基础功能
@ -93,26 +93,4 @@ abstract class BaseController
|
||||
|
||||
return $v->failException(true)->check($data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2019年11月28日
|
||||
* @param string $template
|
||||
* @throws \Exception
|
||||
* @return string
|
||||
*/
|
||||
protected function fetch($template = ''): string
|
||||
{
|
||||
if (Str::contains($template, '::')) {
|
||||
[$module, $template] = explode('::', $template);
|
||||
|
||||
View::config([
|
||||
'view_path' => CatchAdmin::getViews()[$module]
|
||||
]);
|
||||
|
||||
return View::fetch($template);
|
||||
}
|
||||
|
||||
return View::fetch($template);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?php
|
||||
namespace app;
|
||||
|
||||
use catcher\JsonResponse;
|
||||
use catcher\CatchResponse;
|
||||
use think\db\exception\DataNotFoundException;
|
||||
use think\db\exception\ModelNotFoundException;
|
||||
use think\exception\Handle;
|
||||
@ -53,7 +53,7 @@ class ExceptionHandle extends Handle
|
||||
{
|
||||
// 添加自定义异常处理机制
|
||||
if ($request->isAjax()) {
|
||||
return JsonResponse::fail($e->getMessage(), $e->getCode());
|
||||
return CatchResponse::fail($e->getMessage(), $e->getCode());
|
||||
}
|
||||
// 其他错误交给系统处理
|
||||
return parent::render($request, $e);
|
||||
|
@ -2,39 +2,8 @@
|
||||
namespace app;
|
||||
|
||||
// 应用请求对象类
|
||||
use app\exceptions\ValidateFailedException;
|
||||
|
||||
class Request extends \think\Request
|
||||
{
|
||||
/**
|
||||
* Request constructor.
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->validate();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化验证
|
||||
*
|
||||
* @time 2019年11月27日
|
||||
* @throws \Exception
|
||||
* @return mixed
|
||||
*/
|
||||
protected function validate()
|
||||
{
|
||||
if (method_exists($this, 'getValidate')) {
|
||||
$validate = $this->getValidate();
|
||||
|
||||
if (!$validate->check(request()->param())) {
|
||||
throw new ValidateFailedException($validate->getError());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ return [
|
||||
'LogLevel' => [],
|
||||
'LogWrite' => [],
|
||||
'RouteLoaded' => [
|
||||
\app\event\LoadModuleRoutes::class,
|
||||
catcher\event\LoadModuleRoutes::class,
|
||||
],
|
||||
],
|
||||
|
||||
|
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\event;
|
||||
|
||||
use catcher\CatchAdmin;
|
||||
use think\Route;
|
||||
|
||||
class LoadModuleRoutes
|
||||
{
|
||||
/**
|
||||
* 处理
|
||||
*
|
||||
* @time 2019年11月29日
|
||||
* @return void
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
$router = app(Route::class);
|
||||
|
||||
$router->group(function () use ($router) {
|
||||
include CatchAdmin::getRoutes();
|
||||
});
|
||||
}
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
namespace app\exceptions;
|
||||
|
||||
class LoginFailedException extends \Exception
|
||||
{
|
||||
protected $code = 10002;
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
namespace app\exceptions;
|
||||
|
||||
class ValidateFailedException extends \Exception
|
||||
{
|
||||
protected $code = 10001;
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 模块 view path
|
||||
*
|
||||
*/
|
||||
|
||||
use think\helper\Arr;
|
||||
|
||||
if (!function_exists('getModuleViewPath()')) {
|
||||
function getModuleViewPath($module) {
|
||||
|
||||
if (file_exists($views = app()->getRuntimePath() . 'module' . DIRECTORY_SEPARATOR . 'view.php')) {
|
||||
$views = include $views;
|
||||
|
||||
return $views[$module];
|
||||
} else {
|
||||
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
@ -1,12 +1,13 @@
|
||||
<?php
|
||||
namespace catchAdmin\index\controller;
|
||||
|
||||
use app\BaseController;
|
||||
|
||||
use catcher\base\BaseController;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
public function index(): string
|
||||
{
|
||||
return $this->fetch('index::index');
|
||||
return $this->fetch();
|
||||
}
|
||||
}
|
@ -4,10 +4,10 @@
|
||||
<meta charset="utf-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link href="./assets/images/favicon.ico" rel="icon">
|
||||
<title>EasyWeb后台开发框架</title>
|
||||
<link rel="stylesheet" href="/static/assets/libs/layui/css/layui.css"/>
|
||||
<link rel="stylesheet" href="/static/assets/module/admin.css?v=315"/>
|
||||
<link href="__CATCH_ADMIN_IMAGES__/favicon.ico" rel="icon">
|
||||
<title>CatchAdmin 后台管理系统</title>
|
||||
<link rel="stylesheet" href="__CATCH_ADMIN_LIBS__/layui/css/layui.css"/>
|
||||
<link rel="stylesheet" href="__CATCH_ADMIN_MODULE__/admin.css?v=315"/>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||
@ -18,8 +18,8 @@
|
||||
<!-- 头部 -->
|
||||
<div class="layui-header">
|
||||
<div class="layui-logo">
|
||||
<img src="/static/assets/images/logo.png"/>
|
||||
<cite> EasyWeb Iframe</cite>
|
||||
<img src="__CATCH_ADMIN_IMAGES__/logo.png"/>
|
||||
<cite>CatchAdmin</cite>
|
||||
</div>
|
||||
<ul class="layui-nav layui-layout-left">
|
||||
<li class="layui-nav-item" lay-unselect>
|
||||
@ -44,7 +44,7 @@
|
||||
</li>
|
||||
<li class="layui-nav-item" lay-unselect>
|
||||
<a>
|
||||
<img src="assets/images/head.png" class="layui-nav-img">
|
||||
<img src="__CATCH_ADMIN_IMAGES__/head.png" class="layui-nav-img">
|
||||
<cite>管理员</cite>
|
||||
</a>
|
||||
<dl class="layui-nav-child">
|
||||
@ -81,9 +81,9 @@
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item">
|
||||
<a><i class="layui-icon layui-icon-set"></i> <cite>系统管理</cite></a>
|
||||
<a><i class="layui-icon layui-icon-set"></i> <cite>权限管理</cite></a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a lay-href="page/system/user.html">用户管理</a></dd>
|
||||
<dd><a lay-href="{:url('user')}">用户管理</a></dd>
|
||||
<dd><a lay-href="page/system/role.html">角色管理</a></dd>
|
||||
<dd><a lay-href="page/system/authorities.html">菜单管理</a></dd>
|
||||
<dd><a lay-href="page/system/loginRecord.html">登录日志</a></dd>
|
||||
@ -233,8 +233,8 @@
|
||||
</div>
|
||||
|
||||
<!-- js部分 -->
|
||||
<script type="text/javascript" src="/static/assets/libs/layui/layui.js"></script>
|
||||
<script type="text/javascript" src="/static/assets/js/common.js?v=315"></script>
|
||||
<script type="text/javascript" src="__CATCH_ADMIN_LIBS__/layui/layui.js"></script>
|
||||
<script type="text/javascript" src="__CATCH_ADMIN_JS__/common.js?v=315"></script>
|
||||
<script>
|
||||
layui.use(['index'], function () {
|
||||
var $ = layui.jquery;
|
||||
|
@ -1,9 +1,9 @@
|
||||
<?php
|
||||
namespace catchAdmin\login\controller;
|
||||
|
||||
use app\BaseController;
|
||||
use catchAdmin\login\Auth;
|
||||
use catchAdmin\login\request\LoginRequest;
|
||||
use catcher\base\BaseController;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
@ -14,9 +14,9 @@ class Index extends BaseController
|
||||
* @throws \Exception
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
public function index(): string
|
||||
{
|
||||
return $this->fetch('login::index');
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,19 +1,23 @@
|
||||
<?php
|
||||
namespace catchAdmin\login\request;
|
||||
|
||||
use app\Request;
|
||||
use catchAdmin\login\validate\LoginValidate;
|
||||
use catcher\base\BaseRequest;
|
||||
|
||||
class LoginRequest extends Request
|
||||
class LoginRequest extends BaseRequest
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @time 2019年11月27日
|
||||
* @return string
|
||||
*/
|
||||
protected function getValidate()
|
||||
protected function rules(): array
|
||||
{
|
||||
// TODO: Implement getValidate() method.
|
||||
return new LoginValidate();
|
||||
// TODO: Implement rules() method.
|
||||
return [
|
||||
'name|用户名' => 'require|max:25',
|
||||
'password|密码' => 'require',
|
||||
'captcha|验证码' => 'require|captcha'
|
||||
];
|
||||
}
|
||||
|
||||
protected function message(): array
|
||||
{
|
||||
// TODO: Implement message() method.
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
@ -2,13 +2,17 @@
|
||||
|
||||
namespace catchAdmin\login\validate;
|
||||
|
||||
use think\Validate;
|
||||
use catcher\base\BaseValidate;
|
||||
|
||||
class LoginValidate extends Validate
|
||||
class LoginValidate extends BaseValidate
|
||||
{
|
||||
protected $rule = [
|
||||
'name|用户名' => 'require|max:25',
|
||||
'password|密码' => 'require',
|
||||
'captcha|验证码' => 'require|captcha'
|
||||
];
|
||||
protected function getRules(): array
|
||||
{
|
||||
// TODO: Implement getRules() method.
|
||||
return [
|
||||
'name|用户名' => 'require|max:25',
|
||||
'password|密码' => 'require',
|
||||
'captcha|验证码' => 'require|captcha'
|
||||
];
|
||||
}
|
||||
}
|
@ -5,9 +5,9 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>登录</title>
|
||||
<link rel="stylesheet" href="/static/assets/libs/layui/css/layui.css"/>
|
||||
<link rel="stylesheet" href="/static/assets/css/login.css?v=315">
|
||||
<link rel="stylesheet" href="/static/assets/module/admin.css?v=315">
|
||||
<link rel="stylesheet" href="__CATCH_ADMIN_LIBS__/layui/css/layui.css"/>
|
||||
<link rel="stylesheet" href="__CATCH_ADMIN_CSS__/login.css?v=315">
|
||||
<link rel="stylesheet" href="__CATCH_ADMIN_MODULE__/admin.css?v=315">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||
@ -91,8 +91,8 @@
|
||||
</div>
|
||||
|
||||
<!-- js部分 -->
|
||||
<script type="text/javascript" src="/static/assets/libs/layui/layui.js"></script>
|
||||
<script type="text/javascript" src="/static/assets/js/common.js?v=315"></script>
|
||||
<script type="text/javascript" src="__CATCH_ADMIN_LIBS__/layui/layui.js"></script>
|
||||
<script type="text/javascript" src="__CATCH_ADMIN_JS__/common.js?v=315"></script>
|
||||
<script>
|
||||
layui.use(['layer', 'form'], function () {
|
||||
var $ = layui.jquery;
|
||||
|
@ -1,10 +0,0 @@
|
||||
<?php
|
||||
// This file is automatically generated at:2019-11-29 08:20:23
|
||||
declare (strict_types = 1);
|
||||
return array (
|
||||
'module\\index\\IndexService' => false,
|
||||
'module\\install\\InstallService' => false,
|
||||
'module\\login\\LoginService' => false,
|
||||
'module\\permissions\\PermissionService' => false,
|
||||
'module\\user\\UserService' => false,
|
||||
);
|
@ -1,33 +0,0 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\controller;
|
||||
|
||||
use app\BaseController;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function save()
|
||||
{}
|
||||
|
||||
public function read()
|
||||
{}
|
||||
|
||||
public function edit()
|
||||
{}
|
||||
|
||||
public function update()
|
||||
{}
|
||||
|
||||
public function delete()
|
||||
{}
|
||||
|
||||
}
|
91
catchAdmin/user/controller/User.php
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\controller;
|
||||
|
||||
use catchAdmin\user\model\Users;
|
||||
use catchAdmin\user\request\CreateRequest;
|
||||
use catchAdmin\user\request\UpdateRequest;
|
||||
use catcher\base\BaseController;
|
||||
use catcher\CatchForm;
|
||||
use catcher\CatchResponse;
|
||||
|
||||
class User extends BaseController
|
||||
{
|
||||
protected $user;
|
||||
|
||||
public function __construct(Users $user)
|
||||
{
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2019年12月04日
|
||||
* @throws \Exception
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$form = new CatchForm();
|
||||
|
||||
$form->text('name', '用户名')->id('id')->class('class');
|
||||
$form->select('names', '性别')->options(['请选择性别', '男', '女'])->default(1);
|
||||
//$form->select('namess', '用户名');
|
||||
|
||||
$form->render();
|
||||
return $this->fetch([
|
||||
'form' => $form->render()
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2019年12月04日
|
||||
* @param CreateRequest $request
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function create(CreateRequest $request)
|
||||
{
|
||||
return CatchResponse::success($this->user->storeBy($request->post()));
|
||||
}
|
||||
|
||||
public function save()
|
||||
{}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2019年12月04日
|
||||
* @param $id
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function read($id)
|
||||
{
|
||||
return CatchResponse::success($this->user->findBy($id));
|
||||
}
|
||||
|
||||
public function edit()
|
||||
{}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2019年12月04日
|
||||
* @param $id
|
||||
* @param UpdateRequest $request
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function update($id, UpdateRequest $request)
|
||||
{
|
||||
return CatchResponse::success($this->user->updateBy($id, $request->post()));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2019年12月04日
|
||||
* @param $id
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
return CatchResponse::success($this->user->deleteBy($id));
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\model;
|
||||
|
||||
use catcher\Model;
|
||||
use catcher\base\BaseModel;
|
||||
|
||||
class Users extends Model
|
||||
class Users extends BaseModel
|
||||
{
|
||||
protected $name = 'users';
|
||||
|
||||
|
15
catchAdmin/user/request/CreateRequest.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\request;
|
||||
|
||||
use catchAdmin\user\validate\CreateValidate;
|
||||
use catcher\base\BaseRequest;
|
||||
|
||||
class CreateRequest extends BaseRequest
|
||||
{
|
||||
|
||||
protected function getValidate()
|
||||
{
|
||||
// TODO: Implement getValidate() method.
|
||||
return new CreateValidate();
|
||||
}
|
||||
}
|
14
catchAdmin/user/request/UpdateRequest.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\request;
|
||||
|
||||
use catchAdmin\user\validate\UpdateValidate;
|
||||
use catcher\base\BaseRequest;
|
||||
|
||||
class UpdateRequest extends BaseRequest
|
||||
{
|
||||
protected function getValidate()
|
||||
{
|
||||
// TODO: Implement getValidate() method.
|
||||
return new UpdateValidate();
|
||||
}
|
||||
}
|
@ -1,3 +1,3 @@
|
||||
<?php
|
||||
|
||||
$router->resource('user', '\catchAdmin\user\controller\Index');
|
||||
$router->resource('user', '\catchAdmin\user\controller\User');
|
17
catchAdmin/user/validate/CreateValidate.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\validate;
|
||||
|
||||
use catcher\base\BaseValidate;
|
||||
|
||||
class CreateValidate extends BaseValidate
|
||||
{
|
||||
protected function getRules(): array
|
||||
{
|
||||
// TODO: Implement getRules() method.
|
||||
return [
|
||||
'username|用户名' => 'require|max:20',
|
||||
'password|密码' => 'require|max:20',
|
||||
'email|邮箱' => 'require|email'
|
||||
];
|
||||
}
|
||||
}
|
18
catchAdmin/user/validate/UpdateValidate.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
namespace catchAdmin\user\validate;
|
||||
|
||||
use catchAdmin\user\model\Users;
|
||||
use catcher\base\BaseValidate;
|
||||
|
||||
class UpdateValidate extends BaseValidate
|
||||
{
|
||||
protected function getRules(): array
|
||||
{
|
||||
// TODO: Implement getRules() method.
|
||||
return [
|
||||
'username|用户名' => 'require|max:20',
|
||||
'password|密码' => 'require|max:20',
|
||||
'email|邮箱' => 'require|email|unique:'.Users::class.',email,'.request()->route('user').',id',
|
||||
];
|
||||
}
|
||||
}
|
@ -1,10 +1,190 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
{extend name="../../../view/layout"}
|
||||
{block name="title"}用户管理{/block}
|
||||
{block name="search"}
|
||||
<div class="layui-form toolbar">
|
||||
<div class="layui-form-item">
|
||||
{php}echo $form{/php}
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label w-auto">账 号:</label>
|
||||
<div class="layui-input-inline mr0">
|
||||
<input name="username" class="layui-input" type="text" placeholder="输入账号"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label w-auto">用户名:</label>
|
||||
<div class="layui-input-inline mr0">
|
||||
<input name="nickName" class="layui-input" type="text" placeholder="输入用户名"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label w-auto">性 别:</label>
|
||||
<div class="layui-input-inline mr0">
|
||||
<select name="sex">
|
||||
<option value="">选择性别</option>
|
||||
<option value="男">男</option>
|
||||
<option value="女">女</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="padding-right: 110px;">
|
||||
<button class="layui-btn icon-btn" lay-filter="formSubSearchUser" lay-submit>
|
||||
<i class="layui-icon"></i>搜索
|
||||
</button>
|
||||
<button id="btnAddUser" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="table"}
|
||||
<table class="layui-table" id="tableUser" lay-filter="tableUser"></table>
|
||||
{/block}
|
||||
{block name="script"}
|
||||
<script>
|
||||
layui.use(['layer', 'form', 'table', 'util', 'admin'], function () {
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
var form = layui.form;
|
||||
var table = layui.table;
|
||||
var util = layui.util;
|
||||
var admin = layui.admin;
|
||||
|
||||
</body>
|
||||
</html>
|
||||
// 渲染表格
|
||||
var insTb = table.render({
|
||||
elem: '#tableUser',
|
||||
url: '../../json/user.json',
|
||||
page: true,
|
||||
toolbar: true,
|
||||
cellMinWidth: 100,
|
||||
cols: [[
|
||||
{type: 'numbers', title: '#'},
|
||||
{field: 'username', sort: true, title: '账号'},
|
||||
{field: 'nickName', sort: true, title: '用户名'},
|
||||
{field: 'sex', sort: true, title: '性别'},
|
||||
{
|
||||
field: 'createTime', sort: true, templet: function (d) {
|
||||
return util.toDateString(d.createTime);
|
||||
}, title: '创建时间'
|
||||
},
|
||||
{field: 'state', sort: true, templet: '#tableStateUser', title: '状态'},
|
||||
{align: 'center', toolbar: '#tableBarUser', title: '操作', minWidth: 200}
|
||||
]]
|
||||
});
|
||||
|
||||
// 添加
|
||||
$('#btnAddUser').click(function () {
|
||||
showEditModel();
|
||||
});
|
||||
|
||||
// 搜索
|
||||
form.on('submit(formSubSearchUser)', function (data) {
|
||||
insTb.reload({where: data.field}, 'data');
|
||||
});
|
||||
|
||||
// 工具条点击事件
|
||||
table.on('tool(tableUser)', function (obj) {
|
||||
var data = obj.data;
|
||||
var layEvent = obj.event;
|
||||
if (layEvent === 'edit') { // 修改
|
||||
showEditModel(data);
|
||||
} else if (layEvent === 'del') { // 删除
|
||||
doDel(data.userId, data.nickName);
|
||||
} else if (layEvent === 'reset') { // 重置密码
|
||||
resetPsw(data.userId, data.nickName);
|
||||
}
|
||||
});
|
||||
|
||||
// 显示表单弹窗
|
||||
function showEditModel(mUser) {
|
||||
admin.open({
|
||||
type: 1,
|
||||
title: (mUser ? '修改' : '添加') + '用户',
|
||||
content: $('#modelUser').html(),
|
||||
success: function (layero, dIndex) {
|
||||
$(layero).children('.layui-layer-content').css('overflow', 'visible');
|
||||
var url = mUser ? '../../json/ok.json' : '../../json/ok.json';
|
||||
mUser && (mUser.roleId = mUser.roles[0].roleId);
|
||||
// 回显数据
|
||||
form.val('modelUserForm', mUser);
|
||||
// 表单提交事件
|
||||
form.on('submit(modelSubmitUser)', function (data) {
|
||||
layer.load(2);
|
||||
$.get(url, data.field, function (res) {
|
||||
layer.closeAll('loading');
|
||||
if (res.code == 200) {
|
||||
layer.close(dIndex);
|
||||
layer.msg(res.msg, {icon: 1});
|
||||
insTb.reload({}, 'data');
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}, 'json');
|
||||
return false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 删除
|
||||
function doDel(userId, nickName) {
|
||||
layer.confirm('确定要删除“' + nickName + '”吗?', {
|
||||
skin: 'layui-layer-admin',
|
||||
shade: .1
|
||||
}, function (i) {
|
||||
layer.close(i);
|
||||
layer.load(2);
|
||||
$.get('../../json/ok.json', {
|
||||
userId: userId
|
||||
}, function (res) {
|
||||
layer.closeAll('loading');
|
||||
if (res.code == 200) {
|
||||
layer.msg(res.msg, {icon: 1});
|
||||
insTb.reload({}, 'data');
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
}
|
||||
|
||||
// 修改用户状态
|
||||
form.on('switch(ckStateUser)', function (obj) {
|
||||
layer.load(2);
|
||||
$.get('../../json/ok.json', {
|
||||
userId: obj.elem.value,
|
||||
state: obj.elem.checked ? 0 : 1
|
||||
}, function (res) {
|
||||
layer.closeAll('loading');
|
||||
if (res.code == 200) {
|
||||
layer.msg(res.msg, {icon: 1});
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
$(obj.elem).prop('checked', !obj.elem.checked);
|
||||
form.render('checkbox');
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
|
||||
// 重置密码
|
||||
function resetPsw(userId, nickName) {
|
||||
layer.confirm('确定要重置“' + nickName + '”的登录密码吗?', {
|
||||
skin: 'layui-layer-admin',
|
||||
shade: .1
|
||||
}, function (i) {
|
||||
layer.close(i);
|
||||
layer.load(2);
|
||||
$.get('../../json/ok.json', {
|
||||
userId: userId
|
||||
}, function (res) {
|
||||
layer.closeAll('loading');
|
||||
if (res.code == 200) {
|
||||
layer.msg(res.msg, {icon: 1});
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -28,9 +28,7 @@
|
||||
"topthink/think-trace":"^1.0"
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"catchAdmin/helper.php"
|
||||
],
|
||||
"files": [],
|
||||
"psr-4": {
|
||||
"app\\": "app",
|
||||
"catchAdmin\\": "catchAdmin",
|
||||
|
@ -22,4 +22,13 @@ return [
|
||||
'taglib_begin' => '{',
|
||||
// 标签库标签结束标记
|
||||
'taglib_end' => '}',
|
||||
// 替换
|
||||
'tpl_replace_string' => [
|
||||
'__CATCH_ADMIN__'=>'/catch-admin',
|
||||
'__CATCH_ADMIN_MODULE__' => '/catch-admin/assets/module',
|
||||
'__CATCH_ADMIN_JS__' => '/catch-admin/assets/js',
|
||||
'__CATCH_ADMIN_CSS__' => '/catch-admin/assets/css',
|
||||
'__CATCH_ADMIN_IMAGES__' => '/catch-admin/assets/images',
|
||||
'__CATCH_ADMIN_LIBS__' => '/catch-admin/assets/libs',
|
||||
]
|
||||
];
|
||||
|
2
extend/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
34
public/catch-admin/assets/css/error-page.css
Executable file
@ -0,0 +1,34 @@
|
||||
/** 错误页面样式 */
|
||||
.error-page {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.error-page-img {
|
||||
max-width: 100%;
|
||||
max-height: 300px;
|
||||
}
|
||||
|
||||
.error-page-info {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding-left: 30px;
|
||||
}
|
||||
|
||||
.error-page-info h1 {
|
||||
color: #434e59;
|
||||
font-size: 72px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.error-page-info-desc {
|
||||
color: #777;
|
||||
font-size: 20px;
|
||||
line-height: 28px;
|
||||
margin-bottom: 16px;
|
||||
}
|
165
public/catch-admin/assets/css/login.css
Executable file
@ -0,0 +1,165 @@
|
||||
/** 登录页面样式 */
|
||||
|
||||
body {
|
||||
background-image: url(".._login2.png");
|
||||
background-position: center 110px;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100%;
|
||||
background-color: #f0f2f5;
|
||||
}
|
||||
|
||||
.login-wrapper, body, html {
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.login-wrapper {
|
||||
overflow: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.login-body {
|
||||
padding: 10px 10px 40px 10px;
|
||||
}
|
||||
|
||||
.login-body > .layui-card {
|
||||
max-width: 360px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.login-body .layui-card-header {
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.login-body .layui-form-pane .layui-form-label {
|
||||
width: 48px;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.login-body .layui-form-pane .layui-input-block {
|
||||
margin-left: 48px;
|
||||
}
|
||||
|
||||
.login-body .login-captcha {
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
height: 38px;
|
||||
border: 1px solid #e6e6e6;
|
||||
border-radius: 2px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.login-body .login-other > * {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-right: 10px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.login-body .login-other .layui-icon {
|
||||
position: relative;
|
||||
top: 2px;
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
.login-body .login-other a:hover {
|
||||
opacity: .8;
|
||||
}
|
||||
|
||||
.layui-icon-login-qq {
|
||||
color: #3492ED
|
||||
}
|
||||
|
||||
.layui-icon-login-wechat {
|
||||
color: #4DAF29
|
||||
}
|
||||
|
||||
.layui-icon-login-weibo {
|
||||
color: #CF1900
|
||||
}
|
||||
|
||||
/** 底部样式 */
|
||||
.login-footer {
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
color: rgba(255, 255, 255, 0.7) !important;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.login-footer span {
|
||||
padding: 0 5px
|
||||
}
|
||||
|
||||
.login-footer a {
|
||||
padding: 0 5px;
|
||||
color: rgba(255, 255, 255, 0.7) !important;
|
||||
}
|
||||
|
||||
.login-footer a:hover {
|
||||
color: rgba(255, 255, 255, 0.4) !important;
|
||||
}
|
||||
|
||||
/** 头部样式 */
|
||||
.login-header {
|
||||
font-family: Myriad Pro, Helvetica Neue, Arial, Helvetica, sans-serif;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
color: rgba(255, 255, 255, 0.85) !important;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.login-header img {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
/** 移动设备样式 */
|
||||
@media screen and (min-height: 590px) {
|
||||
.login-footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-height: 670px) {
|
||||
.login-body {
|
||||
padding: 110px 10px 40px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/** 辅助样式 */
|
||||
.layui-link {
|
||||
color: #029789 !important;
|
||||
}
|
||||
|
||||
.layui-link:hover {
|
||||
opacity: .8;
|
||||
}
|
||||
|
||||
.pull-right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.login-header {
|
||||
color: rgba(0, 0, 0, .85) !important;
|
||||
}
|
||||
|
||||
.login-footer {
|
||||
color: rgba(0, 0, 0, 0.7) !important;
|
||||
}
|
||||
|
||||
.login-footer a {
|
||||
color: rgba(0, 0, 0, 0.7) !important;
|
||||
}
|
||||
|
||||
.login-footer a:hover {
|
||||
color: rgba(0, 0, 0, 0.4) !important;
|
||||
}
|
BIN
public/catch-admin/assets/images/15367146917869444.jpg
Executable file
After Width: | Height: | Size: 36 KiB |
BIN
public/catch-admin/assets/images/bg_login2.png
Executable file
After Width: | Height: | Size: 21 KiB |
BIN
public/catch-admin/assets/images/favicon.ico
Executable file
After Width: | Height: | Size: 4.1 KiB |
BIN
public/catch-admin/assets/images/head.png
Executable file
After Width: | Height: | Size: 52 KiB |
BIN
public/catch-admin/assets/images/homepic1.png
Executable file
After Width: | Height: | Size: 2.1 KiB |
BIN
public/catch-admin/assets/images/homepic2.png
Executable file
After Width: | Height: | Size: 3.1 KiB |
BIN
public/catch-admin/assets/images/homepic3.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
public/catch-admin/assets/images/homepic4.png
Executable file
After Width: | Height: | Size: 2.5 KiB |
BIN
public/catch-admin/assets/images/homepic5.png
Executable file
After Width: | Height: | Size: 2.2 KiB |
BIN
public/catch-admin/assets/images/homepic6.png
Executable file
After Width: | Height: | Size: 3.0 KiB |
BIN
public/catch-admin/assets/images/ic_403.png
Executable file
After Width: | Height: | Size: 19 KiB |
BIN
public/catch-admin/assets/images/ic_404.png
Executable file
After Width: | Height: | Size: 26 KiB |
BIN
public/catch-admin/assets/images/ic_500.png
Executable file
After Width: | Height: | Size: 22 KiB |
BIN
public/catch-admin/assets/images/img_msg_db.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
public/catch-admin/assets/images/img_msg_notice.png
Executable file
After Width: | Height: | Size: 1.4 KiB |
BIN
public/catch-admin/assets/images/img_msg_pri.png
Executable file
After Width: | Height: | Size: 1.7 KiB |
BIN
public/catch-admin/assets/images/logo.png
Executable file
After Width: | Height: | Size: 3.6 KiB |
BIN
public/catch-admin/assets/images/message.png
Executable file
After Width: | Height: | Size: 1.8 KiB |
BIN
public/catch-admin/assets/images/welcome.png
Executable file
After Width: | Height: | Size: 17 KiB |
52
public/catch-admin/assets/js/common.js
Executable file
@ -0,0 +1,52 @@
|
||||
/** EasyWeb iframe v3.1.5 date:2019-10-05 License By http://easyweb.vip */
|
||||
|
||||
// 以下代码是配置layui扩展模块的目录,每个页面都需要引入
|
||||
layui.config({
|
||||
version: '315',
|
||||
base: getProjectUrl() + 'assets/module/'
|
||||
}).extend({
|
||||
formSelects: 'formSelects/formSelects-v4',
|
||||
treetable: 'treetable-lay/treetable',
|
||||
dropdown: 'dropdown/dropdown',
|
||||
notice: 'notice/notice',
|
||||
step: 'step-lay/step',
|
||||
dtree: 'dtree/dtree',
|
||||
citypicker: 'city-picker/city-picker',
|
||||
tableSelect: 'tableSelect/tableSelect',
|
||||
Cropper: 'Cropper/Cropper',
|
||||
zTree: 'zTree/zTree',
|
||||
introJs: 'introJs/introJs',
|
||||
fileChoose: 'fileChoose/fileChoose',
|
||||
tagsInput: 'tagsInput/tagsInput',
|
||||
Drag: 'Drag/Drag',
|
||||
CKEDITOR: 'ckeditor/ckeditor',
|
||||
Split: 'Split/Split',
|
||||
cascader: 'cascader/cascader'
|
||||
}).use(['layer', 'admin'], function () {
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
var admin = layui.admin;
|
||||
|
||||
// 移除loading动画
|
||||
setTimeout(function () {
|
||||
admin.removeLoading();
|
||||
}, window == top ? 600 : 100);
|
||||
|
||||
});
|
||||
|
||||
// 获取当前项目的根路径,通过获取layui.js全路径截取assets之前的地址
|
||||
function getProjectUrl() {
|
||||
var layuiDir = layui.cache.dir;
|
||||
if (!layuiDir) {
|
||||
var js = document.scripts, last = js.length - 1, src;
|
||||
for (var i = last; i > 0; i--) {
|
||||
if (js[i].readyState === 'interactive') {
|
||||
src = js[i].src;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var jsPath = src || js[last].src;
|
||||
layuiDir = jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
|
||||
}
|
||||
return layuiDir.substring(0, layuiDir.indexOf('assets'));
|
||||
}
|
1
public/catch-admin/assets/libs/echarts/echarts.min.js
vendored
Executable file
79
public/catch-admin/assets/libs/echarts/echartsTheme.js
Executable file
@ -0,0 +1,79 @@
|
||||
var myEchartsTheme = {
|
||||
color: ["#009688", "#1E9FFF", "#5FB878", "#FFB980", "#D87A80", "#8d98b3", "#e5cf0d", "#97b552", "#95706d", "#dc69aa", "#07a2a4", "#9a7fd1", "#588dd5", "#f5994e", "#c05050", "#59678c", "#c9ab00", "#7eb00a", "#6f5553", "#c14089"],
|
||||
title: {textStyle: {fontWeight: "normal", color: "#666"}},
|
||||
dataRange: {itemWidth: 15, color: ["#009688", "#e0ffff"]},
|
||||
toolbox: {color: ["#1e90ff", "#1e90ff", "#1e90ff", "#1e90ff"], effectiveColor: "#ff4500"},
|
||||
tooltip: {
|
||||
backgroundColor: "rgba(50,50,50,0.5)",
|
||||
axisPointer: {
|
||||
type: "line",
|
||||
lineStyle: {color: "#009688"},
|
||||
crossStyle: {color: "#008acd"},
|
||||
shadowStyle: {color: "rgba(200,200,200,0.2)"}
|
||||
}
|
||||
},
|
||||
dataZoom: {dataBackgroundColor: "#efefff", fillerColor: "rgba(182,162,222,0.2)", handleColor: "#008acd"},
|
||||
grid: {borderColor: "#eee"},
|
||||
categoryAxis: {
|
||||
axisLine: {lineStyle: {color: "#009688"}},
|
||||
axisTick: {show: !1},
|
||||
splitLine: {lineStyle: {color: ["#eee"]}}
|
||||
},
|
||||
valueAxis: {
|
||||
axisLine: {lineStyle: {color: "#009688"}},
|
||||
splitArea: {show: !0, areaStyle: {color: ["rgba(250,250,250,0.1)", "rgba(200,200,200,0.1)"]}},
|
||||
splitLine: {lineStyle: {color: ["#eee"]}}
|
||||
},
|
||||
polar: {
|
||||
axisLine: {lineStyle: {color: "#ddd"}},
|
||||
splitArea: {show: !0, areaStyle: {color: ["rgba(250,250,250,0.2)", "rgba(200,200,200,0.2)"]}},
|
||||
splitLine: {lineStyle: {color: "#ddd"}}
|
||||
},
|
||||
timeline: {
|
||||
lineStyle: {color: "#009688"},
|
||||
controlStyle: {normal: {color: "#009688"}, emphasis: {color: "#009688"}},
|
||||
symbol: "emptyCircle",
|
||||
symbolSize: 3
|
||||
},
|
||||
bar: {itemStyle: {normal: {barBorderRadius: 2}, emphasis: {barBorderRadius: 2}}},
|
||||
line: {smooth: !0, symbol: "emptyCircle", symbolSize: 3},
|
||||
k: {
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "#d87a80",
|
||||
color0: "#2ec7c9",
|
||||
lineStyle: {color: "#d87a80", color0: "#2ec7c9"}
|
||||
}
|
||||
}
|
||||
},
|
||||
scatter: {symbol: "circle", symbolSize: 4},
|
||||
radar: {symbol: "emptyCircle", symbolSize: 3},
|
||||
map: {
|
||||
itemStyle: {
|
||||
normal: {areaStyle: {color: "#ddd"}, label: {textStyle: {color: "#d87a80"}}},
|
||||
emphasis: {areaStyle: {color: "#fe994e"}}
|
||||
}
|
||||
},
|
||||
force: {itemStyle: {normal: {linkStyle: {color: "#1e90ff"}}}},
|
||||
chord: {
|
||||
itemStyle: {
|
||||
normal: {
|
||||
borderWidth: 1,
|
||||
borderColor: "rgba(128, 128, 128, 0.5)",
|
||||
chordStyle: {lineStyle: {color: "rgba(128, 128, 128, 0.5)"}}
|
||||
},
|
||||
emphasis: {
|
||||
borderWidth: 1,
|
||||
borderColor: "rgba(128, 128, 128, 0.5)",
|
||||
chordStyle: {lineStyle: {color: "rgba(128, 128, 128, 0.5)"}}
|
||||
}
|
||||
}
|
||||
},
|
||||
gauge: {
|
||||
axisLine: {lineStyle: {color: [[.2, "#2ec7c9"], [.8, "#5ab1ef"], [1, "#d87a80"]], width: 10}},
|
||||
axisTick: {splitNumber: 10, length: 15, lineStyle: {color: "auto"}},
|
||||
splitLine: {length: 22, lineStyle: {color: "auto"}},
|
||||
pointer: {width: 5}
|
||||
},
|
||||
textStyle: {fontFamily: "微软雅黑, Arial, Verdana, sans-serif"}
|
||||
};
|
4
public/catch-admin/assets/libs/jquery/jquery-3.2.1.min.js
vendored
Executable file
2
public/catch-admin/assets/libs/layui/css/layui.css
Executable file
2
public/catch-admin/assets/libs/layui/css/layui.mobile.css
Executable file
2
public/catch-admin/assets/libs/layui/css/modules/code.css
Executable file
@ -0,0 +1,2 @@
|
||||
/** layui-v2.5.5 MIT License By https://www.layui.com */
|
||||
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}
|
BIN
public/catch-admin/assets/libs/layui/css/modules/layer/default/icon-ext.png
Executable file
After Width: | Height: | Size: 5.8 KiB |
BIN
public/catch-admin/assets/libs/layui/css/modules/layer/default/icon.png
Executable file
After Width: | Height: | Size: 11 KiB |
2
public/catch-admin/assets/libs/layui/css/modules/layer/default/layer.css
Executable file
BIN
public/catch-admin/assets/libs/layui/css/modules/layer/default/loading-0.gif
Executable file
After Width: | Height: | Size: 5.7 KiB |
BIN
public/catch-admin/assets/libs/layui/css/modules/layer/default/loading-1.gif
Executable file
After Width: | Height: | Size: 701 B |
BIN
public/catch-admin/assets/libs/layui/css/modules/layer/default/loading-2.gif
Executable file
After Width: | Height: | Size: 1.7 KiB |
BIN
public/catch-admin/assets/libs/layui/font/iconfont.eot
Executable file
485
public/catch-admin/assets/libs/layui/font/iconfont.svg
Executable file
After Width: | Height: | Size: 277 KiB |
BIN
public/catch-admin/assets/libs/layui/font/iconfont.ttf
Executable file
BIN
public/catch-admin/assets/libs/layui/font/iconfont.woff
Executable file
BIN
public/catch-admin/assets/libs/layui/font/iconfont.woff2
Executable file
BIN
public/catch-admin/assets/libs/layui/images/face/0.gif
Executable file
After Width: | Height: | Size: 2.6 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/1.gif
Executable file
After Width: | Height: | Size: 5.4 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/10.gif
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/11.gif
Executable file
After Width: | Height: | Size: 4.0 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/12.gif
Executable file
After Width: | Height: | Size: 3.3 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/13.gif
Executable file
After Width: | Height: | Size: 7.3 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/14.gif
Executable file
After Width: | Height: | Size: 2.3 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/15.gif
Executable file
After Width: | Height: | Size: 1.8 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/16.gif
Executable file
After Width: | Height: | Size: 6.6 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/17.gif
Executable file
After Width: | Height: | Size: 4.3 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/18.gif
Executable file
After Width: | Height: | Size: 2.9 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/19.gif
Executable file
After Width: | Height: | Size: 3.0 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/2.gif
Executable file
After Width: | Height: | Size: 3.1 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/20.gif
Executable file
After Width: | Height: | Size: 5.0 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/21.gif
Executable file
After Width: | Height: | Size: 5.1 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/22.gif
Executable file
After Width: | Height: | Size: 9.6 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/23.gif
Executable file
After Width: | Height: | Size: 3.7 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/24.gif
Executable file
After Width: | Height: | Size: 7.9 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/25.gif
Executable file
After Width: | Height: | Size: 3.1 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/26.gif
Executable file
After Width: | Height: | Size: 3.2 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/27.gif
Executable file
After Width: | Height: | Size: 4.3 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/28.gif
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/29.gif
Executable file
After Width: | Height: | Size: 4.7 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/3.gif
Executable file
After Width: | Height: | Size: 3.9 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/30.gif
Executable file
After Width: | Height: | Size: 2.5 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/31.gif
Executable file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/32.gif
Executable file
After Width: | Height: | Size: 3.4 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/33.gif
Executable file
After Width: | Height: | Size: 2.4 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/34.gif
Executable file
After Width: | Height: | Size: 3.6 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/35.gif
Executable file
After Width: | Height: | Size: 1.8 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/36.gif
Executable file
After Width: | Height: | Size: 2.3 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/37.gif
Executable file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/catch-admin/assets/libs/layui/images/face/38.gif
Executable file
After Width: | Height: | Size: 3.5 KiB |