3 Commits

Author SHA1 Message Date
wuyanwen
fd35d91f1c 修复角色名不显示 2020-01-06 09:28:14 +08:00
wuyanwen
f6e3ee1225 修改数据库字段 2019-12-30 17:07:30 +08:00
yanwenwu
7b782e916a 修改readme 2019-12-21 15:15:12 +08:00
1169 changed files with 66452 additions and 42535 deletions

View File

@@ -1,24 +0,0 @@
# 环境
- 操作系统:
- php 版本:
- thinkphp 版本:
- Mysql 版本:
- web 服务器:
# 问题
- 问题描述:
- 问题截图:
# 结果
- 实际结果:
- 预期结果:
# 分析
- 所做的尝试:
-
-
# 方案:
- 解决方案:
> 请在问题解决后关闭 issue

View File

@@ -1,25 +0,0 @@
# 环境
- 操作系统:
- php 版本:
- thinkphp 版本:
- Mysql 版本:
- web 服务器:
# 问题
- 问题描述:
- 问题截图:
# 结果
- 实际结果:
- 预期结果:
# 分析
- 所做的尝试:
-
-
# 方案:
- 解决方案:
> 请在问题解决后关闭 issue

6
.gitignore vendored
View File

@@ -1,8 +1,6 @@
/.idea
/.vscode
/vendor
/package
/database
*.log
.env
composer.lock
.env

View File

@@ -1,201 +1,32 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
ThinkPHP遵循Apache2开源协议发布并提供免费使用。
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
All rights reserved。
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
1. Definitions.
Apache Licence是著名的非盈利开源组织Apache采用的协议。
该协议和BSD类似鼓励代码共享和尊重原作者的著作权
允许代码修改,再作为开源或商业软件发布。需要满足
的条件:
1 需要给代码的用户一份Apache Licence
2 如果你修改了代码,需要在被修改的文件中说明;
3 在延伸的代码中(修改和有源代码衍生的代码中)需要
带有原来代码中的协议,商标,专利声明和其他原来作者规
定需要包含的说明;
4 如果再发布的产品中包含一个Notice文件则在Notice文
件中需要带有本协议内容。你可以在Notice中增加自己的
许可但不可以表现为对Apache Licence构成更改。
具体的协议参考http://www.apache.org/licenses/LICENSE-2.0
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

184
README.md
View File

@@ -1,165 +1,47 @@
<p align="center">
<img src="https://cdn.learnku.com/uploads/images/202005/17/18206/zSuf7Ce5kM.png!large">
</p>
## CatchAdmin
<p align="center"><code>CatchAdmin</code>是一款基于<a href="http://www.thinkphp.cn/" target="_blank">thinkphp framework</a>
<a href="https://github.com/PanJiaChen/vue-element-admin/">element admin</a>开发而成的后台管理系统。因为 thinkphp 的简单高效,文档齐全。在看了很多 thinkphp 生态中的后台管理系统,发现没有一款合适的前后端分离系统。遂开发了 CatchAdmin。
基于新版 thinkphp6 服务者的特性,后台的每个模块都可以独立成一个服务,模块之间的功能职责更加清晰。同时后台也兼顾了后台开发前端页面,减少了前端页面代码的输出。将表格和表单都封装成了后台组件,可在后台中通过 Json 数据轻松渲染出前端页面大大提高了开发效率。CatchAdmin 同时也提供 Http 客户端Excel 的导入导出,敏感词检测,大量的内置 commands 等一系列组件工具,提高使用后台的开发体验。
</p>
<p align="center">
<a href="https://catchadmin.com/">文档</a> |
<a href="https://demo.catchadmin.com">演示地址</a> |
<a href="https://bbs.catchadmin.com">论坛交流</a> |
<a href="https://gitee.com/jaguarjack/catchAdmin">项目源码</a> |
<a href="https://www.kancloud.cn/akasishikelu/thinkphp6">看云分析</a>
<a href="#extensions">扩展</a>
</p>
<p align="center">
<a href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
<img src="https://svg.hamm.cn/gitee.svg?type=star&user=jaguarjack&project=catchAdmin"/>
</a >
<a href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
<img src="https://svg.hamm.cn/gitee.svg?type=fork&user=jaguarjack&project=catchAdmin"/>
</a >
<img src="https://svg.hamm.cn/badge.svg?key=Base&value=ThinkPHP6"/>
<img src="https://svg.hamm.cn/badge.svg?key=Data&value=MySQL5.5"/>
<img src="https://svg.hamm.cn/badge.svg?key=Runtime&value=PHP7.1"/>
<img src="https://svg.hamm.cn/badge.svg?key=License&value=Apache-2.0"/>
</p >
## 后台启动流程
[![gSrLz6.png](https://z3.ax1x.com/2021/04/26/gSrLz6.png)](https://imgtu.com/i/gSrLz6)
## AntDV 版本
- 请使用 `v1`分支
## 功能
- [x] `用户管理` 后台用户管理
- [x] `部门管理` 配置公司的部门结构,支持树形结构
- [x] `岗位管理` 配置后台用户的职务
- [x] `菜单管理` 配置系统菜单,按钮等等
- [x] `角色管理` 配置用户担当的角色,分配权限
- [x] `数据字典` 管理后台表结构
- [x] `操作日志` 后台用户操作记录
- [x] `登录日志` 后台系统用户的登录记录
- [x] `代码生成` 生成 API 端的 CURD 操作
- [x] `敏感词` 支持敏感词配置
- [x] `附件管理` 可管理上传的文件
- [x] `定时任务` 可管理定时任务,而不依赖于 Crontab
- [x] `短信平台` 短信云管理,支持 阿里大于腾讯云UcloudSubmail
- [x] `云上传` 支持云上传七牛OSS腾讯
- [ ] `微信管理`
## 项目地址
- [github 地址](https://github.com/yanwenwu/catch-admin)
- [gitee 地址](https://gitee.com/jaguarjack/catchAdmin)
- [前端 Vue 项目地址](https://github.com/yanwenwu/catch-admin-vue)
- [文档地址](https://github.com/catch-admin/document)[个人精力实在有限,希望可以小伙伴们可以一起维护文档]
## 支持创作
如果项目对你有帮助,可以订阅支持我❤️。你的每一份支持是对我最大的鼓励。开源不易,感谢支持。可以通过使用 [**🎉 爱发电**](https://afdian.net/@jaguarjack)订阅支持创作。
## 预览
<table>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wucNXq.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wucm6I.md.png"></td>
</tr>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wucZpd.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wuce1A.md.png"></td>
</tr>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wucnXt.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wucKnP.md.png"></td>
</tr>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wuc3tg.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wucM0f.md.png"></td>
</tr>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wucQ78.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wuc1AS.md.png"></td>
</tr>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wuc8hQ.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wucY1s.md.png"></td>
</tr>
<tr>
<td><img src="https://s1.ax1x.com/2020/09/07/wucJpj.md.png"></td>
<td><img src="https://s1.ax1x.com/2020/09/07/wuctcn.md.png"></td>
</tr>
</table>
## 环境要求
## 5.1 版本的请使用 tag1.0 版本
## 新版后台在开发中 请不要使用
### 环境要求
- php7.1+ (需以下扩展)
- [x] mbstring
- [x] json
- [x] openssl
- [x] xml
- [x] pdo
- mbstring
- json
- openssl
- xml
- pdo
- nginx
- mysql
### 如何安装
> 安装之前请确保已安装 Composer
### install
- curl -sS http://install.phpcomposer.com/installer | php
- composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
- composer update
- php think catch:install
#### 下载项目
- 通过 Git 下载(推荐)
```shell
git clone https://gitee.com/jaguarjack/catchAdmin && cd catchAdmin
### Use
- 配置虚拟域名 OR 在根目录下执行 php think run
- yourUrl/login
- 默认用户名 admin@gmail.com 密码 admin
curl -sS https://install.phpcomposer.com/installer | php
### Problem
> SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'updated_at'
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer install --ignore-platform-reqs
> 设置 sql_mode;
```
- composer 安装
```shell
composer create-project jaguarjack/catchadmin:dev-master
show variables like 'sql_mode' ;
remove 'NO_ZERO_IN_DATE,NO_ZERO_DATE'
```
> SET GLOBAL sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
#### 安装
下载完成之后通过命令来进行安装, 一键安装 🚀
```shell
php think catch:install
```
### Talking
- 可以提 ISSUE请按照 issue 模板提问
- 欢迎进入 Q 群,可以及时反馈一些问题。
- ![输入图片说明](https://images.gitee.com/uploads/images/2018/1219/110300_0257b6c0_810218.jpeg "微信图片_20181219105915.jpg")
仅供学习
## 体验地址
[体验地址](https://demo.catchadmin.com)
- 账号: catch@admin.com
- 密码: catchadmin
[catchadmin 文档地址](https://catchadmin.com)
### 系列文章
如果是刚开始使用 thinkphp6, 以下文章可能会对你有些许帮助,文章基于 RC3 版本。整体架构是不变的。
- [Tp6 启动分析](https://www.kancloud.cn/akasishikelu/thinkphp6/1129385)
- [Tp6 Request 解析](https://www.kancloud.cn/akasishikelu/thinkphp6/1134496)
- [TP6 应用初始化](https://www.kancloud.cn/akasishikelu/thinkphp6/1130427)
- [Tp6 中间件分析](https://www.kancloud.cn/akasishikelu/thinkphp6/1136616)
- [Tp6 请求流程](https://www.kancloud.cn/akasishikelu/thinkphp6/1136608)
### Who used
- [uctoo 应用开发管理后台](https://gitee.com/uctoo/uctoo)
### Talking
- [论坛讨论](https://bbs.catchadmin.com)
- 可以提 `ISSUE`,请按照 `issue` 模板提问
- 加入 Q 群 `302266230` 前请先 star 项目支持一下, 备注填写用户名 + 平台。例如: JaguarJack Github
### Thanks
- 感谢 [JetBrains](https://www.jetbrains.com) 提供生产力巨高的 `PHPStorm``WebStorm`
> 排名不分先后
- [top-think/think](https://github.com/top-think/think)
- [element-admin](https://panjiachen.gitee.io/vue-element-admin-site/zh/)
- [thans/tp-jwt-auth](https://packagist.org/packages/thans/tp-jwt-auth)
- [jaguarjack/think-filesystem-cloud](https://github.com/yanwenwu/think-filesystem-cloud)
- [overtrue/wechat](https://github.com/overtrue/wechat)
- [jaguarjack/migration-generator](https://github.com/yanwenwu/migration-generator)
- [phpoffice/phpspreadsheet](https://github.com/PHPOffice/PhpSpreadsheet)
[体验地址](http://demo.catchadmin.com/login)
- 账号: test@catch.com
- 密码: 123456

View File

@@ -3,8 +3,11 @@ declare (strict_types = 1);
namespace app;
use catcher\CatchAdmin;
use think\App;
use think\exception\ValidateException;
use think\facade\View;
use think\helper\Str;
use think\Validate;
/**

View File

@@ -1,6 +1,11 @@
<?php
namespace app;
use catcher\CatchResponse;
use catcher\exceptions\CatchException;
use catcher\exceptions\FailedException;
use catcher\exceptions\LoginFailedException;
use catcher\exceptions\PermissionForbiddenException;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\Handle;
@@ -51,7 +56,10 @@ class ExceptionHandle extends Handle
*/
public function render($request, Throwable $e): Response
{
// if ($e instanceof CatchException){
return CatchResponse::fail($e->getMessage(), $e->getCode());
// }
// 其他错误交给系统处理
return parent::render($request, $e);
//return parent::render($request, $e);
}
}

View File

@@ -3,51 +3,12 @@ namespace app;
// 应用请求对象类
use catchAdmin\permissions\model\Users;
use catcher\CatchAuth;
use catcher\Code;
use catcher\exceptions\FailedException;
use catcher\exceptions\LoginFailedException;
use thans\jwt\exception\TokenBlacklistException;
use thans\jwt\exception\TokenExpiredException;
use thans\jwt\exception\TokenInvalidException;
use catchAdmin\user\Auth;
class Request extends \think\Request
{
protected $auth;
/**
* login user
*
* @time 2020年01月09日
* @param null $guard
* @return mixed
*/
public function user($guard = null)
{
if (!$this->auth) {
$this->auth = new CatchAuth;
public function user()
{
return Auth::user();
}
try {
$user = $this->auth->guard($guard ? : config('catch.auth.default.guard'))->user();
if ($user->status == Users::DISABLE) {
throw new LoginFailedException('该用户已被禁用', Code::USER_FORBIDDEN);
}
} catch (\Exception $e) {
if ($e instanceof TokenExpiredException) {
throw new FailedException('token 过期', Code::LOGIN_EXPIRED);
}
if ($e instanceof TokenBlacklistException) {
throw new FailedException('token 被加入黑名单', Code::LOGIN_BLACKLIST);
}
if ($e instanceof TokenInvalidException) {
throw new FailedException('token 不合法', Code::LOST_LOGIN);
}
throw new FailedException('认证失败: '. $e->getMessage(), $e->getCode());
}
return $user;
}
}

View File

@@ -6,6 +6,5 @@ return [
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
// \think\middleware\SessionInit::class
\think\middleware\AllowCrossDomain::class,
\think\middleware\SessionInit::class
];

View File

@@ -1,4 +1,5 @@
<?php
return [
\catcher\CatchAdminService::class,
];
\jaguarjack\think\module\ThinkModuleService::class,
\catchAdmin\CatchAdminService::class,
];

View File

@@ -1,23 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager;
use catcher\ModuleService;
class ApimanagerService extends ModuleService
{
public function loadRouteFrom()
{
// TODO: Implement loadRouteFrom() method.
return __DIR__ . DIRECTORY_SEPARATOR . 'route.php';
}
}

View File

@@ -1,96 +0,0 @@
apimanager 模块是一个用于API管理、测试的模块。
# 概述
本模块的设计目标是提供开发人员、产品人员等相关角色可以管理和测试API可以将系统内部或外部API信息保存在系统内使得产品具有自完备的特性和持续交付的特性并可进行灵活的二次开发。
## 主要特性
1. 支持API分类管理支持自定义用户环境变量支持API测试用例管理。
2. 支持HTTP、HTTPS接口测试用例的在线运行。更多协议支持规划在模块roadmap中
3. 支持接口文档管理。
4. 已集成微信第三方平台相关接口测试用例,开发者可快速进行第三方平台应用开发。
5. 支持多帐号多应用使用环境,易于团队协作,不限制接口数量、用户数量、请求数量。
6. 基于catchadmin开发模块安装简单使用便捷支持模块数据导入导出。
7. 开源开放易于二次开发测试用例可共享形成产品API知识库。
8. 支持私有化部署、云原生部署。
9. 可视化管理系统路由列表并可与API测试工具结合可视化测试系统接口。
演示地址demo.uctoo.com 控制台使用demo帐号登录
模块使用界面截图:
<table>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/api%20category%20list.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/api%20category%20edit.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/api%20user%20env%20list.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/api%20user%20env%20edit.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/api%20test%20case%20list.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/api%20test%20case%20edit.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/apirun.png"></td>
</tr>
<tr>
<td><img src="https://gitee.com/UCT_admin/materials/raw/master/uctoo_apitester/images/routelist.png"></td>
</tr>
</table>
## 产品架构
1. 基于catchadmin标准模块开发方式开发可在管理后台一键安装模块和初始化模块数据。
2. 前端采用axios技术选型前端可形成标准客户端接口库。
3. 本地接口数据源类型local主要沿用catchadmin基于用户身份的接口鉴权方案需在API测试用例header添加authorization参数其值为登录接口返回的值。
4. 在扫码登录后注册用户帐号接口测试用例演示了采用微信扫码登录后获取到的用户access_token进行接口鉴权的示例。
5. 微信相关开发使用了[uctoo/think-easywechat SDK](https://gitee.com/UCT/think-easywechat) 集成catchadmin (TP6+VUE) 和 easywechat 4支持微信第三方平台、微信小程序云开发、微信支付服务商等特性。
## 安装教程
### 运行环境依赖
PHP >= 7.1.0
Mysql >= 5.5.0 (需支持innodb引擎)
PDO PHP Extension
MBstring PHP Extension
CURL PHP Extension
ZIP Extension
Composer
catchadmin
### 分步骤安装
1. 从https://gitee.com/jaguarjack/catchAdmin 或 https://gitee.com/uctoo/uctoo 下载https://gitee.com/uctoo/uctoo/tree/master/catch/apimanager 目录模块复制到catchadmin对应目录
2. apimanager/catch-admin-vue 目录内是模块前端vue项目代码复制到前端VUE项目对应目录注意如和原前端vue项目目录的文件有冲突需自行合并代码版本。
3. 前端package.json文件请谨慎覆盖原项目文件。请使用命令 npm install --save @smallwei/avue npm install --save vue-json-editor npm install --save vue-json-views 添加模块依赖等效于手动合并package.json版本。如模块新依赖了第三方组件需要在前端项目目录重新运行 yarn install 命令。
3. 登录管理后台,在系统管理->模块管理启用API管理模块即可安装模块和初始化模块数据。
## 使用手册
1. 可以通过API管理->API分类功能增删改查API分类。
2. 可以通过API环境变量功能增删改查用户环境变量。环境变量的key值以{{key}}方式定义在API测试用例中对应的{{key}}值将替换为环境变量的value值。每个用户可以创建多组环境变量可以切换当前选中的环境变量组。
3. 可以通过API列表功能增删改查API测试用例。api_url、header、body、query、auth字段支持环境变量。新增API测试用例时标识字段请与路由列表name字段保持一致以便API测试用例与路由一一对应快速检索。
4. 可以对已添加的API测试用例执行测试操作在API测试界面可以对api_url、header、body、query、auth等字段进行自定义编辑。发送按钮可以实际执行API测试用例获得接口返回值。
5. 可以使用路由列表->同步至数据库功能,将系统内所有路由信息保存至数据库,以便可视化管理和测试。与 php think route:list -m 命令相同效果。
6. 可以使用路由列表->API测试功能以路由name字段为请求参数跳转至API测试列表页面以便快速查询出对应的API测试用例进行API测试。需更新前端vue项目layout/mixin/formOperate.js文件修复了页面初始化传参bug
具体请参考 https://www.kancloud.cn/doc_uctoo/manual
## 开发说明
### 模块roadmap
1. 通过解析路由文件router.php中的数据自动生成系统接口system类型的所有测试用例。即实现系统接口的可视化测试。
2. 实现API管理功能即可通过界面配置进行基于appid的接口权限管理OAUTH2接口鉴权方案。
3. 实现API测试用例中API文档字段支持markdown编辑和展示。
4. 实现除POST、GET、PUT、DELETE之外的其他接口请求方式。
5. 实现全部content-type类型的支持。
6. 实现测试数据的保存、历史记录等功能。
7. 实现notify类型接口的测试目前还没有在市面上见过类似功能的产品但是实际开发中notify类型的接口在微信第三方平台、各种支付回调、硬件数据上传等很多场景都有遇到。
8. 实现API测试用例的公开共享、私有、保护有偿获取等特性。
具体请参考开源版开发手册 https://www.kancloud.cn/doc_uctoo/uctoo_dev 及 本开源项目示例

View File

@@ -1,116 +0,0 @@
{
"name": "catch-admin",
"version": "4.4.0",
"description": "catch-admin manage system on element-admin-vue",
"author": "JaguarJack <njphper@gmail.com>",
"scripts": {
"dev": "vue-cli-service serve",
"lint": "eslint --ext .js,.vue src",
"build:prod": "vue-cli-service build",
"build:stage": "vue-cli-service build --mode staging",
"preview": "node build/index.js --preview",
"new": "plop",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
"test:unit": "jest --clearCache && vue-cli-service test:unit",
"test:ci": "npm run lint && npm run test:unit"
},
"dependencies": {
"@form-create/element-ui": "^2.5.4",
"axios": "0.18.1",
"clipboard": "2.0.4",
"codemirror": "5.45.0",
"core-js": "3.6.5",
"driver.js": "0.9.5",
"dropzone": "5.5.1",
"echarts": "4.2.1",
"element-ui": "2.13.2",
"file-saver": "2.0.1",
"fuse.js": "3.4.4",
"js-cookie": "2.2.0",
"jsonlint": "1.6.3",
"jszip": "3.2.1",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
"screenfull": "4.2.0",
"script-loader": "0.7.2",
"sortablejs": "1.8.4",
"vue": "2.6.10",
"vue-count-to": "1.0.13",
"vue-highlightjs": "^1.3.3",
"vue-router": "3.0.2",
"vue-splitpane": "1.0.4",
"vuedraggable": "2.20.0",
"vuex": "3.1.0",
"xlsx": "0.14.1"
},
"devDependencies": {
"@smallwei/avue": "^2.8.17",
"@vue/cli-plugin-babel": "4.4.4",
"@vue/cli-plugin-eslint": "4.4.4",
"@vue/cli-plugin-unit-jest": "4.4.4",
"@vue/cli-service": "4.4.4",
"@vue/test-utils": "1.0.0-beta.29",
"autoprefixer": "9.5.1",
"babel-eslint": "10.1.0",
"babel-jest": "^26.3.0",
"babel-plugin-dynamic-import-node": "2.3.3",
"chalk": "2.4.2",
"chokidar": "2.1.5",
"connect": "3.6.6",
"eslint": "6.7.2",
"eslint-plugin-vue": "6.2.2",
"highlight.js": "^10.2.0",
"html-webpack-plugin": "3.2.0",
"husky": "1.3.1",
"lint-staged": "8.1.5",
"lodash": "^4.17.20",
"mockjs": "1.0.1-beta3",
"plop": "2.3.0",
"runjs": "4.3.2",
"sass": "1.26.2",
"sass-loader": "8.0.2",
"script-ext-html-webpack-plugin": "2.1.3",
"serve-static": "1.13.2",
"svg-sprite-loader": "4.1.3",
"svgo": "1.2.0",
"vue-highlight.js": "^3.1.0",
"vue-json-editor": "^1.4.3",
"vue-json-views": "^1.3.0",
"vue-template-compiler": "2.6.10"
},
"browserslist": [
"> 1%",
"last 2 versions"
],
"bugs": {
"url": "https://github.com/JaguarJack/catch-admin-vue/issues"
},
"engines": {
"node": ">=8.9",
"npm": ">= 3.0.0"
},
"keywords": [
"vue",
"admin",
"dashboard",
"element-ui",
"boilerplate",
"admin-template",
"management-system"
],
"license": "MIT",
"lint-staged": {
"src/**/*.{js,vue}": [
"eslint --fix",
"git add"
]
},
"husky": {
"hooks": {}
},
"repository": {
"type": "git",
"url": "git+https://github.com/JaguarJack/catch-admin-vue"
}
}

View File

@@ -1,7 +0,0 @@
import request from "@/utils/request";
export function userenvList() {
return request({
url: "/apiTesterUserenv",
method: "get"
});
}

View File

@@ -1,48 +0,0 @@
import Vue from 'vue'
import 'normalize.css/normalize.css' // a modern alternative to CSS resets
import Element from 'element-ui'
import Avue from '@smallwei/avue'
import 'element-ui/lib/theme-chalk/index.css'
import './styles/element-variables.scss'
// import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
import '@/styles/index.scss' // global css
import App from './App'
import store from './store'
import router from './router'
import './icons' // icon
import './permission' // permission control
import './utils/error-log' // error log
import request from '@/utils/request'
import * as filters from './filters' // global filters
import catchAdmin from '@/components/Catch'
Vue.use(Element, {
size: 'small'// set element-ui default size
// locale: enLang // 如果使用中文,无需设置,请删除
})
window.axios = request;
Vue.use(Avue, { request });
// register global utility filters
Object.keys(filters).forEach(key => {
Vue.filter(key, filters[key])
})
// 后台启动
catchAdmin.boot()
Vue.config.productionTip = false
Vue.prototype.$http = request
Vue.prototype.admin = catchAdmin
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})

View File

@@ -1,44 +0,0 @@
<template>
<catch-table
:ref="table.ref"
:headers="table.headers"
:border="true"
:search="table.search"
:filter-params="table.filterParams"
:hide-pagination="true"
:form-create="formCreate"
:actions="table.actions"
:api-route="table.apiRoute"
:dialog-width="table.dialog.width"
default-expand-all
row-key="id"
:tree-props="table.tree.props"
/>
</template>
<script>
import renderTable from '@/views/render-table-form'
export default {
name:'apimanager_apicategory',
mixins: [renderTable],
data() {
return {
tableFrom: 'table/apimanager/ApiCategory',
}
},
methods: {
beforeSubmit(row) {
if (row.form.parent_id instanceof Array) {
row.form.parent_id = row.form.parent_id.length > 0 ? row.form.parent_id.pop() : 0
}
return row
},
afterHandleResponse() {
this.$http.get('table/apimanager/ApiCategory', {params: { only: 'form'}}).then(response => {
this.formCreate.rule = response.data.form
})
}
}
}
</script>

View File

@@ -1,217 +0,0 @@
<template>
<div class="app-container">
<div class="filter-container">
<el-input v-model="queryParam.env_name" placeholder="环境名称" clearable class="filter-item form-search-input" />
<el-button class="filter-item search" icon="el-icon-search" @click="handleSearch">
搜索
</el-button>
<el-button class="filter-item" icon="el-icon-refresh" @click="handleRefresh">
重置
</el-button>
<el-button class="filter-item fr" type="primary" icon="el-icon-plus" @click="handleCreateEnv">
新增
</el-button>
</div>
<el-table ref="multipleTable" :data="data" tooltip-effect="dark" style="width: 100%" border fit @selection-change="handleSelectMulti">
<el-table-column type="selection" width="55" />
<el-table-column prop="env_name" label="环境名称" />
<el-table-column prop="selected" label="当前环境" />
<el-table-column prop="creator" label="创建人" />
<el-table-column prop="created_at" label="创建时间" />
<el-table-column prop="updated_at" label="更新时间" />
<el-table-column label="操作" fixed="right" width="300">
<template slot-scope="module">
<el-button type="primary" icon="el-icon-refresh" @click="selectAPIenv(module.row.id)" >切换</el-button>
<el-button type="primary" icon="el-icon-edit" @click="handleUpdate(module.row)" />
<el-button type="danger" icon="el-icon-delete" @click="handleDelete(module.row.id)" />
</template>
</el-table-column>
</el-table>
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="paginate.current"
hide-on-single-page
:page-sizes="paginate.sizes"
:page-size="paginate.limit"
:layout="paginate.layout"
:total="paginate.total"/>
<!----------------------------------- 编辑 ---------------------------------------------->
<el-dialog :close-on-click-modal="false" :title="title" :visible.sync="formVisible" @close="handleCancel">
<el-form label-position="top" :ref="formName" :model="formFieldsData" :rules="rules">
<el-form-item label="env_name" :label-width="formLabelWidth" prop="env_name">
<el-input v-model="formFieldsData.env_name" placeholder="请输入环境名称" autocomplete="off" clearable />
</el-form-item>
<!-- <el-form-item label="appid" :label-width="formLabelWidth" prop="appid">
<el-input v-model="formFieldsData.appid" placeholder="请输入appid" autocomplete="off" clearable />
</el-form-item>
<el-form-item label="project_id" :label-width="formLabelWidth" prop="project_id">
<el-input v-model="formFieldsData.project_id" placeholder="请输入project_id" autocomplete="off" clearable />
</el-form-item> -->
<el-form-item label="env_json" :label-width="formLabelWidth" prop="env_json">
<avue-crud
ref="crudJSON"
:option="tableOption"
:data="jsonTableData"
@row-update="addUpdateJSON"
@row-del="rowDelJSON"
@row-save="rowSaveJSON"
>
<template slot-scope="{ row, index }" slot="menu">
<el-button
type="text"
size="small"
@click="rowCellJSON(row, index)"
>{{ row.$cellEdit ? "自定义保存" : "自定义修改" }}</el-button
>
</template>
</avue-crud>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="handleCancel"> </el-button>
<el-button type="primary" @click="handleSubmit"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import formOperate from '@/layout/mixin/formOperate'
import { parseTime } from '@/utils'
export default {
name:'apimanager_apienv',
mixins: [formOperate],
data() {
return {
formName: 'apiEnv',
formLabelWidth: '120px',
// 刷新路由
refreshRoute: true,
// 用户搜索
queryParam: {
env_name: '',
},
formVisible: false,
formFieldsData: {
env_name: '',
env_json: ''
},
url: 'apiTesterUserenv',
// 表单验证
rules: {
env_name: [
{ required: true, message: '请输入环境名称' }
],
env_json: [
{ required: true, message: '请输入环境变量' }
]
},
jsonTableData:[],
tableOption: {
refreshBtn:false,
addBtn: false,
editBtn: false,
addRowBtn: true,
cancelBtn: false,
border: true,
column: [
{
label: "Key",
prop: "key",
cell: true,
rules: [
{
required: true,
message: "Key值示例:{{KeyName}}",
trigger: "blur"
}
]
},
{
label: "Value",
prop: "value",
cell: true,
rules: [
{
required: true,
message: "请输入Value值",
trigger: "blur"
}
]
}
]
},
}
},
watch:{
formFieldsData:{
deep:true,
handler(data){
if(data.env_json){
let obj = this.JsonToObject(data.env_json)
let arr = Object.entries(obj).map(item => {
return { key: item[0], value: item[1], $cellEdit: false };
});
this.jsonTableData = arr;
}
}
}
},
methods: {
handleCreateEnv(){
this.jsonTableData = []
this.handleCreate()
},
selectAPIenv(id) {
this.$http.get( 'apiTesterUserenv/selectAPIenv/' + id).then(response => {
this.$message.success(response.message)
this.handleRefresh()
})
},
// ↓ 处理 ApiBaseInfo Json数据格式 返回 Object 格式 ↓
JsonToObject(json) {
if (json) {
let flag = /\'/.test(json);
if (flag) {
return JSON.parse(json.replace(/\'/gi, '"'));
} else {
return JSON.parse(json);
}
} else {
return null;
}
},
// ↓ JSON 表格 行编辑 ↓
rowCellJSON(row, index) {
this.$refs.crudJSON.rowCell(row, index);
},
// ↓ JSON 表格 编辑行数据 ↓
addUpdateJSON(form, index, done, loading) {
loading();
done();
},
// ↓ JSON 表格 保存行数据 ↓
rowSaveJSON(form, done) {
done();
this.formFieldsData.env_json = this.handlerJson(this.jsonTableData);
},
// ↓ JSON 表格 删除行数据 ↓
rowDelJSON(form, index, done) {
this.jsonTableData.splice(index, 1);
this.formFieldsData.env_json = this.handlerJson(this.jsonTableData);
},
handlerJson(arrData){
let cache = {};
arrData.forEach(item => {
cache[item.key] = item.value;
});
if(Object.keys(cache).length){
return JSON.stringify(cache);
}else{
return null;
}
}
}
}
</script>

View File

@@ -1,659 +0,0 @@
<template>
<div class="run-container">
<el-card class="box-card">
<el-row style="margin-bottom:5px">
<el-button
@click="dialogTableVisible = true"
class="filter-item fr"
type="primary"
icon="el-icon-s-grid"
>
</el-button>
<el-select
style="margin-right:5px"
class="filter-item fr"
@change="changeUserenv"
v-model="currentEnvId"
placeholder="用户环境变量"
>
<el-option
:value="env.id"
:label="env.env_name"
v-for="env in userEnvInfos"
:key="env.id"
/>
</el-select>
</el-row>
<el-input
placeholder="请输入内容"
v-model="currentInputUrl"
class="input-with-select"
:disabled="userable"
>
<el-select
class="method_select"
:disabled="userable"
v-model="currentSelectMethod"
slot="prepend"
placeholder="请选择"
>
<el-option
v-for="(mth, index) in apiMethods"
:key="index"
:label="mth"
:value="mth"
></el-option>
</el-select>
<el-button
type="primary"
class="apisend"
slot="append"
icon="el-icon-s-promotion"
@click="_runapi"
:disabled="sendAble"
>发送</el-button
>
</el-input>
<el-tabs class="mt30 tab-liut" type="border-card">
<el-tab-pane label="Header">
<el-table :data="headerTableData">
<el-table-column width="50">
<template slot-scope="{ row }">
<el-checkbox v-model="row.open"></el-checkbox>
</template>
</el-table-column>
<el-table-column label="KEY">
<template slot-scope="{ row }">
<item-btn v-model="row.key" />
</template>
</el-table-column>
<el-table-column label="VALUE">
<template slot-scope="{ row }">
<item-btn :selectshow="true" v-model="row.value" />
</template>
</el-table-column>
<el-table-column width="50">
<template slot="header" slot-scope="scope">
<el-button
type="primary"
icon="el-icon-plus"
circle
@click="addRow(headerTableData, scope)"
></el-button>
</template>
<template slot-scope="{ row }">
<el-button
icon="el-icon-delete"
circle
type="danger"
@click="delRow(row, headerTableData)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="Query">
<el-table :data="queryTableData">
<el-table-column width="50">
<template slot-scope="{ row }">
<el-checkbox v-model="row.open"></el-checkbox>
</template>
</el-table-column>
<el-table-column label="KEY">
<template slot-scope="{ row }">
<item-btn v-model="row.key" />
</template>
</el-table-column>
<el-table-column label="VALUE">
<template slot-scope="{ row }">
<item-btn :selectshow="true" v-model="row.value" />
</template>
</el-table-column>
<el-table-column width="50">
<template slot="header" slot-scope="scope">
<el-button
type="primary"
icon="el-icon-plus"
circle
@click="addRow(queryTableData, scope)"
></el-button>
</template>
<template slot-scope="{ row }">
<el-button
icon="el-icon-delete"
circle
type="danger"
@click="delRow(row, queryTableData)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="Body">
<el-radio-group v-model="radio">
<el-radio :label="0">none</el-radio>
<el-radio :label="1">form-data</el-radio>
<el-radio :label="2">x-www-form-urlencoded</el-radio>
<el-radio :label="3">json</el-radio>
<el-radio :label="4">raw(json)</el-radio>
</el-radio-group>
<vue-json-editor
class="vjd"
v-if="radio === 4"
v-model="rawJson"
:mode="'code'"
lang="zh"
></vue-json-editor>
<el-table
v-else
v-loading="loading"
element-loading-text="This request dose not have a body"
element-loading-spinner="el-icon-warning"
element-loading-background="rgba(0, 0, 0, 0.8)"
:data="bodyTableData"
>
<el-table-column width="50">
<template slot-scope="{ row }">
<el-checkbox v-model="row.open"></el-checkbox>
</template>
</el-table-column>
<el-table-column label="KEY">
<template slot-scope="{ row }">
<item-btn v-model="row.key" />
</template>
</el-table-column>
<el-table-column label="VALUE">
<template slot-scope="{ row }">
<item-btn :selectshow="true" v-model="row.value" />
</template>
</el-table-column>
<el-table-column width="50">
<template slot="header" slot-scope="scope">
<el-button
type="primary"
icon="el-icon-plus"
circle
@click="addRow(bodyTableData, scope)"
></el-button>
</template>
<template slot-scope="{ row }">
<el-button
icon="el-icon-delete"
circle
type="danger"
@click="delRow(row, bodyTableData)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-card v-if="json" class="box-card mt30">
<json-view :data="json" />
</el-card>
</el-card>
<el-dialog :title="currentUserEnvName" :visible.sync="dialogTableVisible">
<el-table :data="currentUserEnvJson" border style="width: 100%">
<el-table-column prop="key" label="变量" fit> </el-table-column>
<el-table-column prop="value" label="值" fit> </el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import vueJsonEditor from "vue-json-editor";
import { userenvList } from "@/api/userenv";
import ItemBtn from "./itemBtn.vue";
import jsonView from "vue-json-views";
import axios from "axios";
import qs from "qs";
export default {
components: {
jsonView,
ItemBtn,
vueJsonEditor
},
data() {
return {
// ↓ 是否允许用户发送请求 ↓
sendAble: false,
// ↓ 是否允许用户编辑 ↓
userable: false,
// ↓ 用户变量对话框展示与隐藏 ↓
dialogTableVisible: false,
// ↓ Api Mthods ↓
apiMethods: [
"POST",
"GET",
"PUT",
"PATCH",
"DELETE",
"COPY",
"HEAD",
"OPTIONS"
],
// ↓ Api 响应 ↓
json: null,
// ↓ api接口基本信息 ↓
apiBaseInfo: {},
// ↓ 用户所有环境变量 ↓
userEnvInfos: [],
// ↓ 当前用户选择的环境变量id ↓
currentEnvId: null,
// ↓ 用户当前输入的Url ↓
currentInputUrl: "",
// ↓ 用户当前选择的Api Method ↓
currentSelectMethod: "GET",
regEnv: /\{\{(.+?)\}\}/g,
// ↓ 请求 body 下的 数据发送格式 0:none 1:form-data 2:x-www-form-urlencoded ↓
radio: 2,
checked: true,
input: "",
// ↓ 请求Body ↓
bodyTableData: [],
headerTableData: [],
queryTableData: [],
radioLabel: ["none", "form-data", "x-www-form-urlencoded", "json"],
rawJson: {},
headers: null,
params: null
};
},
computed: {
// ↓ 用户当前选择环境变量信息 ↓
currentUserEnvInfo() {
if (this.userEnvInfos.length !== 0) {
return this.userEnvInfos.filter(env => env.id === this.currentEnvId)[0];
} else {
return null;
}
},
// ↓ 用户当前选择环境变量信息键值对模型 ↓
currentUserEnvJson() {
if (this.currentUserEnvInfo && this.currentUserEnvInfo.env_json) {
let obj = JSON.parse(this.currentUserEnvInfo.env_json);
return Object.entries(obj).map(item => {
return { key: item[0], value: item[1] };
});
} else {
return null;
}
},
// ↓ 用户当前选择的环境变量名称 ↓
currentUserEnvName() {
if (this.currentUserEnvInfo && this.currentUserEnvInfo.env_name) {
return this.currentUserEnvInfo.env_name;
} else {
return "未定义名称";
}
},
// ↓ 用户当前选择环境变量信息Map数据模型 ↓
currentUserEnvMap() {
if (this.currentUserEnvInfo && this.currentUserEnvInfo.env_json) {
let obj = JSON.parse(this.currentUserEnvInfo.env_json);
return obj;
} else {
return null;
}
},
// ↓ Api接口url (base_url + url) ↓
currentApiUrl() {
// ↓ reg formula ↓
let regEnv = /\{\{(.+?)\}\}/g;
// ↓ 拿到用户当前地址栏看见的 Url ↓
let curInputUrl = this.currentInputUrl;
// ↓ 判断用户是否使用了变量环境字符串 ↓
let flag = regEnv.test(curInputUrl);
if (flag) {
if (this.currentUserEnvMap) {
let new_url = this.replaceUserenv(curInputUrl); //curInputUrl.replace(regEnv,this.currentUserEnvMap["{{host}}"]);
return new_url;
} else {
return null;
}
} else {
return curInputUrl;
}
},
loading() {
return !Boolean(this.radio);
}
},
mounted() {
this.init();
},
methods: {
init() {
let id = this.$route.query.id;
this.$http.get("apitester/" + id).then(response => {
this.apiBaseInfo = response.data;
this.apiBaseInfo.body = this.apiBaseInfo.body.replace(/'/g, '"');
if (this.apiBaseInfo.body) {
// let resstr = this.apiBaseInfo.body
// .replace(/\\/g, "")
// .replace(/"{/g, "{")
// .replace(/}"/g, "}");
this.rawJson = JSON.parse(this.apiBaseInfo.body);
} else {
this.rawJson = {};
}
this.resetMethodAndUrl();
this.initTable();
});
userenvList().then(response => {
this.userEnvInfos = response.data;
if (response.data.length !== 0) {
response.data.forEach(env => {
if (env.selected) {
this.currentEnvId = env.id;
}
});
}
});
},
/**@dis 初始化table表格 */
initTable() {
let { header, query, body, content_type } = this.apiBaseInfo;
this.radio = this.radioLabel.findIndex(el => {
if (content_type.indexOf(el) !== -1) return true;
return false;
});
let resTable = [header, query, body].map(el => {
return el ? JSON.parse(el) : false;
});
[this.headerTableData, this.queryTableData, this.bodyTableData].some(
(el, index) => {
if (resTable[index] === false) return false;
for (const [key, value] of Object.entries(resTable[index])) {
if (typeof value === "string") {
el.push({ open: true, key: key.trim(), value: value.trim() });
} else if (typeof value === "object") {
el.push({
open: true,
key: key.trim(),
value: JSON.stringify(value)
});
} else {
el.push({ open: true, key: key.trim(), value });
}
}
}
);
},
watchParam(arr) {
let regEnv = /\{\{(.+?)\}\}/g;
let watchCeche = {};
arr.forEach(item => {
let regFlag = regEnv.test(item.value);
let cacheFlag = this.currentUserEnvMap[item.value];
if (regFlag && cacheFlag) {
watchCeche[item.key] = cacheFlag;
}
});
return watchCeche;
},
// ↓ 执行Api 核心业务逻辑 ↓
_runapi() {
this.requestBeforeHook();
switch (this.currentSelectMethod) {
case "POST":
this.apiPost();
break;
case "GET":
this.apiGet();
break;
case "PUT":
this.apiPut();
break;
case "DELETE":
this.apiDelete();
break;
case "PATCH":
case "COPY":
case "HEAD":
case "OPTIONS":
this.$notify({
title: "消息",
message: "通知开发人员进行扩展",
type: "info"
});
break;
default:
this.$notify({
title: "消息",
message: "平台版本暂时不支持该请求方法",
type: "info"
});
break;
}
},
headFactory(ctype, args) {
let product = null;
switch (ctype) {
case "x-www-form-urlencoded":
product = qs.stringify(args);
break;
case "form-data":
let data = new FormData();
for (const key in args) {
data.append(key, args[key]);
}
product = data;
break;
case "raw":
this.$notify({
title: "消息",
message: "平台版本暂时还未支持raw数据格式",
type: "info"
});
product = args;
break;
case "json":
default:
product = args;
break;
}
return product;
},
tbDataToObj(tb) {
const params = {};
tb.filter(el => el.open)
.map(el =>
Object.defineProperty({}, el.key, {
value: el.value,
writable: true,
enumerable: true,
configurable: true
})
)
.forEach(el => Object.assign(params, el));
return params;
},
async apiGet() {
let { status, data } = await axios
.get(this.currentApiUrl, {
headers: this.headers,
params: this.params
})
.catch(err => {
this.json = err;
this.$notify({
title: "失败",
message: "请求发送失败",
type: "error"
});
});
if (status === 200) {
this.json = data;
this.$notify({
title: "成功",
message: "请求发送成功",
type: "success"
});
}
},
async apiPost() {
const data =
this.radio === 4
? this.rawJson
: this.headFactory(
this.radioLabel[this.radio],
this.tbDataToObj(this.bodyTableData)
);
let res = await axios
.post(this.currentApiUrl, data, {
headers: this.headers,
params: this.params
})
.catch(err => {
this.json = {};
this.$notify({
title: "失败",
message: "请求发送失败",
type: "error"
});
});
if (res.status === 200) {
this.json = res.data;
this.$notify({
title: "成功",
message: "请求发送成功",
type: "success"
});
}
},
async apiPut() {
const data = this.headFactory(
this.radioLabel[this.radio],
this.tbDataToObj(this.bodyTableData)
);
let res = await axios
.put(this.currentApiUrl, data, {
headers: this.headers,
params: this.params
})
.catch(err => {
this.json = err;
this.$notify({
title: "失败",
message: "请求发送失败",
type: "error"
});
});
if (res.status === 200) {
this.json = res.data;
this.$notify({
title: "成功",
message: "请求发送成功",
type: "success"
});
}
},
async apiDelete() {
const data =
this.radio === 4
? this.rawJson
: this.headFactory(
this.radioLabel[this.radio],
this.tbDataToObj(this.bodyTableData)
);
let res = await axios
.delete(this.currentApiUrl, {
data,
headers: this.headers,
params: this.params
})
.catch(err => {
this.json = err;
this.$notify({
title: "失败",
message: "请求发送失败",
type: "error"
});
});
if (res.status === 200) {
this.json = res.data;
this.$notify({
title: "成功",
message: "请求发送成功",
type: "success"
});
}
},
requestBeforeHook() {
this.headers = this.watchParam(this.headerTableData);
this.params = Object.assign(
this.tbDataToObj(this.queryTableData),
this.watchParam(this.queryTableData)
);
},
// ↓ 修改用户环境变量 ↓
changeUserenv(env) {
this.$http.get("apiTesterUserenv/selectAPIenv/" + env).then(response => {
this.$message.success(response.message);
});
},
// ↓ 重置 Api Methods 与 Api Url ↓
resetMethodAndUrl() {
this.currentInputUrl = this.apiBaseInfo.api_url;
this.currentSelectMethod = this.apiBaseInfo.methods.toLocaleUpperCase();
},
//循环用户选中的环境变量进行替换
replaceUserenv(orgStr) {
let userEnv = this.currentUserEnvJson;
for (let envelement of userEnv) {
orgStr = orgStr.replace(envelement.key, envelement.value);
}
return orgStr;
},
/**@dis 删除行 */
delRow(row, _table) {
let index = _table.findIndex(_row => row === _row);
_table.splice(index, 1);
},
addRow(_table) {
_table.push({ open: false, key: "KEY", value: "VALUE" });
}
},
watch: {
// ↓ 监听经过处理的 Api Url 控制发送按钮是否开启 ↓
currentApiUrl(url) {
let flag = /http|https/.test(url);
if (url && flag) {
this.sendAble = false;
} else {
this.sendAble = true;
}
}
}
};
</script>
<style lang="scss" scoped>
.run-container {
margin: 20px;
.method_select {
width: 100px;
}
.apisend {
background-color: #70b9eb;
color: white;
}
.mt30 {
margin-top: 30px;
}
.tab-liut {
min-height: 200px;
}
}
</style>
<style lang="scss">
.vjd {
.jsoneditor-vue {
height: 430px;
}
.jsoneditor-poweredBy {
display: none;
}
}
</style>

View File

@@ -1,114 +0,0 @@
<template>
<div class="item-btn-container">
<el-row>
<el-col v-show="!selectValue" :span="18">
<el-button @click="clickBtn" v-if="isShow">{{ value }}</el-button>
<el-input
ref="inputRef"
placeholder="请输入内容"
v-else
:value="value"
@blur="inputBlur"
@input="value => this.$emit('input', value)"
></el-input>
</el-col>
<el-col v-show="selectValue" :span="18">
<el-tag v-if="filename" @close="delFile" closable type="success">{{
filename
}}</el-tag>
<el-upload
v-else
action="/upload/image"
:limit="1"
ref="upload"
:show-file-list="false"
:http-request="uploadGuard"
>
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</el-col>
<el-col :span="6">
<el-select v-if="selectshow" v-model="selectValue">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
props: {
value: {
type: [String, File, Number],
default() {
return null;
}
},
selectshow: {
value: Boolean,
default() {
return false;
}
}
},
data() {
return {
isShow: true,
options: [
{
value: false,
label: "Text"
},
{
value: true,
label: "File"
}
],
selectValue: false,
filename: ""
};
},
computed: {
uploadFile() {
return this.$refs.upload;
}
},
methods: {
/**@dis 切换状态 */
clickBtn() {
this.isShow = false;
this.$nextTick(() => {
this.$refs.inputRef.focus();
});
},
inputBlur() {
this.isShow = true;
},
uploadGuard({ file }) {
this.filename = file.name;
this.$emit("input", file);
},
delFile() {
this.filename = "";
this.$emit("input", null);
}
}
};
</script>
<style lang="scss">
.item-btn-container {
.el-button {
max-width: 100%;
overflow: hidden;
text-align: left;
}
}
</style>

View File

@@ -1,816 +0,0 @@
<template>
<div class="app-container">
<el-row :gutter="12">
<el-col :span="6">
<el-card shadow="never">
<div slot="header" class="clearfix">
<span>分类</span>
</div>
<div class="block">
<el-tree
:data="apicategory"
:props="apicategoryProps"
node-key="id"
default-expand-all
:expand-on-click-node="false"
@node-click="getApicategoryData"
/>
</div>
</el-card>
</el-col>
<el-col :span="18">
<div class="filter-container">
<el-row>
<el-input
v-model="queryParam.api_title"
placeholder="名称"
clearable
class="filter-item form-search-input"
/>
<el-input
v-model="queryParam.api_name"
placeholder="标识"
clearable
class="filter-item form-search-input"
/>
<el-select
v-model="queryParam.type"
clearable
placeholder="请选择数据源类型"
class="filter-item"
style="margin-right: 5px"
>
<el-option value="1" label="remote" />
<el-option value="2" label="local" />
</el-select>
<el-button
class="filter-item fr"
icon="el-icon-refresh"
@click="handleRefresh"
>
重置
</el-button>
<el-button
style="margin-right: 5px"
class="filter-item fr search"
icon="el-icon-search"
@click="handleSearch"
>
搜索
</el-button>
</el-row>
<el-row style="margin-top: 5px">
<el-select
class="filter-item "
@change="changeUserenv"
v-model="userenvid"
placeholder="用户环境变量"
>
<el-option
:value="env.id"
:label="env.env_name"
v-for="env in userenvs"
:key="env.id"
/>
</el-select>
<el-button
class="filter-item fr"
type="primary"
icon="el-icon-plus"
@click="handleCreate"
>
新增
</el-button>
</el-row>
</div>
<el-button
v-if="this.selectedIds.length"
size="small"
class="filter-item mb-5"
type="danger"
icon="el-icon-delete"
@click="handleMultiDelete"
>
批量删除
</el-button>
<el-table
ref="multipleTable"
:data="data"
tooltip-effect="dark"
style="width: 100%"
border
fit
@selection-change="handleSelectMulti"
>
<el-table-column
type="selection"
width="55"
:selectable="selectInit"
/>
<el-table-column label="名称">
<template slot-scope="api">{{ api.row.api_title }}</template>
</el-table-column>
<el-table-column prop="methods" label="methods" />
<el-table-column prop="api_name" label="标识" />
<!-- <el-table-column prop="status" label="状态">
<template slot-scope="api">
<el-switch
v-if="api.row.id === 0"
v-model="api.row.status"
disabled
active-text="启用"
:active-value="1"
/>
<el-switch
v-else
v-model="api.row.status"
active-text="启用"
inactive-text="禁用"
:active-value="1"
:inactive-value="2"
@change="disOrEnableUser(api.row)"
/>
</template>
</el-table-column> -->
<el-table-column prop="type" label="数据源类型">
<template slot-scope="api">
<el-tag v-if="api.row.type === 1" type="success">remote</el-tag>
<el-tag v-if="api.row.type === 2" type="danger">local</el-tag>
</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" />
<el-table-column label="操作" fixed="right" width="300">
<template slot-scope="api">
<el-button
type="primary"
icon="el-icon-refresh"
@click="testApi(api.row.id)"
>测试</el-button
>
<el-button
type="primary"
icon="el-icon-edit"
v-if="api.row.id === 0"
disabled
/>
<el-button
type="primary"
icon="el-icon-edit"
v-else
@click="beforeHandleUpdate(api.row)"
/>
<el-button
type="danger"
icon="el-icon-edit"
v-if="api.row.id === 0"
disabled
/>
<el-button
type="danger"
icon="el-icon-delete"
v-else
@click="handleDelete(api.row.id)"
/>
</template>
</el-table-column>
</el-table>
<el-pagination
background
class="pagination-container"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="paginate.current"
hide-on-single-page
:page-sizes="paginate.sizes"
:page-size="paginate.limit"
:layout="paginate.layout"
:total="paginate.total"
/>
</el-col>
</el-row>
<!----------------------------------- API ---------------------------------------------->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="formVisible"
:destroy-on-close="true"
@close="handleCancel()"
>
<el-form :ref="formName" :model="formFieldsData" :rules="rules">
<el-row :gutter="12">
<el-form-item
label="分类"
:label-width="formLabelWidth"
prop="category_id"
>
<el-cascader
v-model="formFieldsData.category_id"
:options="treeCategory.data"
:props="treeCategory.prop"
:show-all-levels="false"
style="width: 85%"
clearable
/>
</el-form-item>
<el-form-item label="type" :label-width="formLabelWidth" prop="type">
<el-select
v-model="formFieldsData.type"
style="width: 85%"
placeholder="请选择数据源类型"
>
<el-option
v-for="(item, key) in type"
:key="key"
:label="item"
:value="key"
/>
</el-select>
</el-form-item>
<el-form-item
label="名称"
:label-width="formLabelWidth"
prop="api_title"
>
<el-input
v-model="formFieldsData.api_title"
placeholder="请输入名称"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item
label="标识路由name"
:label-width="formLabelWidth"
prop="api_name"
>
<el-input
v-model="formFieldsData.api_name"
placeholder="请输入英文唯一标识请与路由name字段一致"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item
label="methods类型"
:label-width="formLabelWidth"
prop="methods"
>
<el-select
v-model="formFieldsData.methods"
placeholder="请选择methods类型"
>
<el-option
v-for="(item, key) in methodsTypes"
:key="key"
:label="item"
:value="key"
/>
</el-select>
</el-form-item>
<el-form-item
label="api_url"
:label-width="formLabelWidth"
prop="api_url"
>
<el-input
v-model="formFieldsData.api_url"
placeholder="请输入api地址"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item label="Header">
<avue-crud
ref="crudHeader"
:option="tableOption"
:data="headerTableData"
@row-update="addUpdateHeader"
@row-del="rowDelHeader"
@row-save="rowSaveHeader"
>
<template slot-scope="{ row, index }" slot="menu">
<el-button
type="text"
size="small"
@click="rowCellHeader(row, index)"
>{{ row.$cellEdit ? "自定义保存" : "自定义修改" }}</el-button
>
</template>
</avue-crud>
</el-form-item>
<el-form-item label="Body">
<avue-crud
ref="crudBody"
:option="tableOption"
:data="bodyTableData"
@row-update="addUpdateBody"
@row-del="rowDelBody"
@row-save="rowSaveBody"
>
<template slot-scope="{ row, index }" slot="menu">
<el-button
type="text"
size="small"
@click="rowCellBody(row, index)"
>{{ row.$cellEdit ? "自定义保存" : "自定义修改" }}</el-button
>
</template>
</avue-crud>
</el-form-item>
<el-form-item label="Query">
<avue-crud
ref="crudQuery"
:option="tableOption"
:data="queryTableData"
@row-update="addUpdateQuery"
@row-del="rowDelQuery"
@row-save="rowSaveQuery"
>
<template slot-scope="{ row, index }" slot="menu">
<el-button
type="text"
size="small"
@click="rowCellQuery(row, index)"
>{{ row.$cellEdit ? "自定义保存" : "自定义修改" }}</el-button
>
</template>
</avue-crud>
</el-form-item>
<el-form-item label="Auth">
<avue-crud
ref="crudAuth"
:option="tableOption"
:data="authTableData"
@row-update="addUpdateAuth"
@row-del="rowDelAuth"
@row-save="rowSaveAuth"
>
<template slot-scope="{ row, index }" slot="menu">
<el-button
type="text"
size="small"
@click="rowCellAuth(row, index)"
>{{ row.$cellEdit ? "自定义保存" : "自定义修改" }}</el-button
>
</template>
</avue-crud>
</el-form-item>
<el-form-item
label="content-type"
:label-width="formLabelWidth"
prop="content_type"
>
<el-select
v-model="formFieldsData.content_type"
style="width: 85%"
placeholder="请选择content_type类型"
>
<el-option
v-for="(item, key) in content_types"
:key="key"
:label="item"
:value="key"
/>
</el-select>
</el-form-item>
<el-form-item
label="文档url"
:label-width="formLabelWidth"
prop="doc_url"
>
<el-input
v-model="formFieldsData.doc_url"
placeholder="请输入文档url地址"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item
label="文档"
:label-width="formLabelWidth"
prop="document"
>
<el-input
type="textarea"
:rows="5"
v-model="formFieldsData.document"
placeholder="请输入文档内容markdown格式"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item
label="示例请求数据"
:label-width="formLabelWidth"
prop="sample_data"
>
<el-input
type="textarea"
:rows="5"
v-model="formFieldsData.sample_data"
placeholder="请输入示例请求数据"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item
label="示例返回数据"
:label-width="formLabelWidth"
prop="sample_result"
>
<el-input
type="textarea"
:rows="5"
v-model="formFieldsData.sample_result"
placeholder="请输入示例返回数据"
autocomplete="off"
clearable
/>
</el-form-item>
<el-form-item label="排序" :label-width="formLabelWidth" prop="sort">
<el-input-number
v-model="formFieldsData.sort"
:min="1"
:max="100000"
/>
</el-form-item>
<el-form-item label="状态" :label-width="formLabelWidth">
<el-radio v-model="formFieldsData.status" :label="1" checked
>已完成</el-radio
>
<el-radio v-model="formFieldsData.status" :label="2"
>待开发</el-radio
>
<el-radio v-model="formFieldsData.status" :label="3"
>开发中</el-radio
>
<el-radio v-model="formFieldsData.status" :label="4"
>已废弃</el-radio
>
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="handleCancel()"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import formOperate from "@/layout/mixin/formOperate";
import { userenvList } from "@/api/userenv";
export default {
name: "apimanager_apitester",
mixins: [formOperate],
data() {
return {
formName: "apis",
// 刷新路由
refreshRoute: true,
apicategoryProps: {
label: "category_title"
},
formLabelWidth: "120px",
// api搜索
queryParam: {
api_title: "",
api_name: "",
status: "",
type: "",
category_id: ""
},
formVisible: false,
formFieldsData: {
api_title: "",
api_name: "",
api_url: "",
category_id: 0,
type: "",
methods: "",
auth: "",
header: "",
query: "",
body: "",
doc_url: "",
document: "",
sample_data: "",
sample_result: "",
sort: "",
status: "",
content_type: "",
env_id: "",
memo: ""
},
url: "apitester",
data: [],
// 分类
treeCategory: {
data: [],
default: [],
prop: {
label: "category_title",
value: "id",
emitPath: false,
checkStrictly: true
}
},
// methods类型
type: {
1: "remote",
2: "local"
},
// methods类型
methodsTypes: {
POST: "POST",
GET: "GET",
PUT: "PUT",
PATCH: "PATCH",
DELETE: "DELETE",
COPY: "COPY",
HEAD: "HEAD",
OPTIONS: "OPTIONS"
},
content_types: {
"application/x-www-form-urlencoded":
"application/x-www-form-urlencoded",
"application/json; charset=utf-8": "application/json; charset=utf-8",
"multipart/form-data": "multipart/form-data",
raw: "raw"
},
// 表单验证
rules: {
api_title: [
{ required: true, message: "请输入名称", trigger: "blur" },
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" }
],
api_name: [
{ required: true, message: "请输入英文唯一标识", trigger: "blur" }
]
},
// 分类
apicategory: [],
userenvs: [],
userenvid: {},
// ↓ api form 表单 ↓
headerTableData: [],
bodyTableData: [],
queryTableData: [],
authTableData: [],
// ↓ api form 表单 Options ↓
tableOption: {
refreshBtn: false,
addBtn: false,
editBtn: false,
addRowBtn: true,
cancelBtn: false,
border: true,
column: [
{
label: "Key",
prop: "key",
cell: true,
rules: [
{
required: true,
message: "请输入Key值",
trigger: "blur"
}
]
},
{
label: "Value",
prop: "value",
cell: true,
rules: [
{
required: true,
message: "请输入Value值",
trigger: "blur"
}
]
}
]
}
};
},
// 初始化数据
mounted() {
this.$http.get("apicategory").then(response => {
this.apicategory = response.data;
});
userenvList().then(response => {
if (response.data.length !== 0) {
response.data.forEach(env => {
if (env.selected) {
this.userenvid = env.id;
}
});
}
this.userenvs = response.data;
});
},
methods: {
testApi(id) {
this.$router.push({ path: "/apimanager/apirun", query: { id } });
},
// 获取分类API
getApicategoryData(data, node, self) {
this.queryParam.category_id = data.id;
this.handleSearch();
},
// 禁用/启用
disOrEnableApi(api) {
this.$http.put("apitester/switch/status/" + api.id).then(response => {
this.$message({
message: response.message,
type: "success"
});
});
},
beforeCreate() {
this.$http.get("apicategory").then(response => {
this.treeCategory.data = response.data;
});
},
beforeHandleUpdate(api) {
this.beforeCreate();
this.$http.get(this.url + "/" + api.id).then(response => {
const api = response.data;
this.handleUpdate(api);
});
},
selectInit(row, index) {
return row.id !== 0;
},
submit() {
this.handleSubmit();
},
onJsonChange(value) {
console.log("value:", value);
},
onJsonSave(value) {
console.log("value:", value);
},
changeUserenv(env) {
this.$http
.get("apiTesterUserenv/selectAPIenv/" + env)
.then(response => {});
},
// ↓ Header 表格 行编辑 ↓
rowCellHeader(row, index) {
this.$refs.crudHeader.rowCell(row, index);
},
rowCellBody(row, index) {
this.$refs.crudBody.rowCell(row, index);
},
rowCellQuery(row, index) {
this.$refs.crudQuery.rowCell(row, index);
},
rowCellAuth(row, index) {
this.$refs.crudAuth.rowCell(row, index);
},
// ↓ Header 表格 编辑行数据 ↓
addUpdateHeader(form, index, done, loading) {
loading();
done();
},
addUpdateBody(form, index, done, loading) {
loading();
done();
},
addUpdateQuery(form, index, done, loading) {
loading();
done();
},
addUpdateAuth(form, index, done, loading) {
loading();
done();
},
afterCancel() {
setTimeout(() => {
this.headerTableData = [];
this.bodyTableData = [];
this.queryTableData = [];
this.authTableData = [];
}, 400);
Object.keys(this.formFieldsData).forEach(k => {
switch (k) {
case "category_id":
this.formFieldsData[k] = null;
break;
case "type":
this.formFieldsData[k] = "1";
break;
default:
break;
}
});
},
// ↓ Header 表格 保存行数据 ↓
rowSaveHeader(form, done) {
done();
let json = this.handlerTable(this.headerTableData);
this.formFieldsData.header = json;
},
rowSaveBody(form, done) {
done();
let json = this.handlerTable(this.bodyTableData);
this.formFieldsData.body = json;
},
rowSaveQuery(form, done) {
done();
let json = this.handlerTable(this.queryTableData);
this.formFieldsData.query = json;
},
rowSaveAuth(form, done) {
done();
let json = this.handlerTable(this.authTableData);
this.formFieldsData.auth = json;
},
// ↓ Header 表格 删除行数据 ↓
rowDelHeader(form, index, done) {
this.headerTableData.splice(index, 1);
let json = this.handlerTable(this.headerTableData);
this.formFieldsData.header = json;
},
rowDelBody(form, index, done) {
this.bodyTableData.splice(index, 1);
let json = this.handlerTable(this.bodyTableData);
this.formFieldsData.body = json;
},
rowDelQuery(form, index, done) {
this.queryTableData.splice(index, 1);
let json = this.handlerTable(this.queryTableData);
this.formFieldsData.query = json;
},
rowDelAuth(form, index, done) {
this.authTableData.splice(index, 1);
let json = this.handlerTable(this.authTableData);
this.formFieldsData.auth = json;
},
// ↓ 处理 ApiBaseInfo Json数据格式 返回 Object 格式 ↓
JsonToObject(json) {
if (json && json !== "") {
let flag = /\'/.test(json);
if (flag) {
return JSON.parse(json.replace(/\'/gi, '"'));
} else {
return JSON.parse(json);
}
} else {
return null;
}
},
initTableData(json) {
let obj = this.JsonToObject(json);
let arr = Object.entries(obj).map(item => {
return { key: item[0], value: item[1], $cellEdit: false };
});
return arr;
},
handlerTable(arr) {
let obj = {};
if (arr) {
arr.forEach(item => {
return (obj[item.key] = item.value);
});
}
if (Object.keys(obj).length) {
return JSON.stringify(obj);
} else {
return "";
}
}
},
watch: {
formFieldsData: {
handler(data) {
if (data.header) {
this.headerTableData = this.initTableData(data.header);
}
if (data.body) {
this.bodyTableData = this.initTableData(data.body);
}
if (data.auth) {
this.authTableData = this.initTableData(data.auth);
}
if (data.query) {
this.queryTableData = this.initTableData(data.query);
}
},
deep: true
}
}
};
</script>
<style>
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
</style>

View File

@@ -1,159 +0,0 @@
<template>
<div class="app-container">
<el-form ref="form" :model="queryParam" :inline="true">
<el-form-item prop="rule" label="rule" :label-width="formLabelWidth">
<el-input v-model="queryParam.rule" placeholder="rule" type="input"></el-input>
</el-form-item><el-form-item prop="route" label="route" :label-width="formLabelWidth">
<el-input v-model="queryParam.route" placeholder="route" type="input"></el-input>
</el-form-item><el-form-item prop="method" label="method" :label-width="formLabelWidth">
<el-input v-model="queryParam.method" placeholder="method" type="input"></el-input>
</el-form-item><el-form-item prop="name" label="name" :label-width="formLabelWidth">
<el-input v-model="queryParam.name" placeholder="name" type="input"></el-input>
</el-form-item><el-form-item prop="domain" label="domain" :label-width="formLabelWidth">
<el-input v-model="queryParam.domain" placeholder="domain" type="input"></el-input>
</el-form-item><el-form-item prop="option" label="option" :label-width="formLabelWidth">
<el-input v-model="queryParam.option" placeholder="option" type="input"></el-input>
</el-form-item><el-form-item prop="pattern" label="pattern" :label-width="formLabelWidth">
<el-input v-model="queryParam.pattern" placeholder="pattern" type="input"></el-input>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" @click="handleSearch">
查询
</el-button>
</el-form-item>
</el-form>
<el-divider content-position="center"></el-divider>
<div class="filter-container">
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-button class="filter-item" icon="el-icon-refresh" @click="handleRefresh">刷新</el-button>
<!-- <el-button class="filter-item" type="primary" icon="el-icon-plus" @click="handleCreate()">添加</el-button> -->
<el-button type="primary" class="filter-item" icon="el-icon-refresh" @click="sync">
同步至数据库
</el-button>
<el-button v-if="this.selectedIds.length" size="small" class="filter-item mb-5" type="danger" icon="el-icon-delete" @click="handleMultiDelete">批量删除</el-button>
<el-button @click="clearFilter">清除所有过滤器</el-button>
</div>
</el-col>
<el-col :span="12">
<el-button icon="el-icon-info" circle @click="templateVersion" style="float: right; padding: 3px 0"></el-button>
<el-dropdown @command="handleTableCommand" style="float: right; padding: 3px 0">
<span class="el-dropdown-link">
<i class="el-icon-more el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="a">配置表格</el-dropdown-item>
<el-dropdown-item command="b" divided>移除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<div class="grid-content">
<el-dropdown @command="handleDropdownCommand" style="float: right; padding: 3px 0">
<span class="el-dropdown-link">
<i class="el-icon-menu el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-checkbox-group v-model="checkList">
<el-dropdown-item command="a"><el-checkbox label="rule"></el-checkbox></el-dropdown-item><el-dropdown-item command="a"><el-checkbox label="route"></el-checkbox></el-dropdown-item><el-dropdown-item command="a"><el-checkbox label="method"></el-checkbox></el-dropdown-item><el-dropdown-item command="a"><el-checkbox label="name"></el-checkbox></el-dropdown-item><el-dropdown-item command="a"><el-checkbox label="domain"></el-checkbox></el-dropdown-item><el-dropdown-item command="a"><el-checkbox label="option"></el-checkbox></el-dropdown-item><el-dropdown-item command="a"><el-checkbox label="pattern"></el-checkbox></el-dropdown-item>
</el-checkbox-group>
</el-dropdown-menu>
</el-dropdown>
</div>
</el-col>
</el-row>
</div>
<el-table ref="multipleTable" :data="data" tooltip-effect="dark" style="width: 100%" fit @selection-change="handleSelectMulti">
<el-table-column type="selection" width="55" v-if="true"></el-table-column>
<el-table-column prop="rule" label="rule" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="route" label="route" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="method" label="method" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="name" label="name" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="domain" label="domain" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="option" label="option" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="pattern" label="pattern" sortable="true" v-if="true"></el-table-column>
<el-table-column prop="creator" label="创建人" v-if="true"></el-table-column>
<el-table-column prop="created_at" label="创建时间" v-if="true"></el-table-column>
<el-table-column prop="updated_at" label="更新时间" v-if="true"></el-table-column>
<el-table-column label="操作" v-if="true" fixed="right">
<template slot-scope="module">
<el-button type="primary" icon="el-icon-stopwatch" @click="testApi(module.row.name)">API测试</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="paginate.current" hide-on-single-page :page-sizes="paginate.sizes" :page-size="paginate.limit" :layout="paginate.layout" :total="paginate.total"></el-pagination>
<!----------------------------------- 新增/编辑 ---------------------------------------------->
<el-drawer ref="drawer" size="60%" :title="drawerTitle" :visible.sync="formVisible" :before-close="handleClose" direction="rtl" @close="handleCancel">
<div class="demo-drawer__content">
<el-form :ref="formName" :model="formFieldsData" :rules="rules">
<el-form-item prop="rule" label="rule" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.rule" placeholder="rule" autocomplete="off" clearable type="input"></el-input>
</el-form-item><el-form-item prop="route" label="route" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.route" placeholder="route" autocomplete="off" clearable type="input"></el-input>
</el-form-item><el-form-item prop="method" label="method" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.method" placeholder="method" autocomplete="off" clearable type="input"></el-input>
</el-form-item><el-form-item prop="name" label="name" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.name" placeholder="name" autocomplete="off" clearable type="input"></el-input>
</el-form-item><el-form-item prop="domain" label="domain" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.domain" placeholder="domain" autocomplete="off" clearable type="input"></el-input>
</el-form-item><el-form-item prop="option" label="option" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.option" placeholder="option" autocomplete="off" clearable type="input"></el-input>
</el-form-item><el-form-item prop="pattern" label="pattern" :label-width="formLabelWidth">
<el-input v-model="formFieldsData.pattern" placeholder="pattern" autocomplete="off" clearable type="input"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="drawer__footer">
<el-button @click="handleCancel"> </el-button>
<el-button type="primary" @click="handleSubmit" :loading="loading">{{ loading ? '提交中 ...' : '确 定' }}</el-button>
</div>
</div>
</el-drawer>
</div>
</template>
<script>
import formOperate from '@/layout/mixin/formOperate'
export default {
name:'apimanager_routeList',
mixins: [formOperate],
data() {
return {
url: 'routeList',
formName: 'route_list',
formLabelWidth: '120px',
// 用户搜索
queryParam: {
rule:'',route:'',method:'',name:'',domain:'',option:'',pattern:'',
},
formVisible: false,
formFieldsData: {
rule:'',route:'',method:'',name:'',domain:'',option:'',pattern:'',
},
loading: false,
checkList: [],
search: '',
drawerTitle: 'route_list',
form: {rule:'',route:'',method:'',name:'',domain:'',option:'',pattern:'', },
timer: null,
// 表单验证
rules: {
}
}
},
mounted() {},
methods: {
testApi(name) {
let api_name = name.replace(/\\/g,"\\\\") //数据库存了含反斜杠的字段查询时转义成四个反斜杠
this.$router.push({ path: "/apitester", query: { api_name} });
},
sync() {
this.$http.post('apimanager/routelist/sync').then(res => {
this.$message.success(res.message)
this.handleRefresh()
})
},
},
}
</script>

View File

@@ -1,9 +0,0 @@
export default {
// api分类
apicategory: () => import('@/views/apimanager/apicategory'),
// api测试
apitester: () => import('@/views/apimanager/apitester'),
apirun: () => import('@/views/apimanager/apirun'),
apienv: () => import('@/views/apimanager/apienv'),
apimanager_routeList: () => import('@/views/apimanager/route_list/route_list'),
}

View File

@@ -1,83 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\controller;
use catcher\base\CatchController;
use catchAdmin\apimanager\model\ApiCategory as ApiCategoryModel;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\exceptions\FailedException;
class ApiCategory extends CatchController
{
protected $ApiCategoryModel;
public function __construct(ApiCategoryModel $ApiCategoryModel)
{
$this->ApiCategoryModel = $ApiCategoryModel;
}
/**
* 列表
* @time 2021年05月19日 15:21
* @param Request $request
*/
public function index(): \think\response\Json
{
return CatchResponse::success($this->ApiCategoryModel->getList());
}
/**
* 保存信息
* @time 2021年05月19日 15:21
* @param Request $request
*/
public function save(Request $request) : \think\response\Json
{
return CatchResponse::success($this->ApiCategoryModel->storeBy($request->post()));
}
/**
* 读取
* @time 2021年05月19日 15:21
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->ApiCategoryModel->findBy($id));
}
/**
* 更新
* @time 2021年05月19日 15:21
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\response\Json
{
return CatchResponse::success($this->ApiCategoryModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2021年05月19日 15:21
* @param $id
*/
public function delete($id) : \think\Response
{
if ($this->ApiCategoryModel->where('parent_id', $id)->find()) {
throw new FailedException('存在子分类,无法删除');
}
return CatchResponse::success($this->ApiCategoryModel->deleteBy($id));
}
}

View File

@@ -1,79 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\apimanager\model\ApiTester as ApiTesterModel;
use catchAdmin\apimanager\model\ApiCategory;
class ApiTester extends CatchController
{
protected $ApiTesterModel;
public function __construct(ApiTesterModel $ApiTesterModel)
{
$this->ApiTesterModel = $ApiTesterModel;
}
/**
* 列表
* @time 2021年05月20日 11:41
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->ApiTesterModel->getList());
}
/**
* 保存信息
* @time 2021年05月20日 11:41
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->ApiTesterModel->storeBy($request->post()));
}
/**
* 读取
* @time 2021年05月20日 11:41
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->ApiTesterModel->findBy($id));
}
/**
* 更新
* @time 2021年05月20日 11:41
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->ApiTesterModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2021年05月20日 11:41
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->ApiTesterModel->deleteBy($id));
}
}

View File

@@ -1,78 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\apimanager\model\ApiTesterLog as ApiTesterLogModel;
class ApiTesterLog extends CatchController
{
protected $ApiTesterLogModel;
public function __construct(ApiTesterLogModel $ApiTesterLogModel)
{
$this->ApiTesterLogModel = $ApiTesterLogModel;
}
/**
* 列表
* @time 2021年06月10日 19:20
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->ApiTesterLogModel->getList());
}
/**
* 保存信息
* @time 2021年06月10日 19:20
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->ApiTesterLogModel->storeBy($request->post()));
}
/**
* 读取
* @time 2021年06月10日 19:20
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->ApiTesterLogModel->findBy($id));
}
/**
* 更新
* @time 2021年06月10日 19:20
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->ApiTesterLogModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2021年06月10日 19:20
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->ApiTesterLogModel->deleteBy($id));
}
}

View File

@@ -1,99 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\apimanager\model\ApiTesterUserenv as ApiTesterUserenvModel;
use think\facade\Log;
class ApiTesterUserenv extends CatchController
{
protected $ApiTesterUserenvModel;
public function __construct(ApiTesterUserenvModel $ApiTesterUserenvModel)
{
$this->ApiTesterUserenvModel = $ApiTesterUserenvModel;
}
/**
* 列表
* @time 2021年05月26日 18:28
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->ApiTesterUserenvModel->getList());
}
/**
* 保存信息
* @time 2021年05月26日 18:28
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->ApiTesterUserenvModel->storeBy($request->post()));
}
/**
* 读取
* @time 2021年05月26日 18:28
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->ApiTesterUserenvModel->findBy($id));
}
/**
* 更新
* @time 2021年05月26日 18:28
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->ApiTesterUserenvModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2021年05月26日 18:28
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->ApiTesterUserenvModel->deleteBy($id));
}
/**
* 切换API环境
* @param Request $request
* @param $id
*/
public function selectAPIenv(Request $request,$id = "") : \think\Response
{
if ($id)
{
$creator_id = $request->user()->id;
$this->ApiTesterUserenvModel->update(['selected' => 0], ['creator_id' => $creator_id]); //全不选
$res = $this->ApiTesterUserenvModel->update(['selected' => 1], ['id' => $id]); //选中当前
//设置为管理员当前选中的applet
if($res){
return CatchResponse::success($res,'切换API环境成功');
}
}
return CatchResponse::fail('切换API环境错误');
}
}

View File

@@ -1,93 +0,0 @@
<?php
namespace catchAdmin\apimanager\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\apimanager\repository\RouteListRepository as RouteListModel;
use think\Response;
class RouteList extends CatchController
{
protected $routeListModel;
/**
*
* @time 2021/11/11 17:47
* @param RouteListModel $routeListModel
* @return mixed
*/
public function __construct(RouteListModel $routeListModel)
{
$this->routeListModel = $routeListModel;
}
/**
*
* @time 2021/11/11 17:47
* @return Response
*/
public function index() : Response
{
return CatchResponse::paginate($this->routeListModel->getList());
}
/**
*
* @time 2021/11/11 17:47
* @param Request $request
* @return Response
*/
public function save(Request $request) : Response
{
return CatchResponse::success($this->routeListModel->storeBy($request->post()));
}
/**
*
* @time 2021/11/11 17:47
* @param $id
* @return Response
*/
public function read($id) : Response
{
return CatchResponse::success($this->routeListModel->findBy($id));
}
/**
*
* @time 2021/11/11 17:47
* @param $id
* @param Request $request
* @return Response
*/
public function update($id, Request $request) : Response
{
return CatchResponse::success($this->routeListModel->updateBy($id, $request->post()));
}
/**
*
* @time 2021/11/11 17:47
* @param $id
* @return Response
*/
public function delete($id) : Response
{
return CatchResponse::success($this->routeListModel->deleteBy($id));
}
/**
* 同步
*
* @time 2021/11/11 17:47
* @return \think\response\Json
* @throws \Exception
*/
public function sync()
{
return CatchResponse::success($this->routeListModel->sync());
}
}

View File

@@ -1,45 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class ApiCategory extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('api_category', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'API分类' ,'id' => 'id' ,'primary_key' => ['id']]);
$table->addColumn('category_title', 'string', ['limit' => 64,'null' => false,'default' => '','signed' => true,'comment' => '分类标题',])
->addColumn('parent_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => true,'comment' => '父级ID',])
->addColumn('category_name', 'string', ['limit' => 128,'null' => false,'default' => '','signed' => true,'comment' => '分类唯一标识',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '状态:1=正常;2=停用',])
->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => true,'comment' => '排序字段',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除字段',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addIndex(['category_name'], ['unique' => true,'name' => 'api_category_category_name'])
->create();
}
}

View File

@@ -1,60 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class ApiTester extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('api_tester', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'api测试表' ,'id' => 'id' ,'primary_key' => ['id']]);
$table->addColumn('api_title', 'string', ['limit' => 128,'null' => false,'default' => '新建接口','signed' => true,'comment' => '标题',])
->addColumn('api_name', 'string', ['limit' => 128,'null' => false,'default' => '','signed' => true,'comment' => '英文唯一标识',])
->addColumn('category_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => true,'comment' => '分类',])
->addColumn('type', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '数据源类型:1=remote,2=local',])
->addColumn('appid', 'string', ['limit' => 64,'null' => true,'signed' => true,'comment' => 'appid',])
->addColumn('project_id', 'string', ['limit' => 64,'null' => true,'signed' => true,'comment' => '项目ID',])
->addColumn('api_url', 'string', ['limit' => 512,'null' => false,'default' => 'https://127.0.0.1','signed' => true,'comment' => 'API URL',])
->addColumn('methods', 'string', ['limit' => 128,'null' => false,'default' => 'POST','signed' => true,'comment' => '方法:POST,GET,PUT,PATCH,DELETE,COPY,HEAD,OPTIONS',])
->addColumn('auth', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '鉴权',])
->addColumn('header', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => 'header',])
->addColumn('query', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => 'query',])
->addColumn('body', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => 'body',])
->addColumn('doc_url', 'string', ['limit' => 512,'null' => true,'signed' => true,'comment' => '文档URL',])
->addColumn('document', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '文档',])
->addColumn('sample_data', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '示例数据',])
->addColumn('sample_result', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '示例返回数据',])
->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => true,'comment' => '排序',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '状态:1=已完成,2=待开发,3=开发中,4=已废弃',])
->addColumn('content_type', 'string', ['limit' => 128,'null' => false,'default' => 'application/x-www-form-urlencoded','signed' => true,'comment' => 'content-type:application/x-www-form-urlencoded,multipart/form-data,raw',])
->addColumn('env_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => true,'comment' => '环境ID',])
->addColumn('memo', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '备注',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除字段',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->create();
}
}

View File

@@ -1,44 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class ApiTesterUserenv extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('api_tester_userenv', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'API测试用户环境' ,'id' => 'id' ,'primary_key' => ['id']]);
$table->addColumn('env_name', 'string', ['limit' => 128,'null' => false,'default' => '','signed' => true,'comment' => '环境名称',])
->addColumn('appid', 'string', ['limit' => 64,'null' => false,'default' => '','signed' => true,'comment' => 'appid',])
->addColumn('project_id', 'string', ['limit' => 64,'null' => false,'default' => '','signed' => true,'comment' => '项目ID',])
->addColumn('env_json', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => false,'signed' => true,'comment' => '环境变量json',])
->addColumn('selected', 'boolean', ['null' => false,'default' => 0,'signed' => true,'comment' => '是否当前选中:0=否,1=是',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除字段',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->create();
}
}

View File

@@ -1,46 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class ApiTesterLog extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('api_tester_log', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'API测试记录' ,'id' => 'id' ,'primary_key' => ['id']]);
$table->addColumn('appid', 'string', ['limit' => 50,'null' => true,'signed' => true,'comment' => 'appid',])
->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => true,'comment' => 'users表id',])
->addColumn('api_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => true,'comment' => 'api_tester表id',])
->addColumn('params', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => 'api参数',])
->addColumn('result', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '返回值',])
->addColumn('request_data', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '请求数据',])
->addColumn('response_data', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => true,'signed' => true,'comment' => '响应数据',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除字段',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->create();
}
}

View File

@@ -1,48 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class RouteList extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('route_list', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '路由表' ,'id' => 'id' ,'primary_key' => ['id']]);
$table->addColumn('rule', 'string', ['limit' => 128,'null' => true,'signed' => true,'comment' => 'rule',])
->addColumn('route', 'string', ['limit' => 256,'null' => true,'signed' => true,'comment' => 'route',])
->addColumn('method', 'string', ['limit' => 16,'null' => true,'signed' => true,'comment' => 'method',])
->addColumn('name', 'string', ['limit' => 256,'null' => true,'signed' => true,'comment' => 'name',])
->addColumn('domain', 'string', ['limit' => 128,'null' => true,'signed' => true,'comment' => 'domain',])
->addColumn('option', 'string', ['limit' => 256,'null' => true,'signed' => true,'comment' => 'option',])
->addColumn('pattern', 'string', ['limit' => 128,'null' => true,'signed' => true,'comment' => 'pattern',])
->addColumn('title', 'string', ['limit' => 128,'null' => true,'signed' => true,'comment' => 'title',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除字段',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addIndex(['name'], ['unique' => true,'name' => 'route_list_name'])
->create();
}
}

View File

@@ -1,98 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
use think\migration\Seeder;
class ApiCategorySeed extends Seeder
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run(): void
{
$data = array (
0 =>
array (
'id' => 1,
'category_title' => '微信第三方平台',
'parent_id' => 0,
'category_name' => 'wechatopen',
'status' => 1,
'sort' => 1,
'created_at' => 1621414770,
'updated_at' => 1621414770,
'deleted_at' => 0,
'creator_id' => 1,
),
1 =>
array (
'id' => 2,
'category_title' => '微信交易组件标准版',
'parent_id' => 1,
'category_name' => 'MiniShop_Base',
'status' => 1,
'sort' => 1,
'created_at' => 1621415897,
'updated_at' => 1621415897,
'deleted_at' => 0,
'creator_id' => 1,
),
2 =>
array (
'id' => 3,
'category_title' => '腾讯AI开放平台',
'parent_id' => 0,
'category_name' => 'tencentAI',
'status' => 1,
'sort' => 1,
'created_at' => 1621493345,
'updated_at' => 1621493345,
'deleted_at' => 0,
'creator_id' => 1,
),
3 =>
array (
'id' => 4,
'category_title' => '批量代云开发',
'parent_id' => 1,
'category_name' => 'componenttcb',
'status' => 1,
'sort' => 1,
'created_at' => 1621494287,
'updated_at' => 1621494287,
'deleted_at' => 0,
'creator_id' => 1,
),
4 =>
array (
'id' => 5,
'category_title' => '本地接口',
'parent_id' => 0,
'category_name' => 'local',
'status' => 1,
'sort' => 2,
'created_at' => 1621494287,
'updated_at' => 1621494287,
'deleted_at' => 0,
'creator_id' => 1,
),
);
foreach ($data as $item) {
\catchAdmin\apimanager\model\ApiCategory::create($item);
}
}
}

View File

@@ -1,785 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
use think\migration\Seeder;
class ApiTesterSeed extends Seeder
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run(): void
{
$data = array (
0 =>
array (
'id' => 1,
'api_title' => '获取类目详情',
'api_name' => 'product/category/get',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/category/get',
'methods' => 'POST',
'auth' => NULL,
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/cat/get_cat_list.html',
'document' => '参考文档url',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 2,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => NULL,
'created_at' => 1621484754,
'updated_at' => 1622461634,
'deleted_at' => 0,
'creator_id' => 1,
),
1 =>
array (
'id' => 2,
'api_title' => '获取品牌列表',
'api_name' => 'product/brand/get',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/brand/get',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/cat/get_brand.html',
'document' => '详见文档url地址',
'sample_data' => '无',
'sample_result' => '返回',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => NULL,
'created_at' => 1621485017,
'updated_at' => 1622378856,
'deleted_at' => 0,
'creator_id' => 1,
),
2 =>
array (
'id' => 3,
'api_title' => '登录日志',
'api_name' => '/log/login',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/log/login',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '',
'doc_url' => 'http://apidoc.catchadmin.com/web/#/5?page_id=23',
'document' => '无',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621598744,
'updated_at' => 1622965477,
'deleted_at' => 0,
'creator_id' => 1,
),
3 =>
array (
'id' => 4,
'api_title' => '操作日志',
'api_name' => 'log/operate',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/log/operate',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '',
'doc_url' => 'http://apidoc.catchadmin.com/web/#/5?page_id=53',
'document' => '无',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621598935,
'updated_at' => 1622965460,
'deleted_at' => 0,
'creator_id' => 1,
),
4 =>
array (
'id' => 5,
'api_title' => '获取运费模板',
'api_name' => 'product/delivery/get_freight_template',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/delivery/get_freight_template',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '',
'doc_url' => 'https://developers.weixin.qq.com/doc/ministore/minishopopencomponent/API/cat/get_freight_template.html',
'document' => '详见文档URL',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621599469,
'updated_at' => 1622378826,
'deleted_at' => 0,
'creator_id' => 1,
),
5 =>
array (
'id' => 6,
'api_title' => '获取店铺的商品分类',
'api_name' => 'product/store/get_shopcat',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/store/get_shopcat',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/store/get_shopcat.html',
'document' => '参考文档url',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621762669,
'updated_at' => 1622378816,
'deleted_at' => 0,
'creator_id' => 1,
),
6 =>
array (
'id' => 7,
'api_title' => '添加商品',
'api_name' => 'product/spu/add',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/spu/add',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '{
"out_product_id": "1234566",
"title": "任天堂 Nintendo Switch 国行续航增强版 NS家用体感游戏机掌机 便携掌上游戏机 红蓝主机",
"sub_title": "JD自营更放心】【国行Switch更安心的保修服务更快的国行服务器】一台主机三种模式游戏掌机随时随地一起趣玩。",
"head_img":
[
"http://img10.360buyimg.com/n1/s450x450_jfs/t1/85865/39/13611/488083/5e590a40E4bdf69c0/55c9bf645ea2b727.jpg"
],
"desc_info":
{
"imgs":
[
"http://img10.360buyimg.com/n1/s450x450_jfs/t1/85865/39/13611/488083/5e590a40E4bdf69c0/55c9bf645ea2b727.jpg"
]
},
"brand_id": 2100000000,
"cats":
[
{
"cat_id": 6033,
"level": 1
},
{
"cat_id": 6057,
"level": 2
},
{
"cat_id": 6091,
"level": 3
}
],
"attrs":
[
{
"attr_key": "商品毛重",
"attr_value": "380g"
},
{
"attr_key": "商品产地",
"attr_value": "中国大陆"
}
],
"model": "国行续航增强版",
"express_info":
{
"template_id": 5189
},
"skus":
[
{
"out_product_id": "1234566",
"out_sku_id": "1024",
"thumb_img": "http://img10.360buyimg.com/n1/s450x450_jfs/t1/100778/17/13648/424215/5e590a40E2d68e774/e171d222a0c9b763.jpg",
"sale_price": 1300,
"market_price": 1500,
"stock_num": 100,
"sku_code": "A24525252",
"barcode": "13251454",
"sku_attrs":
[
{
"attr_key": "选择颜色",
"attr_value": "红蓝主机"
},
{
"attr_key": "选择套装",
"attr_value": "主机+保护套"
}
]
}
]
}',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/add_spu.html',
'document' => '参考文档url',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621764682,
'updated_at' => 1622378805,
'deleted_at' => 0,
'creator_id' => 1,
),
7 =>
array (
'id' => 8,
'api_title' => '获取商品',
'api_name' => 'product/spu/get',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/spu/get',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '{\'product_id\':\'31334398\'}',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/get_spu.html',
'document' => '参考文档URL',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621774347,
'updated_at' => 1622378781,
'deleted_at' => 0,
'creator_id' => 1,
),
8 =>
array (
'id' => 9,
'api_title' => '获取商品列表',
'api_name' => 'product/spu/get_list',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/spu/get_list',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '{"status":5}',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/get_spu_list.html',
'document' => '参考文档URL',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1621777668,
'updated_at' => 1622378754,
'deleted_at' => 0,
'creator_id' => 1,
),
9 =>
array (
'id' => 10,
'api_title' => '搜索商品',
'api_name' => 'product/spu/search',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/spu/search',
'methods' => 'POST',
'auth' => NULL,
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '{\'status\':5,\'keyword\':\'UI\',\'page\':1}',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/search_spu.html',
'document' => '参考文档url',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 1,
'memo' => NULL,
'created_at' => 1622000389,
'updated_at' => 1622378719,
'deleted_at' => 0,
'creator_id' => 1,
),
10 =>
array (
'id' => 11,
'api_title' => '上架商品',
'api_name' => 'product/spu/listing',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/spu/listing',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '{\'product_id\':\'33541981\'}',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/up_spu_listing.html',
'document' => '参考文档URL',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622019456,
'updated_at' => 1622378710,
'deleted_at' => 0,
'creator_id' => 1,
),
11 =>
array (
'id' => 12,
'api_title' => '下架商品',
'api_name' => 'product/spu/delisting',
'category_id' => 2,
'type' => 1,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/api/wechatopen/product/spu/delisting',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{"appid":"{{appid}}"}',
'body' => '{\'product_id\':33541981}',
'doc_url' => 'https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/up_spu_delisting.html',
'document' => '参考文档URL',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622019791,
'updated_at' => 1622378701,
'deleted_at' => 0,
'creator_id' => 1,
),
12 =>
array (
'id' => 13,
'api_title' => 'API测试用户环境新增',
'api_name' => 'ApiTesterUserenv/save',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/apiTesterUserenv',
'methods' => 'POST',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '{\'env_name\':\'api.server.local\',\'appid\':\'wx407e\',\'project_id\':1,\'selected\':0}',
'doc_url' => '无',
'document' => '新增一条API测试用户环境数据',
'sample_data' => '{\'env_name\':\'appapi.uctoo.local\',\'appid\':\'wx407e\',\'project_id\':1,\'env_json\':\'{"{{host}}":"api.server.local","{{appid}}":"wx407e","{{authorization}}":"BearereyJ0eXA"}\',\'selected\':0}',
'sample_result' => '无',
'sort' => 1,
'status' => 4,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 1,
'memo' => '',
'created_at' => 1622030621,
'updated_at' => 1622965370,
'deleted_at' => 0,
'creator_id' => 1,
),
13 =>
array (
'id' => 14,
'api_title' => 'API测试用户环境列表',
'api_name' => 'apiTesterUserenv/index',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/apiTesterUserenv',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{\'creator\':\'admin\'}',
'body' => '',
'doc_url' => '无',
'document' => 'API测试用户环境列表。可以按用户名检索环境列表在query部分增加creator筛选字段。',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622031131,
'updated_at' => 1622965325,
'deleted_at' => 0,
'creator_id' => 1,
),
14 =>
array (
'id' => 15,
'api_title' => 'API测试用户环境更新',
'api_name' => 'apiTesterUserenv/update',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/apiTesterUserenv/3',
'methods' => 'PUT',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '{\'selected\':1}',
'doc_url' => '无',
'document' => 'API地址http://127.0.0.1/apiTesterUserenv/{id}
id为数据主键。body部分为要更新的字段。',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622033581,
'updated_at' => 1622965309,
'deleted_at' => 0,
'creator_id' => 1,
),
15 =>
array (
'id' => 16,
'api_title' => '微应用列表',
'api_name' => 'applet/index',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/applet',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '{\'creator\':\'demo\'}',
'body' => '',
'doc_url' => '无',
'document' => '可在query字段用creator用户名、name应用名称、appid字段进行筛选。',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622083381,
'updated_at' => 1622965295,
'deleted_at' => 0,
'creator_id' => 1,
),
16 =>
array (
'id' => 17,
'api_title' => '设置选中微应用',
'api_name' => 'applet/setapplet/<id>',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/applet/setapplet/1',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '',
'doc_url' => '无',
'document' => '<id>参数为数据主键',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622085296,
'updated_at' => 1622965277,
'deleted_at' => 0,
'creator_id' => 1,
),
17 =>
array (
'id' => 18,
'api_title' => '获取当前选中应用',
'api_name' => 'admin/applet/<creator_id>',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/admin/applet/1',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '',
'doc_url' => '无',
'document' => '<creator_id>参数是后台用户主键ID',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622097323,
'updated_at' => 1622965263,
'deleted_at' => 0,
'creator_id' => 1,
),
18 =>
array (
'id' => 19,
'api_title' => '切换API环境',
'api_name' => 'apiTesterUserenv/selectAPIenv/<id>',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/apiTesterUserenv/selectAPIenv/1',
'methods' => 'GET',
'auth' => '',
'header' => '{"authorization":"{{authorization}}"}',
'query' => '',
'body' => '',
'doc_url' => '无',
'document' => '<id>为API环境数据主键',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622176574,
'updated_at' => 1622965231,
'deleted_at' => 0,
'creator_id' => 1,
),
19 =>
array (
'id' => 20,
'api_title' => '帐号登录',
'api_name' => 'login',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/login',
'methods' => 'POST',
'auth' => '',
'header' => '',
'query' => '',
'body' => '{"email":"catch@admin.com","password":"catchadmin"}',
'doc_url' => 'http://apidoc.catchadmin.com/web/#/5?page_id=24',
'document' => '无',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/json; charset=utf-8',
'env_id' => 0,
'memo' => '',
'created_at' => 1622429937,
'updated_at' => 1622460840,
'deleted_at' => 0,
'creator_id' => 1,
),
20 =>
array (
'id' => 21,
'api_title' => '微信扫码登录后获取后台帐号',
'api_name' => 'wechatlogin/wechatoauth',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/wechatlogin/wechatoauth',
'methods' => 'GET',
'auth' => '',
'header' => '',
'query' => '{"code":"0712VE1"}',
'body' => '',
'doc_url' => 'https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html',
'document' => '微信扫码登录后,在跳转到的页面需要先调用此接口获取微信用户关联的后台管理员帐号列表。根据此接口返回的帐号列表信息,展示帐号名,用户可以点选登录对应帐号。如此接口返回空值,则展示用户注册后台帐号页面。
Query参数
必填参数
code微信扫码登录后微信服务器通知跳转到redirect_url时添加的code参数用于获取微信用户access_token
非必填参数
state扫码登录时添加的随机验证字符串。前端自定义。前端自验证。
返回值accountList 包含扫码登录后获得的 openidaccess_token以及关联的后台帐号列表
',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/x-www-form-urlencoded',
'env_id' => 0,
'memo' => '',
'created_at' => 1622539671,
'updated_at' => 1622709792,
'deleted_at' => 0,
'creator_id' => 1,
),
21 =>
array (
'id' => 22,
'api_title' => '扫码登录后注册用户帐号',
'api_name' => 'wechatlogin/wechatregist',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/wechatlogin/wechatregist',
'methods' => 'POST',
'auth' => '',
'header' => '',
'query' => '',
'body' => '{"username":"13688888888","password":"123456","email":"demo@uctoo.com","openid":"openid","access_token":"access_token"}',
'doc_url' => '无',
'document' => 'openid和access_token是微信扫码登录后获取到的值用于调用帐号注册接口权限验证。
username建议采用用户手机号码并进行短信验证。
password建议校验密码复杂度。
email建议进行邮箱验证。可作为密码找回方式之一。',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/json; charset=utf-8',
'env_id' => 0,
'memo' => '',
'created_at' => 1622710277,
'updated_at' => 1622876680,
'deleted_at' => 0,
'creator_id' => 1,
),
22 =>
array (
'id' => 23,
'api_title' => '微信扫码登录后选择帐号登录',
'api_name' => 'wechatlogin/wechatlogin',
'category_id' => 5,
'type' => 2,
'appid' => '',
'project_id' => '',
'api_url' => '{{host}}/wechatlogin/wechatlogin',
'methods' => 'POST',
'auth' => '',
'header' => '',
'query' => '',
'body' => '{"email":"demo@uctoo.com","openid":"openid","access_token":"access_token","password":"any"}',
'doc_url' => '无',
'document' => '微信扫码后,选择帐号登录。
openid和access_token是在扫码授权后获得。
password参数必须传可以是任意值不做验证。',
'sample_data' => '无',
'sample_result' => '无',
'sort' => 1,
'status' => 1,
'content_type' => 'application/json; charset=utf-8',
'env_id' => 0,
'memo' => '',
'created_at' => 1622713987,
'updated_at' => 1622876660,
'deleted_at' => 0,
'creator_id' => 1,
),
);
foreach ($data as $item) {
\catchAdmin\apimanager\model\ApiTester::create($item);
}
}
}

View File

@@ -1,59 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
use think\migration\Seeder;
class ApiTesterUserenvSeed extends Seeder
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run(): void
{
$data = array (
0 =>
array (
'id' => 1,
'env_name' => 'localhost',
'appid' => 'wx407e4',
'project_id' => '1',
'env_json' => '{"{{host}}":"http://127.0.0.1:8000","{{status}}":"5","{{appid}}":"wx407","{{authorization}}":"Bearer{{手动替换为login接口的token}}"}',
'selected' => 1,
'created_at' => 1622029539,
'updated_at' => 1622386890,
'deleted_at' => 0,
'creator_id' => 1,
),
1 =>
array (
'id' => 2,
'env_name' => 'api.server.local',
'appid' => 'wx407',
'project_id' => '1',
'env_json' => '{"{{host}}":"http://api.server.local"}',
'selected' => 0,
'created_at' => 1622030904,
'updated_at' => 1622386890,
'deleted_at' => 0,
'creator_id' => 1,
),
);
foreach ($data as $item) {
\catchAdmin\apimanager\model\ApiTesterUserenv::create($item);
}
}
}

View File

@@ -1,460 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
use think\migration\Seeder;
class ApimanagerMenusSeed extends Seeder {
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run(): void
{
\catcher\Utils::importTreeData($this->getPermissions(), 'permissions', 'parent_id');
}
protected function getPermissions() {
return [
0 => [
'id' => 143,
'permission_name' => 'API管理',
'parent_id' => 0,
'level' => '',
'route' => '/apimanager',
'icon' => 'el-icon-sort',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apimanager',
'component' => 'layout',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621425807,
'updated_at' => 1621427128,
'deleted_at' => 0,
'children' => [
0 => [
'id' => 144,
'permission_name' => 'API分类',
'parent_id' => 143,
'level' => '',
'route' => '/apicategory',
'icon' => 'el-icon-s-grid',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apicategory',
'component' => 'apicategory',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 10,
'created_at' => 1621413029,
'updated_at' => 1624010103,
'deleted_at' => 0,
'children' => [
0 => [
'id' => 151,
'permission_name' => '列表',
'parent_id' => 144,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apicategory@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779121,
'updated_at' => 1624010103,
'deleted_at' => 0,
],
1 => [
'id' => 152,
'permission_name' => '创建',
'parent_id' => 144,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apicategory@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779137,
'updated_at' => 1624010103,
'deleted_at' => 0,
],
2 => [
'id' => 153,
'permission_name' => '更新',
'parent_id' => 144,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apicategory@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779154,
'updated_at' => 1624010103,
'deleted_at' => 0,
],
3 => [
'id' => 154,
'permission_name' => '读取',
'parent_id' => 144,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apicategory@read',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779171,
'updated_at' => 1624010103,
'deleted_at' => 0,
],
4 => [
'id' => 155,
'permission_name' => '删除',
'parent_id' => 144,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apicategory@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779186,
'updated_at' => 1624010103,
'deleted_at' => 0,
],
],
],
1 => [
'id' => 145,
'permission_name' => 'API测试列表',
'parent_id' => 143,
'level' => '',
'route' => '/apitester',
'icon' => 'el-icon-stopwatch',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apitester',
'component' => 'apitester',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621479275,
'updated_at' => 1624010086,
'deleted_at' => 0,
'children' => [
0 => [
'id' => 146,
'permission_name' => '列表',
'parent_id' => 145,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apitester@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621778966,
'updated_at' => 1624010086,
'deleted_at' => 0,
],
1 => [
'id' => 147,
'permission_name' => '创建',
'parent_id' => 145,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apitester@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779011,
'updated_at' => 1624010086,
'deleted_at' => 0,
],
5 => [
'id' => 148,
'permission_name' => '更新',
'parent_id' => 145,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apitester@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779033,
'updated_at' => 1624010086,
'deleted_at' => 0,
],
2 => [
'id' => 149,
'permission_name' => '读取',
'parent_id' => 145,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apitester@read',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779051,
'updated_at' => 1624010086,
'deleted_at' => 0,
],
3 => [
'id' => 150,
'permission_name' => '删除',
'parent_id' => 145,
'level' => '',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apitester@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621779083,
'updated_at' => 1624010086,
'deleted_at' => 0,
],
],
],
2 => [
'id' => 156,
'permission_name' => 'API运行',
'parent_id' => 143,
'level' => '',
'route' => '/apimanager/apirun',
'icon' => 'el-icon-position',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apirun',
'component' => 'apirun',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 2,
'sort' => 1,
'created_at' => 1621798022,
'updated_at' => 1621831249,
'deleted_at' => 0,
],
3 => [
'id' => 161,
'permission_name' => 'API环境变量',
'parent_id' => 143,
'level' => '',
'route' => '/apienv',
'icon' => 'el-icon-setting',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'apienv',
'component' => 'apienv',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622176953,
'updated_at' => 1622177106,
'deleted_at' => 0,
],
4 => [
'id' => 281,
'permission_name' => '路由列表',
'parent_id' => 143,
'level' => '143',
'route' => '/apimanager/routeList/curd',
'icon' => 'el-icon-link',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'routeList',
'component' => 'apimanager_routeList',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 0,
'created_at' => 1636624116,
'updated_at' => 1636689266,
'deleted_at' => 0,
'children' => [
0 => [
'id' => 282,
'permission_name' => '列表',
'parent_id' => 281,
'level' => '143-281',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'routeList@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1636624117,
'updated_at' => 1636689266,
'deleted_at' => 0,
],
1 => [
'id' => 283,
'permission_name' => '保存',
'parent_id' => 281,
'level' => '143-281',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'routeList@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1636624117,
'updated_at' => 1636689266,
'deleted_at' => 0,
],
2 => [
'id' => 284,
'permission_name' => '读取',
'parent_id' => 281,
'level' => '143-281',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'routeList@read',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1636624118,
'updated_at' => 1636689266,
'deleted_at' => 0,
],
3 => [
'id' => 285,
'permission_name' => '更新',
'parent_id' => 281,
'level' => '143-281',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'routeList@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1636624118,
'updated_at' => 1636689266,
'deleted_at' => 0,
],
4 => [
'id' => 286,
'permission_name' => '删除',
'parent_id' => 281,
'level' => '143-281',
'route' => '',
'icon' => '',
'module' => 'apimanager',
'creator_id' => 1,
'permission_mark' => 'routeList@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1636624119,
'updated_at' => 1636689266,
'deleted_at' => 0,
],
],
],
],
],
];
}
}

View File

@@ -1,92 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model;
use catchAdmin\apimanager\model\search\ApiCategorySearch;
use catcher\base\CatchModel as Model;
use think\db\exception\DbException;
/**
*
* @property int $id
* @property string $category_title
* @property int $parent_id
* @property string $category_name
* @property int $status
* @property int $sort
* @property int $created_at
* @property int $updated_at
* @property int $deleted_at
* @property int $creator_id
*/
class ApiCategory extends Model
{
use ApiCategorySearch;
// 表名
public $name = 'api_category';
// 数据库字段映射
public $field = array(
'id',
// 分类标题
'category_title',
// 父级ID
'parent_id',
// 分类唯一标识
'category_name',
// 状态:1=正常;2=停用
'status',
// 排序字段
'sort',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除字段
'deleted_at',
// 创建人ID
'creator_id',
);
protected $updateChildrenFields = 'status';
/**
* 列表数据
*
* @time 2020年01月09日
* @return array
* @throws DbException
*/
public function getList(): array
{
return $this->catchSearch()
->catchOrder()
->select()->toTree();
}
/**
* 获取子分类IDS
*
* @time 2020年11月04日
* @param $id
* @throws DbException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @return mixed
*/
public static function getChildrenCategoryIds($id)
{
$categoryIds = ApiCategory::field(['id', 'parent_id'])->select()->getAllChildrenIds([$id]);
$categoryIds[] = $id;
return $categoryIds;
}
}

View File

@@ -1,104 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model;
use catcher\base\CatchModel as Model;
use catchAdmin\apimanager\model\search\ApiTesterSearch;
/**
*
* @property int $id
* @property string $api_title
* @property string $api_name
* @property int $category_id
* @property int $type
* @property string $appid
* @property string $project_id
* @property string $api_url
* @property string $methods
* @property string $auth
* @property string $header
* @property string $query
* @property string $body
* @property string $doc_url
* @property string $document
* @property string $sample_data
* @property string $sample_result
* @property int $sort
* @property int $status
* @property string $content_type
* @property int $env_id
* @property string $memo
* @property int $created_at
* @property int $updated_at
* @property int $deleted_at
* @property int $creator_id
*/
class ApiTester extends Model
{
use ApiTesterSearch;
// 表名
public $name = 'api_tester';
// 数据库字段映射
public $field = array(
'id',
// 标题
'api_title',
// 英文唯一标识
'api_name',
// 分类
'category_id',
// 数据源类型:1=remote,2=local
'type',
// appid
'appid',
// 项目ID
'project_id',
// API URL
'api_url',
// 方法:POST,GET,PUT,PATCH,DELETE,COPY,HEAD,OPTIONS
'methods',
// 鉴权
'auth',
// header
'header',
// query
'query',
// body
'body',
// 文档URL
'doc_url',
// 文档
'document',
// 示例数据
'sample_data',
// 示例返回数据
'sample_result',
// 排序
'sort',
// 状态:1=已完成,2=待开发,3=开发中,4=已废弃
'status',
// content-type:application/x-www-form-urlencoded,multipart/form-data,raw
'content_type',
// 环境ID
'env_id',
// 备注
'memo',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除字段
'deleted_at',
// 创建人ID
'creator_id',
);
}

View File

@@ -1,60 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model;
use catcher\base\CatchModel as Model;
/**
*
* @property int $id
* @property string $appid
* @property int $user_id
* @property int $api_id
* @property string $params
* @property string $result
* @property string $request_data
* @property string $response_data
* @property int $created_at
* @property int $updated_at
* @property int $deleted_at
* @property int $creator_id
*/
class ApiTesterLog extends Model
{
// 表名
public $name = 'api_tester_log';
// 数据库字段映射
public $field = array(
'id',
// appid
'appid',
// users表id
'user_id',
// api_tester表id
'api_id',
// api参数
'params',
// 返回值
'result',
// 请求数据
'request_data',
// 响应数据
'response_data',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除字段
'deleted_at',
// 创建人ID
'creator_id',
);
}

View File

@@ -1,76 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model;
use catchAdmin\permissions\model\DataRangScopeTrait;
use catchAdmin\permissions\model\Users;
use catchAdmin\apimanager\model\search\ApiTesterUserenvSearch;
use catcher\base\CatchModel as Model;
/**
*
* @property int $id
* @property string $env_name
* @property string $appid
* @property string $project_id
* @property string $env_json
* @property int $selected
* @property int $created_at
* @property int $updated_at
* @property int $deleted_at
* @property int $creator_id
*/
class ApiTesterUserenv extends Model
{
use ApiTesterUserenvSearch;
use DataRangScopeTrait;
// 表名
public $name = 'api_tester_userenv';
// 数据库字段映射
public $field = array(
'id',
// 环境名称
'env_name',
// appid
'appid',
// 项目ID
'project_id',
// 环境变量json
'env_json',
// 是否当前选中:0=否,1=是
'selected',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除字段
'deleted_at',
// 创建人ID
'creator_id',
);
/**
* get list
*
* @time 2020年04月28日
* @param $params
* @throws \think\db\exception\DbException
* @return void
*/
public function getList()
{
return $this->dataRange()->field([$this->aliasField('*')])
->catchJoin(Users::class, 'id', 'creator_id', ['username as creator'])
->catchSearch()
->order($this->aliasField('id'), 'desc')
->paginate();
}
}

View File

@@ -1,66 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model;
use catchAdmin\apimanager\model\search\RouteListSearch;
use catcher\base\CatchModel as Model;
/**
*
* @property int $id
* @property string $rule
* @property string $route
* @property string $method
* @property string $name
* @property string $domain
* @property string $option
* @property string $pattern
* @property string $title
* @property int $created_at
* @property int $updated_at
* @property int $deleted_at
* @property int $creator_id
*/
class RouteList extends Model
{
use RouteListSearch;
public $field = [
//
'id',
//
'rule',
//
'route',
//
'method',
//
'name',
//
'domain',
//
'option',
//
'pattern',
//
'title',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除字段
'deleted_at',
// 创建人ID
'creator_id',
];
public $name = 'route_list';
}

View File

@@ -1,25 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model\search;
trait ApiCategorySearch
{
public function searchCategoryTitleAttr($query, $value, $data)
{
return $query->whereLike('category_title', $value);
}
public function searchStatusAttr($query, $value, $data)
{
return $query->where('status', $value);
}
}

View File

@@ -1,54 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model\search;
use catchAdmin\apimanager\model\ApiCategory;
trait ApiTesterSearch
{
public function searchApiTitleAttr($query, $value, $data)
{
return $query->whereLike('api_title', $value);
}
public function searchApiNameAttr($query, $value, $data)
{
return $query->whereLike('api_name', $value);
}
public function searchStatusAttr($query, $value, $data)
{
return $query->where($this->aliasField('status'), $value);
}
public function searchTypeAttr($query, $value, $data)
{
return $query->where($this->aliasField('type'), $value);
}
/**
* 查询分类下的API
*
* @time 2021年05月20日
* @param $query
* @param $value
* @param $data
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return mixed
*/
public function searchCategoryIdAttr($query, $value, $data)
{
return $query->whereIn($this->aliasField('category_id'), ApiCategory::getChildrenCategoryIds($value));
}
}

View File

@@ -1,28 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model\search;
use catchAdmin\permissions\model\Users;
trait ApiTesterUserenvSearch
{
public function searchCreatorAttr($query, $value, $data)
{
return $query->whereLike(app(Users::class)->getTable() . '.username', $value);
}
public function searchEnvNameAttr($query, $value, $data)
{
return $query->whereLike('env_name', $value);
}
}

View File

@@ -1,50 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\model\search;
use catchAdmin\apimanager\model\ApiCategory;
trait RouteListSearch
{
public function searchRuleAttr($query, $value, $data)
{
return $query->whereLike('rule', $value);
}
public function searchRouteAttr($query, $value, $data)
{
return $query->whereLike('route', $value);
}
public function searchMethodAttr($query, $value, $data)
{
return $query->whereLike('method', $value);
}
public function searchNameAttr($query, $value, $data)
{
return $query->whereLike('name', $value);
}
public function searchDomainAttr($query, $value, $data)
{
return $query->whereLike('domain', $value);
}
public function searchOptionAttr($query, $value, $data)
{
return $query->whereLike('option', $value);
}
public function searchPatternAttr($query, $value, $data)
{
return $query->whereLike('pattern', $value);
}
}

View File

@@ -1,17 +0,0 @@
{
"name": "API管理",
"alias": "apimanager",
"description": "UCToo API管理",
"version": "1.0.0",
"keywords": [
"API"
],
"order": 0,
"services": [
"\\catchAdmin\\apimanager\\ApimanagerService"
],
"aliases": [],
"files": [],
"requires": [],
"enable": true
}

View File

@@ -1,66 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\repository;
use catchAdmin\permissions\middleware\PermissionsMiddleware;
use catchAdmin\apimanager\model\RouteList;
use catcher\base\CatchRepository;
use catcher\exceptions\FailedException;
use think\facade\Console;
use think\facade\Log;
use think\facade\Db;
class RouteListRepository extends CatchRepository
{
protected $routeList;
public function __construct(RouteList $routeList)
{
$this->routeList = $routeList;
}
protected function model()
{
return $this->routeList;
}
public function all()
{
$routeList = $this->routeList->select();
return $routeList->toArray();
}
/**
* 同步
*
* @time 2020年06月26日
* @throws \Exception
* @return bool
*/
public function sync()
{
DB::table('route_list')->delete(true);
Console::call('route:list', ['-m']); //没用也不是从命令生成的route_list文件读的数据就是想执行一下命令
$routeList = app()->route->getRuleList();
$rows = [];
foreach ($routeList as $item) {
$item['route'] = $item['route'] instanceof \Closure ? '<Closure>' : $item['route'];
$item['option'] = json_encode($item['option']);
$item['pattern'] = json_encode($item['pattern']);
$rows[] = $item;
}
$res = $this->routeList->saveAll($rows);
return true;
}
}

View File

@@ -1,29 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
// you should use `$router`
/* @var think\Route $router */
$router->group(function () use ($router){
// apiCategory路由
$router->resource('apicategory', '\catchAdmin\apimanager\controller\ApiCategory');
// apiTester路由
$router->resource('apitester', '\catchAdmin\apimanager\controller\ApiTester');
// apiTesterUserenv路由
$router->resource('apiTesterUserenv', '\catchAdmin\apimanager\controller\ApiTesterUserenv');
// 切换API环境
$router->get('apiTesterUserenv/selectAPIenv/<id>', '\catchAdmin\apimanager\controller\ApiTesterUserenv@selectAPIenv');
// apiTesterLog路由
$router->resource('apiTesterLog', '\catchAdmin\apimanager\controller\ApiTesterLog');
// routeList 路由
$router->resource('routeList', catchAdmin\apimanager\controller\RouteList::class);
$router->post('apimanager/routelist/sync', 'catchAdmin\apimanager\controller\RouteList@sync');
})->middleware('auth');

View File

@@ -1,61 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\tables;
use catchAdmin\apimanager\tables\forms\Factory;
use catcher\CatchTable;
use catcher\library\table\Actions;
use catcher\library\table\HeaderItem;
use catcher\library\table\Search;
use catcher\library\table\Table;
class ApiCategory extends CatchTable
{
/**
* table
*
* @time 2021年03月29日
* @return array
*/
protected function table(): array
{
// TODO: Implement table() method.
return $this->getTable('api_category')->header([
HeaderItem::label('分类标题')->prop('category_title'),
HeaderItem::label('分类唯一标识')->prop('category_name'),
HeaderItem::label('排序')->prop('sort')->withEditNumberComponent(),
HeaderItem::label('状态')->prop('status')->withSwitchComponent(),
HeaderItem::label('创建时间')->prop('created_at'),
HeaderItem::label('操作')->width(260)->actions([
Actions::update(),
Actions::delete(),
])
])->withApiRoute('apicategory')->withActions([
Actions::create()
])->withSearch([
Search::label('分类标题')->text('category_title', '请输入分类标题'),
Search::label('状态')->status()
])->withDialogWidth('35%')
->toTreeTable()->render();
}
/**
* form 方式
*
* @time 2021年03月29日
* @return array
*/
protected function form(): array
{
return Factory::create('ApiCategory');
}
}

View File

@@ -1,40 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\tables\forms;
use catchAdmin\apimanager\model\ApiCategory as ApiCategoryModel;
use catcher\library\form\Form;
class ApiCategory extends Form
{
public function fields(): array
{
return [
// TODO: Implement fields() method
Form::cascader('parent_id', '上级分类', [0])->options(
ApiCategoryModel::field(['id', 'parent_id', 'category_title'])->select()->toTree()
)->clearable(true)->filterable(true)->props([
'props' => [
'value' => 'id',
'label' => 'category_title',
'checkStrictly' => true
],
])->style(['width' => '100%']),
Form::input('category_title', '分类标题')->required()->placeholder('分类标题'),
Form::input('category_name', '分类唯一标识'),
Form::radio('status', '状态')->value(1)->options(
Form::options()->add('启用', 1)->add('禁用', 2)->render()
),
Form::number('sort', '排序')->value(1)->min(1)->max(10000),
];
}
}

View File

@@ -1,22 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | UCToo [ Universal Convergence Technology ]
// +----------------------------------------------------------------------
// | Copyright (c) 2014-2021 https://www.uctoo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: UCToo <contact@uctoo.com>
// +----------------------------------------------------------------------
namespace catchAdmin\apimanager\tables\forms;
use catcher\library\form\FormFactory;
class Factory extends FormFactory
{
public static function from(): string
{
return __NAMESPACE__;
}
}

View File

@@ -1,25 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms;
use catcher\ModuleService;
class CmsService extends ModuleService
{
public function loadRouteFrom()
{
// TODO: Implement loadRouteFrom() method.
return __DIR__ . DIRECTORY_SEPARATOR . 'route.php';
}
}

View File

@@ -1,6 +0,0 @@
## 内容管理系统
#### 安装
```shell
composer require xaboy/form-builder:~2.0
```

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Articles as articlesModel;
class Articles extends CatchController
{
protected $articlesModel;
public function __construct(ArticlesModel $articlesModel)
{
$this->articlesModel = $articlesModel;
}
/**
* 列表
* @time 2020年12月27日 19:40
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->articlesModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 19:40
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->articlesModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 19:40
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->articlesModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 19:40
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->articlesModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 19:40
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->articlesModel->deleteBy($id));
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Banners as bannersModel;
class Banners extends CatchController
{
protected $bannersModel;
public function __construct(BannersModel $bannersModel)
{
$this->bannersModel = $bannersModel;
}
/**
* 列表
* @time 2020年12月27日 19:58
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->bannersModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 19:58
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->bannersModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 19:58
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->bannersModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 19:58
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->bannersModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 19:58
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->bannersModel->deleteBy($id));
}
}

View File

@@ -1,91 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchAdmin;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Category as categoryModel;
use catcher\CatchUpload;
use catcher\library\excel\reader\Reader;
use think\Exception;
use think\facade\Db;
class Category extends CatchController
{
protected $categoryModel;
public function __construct(CategoryModel $categoryModel)
{
$this->categoryModel = $categoryModel;
}
/**
* 列表
* @time 2020年12月27日 19:15
* @param Request $request
* @return \think\response\Json
*/
public function index(Request $request)
{
return CatchResponse::success($this->categoryModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 19:15
* @param Request $request
* @return \think\response\Json
*/
public function save(Request $request)
{
return CatchResponse::success($this->categoryModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 19:15
* @param $id
* @return \think\response\Json
*/
public function read($id)
{
return CatchResponse::success($this->categoryModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 19:15
* @param Request $request
* @param $id
* @return \think\response\Json
*/
public function update(Request $request, $id)
{
return CatchResponse::success($this->categoryModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 19:15
* @param $id
* @return \think\response\Json
*/
public function delete($id)
{
return CatchResponse::success($this->categoryModel->deleteBy($id));
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Comments as commentsModel;
class Comments extends CatchController
{
protected $commentsModel;
public function __construct(CommentsModel $commentsModel)
{
$this->commentsModel = $commentsModel;
}
/**
* 列表
* @time 2020年12月27日 19:53
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->commentsModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 19:53
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->commentsModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 19:53
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->commentsModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 19:53
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->commentsModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 19:53
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->commentsModel->deleteBy($id));
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\FormData as formDataModel;
class FormData extends CatchController
{
protected $formDataModel;
public function __construct(FormDataModel $formDataModel)
{
$this->formDataModel = $formDataModel;
}
/**
* 列表
* @time 2020年12月27日 20:35
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->formDataModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 20:35
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->formDataModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 20:35
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->formDataModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 20:35
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->formDataModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 20:35
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->formDataModel->deleteBy($id));
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\FormFields as formFieldsModel;
class FormFields extends CatchController
{
protected $formFieldsModel;
public function __construct(FormFieldsModel $formFieldsModel)
{
$this->formFieldsModel = $formFieldsModel;
}
/**
* 列表
* @time 2020年12月27日 20:28
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->formFieldsModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 20:28
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->formFieldsModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 20:28
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->formFieldsModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 20:28
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->formFieldsModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 20:28
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->formFieldsModel->deleteBy($id));
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Forms as formsModel;
class Forms extends CatchController
{
protected $formsModel;
public function __construct(FormsModel $formsModel)
{
$this->formsModel = $formsModel;
}
/**
* 列表
* @time 2020年12月27日 20:19
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->formsModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 20:19
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->formsModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 20:19
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->formsModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 20:19
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->formsModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 20:19
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->formsModel->deleteBy($id));
}
}

View File

@@ -1,95 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catchAdmin\cms\support\Table;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\ModelFields as ModelFieldsModel;
use catchAdmin\cms\model\Models;
use catcher\exceptions\FailedException;
class ModelFields extends CatchController
{
protected $modelFields;
public function __construct(ModelFieldsModel $modelFields)
{
$this->modelFields = $modelFields;
}
/**
* 列表
* @time 2020年12月29日 21:00
* @param Request $request
* @param Models $models
* @return \think\response\Json
*/
public function index(Request $request): \think\response\Json
{
// $columns = Table::columns($models::where('id',$request->param('model_id'))->value('table_name'));
//foreach ($columns as &$column) {
// $column['title'] = $column['comment'];
// }
return CatchResponse::success($this->modelFields->getFieldsByModelId($request->param('model_id')));
}
/**
* 保存信息
* @time 2020年12月29日 21:00
* @param Request $request
* @return \think\response\Json
*/
public function save(Request $request): \think\response\Json
{
return CatchResponse::success($this->modelFields->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月29日 21:00
* @param $id
* @return \think\response\Json
*/
public function read($id): \think\response\Json
{
return CatchResponse::success($this->modelFields->findBy($id));
}
/**
* 更新
* @time 2020年12月29日 21:00
* @param Request $request
* @param $id
* @return \think\response\Json
*/
public function update(Request $request, $id): \think\response\Json
{
return CatchResponse::success($this->modelFields->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月29日 21:00
* @param $id
* @return \think\response\Json
*/
public function delete($id): \think\response\Json
{
return CatchResponse::success($this->modelFields->deleteBy($id));
}
}

View File

@@ -1,85 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Models as CmsModel;
class Models extends CatchController
{
protected $cmsModel;
public function __construct(CmsModel $cmsModel)
{
$this->cmsModel = $cmsModel;
}
/**
* 列表
* @time 2020年12月29日 20:02
* @param Request $request
* @return \think\response\Json
*/
public function index(Request $request): \think\response\Json
{
return CatchResponse::paginate($this->cmsModel->getList());
}
/**
* 保存信息
* @time 2020年12月29日 20:02
* @param Request $request
* @return \think\response\Json
*/
public function save(Request $request): \think\response\Json
{
return CatchResponse::success($this->cmsModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月29日 20:02
* @param $id
* @return \think\response\Json
*/
public function read($id): \think\response\Json
{
return CatchResponse::success($this->cmsModel->findBy($id));
}
/**
* 更新
* @time 2020年12月29日 20:02
* @param Request $request
* @param $id
* @return \think\response\Json
*/
public function update(Request $request, $id): \think\response\Json
{
return CatchResponse::success($this->cmsModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月29日 20:02
* @param $id
* @return \think\response\Json
*/
public function delete($id): \think\response\Json
{
return CatchResponse::success($this->cmsModel->deleteBy($id));
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\SiteLinks as siteLinksModel;
class SiteLinks extends CatchController
{
protected $siteLinksModel;
public function __construct(SiteLinksModel $siteLinksModel)
{
$this->siteLinksModel = $siteLinksModel;
}
/**
* 列表
* @time 2020年12月27日 20:02
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->siteLinksModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 20:02
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->siteLinksModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 20:02
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->siteLinksModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 20:02
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->siteLinksModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 20:02
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->siteLinksModel->deleteBy($id));
}
}

View File

@@ -1,69 +0,0 @@
<?php
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Tags as tagsModel;
class Tags extends CatchController
{
protected $tagsModel;
public function __construct(TagsModel $tagsModel)
{
$this->tagsModel = $tagsModel;
}
/**
* 列表
* @time 2020年12月27日 19:44
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->tagsModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 19:44
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->tagsModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 19:44
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->tagsModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 19:44
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->tagsModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 19:44
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->tagsModel->deleteBy($id));
}
}

View File

@@ -1,69 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catchAdmin\system\model\Attachments;
use catcher\base\CatchController;
use catcher\base\CatchRequest;
use catcher\CatchResponse;
use catcher\CatchUpload;
use catcher\exceptions\FailedException;
class Upload extends CatchController
{
protected $attachment;
public function __construct(Attachments $attachment)
{
$this->attachment = $attachment;
}
/**
* image upload
*
* @time 2020年01月25日
* @param CatchRequest $request
* @param CatchUpload $upload
* @return \think\response\Json
*/
public function image(CatchRequest $request, CatchUpload $upload): \think\response\Json
{
$images = $request->file();
if (!$images) {
throw new FailedException('请选择图片上传');
}
return CatchResponse::success([
'filePath' => $upload->checkImages($images)->multiUpload($images['image'])
]);
}
/**
* file upload
*
* @time 2020年01月25日
* @param CatchRequest $request
* @param CatchUpload $upload
* @return \think\response\Json
*/
public function file(CatchRequest $request, CatchUpload $upload): \think\response\Json
{
$files = $request->file();
return CatchResponse::success([
'src' => $upload->checkFiles($files)->multiUpload($files['file'])
]);
}
}

View File

@@ -1,80 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\controller;
use catcher\base\CatchRequest as Request;
use catcher\CatchResponse;
use catcher\base\CatchController;
use catchAdmin\cms\model\Users as usersModel;
class Users extends CatchController
{
protected $usersModel;
public function __construct(UsersModel $usersModel)
{
$this->usersModel = $usersModel;
}
/**
* 列表
* @time 2020年12月27日 19:04
* @param Request $request
*/
public function index(Request $request) : \think\Response
{
return CatchResponse::paginate($this->usersModel->getList());
}
/**
* 保存信息
* @time 2020年12月27日 19:04
* @param Request $request
*/
public function save(Request $request) : \think\Response
{
return CatchResponse::success($this->usersModel->storeBy($request->post()));
}
/**
* 读取
* @time 2020年12月27日 19:04
* @param $id
*/
public function read($id) : \think\Response
{
return CatchResponse::success($this->usersModel->findBy($id));
}
/**
* 更新
* @time 2020年12月27日 19:04
* @param Request $request
* @param $id
*/
public function update(Request $request, $id) : \think\Response
{
return CatchResponse::success($this->usersModel->updateBy($id, $request->post()));
}
/**
* 删除
* @time 2020年12月27日 19:04
* @param $id
*/
public function delete($id) : \think\Response
{
return CatchResponse::success($this->usersModel->deleteBy($id));
}
}

View File

@@ -1,44 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsHomeUsers extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_users', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '用户表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('username', 'string', ['limit' => 100,'null' => true,'signed' => true,'comment' => '用户名',])
->addColumn('email', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '邮箱',])
->addColumn('mobile', 'string', ['limit' => 50,'null' => false,'default' => '','signed' => true,'comment' => '手机号',])
->addColumn('avatar', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '头像',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 正常 2 禁用',])
->addColumn('password', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '密码',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,53 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsCategory extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_category', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '分类表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('name', 'string', ['limit' => 100,'null' => true,'signed' => true,'comment' => '栏目名称',])
->addColumn('parent_id', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 0,'signed' => true,'comment' => '父级ID',])
->addColumn('title', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'seo标题',])
->addColumn('keywords', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'seo关键词',])
->addColumn('description', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '描述',])
->addColumn('url', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '自定义 URL',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '状态',])
->addColumn('is_can_contribute', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '是否可以投稿',])
->addColumn('is_can_comment', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '是否可以评论',])
->addColumn('type', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '页面模式',])
->addColumn('weight', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 1,'signed' => true,'comment' => '权重',])
// ->addColumn('is_link_out', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '1 是 2 否',])
->addColumn('link_to', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '链接外部地址',])
->addColumn('limit', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 10,'signed' => true,'comment' => '每页数量',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,54 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsArticles extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_articles', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '文章表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('title', 'string', ['limit' => 255,'null' => true,'signed' => true,'comment' => '文章标题',])
->addColumn('category_id', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => true,'signed' => true,'comment' => '分类ID',])
->addColumn('images', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '多图集合',])
->addColumn('tags', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '标签集合',])
->addColumn('url', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '自定义URL',])
->addColumn('content', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR,'null' => false,'signed' => true,'comment' => '内容',])
->addColumn('keywords', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '关键字',])
->addColumn('description', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '描述',])
->addColumn('pv', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '浏览量',])
->addColumn('likes', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '喜欢',])
->addColumn('comments', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '评论数',])
->addColumn('is_top', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '1 置顶 2 非置顶',])
->addColumn('is_recommend', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '1 推荐 2 不推荐',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 展示 2 隐藏',])
->addColumn('is_can_comment', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 允许 2 不允许',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,43 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsTags extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_tags', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '标签表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('name', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '标签名称',])
->addColumn('title', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'seo 标签',])
->addColumn('keywords', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '关键字',])
->addColumn('description', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '描述',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,37 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsArticleRelateTags extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_article_relate_tags', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '文章关联标签表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('article_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => false,'comment' => '文章ID',])
->addColumn('tag_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => false,'comment' => '标签ID',])
->create();
}
}

View File

@@ -1,46 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsComments extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_comments', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('article_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => false,'comment' => '文章ID',])
->addColumn('content', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '内容',])
->addColumn('parent_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '父ID',])
->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => false,'comment' => '评论者ID',])
->addColumn('ip', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'ip 地址',])
->addColumn('user_agent', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'agent',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 展示 2 隐藏',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,43 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsBanners extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_banners', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'banner 图' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('title', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'banner 标题',])
->addColumn('banner_img', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'banner 图片',])
->addColumn('category_id', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 0,'signed' => true,'comment' => '默认 0 代表首页展示',])
->addColumn('link_to', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '链接地址',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,44 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsSiteLinks extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_site_links', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '友情链接' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('title', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '友情链接标题',])
->addColumn('link_to', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '跳转地址',])
->addColumn('weight', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 1,'signed' => true,'comment' => '权重',])
->addColumn('is_show', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 展示 2 隐藏',])
->addColumn('icon', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '网站图标',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,49 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsForms extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_forms', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '动态表单' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('name', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '表单名称',])
->addColumn('alias', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '表单别名',])
->addColumn('submit_url', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '表单提交的 URL',])
->addColumn('title', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '表单标题',])
->addColumn('keywords', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '关键词',])
->addColumn('description', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '描述',])
->addColumn('success_message', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '成功提示信息',])
->addColumn('failed_message', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '失败提示信息',])
->addColumn('success_link_to', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '成功后跳转',])
->addColumn('is_login_to_submit', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 需要 2 不需要',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,48 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsFormFields extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_form_fields', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '动态表单字段' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('form_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => true,'comment' => 'form id',])
->addColumn('label', 'string', ['limit' => 50,'null' => false,'default' => '','signed' => true,'comment' => '字段 label',])
->addColumn('name', 'string', ['limit' => 50,'null' => false,'default' => '','signed' => true,'comment' => '表单字段name',])
->addColumn('default_value', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '默认值',])
->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 1,'signed' => false,'comment' => '类型',])
->addColumn('rule', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '验证规则',])
->addColumn('length', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => false,'default' => 0,'signed' => true,'comment' => '字段长度',])
->addColumn('failed_message', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '验证失败信息',])
->addColumn('status', 'boolean', ['null' => false,'default' => 1,'signed' => true,'comment' => '1 展示 2 隐藏',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,44 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsFormData extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_form_data', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '动态提交的表单数据' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('form_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => true,'signed' => true,'comment' => '表单ID',])
->addColumn('data', 'json', ['null' => false,'signed' => true,'comment' => 'json字段',])
->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => true,'comment' => '用户ID',])
->addColumn('ip', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'ip 地址',])
->addColumn('user_agent', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => 'agent',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,43 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsModel extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_models', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '模型表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('name', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '模型名称',])
->addColumn('alias', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '模型别名',])
->addColumn('table_name', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '模型关联的表名,数据来源',])
->addColumn('description', 'string', ['limit' => 1000,'null' => false,'default' => '','signed' => true,'comment' => '模型描述',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,55 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
use Phinx\Db\Adapter\MysqlAdapter;
class CmsModelFields extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_model_fields', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '模型字段' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('title', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '字段中文名称',])
->addColumn('name', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '表单字段名称',])
->addColumn('type', 'string', ['limit' => 50, 'null' => false,'signed' => true,'comment' => '类型',])
->addColumn('length', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => true,'signed' => true,'comment' => '字段长度',])
->addColumn('default_value', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '默认值',])
->addColumn('options', 'string', ['limit' => 1000,'null' => false,'default' => '', 'comment' => '选项',])
->addColumn('is_index', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '是否是索引 1 是 2 否',])
->addColumn('is_unique', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '是否唯一 1 是 2 否',])
->addColumn('rules', 'string', ['limit' => 255,'null' => false,'default' => '', 'comment' => '验证规则',])
->addColumn('pattern', 'string', ['limit' => 255,'null' => false,'default' => '', 'comment' => '正则',])
->addColumn('model_id', 'integer', ['limit' => MysqlAdapter::INT_SMALL,'null' => true,'signed' => true,'comment' => '模型ID',])
->addColumn('use_at_list', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '展示在列表 1 是 2 否',])
->addColumn('use_at_detail', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '展示在详情 1 是 2 否',])
->addColumn('use_at_search', 'boolean', ['null' => false,'default' => 2,'signed' => true,'comment' => '用作是否搜索 1 是 2 否',])
->addColumn('creator_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建人ID',])
->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 1,'signed' => false,'comment' => '排序',])
->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY,'null' => false,'default' => 1,'signed' => false,'comment' => '状态 1显示 2隐藏',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,51 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
use think\migration\Migrator;
use think\migration\db\Column;
use \Phinx\Db\Adapter\MysqlAdapter;
class ModelAuxiliaryTable extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('cms_model_auxiliary_table', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '模型副表' ,'id' => 'id','signed' => true ,'primary_key' => ['id']]);
$table->addColumn('model_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => true,'comment' => '模型ID',])
->addColumn('table_name', 'string', ['limit' => 255,'null' => false,'default' => '','signed' => true,'comment' => '副表表明',])
->addColumn('used', 'integer', ['limit' => MysqlAdapter::INT_TINY,'null' => false,'default' => 2,'signed' => true,'comment' => '默认使用 1 不使用 2 使用',])
->addColumn('created_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '创建时间',])
->addColumn('updated_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '更新时间',])
->addColumn('deleted_at', 'integer', ['limit' => MysqlAdapter::INT_REGULAR,'null' => false,'default' => 0,'signed' => false,'comment' => '软删除',])
->create();
}
}

View File

@@ -1,48 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
use think\migration\Migrator;
use think\migration\db\Column;
class AddModelFields extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
if ($this->hasTable('cms_models')) {
$this->table('cms_models')
->addColumn('used_at_list', 'string', ['limit' => 512,'null' => false,'default' => '','signed' => true,'comment' => '用在列表的字段', 'after' => 'description'])
->addColumn('used_at_search', 'string', ['limit' => 512,'null' => false,'default' => '','signed' => true,'comment' => '用在搜索的字段', 'after' => 'description'])
->addColumn('used_at_detail', 'string', ['limit' => 512,'null' => false,'default' => '','signed' => true,'comment' => '用在详情的字段', 'after' => 'description'])
->update();
}
}
}

View File

@@ -1,57 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
use think\migration\Migrator;
use think\migration\db\Column;
class AddArticleColumns extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
if ($this->hasTable('cms_articles')) {
$table = $this->table('cms_articles');
$table->addColumn('weight', 'integer', [
'default' => 1,
'comment' => '文章权重',
'after' => 'status'
])->update();
$table->addColumn('cover', 'string', [
'limit' => 255,
'default' => '',
'comment' => '封面地址',
'after' => 'category_id'
])->update();
}
}
}

View File

@@ -1,44 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
use think\migration\Migrator;
use think\migration\db\Column;
class RemoveArticlesTagsField extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
if ($this->hasTable('cms_articles')) {
$this->table('cms_articles')->removeColumn('tags');
}
}
}

View File

@@ -1,47 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
use think\migration\Migrator;
use think\migration\db\Column;
class UpdateArticleColumns extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
if ($this->hasTable('cms_articles')) {
$table = $this->table('cms_articles');
$table->renameColumn('comments', 'comment_num')
->update();
}
}
}

View File

@@ -1,901 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
use think\migration\Seeder;
class CmsMenusSeed extends Seeder
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run(): void
{
\catcher\Utils::importTreeData($this->getPermissions(), 'permissions', 'parent_id');
}
protected function getPermissions()
{
return array (
0 =>
array (
'id' => 140,
'permission_name' => '内容管理',
'parent_id' => 0,
'level' => '',
'route' => 'cms',
'icon' => 'el-icon-video-camera-solid',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'cms',
'component' => 'layout',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618909227,
'updated_at' => 1620956103,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 171,
'permission_name' => '栏目管理',
'parent_id' => 140,
'level' => '140',
'route' => '/cms/category',
'icon' => 'el-icon-s-flag',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'category',
'component' => 'cmsCategory',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618912610,
'updated_at' => 1620956103,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 172,
'permission_name' => '列表',
'parent_id' => 171,
'level' => '140-171',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'category@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 0,
'created_at' => 0,
'updated_at' => 1620369713,
'deleted_at' => 0,
),
1 =>
array (
'id' => 173,
'permission_name' => '保存',
'parent_id' => 171,
'level' => '140-171',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'category@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 0,
'created_at' => 0,
'updated_at' => 1620369713,
'deleted_at' => 0,
),
2 =>
array (
'id' => 174,
'permission_name' => '更新',
'parent_id' => 171,
'level' => '140-171',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'category@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 0,
'created_at' => 0,
'updated_at' => 1620369713,
'deleted_at' => 0,
),
3 =>
array (
'id' => 175,
'permission_name' => '删除',
'parent_id' => 171,
'level' => '140-171',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'category@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 0,
'created_at' => 0,
'updated_at' => 1620369713,
'deleted_at' => 0,
),
),
),
1 =>
array (
'id' => 176,
'permission_name' => '模型管理',
'parent_id' => 140,
'level' => '',
'route' => '/cms/model',
'icon' => 'el-icon-help',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'model',
'component' => 'cmsModel',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618923203,
'updated_at' => 1620956103,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 177,
'permission_name' => '列表',
'parent_id' => 176,
'level' => '140-176',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'model@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618923203,
'updated_at' => 1620909102,
'deleted_at' => 0,
),
1 =>
array (
'id' => 178,
'permission_name' => '保存',
'parent_id' => 176,
'level' => '140-176',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'model@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618923203,
'updated_at' => 1620892464,
'deleted_at' => 0,
),
2 =>
array (
'id' => 179,
'permission_name' => '更新',
'parent_id' => 176,
'level' => '140-176',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'model@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618923203,
'updated_at' => 1620892464,
'deleted_at' => 0,
),
3 =>
array (
'id' => 180,
'permission_name' => '删除',
'parent_id' => 176,
'level' => '140-176',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'model@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1618923203,
'updated_at' => 1620892464,
'deleted_at' => 0,
),
),
),
2 =>
array (
'id' => 182,
'permission_name' => '友情链接',
'parent_id' => 140,
'level' => '140',
'route' => '/cms/site/links',
'icon' => ' el-icon-attract',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'siteLinks',
'component' => 'cmsSiteLinks',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1620548662,
'updated_at' => 1620956103,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 183,
'permission_name' => '列表',
'parent_id' => 182,
'level' => '140-182',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'siteLinks@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1620548662,
'updated_at' => 1620982550,
'deleted_at' => 0,
),
1 =>
array (
'id' => 184,
'permission_name' => '保存',
'parent_id' => 182,
'level' => '140-182',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'siteLinks@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1620548662,
'updated_at' => 1620905875,
'deleted_at' => 0,
),
2 =>
array (
'id' => 185,
'permission_name' => '更新',
'parent_id' => 182,
'level' => '140-182',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'siteLinks@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1620548662,
'updated_at' => 1620905875,
'deleted_at' => 0,
),
3 =>
array (
'id' => 186,
'permission_name' => '删除',
'parent_id' => 182,
'level' => '140-182',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'siteLinks@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1620548662,
'updated_at' => 1620905875,
'deleted_at' => 0,
),
),
),
3 =>
array (
'id' => 196,
'permission_name' => '文章管理',
'parent_id' => 140,
'level' => '',
'route' => '/cms/articles',
'icon' => 'el-icon-s-finance',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'articles',
'component' => 'cmsArticle',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621216834,
'updated_at' => 1621216834,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 197,
'permission_name' => '列表',
'parent_id' => 196,
'level' => '140-196',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'articles@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621216834,
'updated_at' => 1621216834,
'deleted_at' => 0,
),
1 =>
array (
'id' => 198,
'permission_name' => '保存',
'parent_id' => 196,
'level' => '140-196',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'articles@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621216834,
'updated_at' => 1621216834,
'deleted_at' => 0,
),
2 =>
array (
'id' => 199,
'permission_name' => '更新',
'parent_id' => 196,
'level' => '140-196',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'articles@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621216834,
'updated_at' => 1621216834,
'deleted_at' => 0,
),
3 =>
array (
'id' => 200,
'permission_name' => '删除',
'parent_id' => 196,
'level' => '140-196',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'articles@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621216834,
'updated_at' => 1621216834,
'deleted_at' => 0,
),
),
),
4 =>
array (
'id' => 203,
'permission_name' => '文章详情',
'parent_id' => 140,
'level' => '',
'route' => '/cms/articles/detail/:id?',
'icon' => 'el-icon-s-order',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'articles',
'component' => 'cmsArticleDetail',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 2,
'sort' => 1,
'created_at' => 1621475789,
'updated_at' => 1621475789,
'deleted_at' => 0,
),
5 =>
array (
'id' => 204,
'permission_name' => '标签管理',
'parent_id' => 140,
'level' => '',
'route' => '/cms/tags',
'icon' => 'el-icon-paperclip',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'tags',
'component' => 'cmsTag',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621606711,
'updated_at' => 1621607174,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 205,
'permission_name' => '列表',
'parent_id' => 204,
'level' => '140-204',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'tags@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621606711,
'updated_at' => 1621607174,
'deleted_at' => 0,
),
1 =>
array (
'id' => 206,
'permission_name' => '保存',
'parent_id' => 204,
'level' => '140-204',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'tags@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621606711,
'updated_at' => 1621607174,
'deleted_at' => 0,
),
2 =>
array (
'id' => 207,
'permission_name' => '更新',
'parent_id' => 204,
'level' => '140-204',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'tags@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621606711,
'updated_at' => 1621607174,
'deleted_at' => 0,
),
3 =>
array (
'id' => 208,
'permission_name' => '删除',
'parent_id' => 204,
'level' => '140-204',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'tags@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1621606711,
'updated_at' => 1621607174,
'deleted_at' => 0,
),
),
),
6 =>
array (
'id' => 211,
'permission_name' => '用户管理',
'parent_id' => 140,
'level' => '',
'route' => '/cms/users',
'icon' => 'el-icon-user-solid',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'users',
'component' => 'cmsUsers',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622020257,
'updated_at' => 1622020418,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 212,
'permission_name' => '列表',
'parent_id' => 211,
'level' => '140-211',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'users@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622020257,
'updated_at' => 1622020418,
'deleted_at' => 0,
),
1 =>
array (
'id' => 213,
'permission_name' => '保存',
'parent_id' => 211,
'level' => '140-211',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'users@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622020257,
'updated_at' => 1622020418,
'deleted_at' => 0,
),
2 =>
array (
'id' => 214,
'permission_name' => '更新',
'parent_id' => 211,
'level' => '140-211',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'users@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622020257,
'updated_at' => 1622020418,
'deleted_at' => 0,
),
3 =>
array (
'id' => 215,
'permission_name' => '删除',
'parent_id' => 211,
'level' => '140-211',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'users@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622020257,
'updated_at' => 1622020418,
'deleted_at' => 0,
),
),
),
7 =>
array (
'id' => 216,
'permission_name' => '评论管理',
'parent_id' => 140,
'level' => '',
'route' => '/cms/comments',
'icon' => 'el-icon-s-help',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'comments',
'component' => 'cmsComments',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622022327,
'updated_at' => 1622022327,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 217,
'permission_name' => '列表',
'parent_id' => 216,
'level' => '140-216',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'comments@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622022327,
'updated_at' => 1622022327,
'deleted_at' => 0,
),
1 =>
array (
'id' => 220,
'permission_name' => '删除',
'parent_id' => 216,
'level' => '140-216',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'comments@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622022327,
'updated_at' => 1622022327,
'deleted_at' => 0,
),
),
),
8 =>
array (
'id' => 221,
'permission_name' => '轮播管理',
'parent_id' => 140,
'level' => '',
'route' => '/cms/banners',
'icon' => 'el-icon-picture-outline-round',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'banners',
'component' => 'cmsBanners',
'redirect' => '',
'keepalive' => 1,
'type' => 1,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622073776,
'updated_at' => 1622073776,
'deleted_at' => 0,
'children' =>
array (
0 =>
array (
'id' => 222,
'permission_name' => '列表',
'parent_id' => 221,
'level' => '140-221',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'banners@index',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622073776,
'updated_at' => 1622073776,
'deleted_at' => 0,
),
1 =>
array (
'id' => 223,
'permission_name' => '保存',
'parent_id' => 221,
'level' => '140-221',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'banners@save',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622073776,
'updated_at' => 1622073776,
'deleted_at' => 0,
),
2 =>
array (
'id' => 224,
'permission_name' => '更新',
'parent_id' => 221,
'level' => '140-221',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'banners@update',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622073776,
'updated_at' => 1622073776,
'deleted_at' => 0,
),
3 =>
array (
'id' => 225,
'permission_name' => '删除',
'parent_id' => 221,
'level' => '140-221',
'route' => '',
'icon' => '',
'module' => 'cms',
'creator_id' => 1,
'permission_mark' => 'banners@delete',
'component' => '',
'redirect' => '',
'keepalive' => 1,
'type' => 2,
'hidden' => 1,
'sort' => 1,
'created_at' => 1622073776,
'updated_at' => 1622073776,
'deleted_at' => 0,
),
),
),
),
),
);
}
}

View File

@@ -1,24 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
declare(strict_types=1);
namespace catchAdmin\cms\exceptions;
use catcher\exceptions\CatchException;
class ColumnException extends CatchException
{
protected $code = 20002;
}

View File

@@ -1,23 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
declare(strict_types=1);
namespace catchAdmin\cms\exceptions;
use catcher\exceptions\CatchException;
class TableException extends CatchException
{
protected $code = 20001;
}

View File

@@ -1,196 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\events\ArticlesEvent;
use catchAdmin\cms\model\search\ArticlesSearch;
/**
* Class Articles
* @package catchAdmin\cms\model
* @auth CatchAdmin
* @time 2021年05月22日
*
* @property Articles category_id
* @property Articles id
* @property Articles title
* @property Articles cover
* @property Articles images
* @property Articles tags
* @property Articles url
* @property Articles content
* @property Articles keywords
* @property Articles description
* @property Articles pv
* @property Articles likes
* @property Articles comments
* @property Articles is_top
* @property Articles is_recommend
* @property Articles status
* @property Articles weight
* @property Articles is_can_comment
* @property Articles creator_id
* @property Articles created_at
* @property Articles updated_at
* @property Articles deleted_at
*
*/
class Articles extends BaseModel
{
use ArticlesEvent, ArticlesSearch;
// 表名
public $name = 'cms_articles';
// 数据库字段映射
public $field = array(
'id',
// 文章标题
'title',
// 分类ID
'category_id',
'cover', // 封面
// 多图集合
'images',
// 自定义URL
'url',
// 内容
'content',
// 关键字
'keywords',
// 描述
'description',
// 浏览量
'pv',
// 喜欢
'likes',
// 评论数
'comment_num',
// 1 置顶 2 非置顶
'is_top',
// 1 推荐 2 不推荐
'is_recommend',
// 1 展示 2 隐藏
'status',
'weight', // 权重
// 1 允许 2 不允许
'is_can_comment',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
const TOP = 1; // 置顶
const UN_TOP = 2; // 不置顶
const RECOMMEND = 1; // 推荐
const UN_RECOMMEND = 2; // 不推荐
const CAN_COMMENT = 1; // 评论允许
const UN_CAN_COMMENT = 2; // 评论不允许
/**
* 列表
*
* @auth CatchAdmin
* @time 2021年05月22日
* @return mixed
*/
public function getList()
{
// 分页列表
return $this->catchSearch()
->field($this->aliasField('*'))
->catchJoin(Category::class, 'id', 'category_id', ['name as category'])
->catchOrder()
->creator()
->paginate();
}
/**
* 查询
*
* @auth CatchAdmin
* @time 2021年05月22日
* @param $id
* @param array|string[] $field
* @param bool $trash
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return array|mixed|\think\Model|null
*/
public function findBy($id, array $field = ['*'], bool $trash = false)
{
return $this->where('id', $id)
->with(['tag'])
->field('*')
->find();
}
/**
* 文章标签
*
* @time 2021年05月17日
* @return \think\model\relation\BelongsToMany
*/
public function tag(): \think\model\relation\BelongsToMany
{
return $this->belongsToMany(Tags::class, 'cms_article_relate_tags',
'tag_id', 'article_id'
);
}
/**
* 删除标签
*
* @param array $ids
* @return int
* @author CatchAdmin
* @time 2021年05月22日
*/
public function detachTags(array $ids = []): int
{
return $this->tag()->detach($ids);
}
/**
* 新增标签
*
* @author CatchAdmin
* @time 2021年05月22日
* @param array $ids
* @throws \think\db\exception\DbException
* @return array|\think\model\Pivot
*/
public function attachTags(array $ids)
{
return $this->tag()->attach($ids);
}
/**
* 文章评论
*
* @time 2021年05月27日
* @return \think\model\relation\HasMany
*/
public function comments(): \think\model\relation\HasMany
{
return $this->hasMany(Comments::class, 'article_id', 'id');
}
}

View File

@@ -1,54 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\events\BannersEvent;
class Banners extends BaseModel
{
use BannersEvent;
// 表名
public $name = 'cms_banners';
// 数据库字段映射
public $field = array(
'id',
// banner 标题
'title',
// banner 图片
'banner_img',
// 默认 0 代表首页展示
'category_id',
// 链接地址
'link_to',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
public function getList()
{
return $this->catchSearch()
->field($this->aliasField('*'))
->catchLeftJoin(Category::class, 'id', 'category_id', ['name as category'])
->catchOrder()
->creator()
->paginate();
}
}

View File

@@ -1,27 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catcher\base\CatchModel as Model;
use catcher\Utils;
class BaseModel extends Model
{
public function __construct($data = [])
{
parent::__construct($data);
$this->field = $this->getTableFields(Utils::tableWithPrefix($this->name));
}
}

View File

@@ -1,105 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\events\CategoryEvent;
use catchAdmin\cms\model\scopes\CategoryScope;
class Category extends BaseModel
{
use CategoryEvent, CategoryScope;
// 表名
public $name = 'cms_category';
// 数据库字段映射
public $field = array(
'id',
// 分类名称
'name',
// 父级ID
'parent_id',
// seo标题
'title',
// seo关键词
'keywords',
// 描述
'description',
// 自定义 URL
'url',
// 1 显示 2 隐藏
'status',
// 是否可以投稿
'is_can_contribute',
// 是否可以评论
'is_can_comment',
// 是否是单页面 1 是 2 否
'type',
// 权重
'weight',
// 1 是 2 否
'is_link_out',
// 链接外部地址
'link_to',
// 创建人
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
protected $updateChildrenFields = ['status'];
const LIST_TYPE = 1; // 列表
const PAGE_TYPE = 2; // 单页
const COVER_TYPE = 3; // 封面
const CAN_COMMENT = 1; // 可以评论
const CAN_NOT_COMMENT = 2; // 不可以评论
const CAN_CONTRIBUTE = 1; // 可以投稿
const CAN_NOT_CONTRIBUTE = 2; // 不可以投稿
/**
* 列表
*
* @time 2021年03月03日
* @return mixed
*/
public function getList()
{
return $this->quickSearch()
->field(['*'])
->catchOrder()
->articlesCount()
->select()->toTree();
}
/**
* 是否存在下级
*
* @time 2021年03月03日
* @param int $id
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return array|\think\Model|null
*/
public function hasNextLevel($id = 0)
{
return $this->where('parent_id', $id ? :$this->getKey())->find();
}
}

View File

@@ -1,59 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\search\CommentsSearch;
class Comments extends BaseModel
{
use CommentsSearch;
// 表名
public $name = 'cms_comments';
// 数据库字段映射
public $field = array(
'id',
// 文章ID
'article_id',
// 内容
'content',
// 父ID
'parent_id',
// 评论者ID
'user_id',
// ip 地址
'ip',
// agent
'user_agent',
// 1 展示 2 隐藏
'status',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
public function getList()
{
return $this->catchJoin(Articles::class, 'id', 'article_id', ['title'])
->catchJoin(Users::class, 'id', 'user_id', ['username'])
->field($this->aliasField('*'))
->catchSearch()
->catchOrder()
->paginate();
}
}

View File

@@ -1,42 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
class FormData extends BaseModel
{
// 表名
public $name = 'cms_form_data';
// 数据库字段映射
public $field = array(
'id',
// 表单ID
'form_id',
// json字段
'data',
// 用户ID
'user_id',
// ip 地址
'ip',
// agent
'user_agent',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
}

View File

@@ -1,50 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
class FormFields extends BaseModel
{
// 表名
public $name = 'cms_form_fields';
// 数据库字段映射
public $field = array(
'id',
// form id
'form_id',
// 字段 label
'label',
// 表单字段name
'name',
// 默认值
'default_value',
// 类型
'type',
// 验证规则
'rule',
// 字段长度
'length',
// 验证失败信息
'failed_message',
// 1 展示 2 隐藏
'status',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
}

View File

@@ -1,41 +0,0 @@
<?php
namespace catchAdmin\cms\model;
class Forms extends BaseModel
{
// 表名
public $name = 'cms_forms';
// 数据库字段映射
public $field = array(
'id',
// 表单名称
'name',
// 表单别名
'alias',
// 表单提交的 URL
'submit_url',
// 表单标题
'title',
// 关键词
'keywords',
// 描述
'description',
// 成功提示信息
'success_message',
// 失败提示信息
'failed_message',
// 成功后跳转
'success_link_to',
// 1 需要 2 不需要
'is_login_to_submit',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
}

View File

@@ -1,104 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catcher\exceptions\FailedException;
class ModelAuxiliaryTable extends BaseModel
{
// 表名
public $name = 'cms_model_auxiliary_table';
// 数据库字段映射
public $field = array(
'id',
// 模型ID
'model_id',
// 副表名称
'table_name',
// 默认使用
'used',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
const USED = 1;
const NOT_USE = 2;
/**
* 获取默认使用的副表
*
* @time 2021年03月08日
* @param $modelId
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return array|\think\Model|null
*/
public static function getDefaultUsed(int $modelId)
{
return self::where('model_id', $modelId)
->where('used', self::USED)
->find();
}
/**
* 默认使用
*
* @time 2021年03月08日
* @param int $id
* @return mixed
*/
public function used(int $id)
{
$t = $this->findBy($id);
$t->used = self::USED;
if ($t->save()) {
self::where('id', '<>', $id)
->where('model_id', $t->model_id)
->update([
'used' => self::NOT_USE,
]);
return $t;
}
throw new FailedException('启用失败');
}
/**
* 获取使用
*
* @time 2021年03月08日
* @param $modelId
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return array|\think\Model|null
*/
public function getUsed($modelId)
{
return $this->where('model_id', $modelId)
->where('used', self::USED)
->find();
}
}

View File

@@ -1,112 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\events\ModelFieldsEvent;
use catchAdmin\cms\support\Helper;
use catcher\Utils;
class ModelFields extends BaseModel
{
use ModelFieldsEvent;
// 表名
public $name = 'cms_model_fields';
// 数据库字段映射
public $field = array(
'id',
// 字段中文名称
'title',
// 表单字段名称
'name',
// 类型
'type',
// 长度
'length',
// 默认值
'default_value',
'is_index', // 是否是索引
'is_unique', // 是否是唯一
'options', // 列表
'rules', // 验证规则
'pattern', // 字段正则
// 模型ID
'model_id',
// 展示在列表 1 是 2 否
'use_at_list',
// 展示在详情 1 是 2 否
'use_at_detail',
// 用作是否搜索 1 是 2 否
'use_at_search',
// 创建人ID
'creator_id',
'sort',
'status',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
const IS_UNIQUE = 1;
const NOT_UNIQUE = 2;
const IS_INDEX = 1;
const NOT_INDEX = 2;
/**
* 获取模型的动态字段
*
* @time 2021年03月08日
* @param $modelId
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return \think\Collection
*/
public function getFieldsByModelId($modelId): \think\Collection
{
return $this->withoutField([
'created_at', 'deleted_at', 'updated_at',
])->where('model_id', $modelId)->select();
}
/**
* 获取规则
*
* @time 2021年03月07日
* @param $value
* @return string[]
*/
public function getRulesAttr($value): array
{
return Utils::stringToArrayBy($value);
}
/**
* 获取选项
*
* @time 2021年03月07日
* @param $value
* @return mixed
*/
public function getOptionsAttr($value)
{
// return Helper::getOptions($value);
return $value;
}
}

View File

@@ -1,62 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\events\ModelsEvent;
class Models extends BaseModel
{
use ModelsEvent;
// 表名
public $name = 'cms_models';
// 数据库字段映射
public $field = array(
'id',
// 模型名称
'name',
// 模型别名
'alias',
// 模型关联的表名,数据来源
'table_name',
// 模型描述
'description',
// 列表字段
'used_at_list',
// 搜索字段
'used_at_search',
// 详情字段
'used_at_detail',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
/**
* 模型字段
*
* @time 2021年05月11日
* @return \think\model\relation\HasMany
*/
public function fields(): \think\model\relation\HasMany
{
return $this->hasMany(ModelFields::class, 'model_id', 'id');
}
}

View File

@@ -1,56 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
class SiteLinks extends BaseModel
{
// 表名
public $name = 'cms_site_links';
// 数据库字段映射
public $field = array(
'id',
// 友情链接标题
'title',
// 跳转地址
'link_to',
// 权重
'weight',
// 1 展示 2 隐藏
'is_show',
// 网站图标
'icon',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
/**
* 标题搜索
*
* @time 2021年05月09日
* @param $query
* @param $value
* @param $data
* @return mixed
*/
public function searchTitleAttr($query, $value, $data)
{
return $query->whereLike('title', $value);
}
}

View File

@@ -1,90 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Catch-CMS Design On 2020
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\cms\model;
use catchAdmin\cms\model\events\TagsEvent;
class Tags extends BaseModel
{
use TagsEvent;
// 表名
public $name = 'cms_tags';
// 数据库字段映射
public $field = array(
'id',
// 标签名称
'name',
// seo 标签
'title',
// 关键字
'keywords',
// 描述
'description',
// 创建人ID
'creator_id',
// 创建时间
'created_at',
// 更新时间
'updated_at',
// 软删除
'deleted_at',
);
/**
* 列表
*
* @auth CatchAdmin
* @time 2021年05月22日
* @return mixed
* @throws \think\db\exception\DbException
*/
public function getList()
{
// 分页列表
return $this->catchSearch()
->field($this->aliasField('*'))
->withCount('articles')
->catchOrder()
->paginate();
}
/**
* 标签下的文章
*
* @author CatchAdmin
* @time 2021年05月24日
* @return \think\model\relation\BelongsToMany
*/
public function articles(): \think\model\relation\BelongsToMany
{
return $this->belongsToMany(Articles::class, 'cms_article_relate_tags',
'article_id', 'tag_id'
);
}
/**
* 标签 name 搜索
*
* @author CatchAdmin
* @time 2021年05月24日
* @param $query
* @param $value
* @return void
*/
public function searchNameAttr($query, $value)
{
$query->whereLike('name', $value);
}
}

Some files were not shown because too many files have changed in this diff Show More