diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8e098ed
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+/.idea
+/.vscode
+*.log
+.env
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..36f7b6f
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,42 @@
+sudo: false
+
+language: php
+
+branches:
+ only:
+ - stable
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+before_install:
+ - composer self-update
+
+install:
+ - composer install --no-dev --no-interaction --ignore-platform-reqs
+ - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
+ - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
+ - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
+ - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
+ - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
+
+script:
+ - php think unit
+
+deploy:
+ provider: releases
+ api_key:
+ secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
+ file:
+ - ThinkPHP_Core.zip
+ - ThinkPHP_Full.zip
+ skip_cleanup: true
+ on:
+ tags: true
diff --git a/README.en.md b/README.en.md
deleted file mode 100644
index 57dae4f..0000000
--- a/README.en.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# TaoLer
-
-#### Description
-TaoLer社区系统,thinkphp6+layui+fly php框架,
-
-#### Software Architecture
-Software architecture description
-
-#### Installation
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Instructions
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Contribution
-
-1. Fork the repository
-2. Create Feat_xxx branch
-3. Commit your code
-4. Create Pull Request
-
-
-#### Gitee Feature
-
-1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
-2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
-3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
-4. The most valuable open source project [GVP](https://gitee.com/gvp)
-5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
-6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/README.md b/README.md
index 11a8e78..9c7a841 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,29 @@
-# TaoLer
-
+# TaoLer 1.0.0
+TaoLer 1.0 2020.1.1
#### 介绍
TaoLer社区系统,thinkphp6+layui+fly php框架,
#### 软件架构
软件架构说明
-
+ThinkPHP6核心框架,layui前端,Fly模板。
#### 安装教程
-1. xxxx
-2. xxxx
-3. xxxx
+1. git地址 https://gitee.com/toogee/TaoLer/repository/archive/master.zip
+2. 官网下载 http://www.aieok.com
+3. 解压后,项目域名部署为public对外访问,http:://www.youdomain.com/install/index
+4. 安装前需要准保好建立数据库信息(数据库连接地址,数据库用户名,数据库密码,数据库端口,数据库名称)
+5. 安装过程注意记录好设置后台的用户名和密码。
#### 使用说明
-1. xxxx
-2. xxxx
-3. xxxx
+1. 安装后本系统已配置默认演示数据,可以删除原数据或者进行数据的修改
+2. 后台可设置分类cate,一定要设置英文别名
+3. 首页有置顶模块,列表文章模块,右侧包含广告模块,回复展示模块
+
+#### 文档
+
+1. 参考官网分享文章
#### 参与贡献
@@ -26,6 +32,16 @@ TaoLer社区系统,thinkphp6+layui+fly php框架,
3. 提交代码
4. 新建 Pull Request
+#### 版权信息
+
+非商业可免费使用,没有功能限制,但不能更改版本信息,如需更改可购买授权。
+
+本项目包含的第三方源码和二进制文件之版权信息另行标注。
+
+版权所有Copyright © 2019 by aieok.com (http://www.aieok.com)
+
+All rights reserved。
+
#### 码云特技
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..baf0980
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,2 @@
+/api
+/home
\ No newline at end of file
diff --git a/app/.htaccess b/app/.htaccess
new file mode 100644
index 0000000..3418e55
--- /dev/null
+++ b/app/.htaccess
@@ -0,0 +1 @@
+deny from all
\ No newline at end of file
diff --git a/app/BaseController.php b/app/BaseController.php
new file mode 100644
index 0000000..b3bd7d3
--- /dev/null
+++ b/app/BaseController.php
@@ -0,0 +1,94 @@
+app = $app;
+ $this->request = $this->app->request;
+
+ // 控制器初始化
+ $this->initialize();
+ }
+
+ // 初始化
+ protected function initialize()
+ {}
+
+ /**
+ * 验证数据
+ * @access protected
+ * @param array $data 数据
+ * @param string|array $validate 验证器名或者验证规则数组
+ * @param array $message 提示信息
+ * @param bool $batch 是否批量验证
+ * @return array|string|true
+ * @throws ValidateException
+ */
+ protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+ {
+ if (is_array($validate)) {
+ $v = new Validate();
+ $v->rule($validate);
+ } else {
+ if (strpos($validate, '.')) {
+ // 支持场景
+ list($validate, $scene) = explode('.', $validate);
+ }
+ $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+ $v = new $class();
+ if (!empty($scene)) {
+ $v->scene($scene);
+ }
+ }
+
+ $v->message($message);
+
+ // 是否批量验证
+ if ($batch || $this->batchValidate) {
+ $v->batch(true);
+ }
+
+ return $v->failException(true)->check($data);
+ }
+
+}
diff --git a/app/ExceptionHandle.php b/app/ExceptionHandle.php
new file mode 100644
index 0000000..453d126
--- /dev/null
+++ b/app/ExceptionHandle.php
@@ -0,0 +1,58 @@
+alias('a')
+ ->join('auth_group u','a.auth_group_id = u.id')
+ ->field('a.id as aid,username,mobile,email,title,last_login_ip,a.status as astatus,last_login_time')
+ ->where('a.delete_time',0)
+ ->select();
+
+ $count = $admins->count();
+ if($admins){
+ $res = ['code'=>0,'msg'=>'','count'=>$count];
+ foreach($admins as $k => $v){
+ $data = ['id'=>$v['aid'],'loginname'=>$v['username'],'telphone'=>$v['mobile'],'email'=>$v['email'],'role'=>$v['title'],'ip'=>$v['last_login_ip'],'check'=>$v['astatus'],'logintime'=>date("Y-m-d",$v['last_login_time'])];
+ $res['data'][] = $data;
+ }
+ }
+ return json($res);
+ }
+ return View::fetch('list');
+ }
+
+
+ //管理员审核
+ public function adminCheck()
+ {
+ $data = Request::param();
+
+ //获取状态
+ $res = Db::name('admin')->where('id',$data['id'])->save(['status' => $data['status']]);
+ if($res){
+ if($data['status'] == 1){
+ return json(['code'=>0,'msg'=>'设置管理员通过','icon'=>6]);
+ } else {
+ return json(['code'=>0,'msg'=>'管理员已取消','icon'=>5]);
+ }
+
+ }else {
+ return json(['code'=>1,'msg'=>'审核出错']);
+ }
+
+ }
+
+ //添加管理员
+ public function adminForm()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ $data['create_time'] = time();
+ $salt = substr(md5($data['create_time']),-6);
+ $data['password'] = substr_replace(md5($data['password']),$salt,0,6);
+ $result = Db::name('admin')->save($data);
+ Db::name('auth_group_access')->save(['uid'=>$data['id'],'group_id'=>$data['auth_group_id']]);
+ if($result){
+ $res = ['code'=>1,'msg'=>'添加成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'添加失败'];
+ }
+ return json($res);
+ }
+ $auth_group = Db::name('auth_group')->select();
+ View::assign(['auth_group'=>$auth_group]);
+ return View::fetch('adminform');
+ }
+
+ //管理员编辑
+ public function adminEdit()
+ {
+ $admin = AdminModel::find(input('id'));
+
+ if(Request::isAjax()){
+ $data = Request::param();
+ if(empty($data['password'])){
+ unset($data['password']);
+ } else {
+ $t = strtotime($admin['create_time']);
+ $salt = substr(md5($t),-6);
+ $data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
+ }
+ $data['update_time'] = time();
+ $result = $admin->update($data);
+ Db::name('auth_group_access')->where('uid',$data['id'])->update(['group_id'=>$data['auth_group_id']]);
+ if($result){
+ $res = ['code'=>1,'msg'=>'编辑成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'编辑失败'];
+ }
+ return json($res);
+ }
+ $auth_group = Db::name('auth_group')->select();
+ View::assign(['admin'=>$admin,'auth_group'=>$auth_group]);
+ return View::fetch();
+ }
+
+ //删除管理员
+ public function delete($id)
+ {
+ if(Request::isAjax()){
+ $user =AdminModel::find($id);
+ $result = $user->delete();
+
+ if($result){
+ return json(['code'=>1,'msg'=>'删除成功']);
+ }else{
+ return json(['code'=>0,'msg'=>'删除失败']);
+ }
+ }
+ }
+
+ public function info()
+ {
+ $admin = AdminModel::find(Session::get('admin_id'));
+ if(Request::isAjax()){
+ $data = Request::param();
+ $result = $admin->update($data);
+ if($result){
+ $res = ['code'=>0,'msg'=>'更新成功'];
+ } else {
+ $res = ['code'=>1,'msg'=>'更新失败'];
+ }
+ return json($res);
+ }
+ View::assign('admin',$admin);
+ return View::fetch('set/user/info');
+ }
+
+ /**
+ * 显示指定的资源
+ *
+ * @param int $id
+ * @return \think\Response
+ */
+ public function repass()
+ {
+ //
+ $admin = AdminModel::find(Session::get('admin_id'));
+ if(Request::isAjax()){
+ $data = Request::param();
+ $salt = substr(md5(strtotime($admin['create_time'])),-6);
+ $pwd = substr_replace(md5($data['oldPassword']),$salt,0,6);
+ $data['oldPassword'] = md5($pwd);
+ if($admin['password'] != $data['oldPassword']){
+ $res = ['code'=>1,'msg'=>'当前密码错误'];
+ } elseif($data['password'] != $data['repassword']){
+ $res = ['code'=>1,'msg'=>'两次密码不一致'];
+ } else {
+ $password = md5(substr_replace(md5($data['password']),$salt,0,6));
+ $result = $admin->update([
+ 'id' => $admin['id'],
+ 'password' => $password
+ ]);
+ if($result){
+ $res = ['code'=>0,'msg'=>'更新成功'];
+ } else {
+ $res = ['code'=>1,'msg'=>'更新失败'];
+ }
+ }
+
+ return json($res);
+ }
+ View::assign('admin',$admin);
+ return View::fetch('set/user/repass');
+ }
+}
\ No newline at end of file
diff --git a/app/admin/controller/AuthGroup.php b/app/admin/controller/AuthGroup.php
new file mode 100644
index 0000000..151ebdb
--- /dev/null
+++ b/app/admin/controller/AuthGroup.php
@@ -0,0 +1,107 @@
+select();
+ $count = $role->count();
+ $res = [];
+ if($role){
+ $res = ['code'=>0,'msg'=>'','count'=>$count];
+ foreach($role as $k => $v){
+ $data = ['id'=>$v['id'],'rolename'=>$v['title'],'limits'=>$v['limits'],'descr'=>$v['descr'],'check'=>$v['status']];
+ $res['data'][] = $data;
+ }
+ }
+ return json($res);
+ }
+ return View::fetch('role');
+ }
+
+
+
+
+ //角色管理
+ public function role()
+ {
+ //
+ return View::fetch('role');
+ }
+
+ //角色添加
+ public function roleAdd()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ $result = AuthGroupModel::create($data);
+ if($result) {
+ $res = ['code'=>1,'msg'=>'添加成功'];
+ } else {
+ $res = ['code'=>0,'msg'=>'添加失败'];
+ }
+ return json($res);
+ }
+
+ $menus = $this->getMenus();
+ View::assign('menus',$menus);
+
+ return View::fetch('roleadd');
+ }
+
+ //角色编辑
+ public function roleEdit()
+ {
+
+ if(Request::isAjax()){
+ $data = Request::param();
+
+/*
+ if(!strpos($data['rules'],'1,2,3,4,5'))
+ {
+ $data['rules'] = substr_replace($data['rules'],"1,2,3,4,5,",0,0);
+ }
+*/
+ $rule = AuthGroupModel::update($data);
+ if($rule){
+ $res = ['code'=>1,'msg'=>'保存成功'];
+ } else {
+ $res = ['code'=>1,'msg'=>'保存成功'];
+ }
+ return json($res);
+ }
+
+ $menus = $this->getMenus();
+ View::assign('menus',$menus);
+
+ $authGroup = AuthGroupModel::select();
+ $auth = AuthGroupModel::find(input('id'));
+ $ru = $auth->rules;
+
+ View::assign(['authGroup'=>$authGroup,'auth'=>$auth,'ru'=>$ru]);
+ return View::fetch('roleedit');
+ }
+
+
+
+}
diff --git a/app/admin/controller/AuthRule.php b/app/admin/controller/AuthRule.php
new file mode 100644
index 0000000..2f5655f
--- /dev/null
+++ b/app/admin/controller/AuthRule.php
@@ -0,0 +1,169 @@
+authRuleTree();
+ $count = count($auth_rules);
+ $res = [];
+ if($auth_rules){
+ $res = ['code'=>0,'msg'=>'','count'=>$count];
+
+ foreach($auth_rules as $k => $v){
+ //$data = $v->getData();
+ $data = ['id'=>$v['id'],'sort'=>$v['sort'],'title'=>str_repeat('---',$v['level']*2).$v['title'],'name'=>$v['name'],'icon'=>$v['icon'],'status'=>$v['status'],'level'=>$v['level']+1,'ishidden'=>$v['ishidden']];
+ $res['data'][] = $data;
+ }
+ }
+ return json($res);
+ }
+ return View::fetch();
+
+ }
+ //添加权限
+ public function add()
+ {
+ //
+ if(Request::isAjax()){
+ $data = Request::param();
+ //halt($data);
+ $plevel = Db::name('auth_rule')->field('level')->find($data['pid']);
+ if($plevel){
+ $data['level'] = $plevel['level']+1;
+ } else {
+ $data['level'] = 0;
+ }
+
+ $list = Db::name('auth_rule')->save($data);
+
+ if($list){
+ return json(['code'=>0,'msg'=>'添加权限成功']);
+ }else{
+ return json(['code'=>-1,'msg'=>'添加权限失败']);
+ }
+ }
+ $rule = new AuthRuleModel();
+ $auth_rules = $rule->authRuleTree();
+ View::assign('AuthRule',$auth_rules);
+ return View::fetch();
+ }
+
+ //权限编辑
+ public function edit()
+ {
+ $rule = new AuthRuleModel();
+
+ if(Request::isAjax()){
+ $data = Request::param();
+ $ruId = $rule->find($data['pid']); //查询出上级ID
+ if($ruId){
+ $plevel = $ruId->level; //上级level等级
+ $data['level'] = $plevel+1;
+ } else {
+ $data['level'] = 0;
+ }
+
+ $zi = $rule->where('pid',$data['id'])->select();//查询出下级
+
+ if($zi){
+ $zi->update(['level'=>$data['level']+1]);
+ }
+
+
+
+
+
+ $save = AuthRuleModel::update($data);
+
+ if($save){
+ $res = ['code'=>0,'msg'=>'修改成功'];
+ } else {
+ $res = ['code'=>1,'msg'=>'修改失败'];
+ }
+ return json($res);
+ }
+
+ $auth_rules = $rule->authRuleTree();
+ $rules = $rule->find(input('id'));
+ View::assign(['AuthRule'=>$auth_rules,'rules'=>$rules]);
+ return View::fetch();
+ }
+
+
+ //权限开关
+ public function Check()
+ {
+ $data = Request::param();
+
+ //获取状态
+ $res = Db::name('auth_rule')->where('id',$data['id'])->save(['status' => $data['status']]);
+ if($res){
+ if($data['status'] == 1){
+ return json(['code'=>0,'msg'=>'权限开启','icon'=>6]);
+ } else {
+ return json(['code'=>0,'msg'=>'权限禁用','icon'=>5]);
+ }
+
+ }else {
+ return json(['code'=>1,'msg'=>'审核出错']);
+ }
+
+ }
+
+ //菜单显示控制
+ public function menuShow()
+ {
+ $data = Request::param();
+ //var_dump($data);
+ $rules = Db::name('auth_rule')->save($data);
+ if($rules){
+ if($data['ishidden'] == 1){
+ return json(['code'=>1,'msg'=>'设置菜单显示','icon'=>6]);
+ } else {
+ return json(['code'=>1,'msg'=>'取消菜单显示','icon'=>5]);
+ }
+ }else{
+ $res = ['code'=>0,'msg'=>'设置失败'];
+ }
+ return json($res);
+ }
+
+ //排序
+ public function sort()
+ {
+ $data = Request::param();
+ $rules = Db::name('auth_rule')->save($data);
+ if($rules){
+ $res = ['code'=>1,'msg'=>'排序成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'排序失败'];
+ }
+ return json($res);
+ }
+
+ public function delete($id)
+ {
+ $rule = AuthRuleModel::find($id);
+ $result = $rule->delete();
+ if($result){
+ $res = ['code'=>1,'msg'=>'删除成功'];
+ } else {
+ $res = ['code'=>0,'msg'=>'删除失败'];
+ }
+ return json($res);
+ }
+
+}
diff --git a/app/admin/controller/Forum.php b/app/admin/controller/Forum.php
new file mode 100644
index 0000000..a07b28f
--- /dev/null
+++ b/app/admin/controller/Forum.php
@@ -0,0 +1,151 @@
+alias('a')
+ ->join('user u','a.user_id = u.id')
+ ->field('a.id as aid,name,user_img,title,a.update_time,is_top')
+ ->where('a.delete_time',0)
+ ->order('a.create_time', 'desc')
+ ->paginate(15);
+ $res = [];
+ if($forumList){
+ $res['code'] = 0;
+ $res['msg'] = '';
+ $res['count'] = $forumList->total();
+ foreach($forumList as $k=>$v){
+ $res['data'][]= ['id'=>$v['aid'],'poster'=>$v['name'],'avatar'=>$v['user_img'],'content'=>$v['title'],'posttime'=>date("Y-m-d",$v['update_time']),'top'=>$v['is_top']];
+ }
+ }
+ return json($res);
+ }
+ return View::fetch();
+ }
+
+ //编辑帖子
+ public function listForm()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ $form = Db::name('article')->find($data['id']);
+ //halt($form);
+ }
+ return View::fetch();
+ }
+
+ //帖子分类
+ public function tags()
+ {
+ if(Request::isAjax()){
+ $list = Cate::select();
+ if($list){
+ $res['code'] = 0;
+ $res['msg'] = '';
+ $res['count']= count($list);
+ $res['data'] = [];
+ foreach($list as $k=>$v){
+ $res['data'][] = ['id' => $v['id'],'tags'=>$v['catename'],'sort'=>$v['sort'],'ename'=>$v['ename']];
+ }
+ }
+ return json($res);
+ }
+ return View::fetch();
+ }
+
+ //添加帖子分类
+ public function addtags()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ //halt($data);
+ $list = Db::name('cate')->save($data);
+
+ if($list){
+ return json(['code'=>0,'msg'=>'添加分类成功']);
+ }else{
+ return json(['code'=>-1,'msg'=>'添加分类失败']);
+ }
+ }
+ return view('tagsform');
+
+ }
+
+ //编辑帖子分类
+ public function tagsform()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ //halt($data);
+ $list = Db::name('cate')->where('id',$data['id'])->save($data);
+
+ if($list){
+ return json(['code'=>0,'msg'=>'修改分类成功']);
+ }else{
+ return json(['code'=>-1,'msg'=>'修改分类失败']);
+ }
+ }
+ return View::fetch();
+ }
+
+ //删除帖子分类
+ public function tagsdelete()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+
+ $cate = new Cate;
+ $result = $cate->del($data);
+
+
+ if($result == 1){
+ return json(['code'=>0,'msg'=>'删除分类成功']);
+ }else{
+ return json(['code'=>-1,'msg'=>'删除分类失败']);
+ }
+ }
+ }
+
+ //帖子评论
+ public function replys()
+ {
+ if(Request::isAjax()) {
+ $replys = Comment::with(['user','article'])->paginate(15);
+ $count = $replys->total();
+ $res = [];
+ if ($replys) {
+ $res = ['code'=>0,'msg'=>'','count'=>$count];
+ foreach($replys as $k => $v){
+ //var_dump($v);
+ $res['data'][] = ['id'=>$k+1,'replyer'=>$v->user->name,'cardid'=>$v->article->title,'avatar'=>$v->user->user_img,'content'=>$v['content'],'replytime'=>$v['create_time']];
+ }
+ }
+ return json($res);
+ }
+
+ return View::fetch();
+ }
+
+ public function replysform()
+ {
+ return View::fetch();
+ }
+
+}
diff --git a/app/admin/controller/Index.php b/app/admin/controller/Index.php
new file mode 100644
index 0000000..117f2e5
--- /dev/null
+++ b/app/admin/controller/Index.php
@@ -0,0 +1,47 @@
+find(1);
+ View::assign('sys',$sys);
+ return View::fetch();
+ }
+
+
+ public function layout(){
+
+ return view();
+ }
+}
\ No newline at end of file
diff --git a/app/admin/controller/Login.php b/app/admin/controller/Login.php
new file mode 100644
index 0000000..cc035bd
--- /dev/null
+++ b/app/admin/controller/Login.php
@@ -0,0 +1,57 @@
+scene('Login')
+ ->check($data);
+ } catch(ValidateException $e){
+ return json(['code'=>-1,'msg'=>$e->getError()]);
+ }
+
+ $user = new \app\admin\model\Admin();
+ $res = $user->login($data);
+
+ if ($res == 1) {
+ $res = ['code'=>0,'msg'=>'登陆成功'];
+ //$res['data']['access_token'] = $data['__token__'];
+ } else {
+ $res = ['code'=>-1,'msg'=>$res,'url'=>'admin/login'];
+ }
+ return json($res);
+ }
+ return View::fetch('login');
+ }
+
+ //注册
+ public function reg()
+ {
+ if(Session::has('admin_id')){
+ return redirect('/admin/index/index');
+ }
+
+ return View::fetch('reg');
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/admin/controller/Menu.php b/app/admin/controller/Menu.php
new file mode 100644
index 0000000..b3ed64d
--- /dev/null
+++ b/app/admin/controller/Menu.php
@@ -0,0 +1,11 @@
+find(1);
+ $sysInfo = System::find(1);
+ if(Request::isAjax()){
+ $data = Request::param();
+
+ $result = $sysInfo->allowField(['webname','webtitle','domain','keywords','descript','copyright','blackname'])->save($data);
+ if($result){
+ return json(['code'=>0,'msg'=>'更新成功']);
+ } else {
+ return json(['code'=>-1,'msg'=>'更新失败']);
+ }
+ }
+ $syscy = $this->check($sysInfo['base_url']);
+ View::assign(['sysInfo'=>$sysInfo,'syscy'=>$syscy]);
+ return View::fetch('set/system/website');
+ }
+
+ /**
+ * 显示创建资源表单页.
+ *
+ * @return \think\Response
+ */
+ public function email()
+ {
+ //$mailserver = Db::name('mail_server')->find(1);
+ $mailserver = MailServer::find(1);
+ //邮箱配置
+ if(Request::isAjax()){
+ $data = Request::param();
+ $res = $mailserver->save($data);
+ //dump($data);
+ if($res){
+ return json(['code'=>0,'msg'=>'更新成功']);
+ } else {
+ return json(['code'=>-1,'msg'=>'更新失败']);
+ }
+ }
+
+ View::assign('mailserver',$mailserver);
+ return View::fetch('set/system/email');
+ }
+
+ /**
+ * 显示编辑资源表单页.
+ *
+ * @param int $id
+ * @return \think\Response
+ */
+ public function edit($id)
+ {
+ //
+ }
+
+ /**
+ * 保存更新的资源
+ *
+ * @param \think\Request $request
+ * @param int $id
+ * @return \think\Response
+ */
+ public function update(Request $request, $id)
+ {
+ //
+ }
+
+ /**
+ * 删除指定资源
+ *
+ * @param int $id
+ * @return \think\Response
+ */
+ public function delete($id)
+ {
+ //
+ }
+
+ //上传logo
+ public function upload()
+ {
+ $file = request()->file('file');
+
+ try {
+ validate(['image'=>'filesize:2048|fileExt:jpg,png,gif|image:200,200,jpg'])
+ ->check(array($file));
+ $savename = \think\facade\Filesystem::disk('public')->putFile('logo',$file);
+ } catch (think\exception\ValidateException $e) {
+ echo $e->getMessage();
+ }
+ $upload = Config::get('filesystem.disks.public.url');
+
+ if($savename){
+ $name_path =str_replace('\\',"/",$upload.'/'.$savename);
+ $result = Db::name('system')->where('id', 1)->update(['logo'=>$name_path]);
+ if($result){
+ $res = ['code'=>0,'msg'=>'上传logo成功'];
+ } else {
+ $res = ['code'=>1,'msg'=>'上传错误'];
+ }
+
+ }
+ return json($res);
+ }
+
+ public function check($url)
+ {
+ $url = $url.'?u='.Request::domain();
+ $ch =curl_init ();
+ curl_setopt($ch,CURLOPT_URL, $url);
+ curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 20);
+ curl_setopt($ch,CURLOPT_POST, 1);
+ $data = curl_exec($ch);
+ $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
+ curl_close($ch);
+ if($httpCode == '200'){
+ $cy = json_decode($data);
+ if(!empty($cy)){
+ $cylevel = $cy->level;
+ return $cylevel;
+ }
+ } else {
+ return 0;
+ }
+ }
+
+}
diff --git a/app/admin/controller/Slider.php b/app/admin/controller/Slider.php
new file mode 100644
index 0000000..6270156
--- /dev/null
+++ b/app/admin/controller/Slider.php
@@ -0,0 +1,126 @@
+select();
+ View::assign('slider',$sliders);
+ return View::fetch();
+ }
+
+ /**
+ * 显示创建资源表单页.
+ *
+ * @return \think\Response
+ */
+ public function add()
+ {
+ //添加幻灯
+ if(Request::isAjax()){
+ $data = Request::param();
+ $data['slid_start'] = strtotime($data['slid_start']);
+ $data['slid_over'] = strtotime($data['slid_over']);
+ $result = Db::name('slider')->save($data);
+ if($result){
+ $res = ['code'=>1,'msg'=>'添加成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'添加失败'];
+ }
+ return json($res);
+ }
+
+ return View::fetch();
+ }
+
+
+ /**
+ * 编辑幻灯
+ *
+ * @param int $id
+ * @return \think\Response
+ */
+ public function edit($id)
+ {
+ $slider = Db::name('slider')->find($id);
+
+ if(Request::isAjax()){
+ $data = Request::param();
+ //var_dump($data);
+ $data['slid_start'] = strtotime($data['slid_start']);
+ $data['slid_over'] = strtotime($data['slid_over']);
+ $result = Db::name('slider')->where('id',$id)->save($data);
+ if($result){
+ $res = ['code'=>1,'msg'=>'编辑成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'编辑失败'];
+ }
+ return json($res);
+ }
+ View::assign('slider',$slider);
+
+ return View::fetch();
+ }
+
+ /**
+ * 保存更新的资源
+ *
+ * @param
+ * @param int $id
+ * @return \think\Response
+ */
+ public function uploadImg()
+ {
+ $id = Request::param();
+ $file = request()->file('file');
+ try {
+ validate(['image'=>'filesize:2048|fileExt:jpg,png,gif|image:200,200,jpg'])
+ ->check(array($file));
+ $savename = \think\facade\Filesystem::disk('public')->putFile('slider',$file);
+ } catch (think\exception\ValidateException $e) {
+ echo $e->getMessage();
+ }
+ $upload = Config::get('filesystem.disks.public.url');
+
+ if($savename){
+ $name_path =str_replace('\\',"/",$upload.'/'.$savename);
+ $res = ['code'=>0,'msg'=>'上传flash成功','src'=>$name_path];
+ } else {
+ $res = ['code'=>1,'msg'=>'上传错误'];
+ }
+ return json($res);
+ }
+
+ /**
+ * 删除指定资源
+ *
+ * @param int $id
+ * @return \think\Response
+ */
+ public function delete($id)
+ {
+ //
+ $slider = SliderModel::find($id);
+ $res = $slider->delete();
+ if($res){
+ return json(['code'=>1,'msg'=>'删除成功']);
+ } else {
+ return json(['code'=>0,'msg'=>'删除失败']);
+ }
+ }
+}
diff --git a/app/admin/controller/Upgrade.php b/app/admin/controller/Upgrade.php
new file mode 100644
index 0000000..2c9a4af
--- /dev/null
+++ b/app/admin/controller/Upgrade.php
@@ -0,0 +1,471 @@
+sys_version_num = Db::name('system')->where('id',1)->value('sys_version_num');
+ }
+
+
+
+ /** 展示升级界面 */
+ public function index()
+ {
+ $sys_version_num = Db::name('system')->field('sys_version_num,key,upcheck_url,upgrade_url')->find(1);
+ View::assign('ver_num',$sys_version_num);
+ return View::fetch();
+ }
+
+ //设置key
+ public function key()
+ {
+ $data = Request::param();
+ if($data['key']== ''){
+ return json(['code'=>0,'msg'=>'请填写正确的key']);
+ }
+ $res = Db::name('system')->update(['key'=>$data['key'],'id'=>1]);
+ if($res){
+ $res = ['code'=>1,'msg'=>'保存成功'];
+ } else {
+ $res = ['code'=>0,'msg'=>'保存失败'];
+ }
+ return json($res);
+ }
+
+ //修改key
+ public function keyedit()
+ {
+ $key = Db::name('system')->field('key,upcheck_url,upgrade_url')->find(1);
+
+ if(Request::isAjax()){
+ $data = Request::param();
+ if($data['key']== ''){
+ return json(['code'=>0,'msg'=>'请正确填写申请到的key']);
+ }
+ $res = Db::name('system')->update(['key'=>$data['key'],'upcheck_url'=>$data['upcheck_url'],'upgrade_url'=>$data['upgrade_url'],'id'=>1]);
+ if($res){
+ $res = ['code'=>1,'msg'=>'修改成功'];
+ } else {
+ $res = ['code'=>0,'msg'=>'修改失败'];
+ }
+ return json($res);
+ }
+ View::assign('key',$key);
+ return View::fetch();
+ }
+
+ //升级前的版本检测
+ public function check($url)
+ {
+ $url = $url.'?ver='.$this->sys_version_num;
+ $ch =curl_init ();
+ curl_setopt($ch,CURLOPT_URL, $url);
+ curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 20);
+ curl_setopt($ch,CURLOPT_POST, 1);
+ $data = curl_exec($ch);
+ $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
+ curl_close($ch);
+ if($httpCode != '200'){
+ return json(['code'=>0,'msg'=>'连接服务器失败,稍后重试...']);
+ }
+ $versions = json_decode($data);
+ //判断状态
+ $version_code = $versions->code;
+ if($version_code == 0){
+ return json(['code'=>$version_code,'msg'=>$versions->msg]);
+ }
+ //版本比较
+ $version_num = $versions->version;
+ $up_num =$versions->up_num;
+ $res = version_compare($version_num,$this->sys_version_num,'>');
+ if($res){
+ return json(['code'=>1,'msg'=>'发现新版本','version'=>$version_num,'upnum'=>$up_num]);
+ } else {
+ return json(['code'=>0,'msg'=>'暂时还没更新哦! ==8']);
+ }
+ }
+
+
+ /**
+ * 自动更新
+ */
+ public function upload()
+ {
+ $data = Request::param();
+ if(empty($data['key'])){
+ return json(["code"=>0,"msg"=>"请配置正确升级key"]);
+ }
+ $url = $data['url'].'?domain='.Request::domain().'&key='.$data['key'].'&ver='.$this->sys_version_num;
+
+ $ch =curl_init ();
+ curl_setopt($ch,CURLOPT_URL, $url);
+ curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 20);
+ curl_setopt($ch,CURLOPT_POST, 1);
+ $data = curl_exec($ch);
+ $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
+ curl_close($ch);
+ if($httpCode != '200'){
+ return json(['code'=>0,'msg'=>'连接服务器失败,稍后重试...']);
+ }
+ //获取远程文件
+ $versions = json_decode($data);
+ //判断状态
+ $version_code = $versions->code;
+ if($version_code == 0){
+ return json(['code'=>$version_code,'msg'=>$versions->msg]);
+ }
+
+ $version_num = $versions->version;
+ $file_url = $versions->src;
+
+ //判断远程文件是否可用存在
+ $header = get_headers($file_url, true);
+ if(!isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'))){
+ return json(["code"=>0,"msg"=>"获取远程文件失败"]);
+ }
+ //把远程文件放入本地
+ $package_file = $this->upload_dir.'tao_'.$version_num.'.zip';
+
+ if(!is_dir($this->upload_dir)){
+ $this->create_dirs($this->upload_dir);
+ }
+ $cpfile = copy($file_url,$package_file);
+ if(!$cpfile)
+ {
+ return json(["code"=>0,"msg"=>"下载升级文件失败"]);
+ }
+
+ //记录下日志
+ $this->save_log("上传升级包成功!");
+ $this->update_progress("20%");
+
+ //升级前备份代码
+ $ex = array('app','view');
+ $backup_code_res = $this->copydir('../', $this->backup_dir, $ex);
+ if(!$backup_code_res){
+ $this->save_log("备份失败!");
+ return json(["code"=>0,"msg"=>"备份失败"]);
+ }
+ $this->update_progress("30%");
+
+ //执行升级
+ $upres = $this->execute_update($package_file);
+ //更新版本
+ Db::name('system')->update(['sys_version_num'=>$version_num,'id'=>1]);
+ if($upres){
+ return json(["code"=>1,"msg"=>"升级成功"]);
+ }else {
+ return json(["code"=>0,"msg"=>"升级失败"]);
+ }
+ }
+
+ /**
+ * 处理升级包上传
+ */
+ public function uploadZip()
+ {
+ $files = request()->file('file');
+
+ if($files)
+ {
+ $name = $files->getOriginalName();
+
+ if(!$name)
+ {
+ return json(["code"=>0,"msg"=>"请上传升级包文件"]);
+ }
+ }
+ //校验后缀
+ $astr = explode('.',$name);
+ $ext = array_pop($astr);
+ if($ext != 'zip')
+ {
+ return json(["code"=>0,"msg"=>"请上传文件格式不对"]);
+
+ }
+
+ //对比版本号
+ $astr = explode('_',$name);
+ $version_num = str_replace(".zip", '',array_pop($astr));
+ //var_dump($version_num);
+ if(!$version_num)
+ {
+ return json(["code"=>0,"msg"=>"获取版本号失败"]);
+
+ }
+ //对比
+ if(!$this->compare_version($version_num))
+ {
+ return json(["code"=>0,"msg"=>"版本升级不能降级!请检查..."]);
+ }
+
+
+ $package_file = $this->upload_dir.$name;
+ //$mv = $files->move('/../tmp/web/upload_dir',$version_num);
+ $mfile = move_uploaded_file($files,$package_file);
+ if(!$mfile)
+ {
+ return json(["code"=>0,"msg"=>"上传文件失败"]);
+ }
+
+ //记录下日志
+ $this->save_log("上传升级包成功!");
+ $this->update_progress("20%");
+
+ //升级前备份代码
+ $ex = array('app','view');
+ $backup_code_res = $this->copydir('../', $this->backup_dir, $ex);
+ if(!$backup_code_res){
+ $this->save_log("备份失败!");
+ return json(["code"=>0,"msg"=>"备份失败"]);
+ }
+
+ $this->update_progress("30%");
+ //执行升级
+ $upres = $this->execute_update($package_file);
+ //更新版本
+ Db::name('system')->update(['sys_version_num'=>$version_num,'id'=>1]);
+ if($upres){
+ return json(["code"=>1,"msg"=>"升级成功"]);
+ }else {
+ return json(["code"=>0,"msg"=>"升级失败"]);
+ }
+ }
+
+ /**
+ * 升级操作
+ * @return [type] [description]
+ */
+ private function execute_update($package_file)
+ {
+ //解压 如何使用zip加密压缩,这里解压缩的时候注意要解密
+ $uzip = new Uzip();
+ $unzip_res = $uzip->uzip($package_file,$this->upload_dir,true);
+ //halt($unzip_res);
+ if(!$unzip_res)
+ {
+ $this->save_log("解压失败");
+ return json(["code"=>0,"msg"=>"解压失败"]);
+ }
+ //解压成功,得到文件夹
+ $package_name = str_replace(".zip","",$package_file);
+//var_dump($package_name);
+ $this->update_progress("50%");
+
+/*
+ //升级mysql
+ if(file_exists($this->upload_dir.'/'.$package_file."/mysql/mysql_update.sql"))
+ {
+ $result = $this->database_operation($this->upload_dir.'/'.$package_file."/mysql/mysql_update.sql");
+ if(!$result['code'])
+ {
+ echo json($result);die;
+ }
+ }
+*/
+
+ $this->update_progress("70%");
+
+
+ if(is_dir($package_name.'/'))
+ {
+
+ //升级PHP
+ $cp_res = $this->copydir($package_name.'/', $this->root_dir);
+ if(!$cp_res)
+ {
+ $this->save_log("php更新失败");
+ //数据库回滚
+ if(file_exists($this->upload_dir.'/'.$package_file."/mysql/mysql_rockback.sql"))
+ {
+ $this->save_log("数据库回滚");
+ $this->database_operation($this->upload_dir.'/'.$package_file."/mysql/mysql_rockback.sql");
+
+ }
+
+ //php代码回滚 升级前备份的代码
+
+ $backup_code_res = $this->copydir($this->backup_dir, $this->zip_dir);
+ if($backup_code_res){
+ $this->save_log("php回滚");
+ return json(["code"=>0,"msg"=>"php更新失败"]);
+ }
+ }
+ }
+
+ //把解压的升级包清除
+ //$del_zip = unlink($package_file);
+ $this->delDirAndFile($this->upload_dir);
+ $this->delDirAndFile($this->backup_dir);
+
+ $this->update_progress("100%");
+ //更新系统的版本号了
+ //更新php的版本号了(应该跟svn/git的版本号一致)
+ //更新数据库的版本号了(应该跟svn/git的版本号一致)
+
+ return true;
+ }
+
+
+
+ /**
+ * 比较代码版本
+ * @return [type] [description]
+ */
+ private function compare_version($version_num='1.0.0')
+ {
+
+ return version_compare($version_num,$this->sys_version_num,'>');
+ //return json(['code'=>1,'msg'=>'版本','data'=>$version]);
+ }
+
+
+ /**
+ * 数据库操作
+ */
+ public function database_operation($file)
+ {
+ $mysqli = new mysqli("localhost","root","root","test");
+ if($mysqli->connect_errno)
+ {
+ return json(["code"=>0,"msg"=>"Connect failed:".$mysqli->connect_error]);
+ }
+ $sql = file_get_contents($file);
+ $a = $mysqli->multi_query($sql);
+ return ["code"=>1,"msg"=>"数据库操作OK"];
+ }
+
+ /**
+ * 返回系统升级的进度
+ */
+ public function update_progress($progress)
+ {
+ exec(" echo '".$progress."' > $this->progress_log ");
+
+ }
+ /**
+ * 记录日志
+ */
+ public function save_log($msg,$action="update")
+ {
+ $msg .= date("Y-m-d H:i:s").":".$msg."\n";
+ if($action == "update")
+ {
+ exec(" echo '".$msg."' >> $this->update_log ");
+ }else
+ {
+ exec(" echo '".$msg."' >> $this->return_log ");
+ }
+ }
+
+
+ /**
+ * 复制文件夹$source下的文件和子文件夹下的内容到$dest下 升级+备份代码
+ * @param $source
+ * @param $dest
+ * @param $ex 定义指定复制的目录,默认全复制
+ */
+ public function copydir($source, $dest, $ex=array())
+ {
+ if (!file_exists($dest)) mkdir($dest);
+ if($handle = opendir($source)){
+ while (($file = readdir($handle)) !== false) {
+
+ if (( $file != '.' ) && ( $file != '..' )) {
+ if ( is_dir($source . $file) ) {
+
+ if(count($ex) != 0){
+ if(in_array($file,$ex)){
+
+ $this->copydir($source . $file.'/', $dest . $file.'/');
+ }
+ }else{
+ $this->copydir($source . $file.'/', $dest . $file.'/');
+ }
+ } else {
+ copy($source. $file, $dest . $file);
+ }
+ }
+ }
+ closedir($handle);
+
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * 删除文件夹及内容
+ * @param $dirPath
+ * @param $nowDir 是否删除当前文件夹$dirPath true false
+ */
+ public function delDirAndFile( $dirPath, $nowDir=false )
+
+ {
+ if ( $handle = opendir($dirPath) ) {
+
+ while ( false !== ( $item = readdir( $handle ) ) ) {
+
+ if ( $item != '.' && $item != '..' ) {
+
+ $path = $dirPath.$item;
+ //var_dump($path);
+ if (is_dir($path)) {
+ $this->delDirAndFile($path.'/');
+ rmdir($path.'/');
+ } else {
+ unlink($path);
+ }
+ }
+ }
+
+ closedir( $handle );
+/*
+ if($nowDir == true){
+ if(!rmdir($dirPath)){
+ return false;
+ }
+ }
+*/
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/admin/controller/User.php b/app/admin/controller/User.php
new file mode 100644
index 0000000..edce1ec
--- /dev/null
+++ b/app/admin/controller/User.php
@@ -0,0 +1,129 @@
+where(['delete_time'=>0])->select();
+ $count = $user->count();
+ $res = [];
+ if($user){
+ $res = ['code'=>0,'msg'=>'','count'=>$count];
+
+ foreach($user as $k => $v){
+ $data = ['id'=>$v['id'],'username'=>$v['name'],'avatar'=>$v['user_img'],'phone'=>$v['phone'],'email'=>$v['email'],'sex'=>$v['sex'],'ip'=>$v['last_login_ip'],'jointime'=>date("Y-m-d",$v['create_time']),'status'=>$v['status']];
+ $res['data'][] = $data;
+ }
+ }
+ return json($res);
+ }
+ return View::fetch();
+ }
+
+
+ //添加用户
+ public function userForm()
+ {
+ //
+ if(Request::isAjax()){
+ $data = Request::param();
+ $result = Db::name('user')->save($data);
+ if($result){
+ $res = ['code'=>1,'msg'=>'添加成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'添加失败'];
+ }
+ return json($res);
+ }
+
+ return View::fetch('userform');
+ }
+
+ //编辑用户
+ public function userEdit()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ $result = Db::name('user')->update($data);
+ if($result){
+ $res = ['code'=>1,'msg'=>'编辑成功'];
+ }else{
+ $res = ['code'=>0,'msg'=>'编辑失败'];
+ }
+ return json($res);
+ }
+ $user = Db::name('user')->find(input('id'));
+ View::assign('user',$user);
+ return View::fetch('useredit');
+ }
+
+ //删除用户
+ public function delete($id)
+ {
+ if(Request::isAjax()){
+ $user =UserModel::find($id);
+ $result = $user->delete();
+
+ if($result){
+ return json(['code'=>1,'msg'=>'删除成功']);
+ }else{
+ return json(['code'=>0,'msg'=>'删除失败']);
+ }
+ }
+ }
+
+ //上传头像
+ public function uploadImg()
+ {
+ $file = request()->file('file');
+ try {
+ validate(['image'=>'filesize:2048|fileExt:jpg,png,gif|image:200,200,jpg'])
+ ->check(array($file));
+ $savename = \think\facade\Filesystem::disk('public')->putFile('head_pic',$file);
+ } catch (think\exception\ValidateException $e) {
+ echo $e->getMessage();
+ }
+ $upload = Config::get('filesystem.disks.public.url');
+
+ if($savename){
+ $name_path =str_replace('\\',"/",$upload.'/'.$savename);
+ $res = ['code'=>0,'msg'=>'上传头像成功','src'=>$name_path];
+ } else {
+ $res = ['code'=>1,'msg'=>'上传错误'];
+ }
+ return json($res);
+ }
+
+
+ //退出登陆
+ public function logout()
+ {
+ Session::clear();
+ $res = ['code'=>0,'msg'=>'退出成功' ];
+
+ return json($res);
+ }
+
+}
diff --git a/app/admin/controller/Uzip.php b/app/admin/controller/Uzip.php
new file mode 100644
index 0000000..ce026f5
--- /dev/null
+++ b/app/admin/controller/Uzip.php
@@ -0,0 +1,96 @@
+create_dirs($dir);
+ }
+
+ if(file_exists($filename)) {
+ $resource = zip_open($filename);
+
+ while($zip = zip_read($resource)) {
+ if(zip_entry_open($resource, $zip)) {
+
+ //获得文件名,mac压缩成zip,解压需要过滤资源库隐藏文件
+ $file_content = zip_entry_name($zip);
+
+
+ // 如果文件不在根目录中
+ $pos_last_slash = strrpos($file_content, "/");
+ $file_name = substr($file_content, $pos_last_slash+1);
+
+ if(empty($file_name)){
+
+ $pt = $this->create_dirs($dir.$file_content);
+ }
+
+ if($file_name) {
+
+ $save_path = $dir.$file_content;
+
+ if(file_exists($save_path)) {
+ if($overwrite === true){
+ //echo $file_name . '
';
+ $file_size = zip_entry_filesize($zip);
+ $file = zip_entry_read($zip, $file_size);
+ $fpc = file_put_contents($save_path, $file);
+ //zip_entry_close($zip);
+ }else{
+ //echo '文件夹内已存在文件 "' . $file_name . '" ';
+ return json(['code'=>0,'msg'=>'文件夹内已存在文件']);
+ }
+
+ }else {
+ //echo $file_name . '';
+ $file_size = zip_entry_filesize($zip);
+ $file = zip_entry_read($zip, $file_size);
+ $fpc = file_put_contents($save_path, $file);
+ //zip_entry_close($zip);
+ }
+
+ }
+ zip_entry_close($zip);
+ }
+ }
+ zip_close($resource);
+
+ }else{
+ return false;
+ }
+ return true;
+ }
+
+
+ public function create_dirs($path)
+ {
+ if (!is_dir($path))
+ {
+ $directory_path = "";
+ $directories = explode("/",$path);
+ array_pop($directories);
+
+ foreach($directories as $directory)
+ {
+ $directory_path .= $directory."/";
+ if (!is_dir($directory_path))
+ {
+ mkdir($directory_path);
+ chmod($directory_path, 0777);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/admin/middleware.php b/app/admin/middleware.php
new file mode 100644
index 0000000..bdf6ca9
--- /dev/null
+++ b/app/admin/middleware.php
@@ -0,0 +1,6 @@
+ \app\middleware\logedCheck::class,
+];
\ No newline at end of file
diff --git a/app/admin/model/.gitignore b/app/admin/model/.gitignore
new file mode 100644
index 0000000..0a94e04
--- /dev/null
+++ b/app/admin/model/.gitignore
@@ -0,0 +1 @@
+Version.php
\ No newline at end of file
diff --git a/app/admin/model/Admin.php b/app/admin/model/Admin.php
new file mode 100644
index 0000000..a63f603
--- /dev/null
+++ b/app/admin/model/Admin.php
@@ -0,0 +1,50 @@
+where('username',$data['username'])->find();
+
+ if($admin['status'] !=1){
+ return '用户被禁用或未审核,请联系管理员';
+ }
+ //对输入的密码字段进行MD5加密,再进行数据库的查询
+ $salt = substr(md5($admin['create_time']),-6);
+ $pwd = substr_replace(md5($data['password']),$salt,0,6);
+ $data['password'] = md5($pwd);
+ if($admin['password'] == $data['password']){
+
+ //将用户数据写入Session
+ Session::set('admin_id',$admin['id']);
+ Session::set('admin_name',$admin['username']);
+
+ Db::name('admin')->where('id',$admin['id'])->update(
+ [
+ 'last_login_time' => time(),
+ 'last_login_ip' => request()->ip(),
+ ]
+ );
+
+ //用户名密码正确返回1
+ return 1;
+ }else{
+ return '用户名或密码错误';
+ }
+ }
+}
diff --git a/app/admin/model/Article.php b/app/admin/model/Article.php
new file mode 100644
index 0000000..e2463f0
--- /dev/null
+++ b/app/admin/model/Article.php
@@ -0,0 +1,10 @@
+order('sort asc')->select();
+ return $this->sort($authRules);
+ }
+
+ public function sort($data,$pid=0)
+ {
+ static $arr = array();
+ foreach($data as $k=> $v){
+ if($v['pid']==$pid){
+ $arr[] = $v;
+ $this->sort($data,$v['id']);
+ }
+ }
+ return $arr;
+ }
+}
diff --git a/app/admin/model/AuthRule.php b/app/admin/model/AuthRule.php
new file mode 100644
index 0000000..dbcb07d
--- /dev/null
+++ b/app/admin/model/AuthRule.php
@@ -0,0 +1,35 @@
+order('sort asc')->select();
+ return $this->sort($authRules);
+ }
+
+ public function sort($data,$pid=0)
+ {
+ static $arr = array();
+ foreach($data as $k=> $v){
+ if($v['pid']==$pid){
+ $arr[] = $v;
+ $this->sort($data,$v['id']);
+ }
+ }
+ return $arr;
+ }
+}
diff --git a/app/admin/model/MailServer.php b/app/admin/model/MailServer.php
new file mode 100644
index 0000000..e5efcb8
--- /dev/null
+++ b/app/admin/model/MailServer.php
@@ -0,0 +1,24 @@
+ 'require|min:2|max:18|unique:admin',
+ 'password|密码' => 'require|min:6|max:20',
+ 'repassword|确认密码'=>'require|confirm:password',
+ 'nickname|昵称' => 'require|min:2|max:20',
+ 'email|邮箱' => 'require|email|unique:admin',
+ 'captcha|验证码' => 'require|captcha',
+ 'city|城市' => 'min:2',
+ 'sign|签名' => 'min:10',
+ 'sex|性别' => 'require',
+ 'nowpass|密码' => 'require|min:6|max:20',
+ ];
+
+ //登陆验证场景
+ public function sceneLogin()
+ {
+ return $this->only(['username','password','captcha'])
+ ->remove('username', 'unique');
+ }
+
+ //注册验证场景
+ public function sceneReg()
+ {
+ return $this->only(['username','password','repassword','email','captcha']);
+ //->append('email','unique:user');
+ // ->remove('password', 'confirm');
+ }
+
+ //密码找回
+ public function sceneForget()
+ {
+ return $this->only(['email','captcha']);
+ }
+
+ //密码重设
+ public function sceneRepass()
+ {
+ return $this->only(['password','repassword','captcha']);
+ }
+
+ //用户资料
+ public function sceneSet()
+ {
+ return $this->only(['email','nickname','ctity','sex','sign'])
+ ->remove('email','unique');
+ }
+
+ //设置新密码
+ public function sceneSetpass()
+ {
+ return $this->only(['nowpass','password','repassword']);
+ }
+}
\ No newline at end of file
diff --git a/app/common.php b/app/common.php
new file mode 100644
index 0000000..7c54aac
--- /dev/null
+++ b/app/common.php
@@ -0,0 +1,246 @@
+find(1);
+try {
+ //Server settings
+ $mail->SMTPDebug = 0; // Enable verbose debug output
+ $mail->CharSet = 'utf-8'; //b
+ $mail->isSMTP(); // Set mailer to use SMTP
+ $mail->Host = $mailserver['host']; // Specify main and backup SMTP servers
+ $mail->SMTPAuth = true; // Enable SMTP authentication
+ $mail->Username = $mailserver['mail']; // SMTP username
+ $mail->Password = $mailserver['password']; // SMTP password
+ $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
+ $mail->Port = $mailserver['port']; // TCP port to connect to
+
+ //Recipients
+ $mail->setFrom($mailserver['mail'], $mailserver['nickname']);
+ $mail->addAddress($to); // Add a recipient
+ //$mail->addAddress('ellen@example.com'); // Name is optional
+ //$mail->addReplyTo('info@example.com', 'Information');
+ //$mail->addCC('cc@example.com');
+ //$mail->addBCC('bcc@example.com');
+
+ //Attachments
+ //$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
+ //$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
+
+ //Content
+ $mail->isHTML(true); // Set email format to HTML
+ $mail->Subject = $title;
+ $mail->Body = $content;
+ //$mail->AltBody =$user ;
+
+
+ return $mail->send();
+ echo 'Message has been sent';
+ } catch (Exception $e) {
+ echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
+ }
+}
+
+//根据user area_id查询区域简称
+function getAsing($area_id){
+ return Db::name('user_area')->where('id',$area_id)->value('asing');
+}
+
+//根据用户主键ID,查询用户名称
+if(!function_exists('getUserName'))
+{
+ function getUserName($user_id)
+ {
+ return Db::name('user')->where('id',$user_id)->value('name');
+ }
+}
+
+if(!function_exists('getUserImg'))
+{
+ function getUserImg($user_id)
+ {
+ return Db::name('user')->where('id',$user_id)->value('user_img');
+ }
+}
+
+
+//根据文章分类ID查询分类名
+function getCateName($cate_ename)
+ {
+ return Db::name('cate')->where('ename',$cate_ename)->value('catename');
+ }
+
+
+//过滤文章摘要
+function getArtContent($content)
+{
+ return mb_substr(strip_tags($content),0,50).'更多详情...';
+}
+
+
+
+//根据帖子收藏主键ID,查询帖子名称
+if(!function_exists('getArticName'))
+{
+ function getArticName($article_id)
+ {
+ return Db::name('article')->where('id',$article_id)->value('title');
+ }
+}
+
+//根据评论时间查询是否已过修改期
+function getLimtTime($create_time)
+ {
+ $nt = time();
+ $lt = intval(($nt - strtotime($create_time))/86400);
+
+ return $lt;
+ }
+
+//根据用户名查询主页
+function jump()
+{
+ $username = Request::param('username');
+ return Db::name('user')->where('name',$username)->find();
+}
+
+/**
+ * 数组层级缩进转换
+ * @param array $array 源数组
+ * @param int $pid
+ * @param int $level
+ * @return array
+ */
+function array2level($array, $pid = 0, $level = 1)
+{
+ static $list = [];
+
+ foreach ($array as $v) {
+
+ if ($v['pid'] == $pid) {
+
+ $v['level'] = $level;
+ $list[] = $v;
+
+ array2level($array, $v['id'], $level + 1);
+ }
+ }
+
+ return $list;
+}
+
+/**
+ * 构建层级(树状)数组
+ * @param array $array 要进行处理的一维数组,经过该函数处理后,该数组自动转为树状数组
+ * @param string $pid_name 父级ID的字段名
+ * @param string $child_key_name 子元素键名
+ * @return array|bool
+ */
+function array2tree(&$array, $pid_name = 'pid', $child_key_name = 'children')
+{
+ $counter = array_children_count($array, $pid_name);
+ if (!isset($counter[0]) || $counter[0] == 0) {
+ return $array;
+ }
+ $tree = [];
+ while (isset($counter[0]) && $counter[0] > 0) {
+ $temp = array_shift($array);
+ if (isset($counter[$temp['id']]) && $counter[$temp['id']] > 0) {
+ array_push($array, $temp);
+ } else {
+ if ($temp[$pid_name] == 0) {
+ $tree[] = $temp;
+ } else {
+ $array = array_child_append($array, $temp[$pid_name], $temp, $child_key_name);
+ }
+ }
+ $counter = array_children_count($array, $pid_name);
+ }
+
+ return $tree;
+}
+
+/**
+ * 子元素计数器
+ * @param array $array
+ * @param int $pid
+ * @return array
+ */
+function array_children_count($array, $pid)
+{
+ $counter = [];
+ foreach ($array as $item) {
+ $count = isset($counter[$item[$pid]]) ? $counter[$item[$pid]] : 0;
+ $count++;
+ $counter[$item[$pid]] = $count;
+ }
+
+ return $counter;
+}
+
+/**
+ * 把元素插入到对应的父元素$child_key_name字段
+ * @param $parent
+ * @param $pid
+ * @param $child
+ * @param string $child_key_name 子元素键名
+ * @return mixed
+ */
+function array_child_append($parent, $pid, $child, $child_key_name)
+{
+ foreach ($parent as &$item) {
+ if ($item['id'] == $pid) {
+ if (!isset($item[$child_key_name])) {
+ $item[$child_key_name] = [];
+ }
+
+ $item[$child_key_name][] = $child;
+ }
+ }
+
+ return $parent;
+}
+
+
+//菜单递归
+function getTree($data)
+{
+ $tree = [];
+ foreach ($data as $array) {
+
+ if(isset($data[$array['pid']])) {
+ $data[$array['pid']]['children'][] = &$data[$array['id']];
+ //$tree = $data;
+ } else {
+ $tree[] = &$data[$array['id']];
+ }
+ }
+ return $tree;
+}
+
+//按钮权限检查
+function checkRuleButton($rules_button)
+{
+ $admin_id = Session::get('admin_id');
+ $auth = new xiaodi\Auth();
+ $res = $auth->check($rules_button,$admin_id );
+
+ if($res || $admin_id == 1){
+ return true;
+ } else {
+ return false;
+ }
+}
+
+//菜单结构
+function getSpaceNmu($level)
+{
+ return str_repeat('---',$level);
+}
diff --git a/app/common/controller/AdminController.php b/app/common/controller/AdminController.php
new file mode 100644
index 0000000..37735a1
--- /dev/null
+++ b/app/common/controller/AdminController.php
@@ -0,0 +1,238 @@
+app = $app;
+ $this->request = $this->app->request;
+
+ // 控制器初始化
+ $this->initialize();
+ }
+
+ // 初始化
+ protected function initialize()
+ {
+ //权限auth检查
+ //$this->checkAuth();
+ $this->getMenu();
+ }
+
+ /**
+ * 验证数据
+ * @access protected
+ * @param array $data 数据
+ * @param string|array $validate 验证器名或者验证规则数组
+ * @param array $message 提示信息
+ * @param bool $batch 是否批量验证
+ * @return array|string|true
+ * @throws ValidateException
+ */
+ protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+ {
+ if (is_array($validate)) {
+ $v = new Validate();
+ $v->rule($validate);
+ } else {
+ if (strpos($validate, '.')) {
+ // 支持场景
+ list($validate, $scene) = explode('.', $validate);
+ }
+ $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+ $v = new $class();
+ if (!empty($scene)) {
+ $v->scene($scene);
+ }
+ }
+
+ $v->message($message);
+
+ // 是否批量验证
+ if ($batch || $this->batchValidate) {
+ $v->batch(true);
+ }
+
+ return $v->failException(true)->check($data);
+ }
+
+
+ //权限检查
+ /**
+ * 权限检查
+ * @return bool
+ */
+/*
+ protected function checkAuth()
+ {
+ if (!Session::has('admin_id')) {
+ echo '请去登陆';
+ return redirect('/admin/login/index');
+ //$this->error('请登录');
+ //return ['code'=>0,'url'=>'/user/login'];
+ }
+
+ $app = app('http')->getName();
+ $controller = $this->request->controller();
+ $action = $this->request->action();
+
+ // 排除权限
+ $not_check = ['admin/Index/index','admin/Index/home','admin/Set/info','admin/Set/password'];
+
+ if (!in_array($app . '/' . $controller . '/' . $action, $not_check)) {
+ $auth = new Auth();
+ $admin_id = Session::get('admin_id');
+
+ if (!$auth->check($app . '/' . $controller . '/' . $action, $admin_id) && $admin_id != 1) {
+ //$this->error('没有权限');
+ echo '';
+ //return redirect('admin/user/login');
+ }
+ }
+ }
+*/
+
+
+ /**
+ * 获取侧边栏菜单
+ */
+ protected function getMenu()
+ {
+ $menu = [];
+ $admin_id = Session::get('admin_id');
+ $auth = new Auth();
+
+ $auth_rule_list = Db::name('auth_rule')->where(['status'=> 1,'ishidden'=>1])->order(['sort' => 'asc'])->select();
+ //var_export($auth_rule_list);
+
+ foreach ($auth_rule_list as $value) {
+ if ($auth->check($value['name'], $admin_id) || $admin_id == 1) {
+ $menu[] = $value;
+ }
+ }
+
+ $menu = !empty($menu) ? array2tree($menu) : [];
+ return View::assign('menu', $menu);
+ }
+
+ /**
+ * 获取角色菜单
+ */
+ protected function getMenus()
+ {
+ $menu = [];
+ $auth_rule_list = Db::name('auth_rule')->where(['status'=> 1])->order(['sort' => 'ASC', 'id' => 'ASC'])->select();
+ //var_export($auth_rule_list);
+
+ foreach ($auth_rule_list as $value) {
+ $menu[] = $value;
+ }
+ $menus = !empty($menu) ? array2tree($menu) : [];
+ //$menu2 = getTree($menu);
+ return $menus;
+ //return View::assign('menus', $menus);
+ }
+
+ //判断是否已登录?
+ protected function isLogged()
+ {
+ if(Session::has('admin_id')){
+ return redirect('admin/index/index');
+ }
+ }
+
+ //判断是否需要登录?
+ protected function isLogin()
+ {
+ if(!Session::has('admin_id')){
+ return redirect('/admin/login/index');
+ }
+ }
+
+ //显示当前登录管理员
+ protected function showAdmin()
+ {
+ $id = Session::get('admin_id');
+
+ //1.查询管理用户
+ $adminHead = Admin::find($id);
+
+ //2.将User变量赋给模板 公共模板nav.html
+ View::assign('adminHead',$adminHead);
+ }
+
+ /**创建目录
+ * This function creates recursive directories if it doesn't already exist
+ *
+ * @param String The path that should be created
+ *
+ * @return void
+ */
+ protected function create_dirs($path)
+ {
+ if (!is_dir($path))
+ {
+ $directory_path = "";
+ $directories = explode("/",$path);
+ array_pop($directories);
+
+ foreach($directories as $directory)
+ {
+ $directory_path .= $directory."/";
+ if (!is_dir($directory_path))
+ {
+ mkdir($directory_path);
+ chmod($directory_path, 0777);
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/common/controller/BaseController.php b/app/common/controller/BaseController.php
new file mode 100644
index 0000000..42589f2
--- /dev/null
+++ b/app/common/controller/BaseController.php
@@ -0,0 +1,257 @@
+app = $app;
+ $this->request = $this->app->request;
+
+ // 控制器初始化
+ $this->initialize();
+ }
+
+ // 初始化
+ protected function initialize()
+ {
+ //系统配置
+ $this->showSystem();
+ //显示分类导航
+ $this->showNav();
+ $this->showUser();
+ }
+
+ /**
+ * 验证数据
+ * @access protected
+ * @param array $data 数据
+ * @param string|array $validate 验证器名或者验证规则数组
+ * @param array $message 提示信息
+ * @param bool $batch 是否批量验证
+ * @return array|string|true
+ * @throws ValidateException
+ */
+ protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+ {
+ if (is_array($validate)) {
+ $v = new Validate();
+ $v->rule($validate);
+ } else {
+ if (strpos($validate, '.')) {
+ // 支持场景
+ list($validate, $scene) = explode('.', $validate);
+ }
+ $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+ $v = new $class();
+ if (!empty($scene)) {
+ $v->scene($scene);
+ }
+ }
+
+ $v->message($message);
+
+ // 是否批量验证
+ if ($batch || $this->batchValidate) {
+ $v->batch(true);
+ }
+
+ return $v->failException(true)->check($data);
+ }
+
+ /**
+ * 操作错误跳转
+ * @param mixed $msg 提示信息
+ * @param string $url 跳转的URL地址
+ * @param mixed $data 返回的数据
+ * @param integer $wait 跳转等待时间
+ * @param array $header 发送的Header信息
+ * @return void
+ */
+ protected function error($msg = '', string $url = null, $data = '', int $wait = 3, array $header = []): Response
+ {
+ if (is_null($url)) {
+ $url = request()->isAjax() ? '' : 'javascript:history.back(-1);';
+ } elseif ($url) {
+ $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : app('route')->buildUrl($url);
+ }
+
+ $result = [
+ 'code' => 0,
+ 'msg' => $msg,
+ 'data' => $data,
+ 'url' => $url,
+ 'wait' => $wait,
+ ];
+
+ $type = (request()->isJson() || request()->isAjax()) ? 'json' : 'html';
+ if ('html' == strtolower($type)) {
+ $type = 'jump';
+ }
+
+ $response = Response::create($result, $type)->header($header)->options(['jump_template' => app('config')->get('app.dispatch_error_tmpl')]);
+
+ throw new HttpResponseException($response);
+ }
+
+ /**
+ * 返回封装后的API数据到客户端
+ * @param mixed $data 要返回的数据
+ * @param integer $code 返回的code
+ * @param mixed $msg 提示信息
+ * @param string $type 返回数据格式
+ * @param array $header 发送的Header信息
+ * @return Response
+ */
+ protected function result($data, int $code = 0, $msg = '', string $type = '', array $header = []): Response
+ {
+ $result = [
+ 'code' => $code,
+ 'msg' => $msg,
+ 'time' => time(),
+ 'data' => $data,
+ ];
+
+ $type = $type ?: 'json';
+ $response = Response::create($result, $type)->header($header);
+
+ throw new HttpResponseException($response);
+ }
+
+ /**
+ * 操作成功跳转
+ * @param mixed $msg 提示信息
+ * @param string $url 跳转的URL地址
+ * @param mixed $data 返回的数据
+ * @param integer $wait 跳转等待时间
+ * @param array $header 发送的Header信息
+ * @return void
+ */
+ protected function success($msg = '', string $url = null, $data = '', int $wait = 3, array $header = []): Response
+ {
+ if (is_null($url) && isset($_SERVER["HTTP_REFERER"])) {
+ $url = $_SERVER["HTTP_REFERER"];
+ } elseif ($url) {
+ $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : app('route')->buildUrl($url);
+ }
+
+ $result = [
+ 'code' => 1,
+ 'msg' => $msg,
+ 'data' => $data,
+ 'url' => $url,
+ 'wait' => $wait,
+ ];
+
+ $type = (request()->isJson() || request()->isAjax()) ? 'json' : 'html';
+ // 把跳转模板的渲染下沉,这样在 response_send 行为里通过getData()获得的数据是一致性的格式
+ if ('html' == strtolower($type)) {
+ $type = 'jump';
+ }
+
+ $response = Response::create($result, $type)->header($header)->options(['jump_template' => app('config')->get('app.dispatch_success_tmpl')]);
+
+ throw new HttpResponseException($response);
+ }
+
+
+ //判断是否已登录?
+ protected function isLogged()
+ {
+ if(Session::has('user_id')){
+ $this->success('您已登录','/index/index/index');
+ }
+ }
+
+ //判断是否需要登录?
+ protected function isLogin()
+ {
+ if(!Session::has('user_id')){
+ $this->error('请登录','/index/user/login');
+ }
+ }
+
+/* //判断密码找回是否已进行了邮件发送?
+ protected function isMailed()
+ {
+ if(Cache::get('repass') != 1){
+ $this->error('错误请求,请正确操作!','/index/user/forget');
+ }
+ }*/
+
+// 显示导航
+ protected function showNav()
+ {
+ //1.查询分类表获取所有分类
+ $cateList = Db::name('cate')->where(['status'=>1,'delete_time'=>0])->order('sort','asc')->select();
+
+ //2.将catelist变量赋给模板 公共模板nav.html
+ View::assign('cateList',$cateList);
+
+ }
+
+ //显示用户
+ protected function showUser()
+ {
+ $user['user_id'] = Session::get('user_id');
+ //1.查询用户
+ $user = Db::name('user')->field('id,name,nickname,user_img,sex,auth,city,email,sign,point')->where('id',$user['user_id'])->find();
+
+ //2.将User变量赋给模板 公共模板nav.html
+ View::assign('user',$user);
+
+ }
+
+ //显示网站设置
+ protected function showSystem()
+ {
+ //1.查询分类表获取所有分类
+ $sysInfo = Db::name('system')->cache(true)->find(1);
+ View::assign('sysInfo',$sysInfo);
+ }
+
+
+}
diff --git a/app/common/model/Article.php b/app/common/model/Article.php
new file mode 100644
index 0000000..f34125f
--- /dev/null
+++ b/app/common/model/Article.php
@@ -0,0 +1,82 @@
+1,'is_top'=>0,'is_hot'=>0];
+ //仅更新有效
+ protected $update = ['update_time'];
+
+ //软删除
+ use SoftDelete;
+ protected $deleteTime = 'delete_time';
+ protected $defaultSoftDelete = 0;
+
+ //文章关联栏目表
+ public function cate()
+ {
+ return $this->belongsTo('Cate','cate_id','id');
+ }
+
+ //文章关联评论
+ public function comments()
+ {
+ return $this->hasMany('Comment','article_id','id');
+ }
+
+ //文章关联用户
+ public function user()
+ {
+ return $this->belongsTo('User','user_id','id');
+ }
+
+ //文章添加
+ public function add($data)
+ {
+ $result = $this->save($data);
+
+ if($result) {
+ return 1;
+ } else {
+ return '文章添加失败!';
+ }
+ }
+
+ //文章编辑
+ public function edit($data)
+ {
+ $article = $this->find($data['id']);
+ $result = $article->save($data);
+ if($result) {
+ return 1;
+ } else {
+ return '文章修改失败!';
+ }
+ }
+
+ //文章
+ public function detail()
+ {
+ $arts = Article::all();
+ return $arts;
+ }
+
+
+ //置顶文章
+ public function artTop()
+ {
+ $artTop = Article::where('status',1)->where('is_top',1)->select();
+
+ return $artTop;
+ }
+}
\ No newline at end of file
diff --git a/app/common/model/Cate.php b/app/common/model/Cate.php
new file mode 100644
index 0000000..6327d31
--- /dev/null
+++ b/app/common/model/Cate.php
@@ -0,0 +1,28 @@
+find($data['id']);
+
+ $res = $cates->delete();
+ if($res){
+ return 1;
+ }else{
+ return -1;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/common/model/Collection.php b/app/common/model/Collection.php
new file mode 100644
index 0000000..3d41516
--- /dev/null
+++ b/app/common/model/Collection.php
@@ -0,0 +1,25 @@
+belongsTo('Article','article_id','id');
+ }
+
+}
\ No newline at end of file
diff --git a/app/common/model/Comment.php b/app/common/model/Comment.php
new file mode 100644
index 0000000..178f1c1
--- /dev/null
+++ b/app/common/model/Comment.php
@@ -0,0 +1,30 @@
+belongsTo('Article','article_id','id');
+ }
+
+ public function user()
+ {
+ //评论关联用户
+ return $this->belongsTo('User','user_id','id');
+ }
+
+}
\ No newline at end of file
diff --git a/app/common/model/Sign.php b/app/common/model/Sign.php
new file mode 100644
index 0000000..82c58aa
--- /dev/null
+++ b/app/common/model/Sign.php
@@ -0,0 +1,28 @@
+hasMany('User','user_id','id');
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/app/common/model/System.php b/app/common/model/System.php
new file mode 100644
index 0000000..29d4818
--- /dev/null
+++ b/app/common/model/System.php
@@ -0,0 +1,21 @@
+hasMany('Comment','user_id','id');
+ }
+
+ //用户关联所属区域
+ public function userArea()
+ {
+ return $this->belongsTo('UserArea','user_raea_id','id');
+ }
+
+ //登陆校验
+ public function login($data)
+ {
+ //查询用户
+ $user = Db::name('user')->whereOr('email',$data['name'])->whereOr('name',$data['name'])->find();
+ //halt($user);
+ //对输入的密码字段进行MD5加密,再进行数据库的查询
+ $salt = substr(md5($user['create_time']),-6);
+ $pwd = substr_replace(md5($data['password']),$salt,0,6);
+ $data['password'] = md5($pwd);
+
+ if($user['password'] == $data['password']){
+ //将用户数据写入Session
+ Session::set('user_id',$user['id']);
+ Session::set('user_name',$user['name']);
+ //查询结果1表示有用户,用户名密码正确
+ return 1;
+ }else{
+ return '用户名或密码错误';
+ }
+ }
+
+ //注册校验
+ public function reg($data)
+ {
+ //随机存入默认头像
+ $code = mt_rand('1','11');
+ $data['user_img'] = "./static/res/images/avatar/$code.jpg";
+ $data['create_time'] = time();
+ $salt = substr(md5($data['create_time']),-6);
+ $data['password'] = substr_replace(md5($data['password']),$salt,0,6);
+ $result = $this->save($data);
+ if ($result) {
+ return 1;
+ } else{
+ return '注册失败';
+ }
+ }
+
+ //重置密码
+ public function respass($data)
+ { //halt($data);
+ $user = $this->where('id',$data['uid'])->find();
+ $salt = substr(md5($user['create_time']),-6);
+ $data['password'] = substr_replace(md5($data['password']),$salt,0,6);
+ $result = $user->save($data);
+ if ($result) {
+ return 1;
+ } else{
+ return '更改失败';
+ }
+ }
+
+ //更新设置
+ public function setNew($data)
+ {
+ $userId = $data['user_id'];
+ $user = User::where('id',$userId)->find();
+ $result = $user->allowField(['email','nickname','sex','city','sign'])->save($data);
+ if($result){
+ return 1;
+ }else{
+ return '修改失败';
+ }
+ }
+
+ //用户修改密码
+ public function setpass($data)
+ {
+ $user = $this->find($data['user_id']);
+ $salt = substr(md5($user['create_time']),-6);
+ $pwd = substr_replace(md5($data['nowpass']),$salt,0,6);
+ $data['nowpass'] = md5($pwd);
+ $result = $data['nowpass'] == $user['password'];
+ if(!$result){
+ return '当前密码不正确';
+ }
+ $data['password'] = substr_replace(md5($data['password']),$salt,0,6);
+ $user->password = $data['password'];
+ $result = $user->save();
+ if($result){
+ return 1;
+ }else{
+ return '修改失败,请改换密码';
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/common/model/UserArea.php b/app/common/model/UserArea.php
new file mode 100644
index 0000000..f219a3a
--- /dev/null
+++ b/app/common/model/UserArea.php
@@ -0,0 +1,23 @@
+belongsTo('User','user_id','id');
+ }
+
+}
\ No newline at end of file
diff --git a/app/common/model/UserZan.php b/app/common/model/UserZan.php
new file mode 100644
index 0000000..6519b85
--- /dev/null
+++ b/app/common/model/UserZan.php
@@ -0,0 +1,30 @@
+belongsTo('Comment','comment_id','id');
+ }
+
+ public function user()
+ {
+ //评论关联用户
+ return $this->belongsTo('User','user_id','id');
+ }
+
+}
\ No newline at end of file
diff --git a/app/common/validate/Article.php b/app/common/validate/Article.php
new file mode 100644
index 0000000..4e5c30b
--- /dev/null
+++ b/app/common/validate/Article.php
@@ -0,0 +1,20 @@
+ 'require|min:4|max:50',
+ 'content|内容' => 'require',
+ 'cate_id|分类' => 'require',
+ 'captcha|验证码' => 'require|captcha'
+ ];
+
+ public function sceneArtadd()
+ {
+ return $this->only(['cate_id','title','content','captcha']);
+ }
+}
\ No newline at end of file
diff --git a/app/common/validate/User.php b/app/common/validate/User.php
new file mode 100644
index 0000000..98c81e9
--- /dev/null
+++ b/app/common/validate/User.php
@@ -0,0 +1,80 @@
+ 'require|min:2|max:18|unique:user',
+ 'email|邮箱' => 'require|email|unique:user',
+ 'password|密码' => 'require|min:6|max:20',
+ 'repassword|确认密码'=>'require|confirm:password',
+ 'nickname|昵称' => 'require|min:2|max:20',
+ 'captcha|验证码' => 'require|captcha',
+ 'city|城市' => 'min:2|max:25',
+ 'sign|签名' => 'min:10|max:100',
+ 'sex|性别' => 'require',
+ 'nowpass|新密码' => 'require|min:6|max:20',
+ 'code|校验码' => 'require|length:4',
+ ];
+
+ //邮件邮件码验证
+ public function sceneCode()
+ {
+ return $this->only(['code',]);
+ }
+
+ //name登陆验证场景
+ public function sceneLoginName()
+ {
+ return $this->only(['name','password','captcha'])
+ ->remove('name', 'unique');
+ }
+
+ //emai登陆验证场景
+ public function sceneLoginEmail()
+ {
+ return $this->only(['email','password','captcha'])
+ ->remove('email', 'unique');
+ }
+
+ //注册验证场景
+ public function sceneReg()
+ {
+ return $this->only(['name','email','password','repassword','captcha']);
+
+ }
+
+ //密码找回
+ public function sceneForget()
+ {
+ return $this->only(['email','captcha'])
+ ->remove('email', 'unique');
+ }
+
+ //密码重设
+ public function sceneRepass()
+ {
+ return $this->only(['password','repassword','captcha']);
+ }
+
+ //密码重置
+ public function sceneRespass()
+ {
+ return $this->only(['password','repassword','captcha']);
+ }
+
+ //用户资料
+ public function sceneSet()
+ {
+ return $this->only(['email','nickname','ctity','sex','sign'])
+ ->remove('email','unique');
+ }
+
+ //设置新密码
+ public function sceneSetpass()
+ {
+ return $this->only(['nowpass','password','repassword']);
+ }
+}
\ No newline at end of file
diff --git a/app/event.php b/app/event.php
new file mode 100644
index 0000000..e9851bb
--- /dev/null
+++ b/app/event.php
@@ -0,0 +1,17 @@
+ [
+ ],
+
+ 'listen' => [
+ 'AppInit' => [],
+ 'HttpRun' => [],
+ 'HttpEnd' => [],
+ 'LogLevel' => [],
+ 'LogWrite' => [],
+ ],
+
+ 'subscribe' => [
+ ],
+];
diff --git a/app/index/controller/.gitignore b/app/index/controller/.gitignore
new file mode 100644
index 0000000..06c2f0f
--- /dev/null
+++ b/app/index/controller/.gitignore
@@ -0,0 +1 @@
+Api.php
\ No newline at end of file
diff --git a/app/index/controller/Article.php b/app/index/controller/Article.php
new file mode 100644
index 0000000..c6d8e11
--- /dev/null
+++ b/app/index/controller/Article.php
@@ -0,0 +1,272 @@
+ ['except' => ['cate','detail'] ],
+ ];
+
+ //文章分类
+ public function cate(){
+
+ $where =[];
+ //获取分类ID
+ $ename = Request::param('ename');
+ $cate = Db::name('cate')->where('ename',$ename)->find();
+ $types = input('type');
+ if($cate){
+ $where = ['cate_id' => $cate['id']];
+ }else{
+ $where = true;
+ }
+ switch ($types) {
+ //查询文章,10个分1页
+ case 'all':
+ $artList = ArticleModel::withCount(['user','cate','comments'])->where('status',1)->where($where)->order(['is_top'=>'desc','create_time'=>'desc'])->paginate(10);
+ break;
+
+ case 'hot':
+ $artList = ArticleModel::withCount(['user','cate','comments'])->where('status',1)->where($where)->where('is_hot',1)->order(['is_top'=>'desc','create_time'=>'desc'])->paginate(10);
+ break;
+
+ case 'top':
+ $artList = ArticleModel::withCount(['user','cate','comments'])->where('status',1)->where($where)->where('is_top',1)->order(['is_top'=>'desc','create_time'=>'desc'])->paginate(10);
+ break;
+
+ default:
+ $artList = ArticleModel::withCount(['user','cate','comments'])->where('status',1)->where($where)->order(['is_top'=>'desc','create_time'=>'desc'])->paginate(10);
+ break;
+ }
+
+ // 热议文章
+ $artHot = ArticleModel::withCount('comments')->where('status',1)->whereTime('create_time', 'year')->order('comments_count','desc')->limit(10)->select();
+ //分类右栏广告
+ $ad_cate = Db::name('slider')->where('slid_status',1)->where('delete_time',0)->where('slid_type',4)->whereTime('slid_over','>=',time())->select();
+ //通用右栏
+ $ad_comm = Db::name('slider')->where('slid_status',1)->where('delete_time',0)->where('slid_type',3)->whereTime('slid_over','>=',time())->select();
+
+ View::assign(['type'=>$types,'artList'=>$artList,'artHot'=>$artHot,'ad_cate'=>$ad_cate,'ad_comm'=>$ad_comm]);
+ return View::fetch();
+ }
+
+ //文章详情页
+ public function detail($id = 1)
+ {
+ //获取文章ID
+ $id = Request::param('id');
+ //查询文章
+ $article = ArticleModel::withCount(['user','cate','comments'])->find($id);
+ $article->inc('pv')->update();
+
+/*
+ $nt = time();
+ $ft = $article->comments;
+ $ct[] = [];
+ foreach($ft as $c){
+ $t = $c->create_time;
+ $ct[] = intval(($nt - strtotime($t))/86400);
+ }
+ dump($nt);
+ dump($ct);
+ $this->assign('ct',$ct);
+ $article->append(['comment.ct'])->toArray();
+ //halt($article);
+*/
+
+ // 热议文章
+ $artHot = ArticleModel::withCount('comments')->where('status',1)->whereTime('create_time', 'year')->order('comments_count','desc')->limit(10)->select();
+ //文章广告
+ $ad_article = Db::name('slider')->where('slid_status',1)->where('delete_time',0)->where('slid_type',3)->whereTime('slid_over','>=',time())->select();
+ //通用右栏
+ $ad_comm = Db::name('slider')->where('slid_status',1)->where('delete_time',0)->where('slid_type',3)->whereTime('slid_over','>=',time())->select();
+ View::assign(['article'=>$article,'artHot'=>$artHot,'ad_art'=>$ad_article,'ad_comm'=>$ad_comm]);
+ return View::fetch();
+ }
+
+ //文章评论
+ public function comment()
+ {
+ //if (Request::isAjax()){
+ //获取评论
+ $data = Request::only(['content','article_id','user_id']);
+
+ //用户留言存入数据库
+ if (Comment::create($data)) {
+ $res = ['code'=>1, 'msg'=>'留言成功'];
+ } else{
+ $res = ['code'=>0, 'msg'=>'留言失败'];
+ }
+ return json($res);
+ }
+
+
+
+ //添加文章
+ public function add()
+ {
+ if(Request::isAjax()){
+ $data = Request::post();
+ $validate = new \app\common\validate\Article; //调用验证器
+ $result = $validate->scene('Artadd')->check($data); //进行数据验证
+ if(true !==$result){
+ return $this->error($validate->getError());
+ } else {
+ $article = new \app\common\model\Article;
+ $result = $article->add($data);
+ if($result == 1) {
+ $aid = Db::name('article')->max('id');
+ return json(['code'=>1,'msg'=>'发布成功','url'=>'/'.app('http')->getName().'/jie/'.$aid.'.html']);
+ } else {
+ $this->error($result);
+ }
+ }
+ }
+ return View::fetch();
+ }
+
+ //编辑文章
+ public function edit()
+ {
+ $aid = input('id');
+ $article = Db::name('article')->find($aid);
+
+ if(Request::isAjax()){
+ $data = Request::post();
+ $validate = new \app\common\validate\Article(); //调用验证器
+ $res = $validate->scene('Artadd')->check($data); //进行数据验证
+
+ if(true !==$res){
+ //echo '';
+ return $this->error($validate->getError());
+ } else {
+ $article = new \app\common\model\Article;
+ $result = $article->edit($data);
+ if($result == 1) {
+ return json(['code'=>1,'msg'=>'修改成功','url'=>'/'.app('http')->getName().'/jie/'.$aid.'.html']);
+ } else {
+ $this->error($result);
+ }
+ }
+ }
+
+ View::assign('article',$article);
+ return View::fetch();
+ }
+
+ //删除文章
+ public function delete()
+ {
+ $article = ArticleModel::find(input('id'));
+ $result = $article->together(['comments'])->delete();
+ if($result) {
+ $res = ['code'=>1,'msg'=>'删除文章成功','url'=>'/index/user/post'];
+ } else {
+ $res = ['code'=>0,'msg'=>'删除文章失败'];
+ }
+ return json($res);
+ }
+
+ //添加文章和编辑页富文本编辑器图片上传
+ public function lay_img_upload()
+ {
+ $file = Request()->file('file');
+ if(empty($file)){
+ $result["code"] = "1";
+ $result["msg"] = "请选择图片";
+ $result['data']["src"] = '';
+ }else{
+ // 移动到框架应用根目录/public/uploads/ 目录下
+ $info = $file->move('uploads/' );
+ if($info){
+ $infos = $info->getInfo();
+ // 源文件名
+ $name = $infos['name'];
+
+ $name_path =str_replace('\\',"/",$info->getSaveName());
+ //成功上传后 获取上传信息
+ $result["code"] = '0';
+ $result["msg"] = "上传成功";
+ $result['data']["src"] = "/uploads/".$name_path;
+ $result['data']["title"] = $name;
+ }else{
+ // 上传失败获取错误信息
+ $result["code"] = "2";
+ $result["msg"] = "上传出错";
+ $result['data']["src"] ='';
+ }
+ }
+
+ return json_encode($result);
+
+ }
+
+ //文本编辑器图片上传
+ public function text_img_upload()
+ {
+ $file = request()->file('file');
+ try {
+ validate(['image'=>'filesize:2048|fileExt:jpg,png,gif'])
+ ->check(array($file));
+ $savename = \think\facade\Filesystem::disk('public')->putFile('article_pic',$file);
+ } catch (think\exception\ValidateException $e) {
+ echo $e->getMessage();
+ }
+ $upload = Config::get('filesystem.disks.public.url');
+
+ if($savename){
+ //$name = $file->hashName();
+ $name_path =str_replace('\\',"/",$upload.'/'.$savename);
+ //halt($name_path);
+ //$image = \think\Image::open("uploads/$name_path");
+ //$image->thumb(168, 168)->save("uploads/$name_path");
+
+ $res = ['status'=>0,'msg'=>'上传成功','url'=> $name_path];
+ }else{
+ $res = ['status'=>1,'msg'=>'上传错误'];
+ }
+ return json($res);
+ }
+
+
+ //文章置顶,状态
+ public function jieset(){
+ $data = Request::param();
+ $article = ArticleModel::find($data['id']);
+ if($data['field'] === 'top') {
+ if($data['rank']==1){
+ $article->save(['is_top' => 1]);
+ $res['status'] = 0;
+ $res['msg'] ='置顶成功';
+ } else {
+ $article->save(['is_top' => 0]);
+ $res['status'] = 0;
+ $res['msg'] ='已取消置顶';
+ }
+ } else {
+ if($data['rank']==1){
+ $article->save(['is_hot' => 1]);
+ $res['status'] = 0;
+ $res['msg'] ='已设精贴';
+ } else {
+ $article->save(['is_hot' => 0]);
+ $res['status'] = 0;
+ $res['msg'] ='精贴已取消';
+ }
+ }
+ return json($res);
+ }
+
+}
\ No newline at end of file
diff --git a/app/index/controller/Collection.php b/app/index/controller/Collection.php
new file mode 100644
index 0000000..9676d6e
--- /dev/null
+++ b/app/index/controller/Collection.php
@@ -0,0 +1,64 @@
+ 'integer',
+// ];
+
+ //文章收藏
+ public function add(){
+ //$data = Request::param();
+ $data['article_id'] = intval(input('cid'));
+ $data['user_id'] = session::get('user_id');
+ $result = CollectionModel::create($data);
+ if($result){
+ $res['status'] = 0;
+ //$res=['type' => 'add','type' => 'remove', 'msg' => '收藏成功'];
+ }
+ return $res;
+ }
+
+ //取消收藏
+ public function remove(){
+
+ $cid = input('cid');
+ $aid = intval($cid);
+ $user['user_id'] = session::get('user_id');
+ //$result = CollectionModel::where('cid',$arid)->select();
+ $result = Db::name('collection')->where(['article_id' => $aid,'user_id' => $user['user_id']])->delete();
+ if($result){
+ $res['status'] = 0;
+ //$res=['type' => 'add','type' => 'remove', 'msg' => '收藏成功'];
+ }
+ return $res;
+ }
+
+ //收藏查询
+ public function find(){
+ //$cid = Request::param();
+ $cid = input('cid');
+ $aid = intval($cid);
+ $user['user_id'] = session::get('user_id');
+ //halt($artid);
+ $collectData = Db::name('collection')->where(['article_id' => $aid,'user_id' => $user['user_id']])->find();
+ if($collectData){
+ $res['status'] = 0;
+ $res['data']['collection'] = $collectData['article_id'];
+ } else {
+ $res['status'] = 0;
+ $res['data'] = '';
+ }
+ return json($res);
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/index/controller/Comment.php b/app/index/controller/Comment.php
new file mode 100644
index 0000000..71287ea
--- /dev/null
+++ b/app/index/controller/Comment.php
@@ -0,0 +1,109 @@
+save(['cai' =>1]);
+ $res = [];
+ if($result){
+ $art = Article::find($comms['article_id']);
+ $jie = $art->save(['jie' => 1]);
+ if($jie){
+ $res['status'] = 0;
+ }
+ }
+ return json($res);
+ }
+
+ //删除评论
+ public function jiedaDelete(){
+
+ $id = input('id');
+ //$arid = intval($id);
+
+ $comms = CommentModel::find($id);
+ $result = $comms->delete();
+ //$result = Db::name('collection')->where('article_id',$arid)->delete();
+ if($result){
+ //$res=['type' => 'add','type' => 'remove', 'msg' => '收藏成功'];
+ $res = [
+ 'status' => 0,
+ ];
+ }
+ return json($res);
+ }
+
+
+ //编辑评论
+ public function getDa()
+ {
+ $this->isLogin();
+ $id = input('id');
+ $comms = CommentModel::find($id);
+ $res['rows'] = [];
+ if($comms) {
+ $res['status'] = 0;
+ $res['rows']['content'] = $comms['content'];
+ }
+ return json($res);
+ }
+
+ //更新评论
+ public function updateDa()
+ {
+ $this->isLogin();
+ $id = input('id');
+ $content = input('content');
+ $comms = CommentModel::find($id);
+ $result = $comms->save(['content' => $content]);
+ if($result) {
+ $res['status'] = 0;
+ $res['msg'] = '更新成功';
+ } else {
+ $res['msg'] = '更新失败';
+ }
+ return json($res);
+ }
+
+ //点赞评论
+ public function jiedaZan()
+ {
+ $this->isLogin();
+ $data['comment_id'] = input('post.id');
+ $data['user_id'] = session('user_id');
+ //查询是否已存在点赞
+ $zan = UserZan::where(['comment_id'=>input('post.id'),'user_id'=>session('user_id')])->find();
+ Session::set('ok',$zan['comment_id']);
+ if(!$zan ){ //如果没有点过赞执行点赞操作
+ $coms = CommentModel::find(input('post.id'));
+ if($coms['user_id'] == session('user_id')){
+ return $res=['msg' => '不能给自己点赞哦'];
+ } else {
+ $res = UserZan::create($data);
+ if($res){
+ //评论点赞数加1
+ $coms->save(['zan' => $coms['zan']+1]);
+ return $res=['status' => 0, 'msg' => '点赞成功'];
+ }else {
+ $this->error('点赞失败');
+ }
+ }
+
+ } else {
+ return $res=['msg' => '你已赞过了'];
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/index/controller/Error.php b/app/index/controller/Error.php
new file mode 100644
index 0000000..733cbf1
--- /dev/null
+++ b/app/index/controller/Error.php
@@ -0,0 +1,10 @@
+where('slid_status',1)->where('delete_time',0)->where('slid_type',1)->whereTime('slid_over','>=',time())->select();
+
+ //置顶文章
+ $artTop = Article::where(['is_top'=>1,'status'=>1,'delete_time'=>0])->with([
+ 'cate' => function($query){
+ $query->where('delete_time',0);
+ }
+ ])->with(['user'])->withCount(['comments'])->order('create_time','desc')->limit(5)->select();
+
+ //查询首页文章显示15条
+ $types = input('type');
+ $artList = Article::withCount(['user','cate','comments'])->where(['status'=>1,'delete_time'=>0])->order('create_time','desc')->limit(15)->select();
+
+ //热议文章
+ $artHot = Article::withCount('comments')->field('title,comments_count')->where(['status'=>1,'delete_time'=>0])->whereTime('create_time', 'year')->order('comments_count','desc')->limit(10)->select();
+
+ //首页赞助
+ $ad_index = Db::name('slider')->where('slid_status',1)->where('delete_time',0)->where('slid_type',2)->whereTime('slid_over','>=',time())->select();
+
+ //首页右栏
+ $ad_comm = Db::name('slider')->where('slid_status',1)->where('delete_time',0)->where('slid_type',3)->whereTime('slid_over','>=',time())->select();
+
+ //友情链接
+ $friend_links = Db::name('friend_link')->field('linkname,linksrc')->select();
+
+ $vs = [
+ 'slider' => $sliders,
+ 'artTop' => $artTop,
+ 'artList' => $artList,
+ 'artHot' => $artHot,
+ 'type' => $types,
+ 'ad_index' => $ad_index,
+ 'ad_comm' => $ad_comm,
+ 'flinks' => $friend_links,
+ ];
+ View::assign($vs);
+
+ return View::fetch();
+ }
+
+ //回帖榜
+ public function reply()
+ {
+ $user = User::withCount('comments')->order('comments_count','desc')->limit(20)->select();
+ if($user)
+ {
+ $res['status'] = 0;
+ $res['data'] = array();
+ foreach ($user as $key=>$v) {
+
+ $u['uid'] = $v['id'];
+ $u['count(*)'] = $v['comments_count'];
+ if($v['nickname'])
+ {
+ $u['user'] = ['username'=>$v['nickname'],'avatar'=>$v['user_img']];
+ } else {
+ $u['user'] = ['username'=>$v['name'],'avatar'=>$v['user_img']];
+ }
+ $res['data'][] = $u;
+ }
+ }
+ return json($res);
+ }
+
+ //搜索功能
+ public function search()
+ {
+ //$this->showUser();
+ //全局查询条件
+ $map = []; //所有的查询条件封装到数组中
+ //条件1:
+ $map[] = ['status','=',1]; //这里等号不能省略
+
+ //实现搜索功能
+ $keywords = input('keywords');
+ if(!empty($keywords)){
+ //条件2
+ $map[] = ['title','like','%'.$keywords.'%'];
+ $artList = Article::where($map)->withCount('comments')->order('create_time','desc')->paginate(10);
+ $counts = $artList->count();
+ $searchs = [
+ 'artList' => $artList,
+ 'keywords' => $keywords,
+ 'counts' => $counts
+ ];
+
+ View::assign($searchs);
+ //友情链接
+ $friend_links = Db::name('friend_link')->field('linkname,linksrc')->select();
+ View::assign('flinks',$friend_links);
+
+ // 查询热议
+ $artHot = Article::withCount('comments')->field('title,comments_count')->where('status',1)->whereTime('create_time', 'year')->order('comments_count','desc')->limit(10)->select();
+ View::assign('artHot',$artHot);
+
+ } else{
+ return '请输入关键词';
+ }
+ return View::fetch('search');
+ }
+
+ public function jump()
+ {
+ $username = Request::param('username');
+ $u = Db::name('user')->whereOr('nickname', $username)->whereOr('name', $username)->find();
+ return redirect('index/user/home',['id'=>$u['id']]);
+
+ }
+
+}
diff --git a/app/index/controller/Jump.php b/app/index/controller/Jump.php
new file mode 100644
index 0000000..ecc7e02
--- /dev/null
+++ b/app/index/controller/Jump.php
@@ -0,0 +1,27 @@
+scene('loginEmail')
+ ->check($data);
+ } catch (ValidateException $e) {
+ // 验证失败 输出错误信息
+ return json(['code'=>0,'msg'=>$e->getError()]);
+ }
+ $data['name'] = $data['email'];
+ unset($data['email']);
+ } else {
+ //用户名name登陆验证
+ try{
+ validate(userValidate::class)
+ ->scene('loginName')
+ ->check($data);
+ } catch (ValidateException $e) {
+ // 验证失败 输出错误信息
+ return json(['code'=>0,'msg'=>$e->getError()]);
+ }
+ }
+ //登陆请求
+ $user = new \app\common\model\User();
+ $res = $user->login($data);
+ if ($res == 1) {
+ return json(['code'=>'1','msg'=>'登陆成功','url'=>'/index/index/index']);
+ } else {
+ return json(['code'=>'0','msg'=>$res]);
+ }
+ }
+ return View::fetch('login');
+ }
+
+ //注册
+ public function reg()
+ {
+ if(Request::isAjax()){
+ $data = Request::only(['name','email','password','repassword','captcha']);
+
+ //校验场景中reg的方法数据
+ try{
+ validate(userValidate::class)
+ ->scene('Reg')
+ ->check($data);
+ } catch (ValidateException $e) {
+ return json(['code'=>0,'msg'=>$e->getError()]);
+ }
+
+ $user = new userModel;
+ $result = $user->reg($data);
+
+ if ($result == 1) {
+ $res = ['code'=>1,'msg'=>'注册成功','url'=>'/index/login/index'];
+ }else {
+ $res = ['code'=>0,'msg'=>$result];
+ }
+ return json($res);
+ }
+ //加载注册模板
+ return View::fetch();
+ }
+
+ //找回密码
+ public function forget()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+
+ try{
+ validate(userValidate::class)
+ ->scene('Forget')
+ ->check($data);
+ } catch (ValidateException $e) {
+ return json(['code'=>0,'msg'=>$e->getError()]);
+ }
+ //查询用户
+ $user = Db::name('user')->where('email',$data['email'])->find();
+ if($user) {
+ $code = mt_rand('1111','9999');
+ Cache::set('code',$code,600);
+ Cache::set('userid',$user['id'],600);
+
+ $result = mailto($data['email'],'重置密码','Hi亲爱的'.$user['name'].':您正在维护您的信息,请在10分钟内验证,您的验证码为:'.$code);
+ if($result){
+ Cache::set('repass',1,60); //设置repass标志为1存入Cache
+ $res = ['code'=>1,'msg'=>'验证码已发送成功,请去邮箱查看!','url'=>'/index/login/postcode'];
+ } else {
+ $res = ['code'=>0,'msg'=>'验证码发送失败!'];
+ }
+ }else{
+ $res = ['code' =>0,'msg'=>'邮箱错误或不存在'];
+ }
+ return json($res);
+ }
+ return View::fetch();
+ }
+
+ //接收验证码
+ public function postcode()
+ {
+ if(Cache::get('repass') != 1){
+ return json(['code'=>0,'msg'=>'请求错误!','url'=>'/index/login/forget']);
+ }
+ if(Request::isAjax()){
+ $code = Request::only(['code']);
+ try{
+ validate(userValidate::class)
+ ->scene('Code')
+ ->check($code);
+ } catch (ValidateException $e) {
+ return json(['code'=>0,'msg'=>$e->getError()]);
+ }
+
+ if(Cache::get('code')==$code['code']) { //无任何输入情况下需排除code为0和Cache为0的情况
+ //Cache::delete('repass');
+ Cache::set('repass',2,60);
+ $res = ['code'=>'1','msg'=>'验证成功','url'=>'/index/login/respass'];
+ } else {
+ $res = ['code'=>0,'msg'=>'验证码错误或已过期!'];
+ }
+ return json($res);
+ }
+ return View::fetch('forget');
+ }
+
+ //忘记密码找回重置
+ public function respass()
+ {
+ if(Cache::get('repass') != 2){
+ return json(['code'=>0,'msg'=>'请求错误!','url'=>'/index/login/forget']);
+ }
+ if(Request::isAjax()){
+ $data = Request::param();
+ try{
+ validate(userValidate::class)
+ ->scene('Repass')
+ ->check($data);
+ } catch (ValidateException $e) {
+ return json(['code'=>0,'msg'=>$e->getError()]);
+ }
+
+ $data['uid'] = Cache::get('userid');
+ $user = new \app\common\model\User();
+ $res = $user->respass($data);
+ if ($res == 1) {
+ return json(['code'=>'1','msg'=>'修改成功','url'=>'/index/login/index']);
+ } else {
+ return json(['code'=>'0','msg'=>'$res']);
+ }
+ }
+ return View::fetch('forget');
+ }
+
+}
\ No newline at end of file
diff --git a/app/index/controller/Message.php b/app/index/controller/Message.php
new file mode 100644
index 0000000..b517e2d
--- /dev/null
+++ b/app/index/controller/Message.php
@@ -0,0 +1,20 @@
+0,'count' => 0, 'msg' => 'nums'];
+
+ return $res;
+ }
+
+}
\ No newline at end of file
diff --git a/app/index/controller/Sign.php b/app/index/controller/Sign.php
new file mode 100644
index 0000000..dd27fa0
--- /dev/null
+++ b/app/index/controller/Sign.php
@@ -0,0 +1,268 @@
+uid = session('user_id');
+
+ }
+
+ public function lists()
+ {
+ //总榜
+ $totallist = Db::name('user_sign')->alias('s')->join('user u', 's.uid=u.id', 'LEFT')->field('s.uid,s.id,max(s.days) as days,u.name as name,u.user_img as user_img')->group('s.uid')->order('days desc')->limit(20)->select();
+ $time = time();
+ $start_stime = strtotime(date('Y-m-d 0:0:0', $time)) - 1;
+ $end_stime = strtotime(date('Y-m-d 23:59:59', $time)) + 1;
+ //今日最快
+ $fastlist = Db::name('user_sign')->alias('s')->join('user u', 's.uid=u.id')->field('s.*,u.name as name,u.user_img as user_img')->where("s.stime > $start_stime and s.stime < $end_stime")->order('s.id asc')->limit(20)->select();
+ //最新
+ $newlist = Db::name('user_sign')->alias('s')->join('user u', 's.uid=u.id')->field('s.*,u.name as name,u.user_img as user_img')->order('id desc')->limit(20)->select();
+
+ View::assign('totallist', $totallist);
+ View::assign('fastlist', $fastlist);
+ View::assign('newlist', $newlist);
+ return View::fetch();
+ }
+
+ /**
+ * 执行当天签到
+ * @return json 签到成功返回 {status:1,info:'已签到'}
+ */
+ public function sign()
+ {
+ if (!Session::has('user_id') || !Session::has('user_name')) {
+ return json(array('code' => 0, 'msg' => '亲,登陆后才能签到哦','url' => 'index/login/index'));
+ } else {
+ $uid = session('user_id');
+ $todayData = $this->todayData()->getData();
+ //var_dump($todayData);
+
+ if ($todayData['is_sign'] == 1) { //数组中是返回的是一个对象,不能直接用[]来显示,正确的输出方法是:$pic[0]->title问题解决!
+ exit('{"code":-1,"msg":"你今天已经签过到了"}');
+ } else {
+ $data = $this->getInsertData($uid);
+
+ $days = $data['days'];
+ // 无今天数据
+
+ $data['uid'] = $uid;
+ $data['stime'] = time();
+ $id = Db::name('user_sign')->insertGetId($data);
+
+ if ($id) {
+ //$will_getscore
+ //$score = $this->getTodayScores($days);
+ $score = $todayData['will_getscore'];
+ $date=date('Ymd');
+ $msg='';
+ $teshudate=['20180215','20180216','20180217','20180218','20180219','20180220','20180221'];
+ //签到奖励
+ if(in_array($date,$teshudate)){
+ $randnum=rand(1,99);
+ $msg='新年好!您额外获得随机奖励'.$randnum.'金币!';
+ point_note($randnum, $uid, 'NewYearReward', $id);
+ }
+
+ session('signdate', $date);
+
+ if ($score > 0) {
+ // 为该用户添加积分
+ $user = User::find($uid);
+ $point = $user['point']+$score;
+ $user->save(['point' => $point]);
+ //point_note($score, $uid, $id);
+
+ }
+ return json(['code'=>200,'score'=>$score,'days'=>$days,'msg'=>$msg]);
+ // exit('{"code":200,"score":"' . $score . '","days":"' . $days . '"}');
+ } else {
+ exit('{"code":-1,"msg":"签到失败,请刷新后重试!"}');
+ }
+ }
+ }
+ }
+ /**
+ * 返回每次签到要插入的数据
+ *
+ * @param int $uid 用户id
+ * @return array(
+ * 'days' => '天数',
+ * 'is_sign' => '昨天是否签到,用1表示已经签到',
+ * 'stime' => '签到时间',
+ * );
+ */
+ protected function getInsertData($uid)
+ {
+ // 昨天的连续签到天数
+ $start_time = strtotime(date('Y-m-d 0:0:0', time() - 86400)) - 1;
+ $end_time = strtotime(date('Y-m-d 23:59:59', time() - 86400)) + 1;
+ $days = Db::name('user_sign')->where("uid = $uid and stime > $start_time and stime < $end_time")->value('days');
+ if ($days) {
+ $days++;
+ $is_sign = 1;
+ $time = time();
+ // if($days > 30){
+ // $days = 1;
+ // }
+ } else {
+ //$days=1;
+ $is_sign = 0;
+ $days = 1;
+ $time = '';
+ }
+ return [
+ 'days' => $days,
+ 'is_sign' => $is_sign,
+ 'stime' => $time,
+ ];
+ }
+ /**
+ * 用户当天签到的数据
+ * @return array 签到信息 is_sign,stime 等
+ */
+ public function todayData()
+ {
+ $time = time();
+ $start_stime = strtotime(date('Y-m-d 0:0:0', $time)) - 1;
+ $end_stime = strtotime(date('Y-m-d 23:59:59', $time)) + 1;
+ $res = Db::name('user_sign')->where('uid',session('user_id'))->where('stime', '>', $start_stime)->where('stime', '<', $end_stime)->find();
+ $score = 0;
+ if ($res) {
+ $is_sign = 1;
+ //昨天已签到
+ //已连续签到 已获取
+ $days = $res['days'];
+ $score = $this->getTodayScores($res['days']);
+ $will_getscore = $this->getTodayScores($res['days'] + 1);
+ } else {
+ //今天没有签,看昨天
+ $is_sign = 0;
+ $yestoday = $this->getInsertData(session('user_id'));
+ if ($yestoday['is_sign']) {
+ //今天连续天数
+ $days = $yestoday['days'] - 1;
+ $will_getscore = $this->getTodayScores($yestoday['days']);
+ } else {
+ //今天第一天
+ $days = 0;
+ $will_getscore = $this->getTodayScores(1);
+
+ }
+
+ //已连续签到 可获取
+ $score = $this->getTodayScores($days);
+ }
+ $data = [
+ 'is_sign' => $is_sign,
+ 'days' => $days,
+ 'score' => $score,
+ 'will_getscore' => $will_getscore,
+ ];
+
+ return json($data);
+ }
+ /**
+ * 积分规则,返回连续签到的天数对应的积分
+ *
+ * @param int $days 当天应该得的分数
+ * @return int 积分
+ */
+ protected function getTodayScores($days)
+ {
+ $score = 0;
+ $scores = Db::name('user_signrule')->where("days <= $days")->order('days desc')->limit(1)->value('score');
+ if ($scores) {
+ $score = $scores;
+ }
+
+ return $score;
+ }
+
+ public function getsignrule()
+ {
+ $rules = Db::name('user_signrule')->order('days asc')->select();
+ return json(array('code' => 200, 'msg' => $rules));
+ }
+
+ /**
+ * 显示签到列表
+ *
+ * @param array $signDays 某月签到的日期 array(1,2,3,4,5,12,13)
+ * @param int $year 可选,年份
+ * @param int $month 可选,月份
+ * @return string 日期列表1....
+ */
+ public function showDays($signDays, $year = '', $month = '')
+ {
+ $time = time();
+ $year = $year ? $year : date('Y', $time);
+ $month = $month ? $month : date('m', $time);
+ $daysTotal = date('t', mktime(0, 0, 0, $month, 1, $year));
+ $now = date('Y-m-d', $time);
+ $str = '';
+ // $i=0;
+ for ($j = 1; $j <= $daysTotal; $j++) {
+ // $i++;
+ $someDay = date('Y-m-d', strtotime("$year-$month-$j"));
+ // 小于今天的日期样式
+ if ($someDay <= $now) {
+ // 当天日期样式 tdc = todayColor
+ if ($someDay == $now) {
+ // 当天签到过的
+ if (in_array($j, $signDays)) {
+ $str .= '' . $j . '';
+ } else {
+ $str .= '' . $j . '';
+ }
+ } else {
+ // 签到过的日期样式 current bfc = beforeColor , fw = font-weight
+ if (in_array($j, $signDays)) {
+ $str .= '' . $j . '';
+ } else {
+ $str .= '' . $j . '';
+ }
+ }
+ } else {
+ $str .= '' . $j . '';
+ }
+ }
+ return $str;
+ }
+ /**
+ * 获取当月签到的天数,与 $this->showDays() 配合使用
+ * @return 当月签到日期 array(1,2,3,4,5,12,13)
+ */
+ public function getMonthSign()
+ {
+ $time = time();
+ $year = date('Y', $time);
+ $month = date('m', $time);
+ $day = date("t", strtotime("$year-$month"));
+ $start_stime = strtotime("$year-$month-1 0:0:0") - 1;
+ $end_stime = strtotime("$year-$month-$day 23:59:59") + 1;
+ $list = Db::name('user_sign')->where("uid = {$this->uid} and stime > $start_stime and stime < $end_stime")->order('stime asc')->column('stime');
+ //if(is_array($list)){
+ foreach ($list as $key => $value) {
+ $list[$key] = date('j', $value);
+ }
+ //}
+ //return $list;
+ return json_encode($list);
+ }
+
+}
diff --git a/app/index/controller/User.php b/app/index/controller/User.php
new file mode 100644
index 0000000..403e289
--- /dev/null
+++ b/app/index/controller/User.php
@@ -0,0 +1,198 @@
+ ['except' => ['home'] ],
+ ];
+
+ //用户中心
+ public function index()
+ {
+ //$this->isLogin();
+ $user['user_id'] = session::get('user_id');
+ $username = session::get('user_name');
+
+ return view();
+ }
+ //文章管理
+ public function post()
+ {
+ //发表的帖子
+ $user['user_id'] = session::get('user_id');
+ $username = session::get('user_name');
+
+ $article = Article::withCount('comments')->where('user_id',$user['user_id'])->order('update_time','desc')->paginate([
+ 'list_rows'=>10,
+ 'page',
+ 'path' => 'post',
+ 'fragment' => 'index',
+ 'var_page' => 'page',
+ ]);
+ $page = $article->render();
+ View::assign(['article'=>$article,'page'=>$page]);
+
+
+ //收藏的帖子
+ $collect = Collection::with('article')->where('user_id',$user['user_id'])->order('create_time','desc')->paginate(10);
+
+ $count =$collect->total();
+ View::assign(['collect'=>$collect,'count'=>$count]);
+
+ return View::fetch();
+ }
+
+ //取消文章收藏
+ public function colltDel()
+ {
+ $collt = Collection::where('article_id',input('id'))->where('user_id',session::get('user_id'))->find();
+ $result = $collt->delete();
+ if($result){
+ $this->success('取消成功');
+ } else {
+ $this->error('取消失败了');
+ }
+ }
+
+ //用户设置-我的资料
+ public function set()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ $validate = new \app\common\validate\User();
+ $result = $validate->scene('Set')->check($data);
+ if(!$result){
+ $this->error($validate->getError());
+ } else {
+ $user = new \app\common\model\User();
+ $result = $user->setNew($data);
+ if($result==1){
+ return ['code'=>1,'msg'=>'资料更新成功','url'=>'/index/user/set'];
+ } else {
+ $this->error($result);
+ }
+ }
+ }
+ return View::fetch();
+ }
+
+ //更换头像
+ public function uploadHeadImg()
+ {
+ $file = request()->file('file');
+ try {
+ validate(['image'=>'filesize:2048|fileExt:jpg,png,gif|image:200,200,jpg'])
+ ->check(array($file));
+ $savename = \think\facade\Filesystem::disk('public')->putFile('head_pic',$file);
+ } catch (think\exception\ValidateException $e) {
+ echo $e->getMessage();
+ }
+ $upload = Config::get('filesystem.disks.public.url');
+ if($savename){
+ //$name = $file->hashName();
+ $name_path =str_replace('\\',"/",$upload.'/'.$savename);
+ //$image = \think\Image::open("uploads/$name_path");
+ //$image->thumb(168, 168)->save("uploads/$name_path");
+
+ //查出当前用户并把得到的用户头像更新
+ $userId = Session::get('user_id');
+ $result = Db::name('user')
+ ->where('id',$userId)
+ ->update(['user_img'=>$name_path]);
+
+ if($result) {
+ $res = ['status'=>0,'msg'=>'头像更新成功'];
+ } else {
+ $res = ['status'=>1,'msg'=>'头像更新失败'];
+ }
+ }else{
+ $res = ['status'=>1,'msg'=>'上传错误'];
+ }
+ return json($res);
+ }
+
+
+ public function message()
+ {
+ return view();
+ }
+
+ //个人页
+ public function home()
+ {
+ $userID = input('id');
+ Session::get('user_id');
+ //用户
+ $u = Db::name('user')->field('name,nickname,city,sex,sign,user_img,point,create_time')->find($userID ?: Session::get('user_id'));
+ //用户发贴
+ $arts = Db::name('user')->alias('u')->join('article a','u.id = a.user_id')->field('u.id,a.id,a.title,a.pv,a.is_hot,a.create_time')->where('a.user_id',input('id') ?: Session::get('user_id'))->select();
+ //用户回答
+ $reys = Db::name('comment')->alias('c')->join('article a','c.article_id = a.id')->field('a.id,a.title,c.content,c.create_time')->where('c.user_id',input('id') ?: Session::get('user_id'))->select();
+
+ View::assign('u',$u);
+ View::assign('arts',$arts);
+ View::assign('reys',$reys);
+ return View::fetch();
+ }
+
+
+ public function layout()
+ {
+ return View::fetch();
+ }
+
+
+ //邮箱激活
+ public function activate()
+ {
+ $this->isLogin();
+ $user['user_id'] = session::get('user_id');
+ $user = UserModel::find($user['user_id']);
+ $this->assign('user',$user);
+ return view();
+ }
+
+ //修改密码
+ public function setpass()
+ {
+ if(Request::isAjax()){
+ $data = Request::param();
+ $validate = new \app\common\validate\User();
+ $res = $validate->scene('setPass')->check($data);
+ if(!$res){
+ return $this->error($validate->getError());
+ }
+ $user = new \app\common\model\User();
+ $result = $user->setpass($data);
+ if($result == 1) {
+ Session::clear();
+ return $this->success('密码修改成功 请登录', '/index/user/login');
+ } else {
+ return $this->error($result);
+ }
+ }
+ }
+
+ //退出账户
+ public function logout()
+ {
+ Session::clear();
+ return json(array('code' => 200, 'msg' => '退出成功'));
+ }
+
+}
\ No newline at end of file
diff --git a/app/index/middleware.php b/app/index/middleware.php
new file mode 100644
index 0000000..49e7ff0
--- /dev/null
+++ b/app/index/middleware.php
@@ -0,0 +1,7 @@
+ \app\middleware\logedCheck::class,
+];
\ No newline at end of file
diff --git a/app/install/common.php b/app/install/common.php
new file mode 100644
index 0000000..159a191
--- /dev/null
+++ b/app/install/common.php
@@ -0,0 +1,153 @@
+
+// +----------------------------------------------------------------------
+// 检测环境是否支持可写
+//define('IS_WRITE', true);
+
+use Think\Request;
+use think\facade\Session;
+use think\facade\Config;
+use think\facade\Env;
+
+/**
+ * 写入配置文件
+ * @param array $config 配置信息
+ * @return string
+ */
+function write_config($config)
+{
+ if (is_array($config)) {
+ //读取配置内容
+ $conf = file_get_contents(Env::get('module_path') . 'data/database.tpl');
+ //替换配置项
+ foreach ($config as $name => $value) {
+ $conf = str_replace("[{$name}]", $value, $conf);
+ }
+ //写入应用配置文件
+ if (file_put_contents(Env::get('config_path') . 'database.php', $conf)) {
+ show_msg('配置文件写入成功!');
+ } else {
+ show_msg('配置文件写入失败!', 'error');
+ Session::set('error', true, 'install');
+ }
+ return true;
+ }
+}
+
+/**
+ * 创建数据表
+ * @param resource $db 数据库连接资源
+ * @param string $prefix
+ */
+function create_tables($db, $prefix = '') {
+ // 导入sql数据并创建表
+ $sql = file_get_contents('../app/install/data/taoler.sql');
+ //替换表前缀
+ $orginal = 'tao_';
+ ($orginal==$prefix) ? true : $sql = str_replace(" `{$orginal}", " `{$prefix}", $sql);
+ $sql_array=preg_split("/;[\r\n]+/", $sql);
+ //开始安装
+ //var_dump($sql_array);
+ foreach ($sql_array as $k => $v) {
+ if (!empty($v)) {
+ //$v=$v.';';
+ if (substr($v, 0, 12) == 'CREATE TABLE') {
+ //echo 'ddddddddddddddddd';
+ $name = preg_replace("/^CREATE TABLE `(\w+)` .*/s", "\\1", $v);
+ $msg = "创建数据表{$name}";
+ if (false !== $db->query($v)) {
+ //show_msg($msg . '...成功!');
+ //echo '成功';
+ } else {
+ echo '失败';
+
+ //show_msg($msg . '...失败!', 'error');
+ //Session::set('error', true, 'install');
+ }
+ } else {
+ $db->query($v);
+ }
+ //echo substr($v, 0, 12).'--';
+ // $db->query($v);
+ }
+ }
+}
+
+function register_administrator($db, $prefix, $admin) {
+ //show_msg('开始注册创始人帐号...');
+ $password = password_hash($admin['password'], PASSWORD_DEFAULT);
+ $sql="INSERT INTO {$prefix}user(group_id,username,password,email,create_time) VALUE(1,'{$admin['username']}','{$password}','{$admin['email']}','{time()}')";
+ //执行sql
+ $db->execute($sql);
+ //show_msg('创始人帐号注册完成!');
+}
+
+/**
+ * 更新数据表
+ * @param resource $db 数据库连接资源
+ * @param string $prefix
+ * @author lyq <605415184@qq.com>
+ */
+function update_tables($db, $prefix = '') {
+ //读取SQL文件
+ $sql = file_get_contents(APP_PATH . 'install/data/update.sql');
+ $sql = str_replace("\r", "\n", $sql);
+ $sql = explode(";\n", $sql);
+
+ //替换表前缀
+ $sql = str_replace(" `tao_", " `{$prefix}", $sql);
+
+ //开始安装
+ show_msg('开始升级数据库...');
+ foreach ($sql as $value) {
+ $value = trim($value);
+ if (empty($value)) {
+ continue;
+ }
+ if (substr($value, 0, 12) == 'CREATE TABLE') {
+ $name = preg_replace("/^CREATE TABLE `(\w+)` .*/s", "\\1", $value);
+ $msg = "创建数据表{$name}";
+ if (false !== $db->execute($value)) {
+ show_msg($msg . '...成功!');
+ } else {
+ show_msg($msg . '...失败!', 'error');
+ Session::set('error', true, 'install');
+ }
+ } else {
+ if (substr($value, 0, 8) == 'UPDATE `') {
+ $name = preg_replace("/^UPDATE `(\w+)` .*/s", "\\1", $value);
+ $msg = "更新数据表{$name}";
+ } else if (substr($value, 0, 11) == 'ALTER TABLE') {
+ $name = preg_replace("/^ALTER TABLE `(\w+)` .*/s", "\\1", $value);
+ $msg = "修改数据表{$name}";
+ } else if (substr($value, 0, 11) == 'INSERT INTO') {
+ $name = preg_replace("/^INSERT INTO `(\w+)` .*/s", "\\1", $value);
+ $msg = "写入数据表{$name}";
+ }
+ if (($db->execute($value)) !== false) {
+ show_msg($msg . '...成功!');
+ } else {
+ show_msg($msg . '...失败!', 'error');
+ Session::set('error', true, 'install');
+ }
+ }
+ }
+}
+
+/**
+ * 及时显示提示信息
+ * @param string $msg 提示信息
+ * @param string $class
+ * @param string $jump
+ */
+function show_msg($msg, $class = '',$jump='') {
+ echo "";
+ flush();
+ ob_flush();
+}
\ No newline at end of file
diff --git a/app/install/config/database.php b/app/install/config/database.php
new file mode 100644
index 0000000..fcf0b7c
--- /dev/null
+++ b/app/install/config/database.php
@@ -0,0 +1,26 @@
+ [
+ 'install' => [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'hostname' => '127.0.0.1',
+ // 数据库名
+ 'database' => '',
+ // 用户名
+ 'username' => 'root',
+ // 密码
+ 'password' => '',
+ // 端口
+ 'hostport' => '3306',
+ // 数据库连接参数
+ 'params' => [],
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8',
+ // 数据库表前缀
+ 'prefix' => 'tao_',
+ ],
+ ],
+];
\ No newline at end of file
diff --git a/app/install/controller/index.php b/app/install/controller/index.php
new file mode 100644
index 0000000..f0e0963
--- /dev/null
+++ b/app/install/controller/index.php
@@ -0,0 +1,207 @@
+alert('已经成功安装了TaoLer社区系统,安装系统已锁定。如需重新安装,请删除根目录下的install.lock文件')";
+ die();
+ }
+ }
+
+ //安装首页
+ public function index()
+ {
+ Session::set('agre',true);
+ return View::fetch('agreement');
+ }
+
+ //test
+ public function test()
+ {
+ if(Session::pull('agre')){
+ Session::set('cre',true);
+ return View::fetch('test');
+ } else {
+ return 'error,请返回安装!';
+ }
+ }
+
+ //test
+ public function create(){
+ if(Session::pull('cre')){
+ Session::set('suc',true);
+ return View::fetch('create');
+ } else {
+ return 'error,请返回安装!';
+ }
+ }
+
+ // 安装成功页面
+ public function complete(){
+
+ if(Session::has('suc') != 'true'){
+ return 'error,请返回安装!';
+ }
+
+ // 判断是否为post
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+
+ $data = $_POST;
+ //var_dump($data);
+ if (!preg_match("/^[a-zA-Z]{1}([0-9a-zA-Z]|[._]){4,19}$/", $data['admin_user'])) {
+ die("");
+ }
+
+ if (!preg_match("/^[\@A-Za-z0-9\!\#\$\%\^\&\*\.\~]{6,22}$/", $data['admin_pass'])) {
+ die("");
+ }
+ if ($data['admin_pass'] != $data['admin_pass2']) {
+ die("");
+
+ }
+ $_SESSION['adminusername'] = $data['admin_user'];
+ // 生成管理员
+ $username = $data['admin_user'];
+ $create_time = time();
+ $salt = substr(md5($create_time),-6);
+ $pass = md5(substr_replace(md5($data['admin_pass']),$salt,0,6));
+
+
+ if ($data['DB_TYPE'] == 'mysql') {
+
+ //数据库
+ $db_s = << [
+ 'install' => [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'hostname' => '{$data['DB_HOST']}',
+ // 数据库名
+ 'database' => '{$data['DB_NAME']}',
+ // 用户名
+ 'username' => '{$data['DB_USER']}',
+ // 密码
+ 'password' => '{$data['DB_PWD']}',
+ // 端口
+ 'hostport' => '{$data['DB_PORT']}',
+ // 数据库连接参数
+ 'params' => [],
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8',
+ // 数据库表前缀
+ 'prefix' => '{$data['DB_PREFIX']}',
+ ],
+ ],
+];
+php;
+ // 创建数据库链接配置文件
+
+ $fp = fopen('../app/install/config/database.php', "r+b");
+ fputs($fp, $db_s);
+ fclose($fp);
+
+
+ $db = Db::connect('install');
+ //var_dump($db);
+ $sql = 'CREATE DATABASE IF NOT EXISTS '.$data['DB_NAME'].' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci';
+ //$db->execute($sql);
+
+ //创建数据表
+ create_tables($db, $data['DB_PREFIX']);
+
+ //管理员
+ $table_admin = $data['DB_PREFIX'] . "admin";
+ $table_user = $data['DB_PREFIX'] . "user";
+ $sql_admin = "UPDATE $table_admin SET username = '{$username}', password = '{$pass}', status=1,create_time = '{$create_time}' WHERE id = 1";
+ $sql_user = "UPDATE $table_user SET name = '{$username}', password = '{$pass}', status=1, auth=1, create_time = '{$create_time}' WHERE id = 1";
+ $db->execute($sql_admin);
+ $db->execute($sql_user);
+
+ Db::getConnection()->close();
+ }
+
+ $db_str = << [],
+ // 自动写入时间戳字段
+ // true为自动识别类型 false关闭
+ // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
+ 'auto_timestamp' => true,
+ // 时间字段取出后的默认时间格式
+ 'datetime_format' => 'Y-m-d H:i:s',
+ // 数据库连接配置信息
+ 'connections' => [
+ 'mysql' => [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'hostname' => '{$data['DB_HOST']}',
+ // 数据库名
+ 'database' => '{$data['DB_NAME']}',
+ // 用户名
+ 'username' => '{$data['DB_USER']}',
+ // 密码
+ 'password' => '{$data['DB_PWD']}',
+ // 端口
+ 'hostport' => '{$data['DB_PORT']}',
+ // 数据库连接参数
+ 'params' => [],
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8',
+ // 数据库表前缀
+ 'prefix' => '{$data['DB_PREFIX']}',
+ // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+ 'deploy' => 0,
+ // 数据库读写是否分离 主从式有效
+ 'rw_separate' => false,
+ // 读写分离后 主服务器数量
+ 'master_num' => 1,
+ // 指定从服务器序号
+ 'slave_no' => '',
+ // 是否严格检查字段是否存在
+ 'fields_strict' => true,
+ // 是否需要断线重连
+ 'break_reconnect' => false,
+ // 监听SQL
+ 'trigger_sql' => true,
+ // 开启字段缓存
+ 'fields_cache' => false,
+ // 字段缓存路径
+ 'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
+ ],
+ ],
+];
+php;
+ // 创建数据库链接配置文件
+
+ $fp = fopen('../config/database.php', "r+b");
+ fwrite($fp, $db_str);
+ fclose($fp);
+
+ file_put_contents('../install.lock', 'lock');
+ Session::clear();
+ return View::fetch('complete');
+ } else {
+ return '安装失败';
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/install/data/taoler.sql b/app/install/data/taoler.sql
new file mode 100644
index 0000000..ece0c38
--- /dev/null
+++ b/app/install/data/taoler.sql
@@ -0,0 +1,557 @@
+/*
+Navicat MySQL Data Transfer
+
+Source Server : TP
+Source Server Version : 50727
+Source Host : 127.0.0.1:3306
+Source Database : taoler
+
+Target Server Type : MYSQL
+Target Server Version : 50727
+File Encoding : 65001
+
+Date: 2020-01-01 12:54:45
+*/
+
+SET FOREIGN_KEY_CHECKS=0;
+
+-- ----------------------------
+-- Table structure for tao_admin
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_admin`;
+CREATE TABLE `tao_admin` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `username` varchar(20) NOT NULL COMMENT '管理员账户',
+ `nickname` varchar(20) NOT NULL COMMENT '昵称',
+ `password` varchar(32) NOT NULL COMMENT '密码',
+ `email` varchar(30) NOT NULL COMMENT '邮箱',
+ `mobile` varchar(11) NOT NULL COMMENT '手机号',
+ `sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0女1男',
+ `status` enum('1','0') NOT NULL DEFAULT '0' COMMENT '1启用0禁用',
+ `auth_group_id` smallint(1) NOT NULL DEFAULT '0' COMMENT '1超级管理员0是普通管理员',
+ `remarks` varchar(255) NOT NULL COMMENT '备注',
+ `last_login_ip` int(4) unsigned NOT NULL COMMENT '最后登录IP',
+ `last_login_time` int(11) unsigned zerofill NOT NULL COMMENT '最后登录时间',
+ `create_time` int(11) unsigned zerofill NOT NULL COMMENT '创建时间',
+ `update_time` int(11) unsigned zerofill NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) unsigned zerofill NOT NULL COMMENT '软删除',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_admin
+-- ----------------------------
+INSERT INTO `tao_admin` VALUES ('1', 'admin', '管理员', 'def94a4e0b210f2fac7df0fb279d09d3', 'adminqq@qq.com', '13511112222', '1', '1', '1', '2019.12.31,明天新年发布新版本!', '1270', '01577852879', '01577258664', '01577801064', '00000000000');
+INSERT INTO `tao_admin` VALUES ('2', 'test', '测试员', '3dbfa76bd34a2a0274f5d52f5529ccb3', 'tao@qq.com', '13567891236', '0', '0', '2', '', '1270', '01577514365', '01555892325', '01577847765', '00000000000');
+
+-- ----------------------------
+-- Table structure for tao_article
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_article`;
+CREATE TABLE `tao_article` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+ `title` varchar(50) NOT NULL COMMENT '标题',
+ `content` text NOT NULL COMMENT '内容',
+ `status` enum('0','1') NOT NULL DEFAULT '1' COMMENT '状态1显示0隐藏',
+ `cate_id` int(11) NOT NULL COMMENT '分类id',
+ `user_id` int(11) NOT NULL COMMENT '用户id',
+ `is_top` enum('0','1') NOT NULL DEFAULT '0' COMMENT '置顶1否0',
+ `is_hot` enum('0','1') NOT NULL DEFAULT '0' COMMENT '推荐1否0',
+ `is_reply` enum('1','0') NOT NULL DEFAULT '1' COMMENT '0禁评1可评',
+ `pv` int(11) NOT NULL COMMENT '浏览量',
+ `jie` enum('1','0') NOT NULL DEFAULT '0' COMMENT '0未结1已结',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_article
+-- ----------------------------
+INSERT INTO `tao_article` VALUES ('1', '哪里有好用专一的社区论坛?', '最近有所需要,在网上搜了一下,想找好用现成的社区性质的论坛,本来想搭建一个小区可维护的论坛。你们有推荐的吗?\r\n偶尔进到layui的Fly社区,感觉这个还挺好看的,搜了一下,也有几个类似的项目,得到的结果是,有不错的,可惜不维护了,有维护的,但不是自己想要的风格。\r\n我看的项目框架大多PHP实现的,要不咱也来一个。', '1', '6', '1', '0', '0', '1', '27', '0', '1546698110', '1577773844', '0');
+INSERT INTO `tao_article` VALUES ('2', 'php是世界最好的语言吗?', '[quote]\r\n PHP是世界最好的语言\r\n[/quote]\r\n您是怎么认为的呢?据说现在PHP7性能蛮好的,对于WEB开发很有效率,我是学C的,PHP几年前有过了解,在ASP时代,做过电影网站站长,很ASP后来很快就不用了。\r\n你认为PHP怎么样呢?', '1', '1', '1', '0', '0', '1', '77', '0', '1546699158', '1577773832', '0');
+INSERT INTO `tao_article` VALUES ('3', 'php压缩文件解压Unzip类', '[quote]\r\n 解压代码\r\n[/quote]\r\n[pre]\r\ncreate_dirs($dest_dir);\r\n\r\n // zip包中的 每个 文件\r\n while ($zip_entry = zip_read($zip))\r\n {\r\n\r\n // 现在我们要在目标目录中创建目录\r\n \r\n // 如果文件不在根目录中\r\n $pos_last_slash = strrpos(zip_entry_name($zip_entry), \"/\"); // strrpos()字符串在另一字符串中最后一次出现的位置。\r\n if ($pos_last_slash !== false)\r\n {\r\n // 创建保存zip条目的目录(结尾加“/”)substr()可在字符串中抽取从 start 下标开始的指定数目的字符。\r\n $this->create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));\r\n \r\n }\r\n\r\n // Open the entry\r\n if (zip_entry_open($zip,$zip_entry,\"r\"))\r\n {\r\n \r\n // 要保存在磁盘上的文件名\r\n $file_name = $dest_dir.zip_entry_name($zip_entry);\r\n\r\n // 检查是否应覆盖文件\r\n if ($overwrite === true || $overwrite === false && !is_file($file_name))\r\n {\r\n // 获取zip条目的内容\r\n $fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));\r\n\r\n file_put_contents($file_name, $fstream );\r\n // Set the rights\r\n chmod($file_name, 0777);\r\n echo \"save: \".$file_name.\"
\";\r\n }\r\n \r\n // Close the entry\r\n zip_entry_close($zip_entry);\r\n } \r\n }\r\n // Close the zip-file\r\n zip_close($zip);\r\n }\r\n }else{\r\n return false;\r\n }\r\n \r\n return true;\r\n}\r\n\r\n/**\r\n* This function creates recursive directories if it doesn\'t already exist\r\n*\r\n* @param String The path that should be created\r\n* \r\n* @return void\r\n*/\r\npublic function create_dirs($path)\r\n{\r\n if (!is_dir($path))\r\n {\r\n $directory_path = \"\";\r\n $directories = explode(\"/\",$path);\r\n array_pop($directories);\r\n \r\n foreach($directories as $directory)\r\n {\r\n $directory_path .= $directory.\"/\";\r\n if (!is_dir($directory_path))\r\n {\r\n mkdir($directory_path);\r\n chmod($directory_path, 0777);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n}\r\n[/pre]\r\n\r\n[quote]\r\n 使用实例\r\n[/quote]\r\n[pre]\r\nExtract C:/zipfiletest/zip-file.zip to C:/zipfiletest/zip-file/ and overwrites existing files\r\nunzip(\"C:/zipfiletest/zip-file.zip\", false, true, true);\r\n\r\nExtract C:/zipfiletest/zip-file.zip to C:/another_map/zipfiletest/ and doesn\'t overwrite existing files. NOTE: It doesn\'t create a map with the zip-file-name!\r\nunzip(\"C:/zipfiletest/zip-file.zip\", \"C:/another_map/zipfiletest/\", true, false);\r\n[/pre]\r\n\r\n\r\n', '1', '2', '1', '0', '1', '1', '218', '0', '1546698192', '1577763213', '0');
+INSERT INTO `tao_article` VALUES ('4', 'Fly Template 社区模版', '[quote]\r\n 你们认为layui官方Fly Template 社区模版怎么样?\r\n[/quote]\r\nimg[https://cdn.layui.com/upload/2017_11/168_1512035128058_80242.jpg] \r\n你喜欢吗?\r\n很多人都说比较喜欢,我个人认为不错的,这个板子非常喜欢,我看到有一些人做了开发,可惜的是都没有很好的维护,有的漏洞比较多,不完善,很美好的一个板子,但没有长久 的更新,非常的可惜。\r\n如果用别人的不好用,那我就做一个出来吧。喜欢的人多关注,适当时候放出来大家一起用。\r\n关于详情页的内容解析\r\n该模板自带一个特定语法的编辑器,当你把内容存储到数据库后,在页面读取后浏览,会发现诸如“表情、代码、图片”等无法解析,这是因为需要对该内容进行一次转义,通常来说这是在服务端完成的,但鉴于简单化,你还可以直接在前端去解析,在模板的detail.html中,我们已经把相关的代码写好了,你只需打开注释即可(在代码的最下面)。当然,如果觉得编辑器无法满足你的需求,你也可以把该编辑器换成别的HTML编辑器或MarkDown编辑器。', '1', '1', '1', '0', '0', '1', '12', '0', '1546698225', '1577772362', '0');
+INSERT INTO `tao_article` VALUES ('5', '中国区域性网上社区的舆情研究', '[quote]\r\n 中国区域性网上社区的舆情研究--基于《济南部落论坛》和《福州家园网》的实证分析\r\n冯立梅\r\n福建师范大学\r\n[/quote]\r\n网上论坛是网上社区最主要的组成部分。继全国性综合网上论坛,如天涯论坛、强国论坛的火爆之后,区域性的网上论坛,也开始迅速成长。\r\n如今每个城市,甚至有的县,都已经拥有了自己的网上论坛。泡本地的网上论坛,成为上网一族的习惯。处在社会转型时期的中国,各种矛盾问题比以往更加突出。而越来越多的社会热点事件,是萌芽于各地方性的网上论坛。网络舆情,是网上论坛信息的体现。因此,研究中国区域性网上社区的舆情信息就显得十分必要。\r\n\r\n本文力图从舆情的第一线出发,探讨中国区域性网上社区目前发展的态势,以及网络舆情的状况。并具体到几个网上论坛,通过综合研究和个案观察的方法,来概括其真实的表征,以此为据进行相关的理论分析。\r\n本着根据调查成果来下结论的思路,经过研究发现,中国区域性网上论坛能够一定程度的反映网络舆情,但是多停留在初级的讨论状态,情绪抒发后真正的问题并没有得到实质的解决。只有个别事件由于舆论压力而被重点处理。网上论坛具有很好的社会降压阀的作用,但对于网络民主的促进,远不及微博等新的媒体形式。 ', '1', '3', '2', '0', '1', '1', '23', '0', '1556798251', '1577765263', '0');
+INSERT INTO `tao_article` VALUES ('6', 'PHP是什么', '[quote]\r\n PHP原始为Personal Home Page的缩写,已经正式更名为 \"PHP: Hypertext Preprocessor\"。\r\n[/quote]\r\n\r\n自20世纪90年代国内互联网开始发展到现在,互联网信息几乎覆盖了我们日常活动所有知识范畴,并逐渐成为我们生活、学习、工作中必不可少的一部分。据统计,从2003 年开始,我国的网页规模基本保持了翻番的增长速度,并且呈上升趋势。PHP 语言作为当今最热门的网站程序开发语言,它具有成本低、速度快、可移植性好、 内置丰富的函数库等优点,因此被越来越多的企业应用于网站开发中。但随着互联网的不断更新换代,PHP语言也出现了不少问题。 [1] \r\n根据动态网站要求,PHP语言作为一种语言程序,其专用性逐渐在应用过程中显现,其技术水平的优劣与否将直接影响网站的运行效率。其特点是具有公开的源代码, 在程序设计上与通用型语言,如C语言相似性较高,因此在操作过程中简单易懂,可操作性强。同时,PHP语言具有较高的数据传送处理水平和输出水平,可以广泛应用在Windows系统及各类Web服务器中。如果数据量较大,PHP语言还可以拓宽链接面,与各种数据库相连,缓解数据存储、检索及维护压力。随着技术的发展,PHP 语言搜索引擎还可以量体裁衣,实行个性化服务,如根据客户的喜好进行分类收集储存,极大提高了数据运行效率。', '1', '3', '1', '0', '0', '1', '28', '0', '1546748103', '1577772531', '0');
+INSERT INTO `tao_article` VALUES ('7', 'thinkphp Db类和模型的正确使用姿势', '[quote]\r\n 来源:流年 ThinkPHP官方博客\r\n[/quote]\r\n\r\n2018 年 10 月 23 日 发布\r\n发现很多开发者在使用ThinkPHP5.*的时候不明白Db和模型的正确使用姿势,尤其是在5.1版本里面,如果你没有使用下面的正确姿势,有很大可能性会踩坑。\r\n\r\nDb的正确姿势\r\n下面是官方推荐的Db类用法(也就是每次都是静态方法调用)\r\n\r\n[pre]\r\n// 查询单个数据\r\nDb::name(\'user\')->where(\'id\', 1)->find();\r\n// 查询多个数据\r\nDb::name(\'user\')->where(\'id\', \'>\', 1)->select();\r\n// 写入新的数据\r\nDb::name(\'user\')->insert([\'name\' => \'张三\']);\r\n// 更新数据\r\nDb::name(\'user\')->where(\'id\', 1)->update([\'name\' => \'李四\']);\r\n// 删除数据\r\nDb::name(\'user\')->delete(1);\r\n[/pre]\r\n\r\n很多开发者为了简化代码,喜欢使用下面的代码。\r\n\r\n[quote]\r\n 但是,永远不要在5.1中使用下面的代码!\r\n[/quote]\r\n\r\n[pre]\r\n// 错误的用法\r\n\r\n$user = Db::name(\'user\');\r\n// 查询单个数据\r\n$user->where(\'id\', 1)->find();\r\n// 查询多个数据\r\n$user->where(\'id\', \'>\', 1)->select();\r\n// 写入新的数据\r\n$user->insert([\'name\' => \'张三\']);\r\n// 更新数据\r\n$user->update([\'name\' => \'李四\']);\r\n// 删除数据\r\n$user->delete(1);\r\n[/pre]\r\n\r\n[quote]\r\n 即便是使用助手函数仍然不建议!\r\n[/quote]\r\n\r\n[pre]\r\n// 仍然是错误的用法\r\n\r\n// 查询单个数据\r\ndb(\'user\')->where(\'id\', 1)->find();\r\n// 查询多个数据\r\ndb(\'user\')->where(\'id\', \'>\', 1)->select();\r\n// 写入新的数据\r\ndb(\'user\')->insert([\'name\' => \'张三\']);\r\n// 更新数据\r\ndb(\'user\')->update([\'name\' => \'李四\']);\r\n// 删除数据\r\ndb(\'user\')->delete(1);\r\n[/pre]\r\n\r\n很多开发者可能会奇怪,为什么是错误的用法呢?我使用的结果明明都没问题啊?这只是说明你还没踩坑罢了。\r\n\r\n真正的原因,是5.1版本每次查询后是不会清空前次(5.0则会每次清空)的查询条件的,所以下面的用法是有效的。\r\n\r\n[pre]\r\n$user = Db::name(\'user\');\r\n// 查询分数大于80分的用户总数\r\n$count = $user->where(\'score\', \'>\', 80)->count();\r\n// 查询分数大于80分的用户数据\r\n$user->select();\r\n[/pre]\r\n\r\n看到这里你应该明白了,当你使用的是同一个数据库查询对象实例的话,查询条件是始终会保留的(也就是会导致后面的查询条件错乱),而如果你使用助手函数或者手动实例化后多次操作都是相同的对象实例,除非你像下面一样手动清除。\r\n\r\n[pre]\r\n$user = Db::name(\'user\');\r\n// 查询分数大于80分的用户总数\r\n$count = $user->where(\'score\', \'>\', 80)->count();\r\n// 清除查询条件(但不包括排序或者字段等信息)\r\n$user->removeOption(\'where\');\r\n// 查询所有用户数据 并按分数倒序排列 \r\n$user->order(\'score\', \'desc\')->select();\r\n// 清除所有查询条件\r\n$user->removeOption();\r\n// 查询分数等于100的用户\r\n$user->where(\'score\', 100)->select();\r\n[/pre]\r\n\r\n[quote]\r\n 最佳实践:每次使用全新的Db静态查询\r\n[/quote]\r\n\r\n模型的正确姿势\r\n模型的设计其实和Db一样,基本上不需要手动进行实例化。\r\n\r\n[pre]\r\n// 写入新的数据\r\n$user = User::create([\'name\' => \'张三\']);\r\n// 更新数据\r\n$user->update([\'name\' => \'李四\']);\r\n\r\n// 查询单个数据\r\n$user = User::get(1);\r\n// 删除当前模型数据\r\n$user->delete();\r\n[/pre]\r\n\r\n上面的代码中,我们没有使用任何的实例化代码,都是使用静态方法操作。模型的实例化工作是由系统在查询或者写入数据的时候自动完成的。如果你自己手动实例化模型的话,会造成模型的重复实例化开销。\r\n\r\n不建议的用法:\r\n\r\n[pre]\r\n$user = new User;\r\n// 写入新的数据\r\n$user->name = \'张三\';\r\n$user->save();\r\n$user = new User;\r\n$user->find(1);\r\necho $user->name;\r\n[/pre]\r\n\r\n建议用法:\r\n\r\n[pre]\r\n// 写入新的数据\r\nUser::create([\'name\' => \'张三\']);\r\n$user = User::get(1);\r\necho $user->name;\r\n[/pre]\r\n\r\n所以,请不要手动实例化模型,也不建议使用model助手函数。\r\n\r\n[quote]\r\n 最佳实践:模型查询和创建都使用静态方法\r\n[/quote]\r\n\r\n现在,你明白Db类和模型使用的正确姿势了么?', '1', '2', '3', '0', '1', '1', '29', '0', '1546776559', '1577766682', '0');
+INSERT INTO `tao_article` VALUES ('8', 'thinkphp更新数据表的方法', '[quote]\r\n tp更新数据表的方法\r\n[/quote]\r\n[pre]\r\n/**\r\n * 更新数据表\r\n * @param resource $db 数据库连接资源\r\n * @param string $prefix\r\n * @author lyq <605415184@qq.com>\r\n */\r\nfunction update_tables($db, $prefix = \'\') {\r\n //读取SQL文件\r\n $sql = file_get_contents(APP_PATH . \'install/data/update.sql\');\r\n $sql = str_replace(\"\\r\", \"\\n\", $sql);\r\n $sql = explode(\";\\n\", $sql);\r\n\r\n //替换表前缀\r\n $sql = str_replace(\" `tao_\", \" `{$prefix}\", $sql);\r\n\r\n //开始安装\r\n show_msg(\'开始升级数据库...\');\r\n foreach ($sql as $value) {\r\n $value = trim($value);\r\n if (empty($value)) {\r\n continue;\r\n }\r\n if (substr($value, 0, 12) == \'CREATE TABLE\') {\r\n $name = preg_replace(\"/^CREATE TABLE `(\\w+)` .*/s\", \"\\\\1\", $value);\r\n $msg = \"创建数据表{$name}\";\r\n if (false !== $db->execute($value)) {\r\n show_msg($msg . \'...成功!\');\r\n } else {\r\n show_msg($msg . \'...失败!\', \'error\');\r\n Session::set(\'error\', true, \'install\');\r\n }\r\n } else {\r\n if (substr($value, 0, 8) == \'UPDATE `\') {\r\n $name = preg_replace(\"/^UPDATE `(\\w+)` .*/s\", \"\\\\1\", $value);\r\n $msg = \"更新数据表{$name}\";\r\n } else if (substr($value, 0, 11) == \'ALTER TABLE\') {\r\n $name = preg_replace(\"/^ALTER TABLE `(\\w+)` .*/s\", \"\\\\1\", $value);\r\n $msg = \"修改数据表{$name}\";\r\n } else if (substr($value, 0, 11) == \'INSERT INTO\') {\r\n $name = preg_replace(\"/^INSERT INTO `(\\w+)` .*/s\", \"\\\\1\", $value);\r\n $msg = \"写入数据表{$name}\";\r\n }\r\n if (($db->execute($value)) !== false) {\r\n show_msg($msg . \'...成功!\');\r\n } else {\r\n show_msg($msg . \'...失败!\', \'error\');\r\n Session::set(\'error\', true, \'install\');\r\n }\r\n }\r\n }\r\n}\r\n[/pre]\r\n', '1', '2', '2', '0', '0', '1', '110', '0', '1546776594', '1577763657', '0');
+INSERT INTO `tao_article` VALUES ('9', '社区为单位组织的区域性社区服务', '作为以社区为单位组织的区域性社区福利服务,社区服务主要表现为以下几个方面特征:()\r\n\r\nA、自助互助性\r\n\r\nB、多元化\r\n\r\nC、服务形式丰富化\r\n\r\nD、广泛性\r\n\r\nE、服务人员专业化\r\n\r\nF、持续发展性', '1', '3', '2', '0', '0', '1', '37', '0', '1546776655', '1577765003', '0');
+INSERT INTO `tao_article` VALUES ('10', '徐州这个小区业主自治攒下24万元家底', '[quote]\r\n 转自腾讯网\r\n[/quote]\r\n2月13日,大年初九,家住军缘新城的蔺女士是春节后第四次在家请客了。\r\n\r\n“以前小区环境不好,不好意思喊亲戚朋友来家里吃饭。现在小区像花园一样,晚上还有喷泉,作为业主感觉很自豪。小区自治这几个月,变化太大了。”\r\n\r\n重建后的小区广场美观又实用\r\nimg[https://inews.gtimg.com/newsapp_bt/0/7699348341/1000] \r\n\r\n13日早上9时许,军缘新城小区广场上很安静,只听见扫帚“唰唰”的扫地声,两名保洁员在打扫卫生,清扫过的地面一尘不染。\r\n\r\n小区业委会主任马照明和财务监督组组长周永才介绍了自从2018年9月10日小区自治以来广场上发生的变化:\r\nimg[https://inews.gtimg.com/newsapp_bt/0/7699348342/1000] \r\n\r\n小区水清路净。\r\n\r\n最大的亮点是春节前花费2305元修好了闲置多年的喷泉,安装上彩色的灯带。春节以来,业主们每天晚上都到广场欣赏彩色喷泉,大人孩子个个欢天喜地。\r\n\r\n\r\n春节前,清理水池里的淤泥,修复喷泉。\r\n\r\n“喷泉水池积攒多年的淤泥我们都清理干净了,七八个人整整干了12天的时间,又花300元钱买了一批观赏鱼放进去。”周永才指着清澈见底的水池说:“天冷,这些鱼懒得动,喜欢躲在石头缝里,等天年暖和了,它们游来游去更漂亮。”\r\n\r\n小区路灯全部更换成LED灯,亮堂又节能。广场上有一盏10米多高的大灯,是6年前有业主捐赠的,只亮了一段时间就坏了,几任物业公司都没人修理过。\r\nimg[https://inews.gtimg.com/newsapp_bt/0/7699348344/1000] \r\n\r\n业委会工作人员和业主齐心协力上阵,安装照明设施。\r\n\r\n这次实行自治后,也请电工维修好了。因为灯杆太高太重,放下和扶起的时候难度都很大,小区20多名男女老少一起过来用绳子把它拽起来。灯亮起来以后,早上锻炼、晚上跳广场舞的业主都很方便。\r\n\r\n广场的绿植看上去也很整齐、富有层次,树木已经修剪好,灌木丛内没有一点杂草和落叶。白玉兰树叶绿油油的,樱花树枝也泛出了生机。\r\n\r\n\r\n为了美化环境,小区内每个向阳的地段都设置了晾晒区\r\n\r\n小区广场不仅美观,还很实用,四周安装了15个高大的晾衣架。阳光好的时候,业主都喜欢到这里晒被子。\r\n\r\n广场的一角,还有一个醒目的展示牌,上面贴着1月11日至2月10日的各项收支明细和工资发放表。大到几百元的灯带,小到2元的刷子,一项项都罗列清楚。\r\n\r\n小区自治之路一波三折\r\n\r\n治理好一个小区,并不比管理好一家企业轻松。军缘新城的自治之路,也经历了一波三折。\r\n\r\n军缘新城于2008年3月上房,至2018年年初,10年间换了6任物业公司,没有一家能够在这个小区顺顺当当干下去。\r\n\r\n“主要是形成了恶性循环。物业服务不好,业主不愿交物业费;物业收不上来费用,服务质量就更差。”周永才说,最差的一年,物业公司只收到了60户业主的物业费。\r\n\r\n亏损最严重的一家物业公司,欠下了9万多元的债务。每一任物业走的时候,小区都是垃圾遍地,物业办公室里甚至连灯泡都被拆走。最后,业主们只能向社区求助,2018年以后,没有物业公司愿意到军缘新城来服务了。\r\n\r\n业主自治成了军缘新城唯一的出路。马照明说,自治并不像想像的那么简单、美好。军缘新城先后有三班热心业主出马实行自治,都想改变小区面貌,也摔了不少跟头。\r\n\r\n第一次自治从2018年2月开始,坚持了5个月,但管理中出现一些问题,物业费迟迟收不上来,只得偃旗息鼓;在社区的组织下,第二次自治很快又开始了,但因为提出的两套方案业主不认可,也没能顺利收取物业费,前后只坚持了26天。\r\n\r\n\r\n业主委员会马照明主任向业主群内发布的就职声明\r\n\r\n两次自治失败,有些人觉得灰心了。这时,曾经担任过业委会成员的马照明,在大家的推选之下站了出来,愿意担心业委会主任。上任之初他就声明:不要任何薪水和奖励,一切工作站在广大业主利益方面出发,监督、督促物业搞好小区物业服务,维护业主利益。\r\n\r\n新的业委会班子共有11名成员,经过商讨,成立了自治办,自治办负责人是热心业主朱兆砥,一名退休老师,也是他带头站出来支持小区自治的。\r\n\r\n\r\n只有物业经理和保安保洁等人员能领工资,他们都是小区业主。\r\n\r\n朱兆砥聘任用了一名物业经理和保安、保洁、电工共10人,只有这11人是拿工资的,其余人全部是义务为小区服务。朱兆砥在内蒙还有一份工作,经常在群里“遥控”指挥,春节回来这几天每天泡在小区里,几乎没有休息过。\r\n\r\n成功秘诀是“财务公开+办实事”\r\n\r\n\r\n每个月公示一次账目\r\n\r\n总结小区自治成功的经验,马照明透露了两个秘诀:一是财务公开,二是给业主办实事。\r\n\r\n作为小区的“财务总监”,周永才说,他们财务小组一共有7名成员,里面有从事会计工作的,有拿到会计师职称的,有干过财务科长的,还有在高校里传授财会知识的教授,这些成员都由热心业主推荐,他挨家挨户上门动员做工作争取来的。\r\n\r\n每个月月底大家坐在一起集体进行财务审核,查看各项收入和支出有无问题,全部同意后由周永才签字,再进行公示。\r\n\r\n接手小区财务后,他们才知道,有些盈利以前的物业从来不公示也不会告知业主,比如小区的饮水机、捐衣箱、快递箱都是有租金的,虽然不高,但也积少成多。\r\n\r\n诸如此类的收入,哪怕有100元的进账,周永才也会公示。支出更要征求民意,春年前给物业人员每人发100元过节费,也是征得大家同意的。\r\n\r\n每项财务专项专用,物业费用于发放物业人员工资,小区租金和广告收入则用于小区公共建设。\r\n\r\n\r\n业主委员会财务都有专职人员进行监管,每个月的收支都张贴出来。\r\n\r\n“我们账上现在还剩余241580.9元。”年过六旬的周永才对小区账户上的每项数字都能脱口而出。他总是想方设法为小区省钱,购买路灯灯泡时为了享受团购价,他在群里发动有需求的业主一起购买,最终省下了150元。小区物业办公需要电脑,他主动把自己家闲置的电脑拿过来作为公用。业委会与物业用房也由5间压缩为4间,多出租一间房就多一点收入。\r\n\r\n说到给业主办实事,那肯定需要钱,军缘新城的这一届业委会上任时一穷二白,马照明甚至还垫付了4000多元的电梯维修费。怎么办?\r\n\r\n业委会想到了小门门口的一排公共用房,上房多年来,除去物业和业委会用房5间,其余全部被无端占用。顶着巨大的压力,他们请一些有威望的老人前去做工作,一遍遍动员、贴公告,前后花了两个月的时间终于把房子全部要回来并租了出去,14间房屋每年可收租金3.5万元。另外小区广告费的收入每年也有2.5万元左右。\r\n\r\n业委会和自治办一边整改小区,一边收取物业费,将物业费收取标准由每平米0.45元降至每平米0.40元,而且不另收公共能耗费,前三个月的物业费收缴率终于创了新高,达到90%以上,如果不是有140户空关户,收缴率会更高。\r\n\r\n社区放心了,业主满意了\r\n\r\n军缘新城新一轮自治从2018年9月10日开始,到现在5个多月了,工作进展十分顺利。\r\n\r\n道北社区盛莉主任感慨说,现在军缘新城自治工作确实已经走上正轨,不需要社区介入了,也没有业主前来投诉了。以前每次物业撤出和自治失败后,都是社区来兜底。\r\n\r\n这次自治,物业费收得低,保安和保洁用的都是小区居民,活干得好,业委会跟业主沟通也有方法,业主很满意,社区也放心了。\r\n\r\n在广场上保洁的陈衍玲说,\r\n\r\n她负责小区三栋楼房和半个广场的清洁工作,每天把三栋楼的公共区域都打扫一遍,广场早中晚都要打扫,一天下来没有清闲的时候,每个月工资1600元。\r\n\r\n但是打扫自己的小区很开心,就像在自己家里搞卫生一样,到处弄得干干净净的,得到业主的夸赞,心里很自豪。\r\n\r\n小区居民季女士对业委会竖起了大拇指:\r\n\r\n小区自治很成功,业主们都很感激业委会和自治办,他们个个都是无私奉献。如今的小区比很多有物业管理的小区都要干净。\r\n\r\n自从她5年前住进这里,喷泉水池就是个臭水沟,以前从来没见喷泉喷过水,现在水池变得那么干净,还养起了鱼。变化大太了。业委会为业主服务更热心,有一次她家突然停电了,马主任带着电工到她家维修,一会儿就把问题解决了。他们是实实在在给业主办事。\r\n\r\n马照明骄傲地说,前几天他看到小区里有个孩子不愿去爷爷奶奶家,原因竟然是这里晚上有漂亮的喷泉,比爷爷奶奶家好玩。\r\n\r\n据了解,军缘新城即将上马一个更好玩的项目:取消门禁卡,刷脸进小区,打造智慧小区。这个全市还是首家。\r\n\r\n对于小区将来的发展,军缘新城业委会已经制定了长远规划:重建广场上6座小亭子,更换所有单元门,美化小区入口的500米长廊,建成花园式小区。最近他们正在寻找广告商合作一起翻修入口长廊,还希望有爱好墙壁画的人士能帮他们美化墙面。', '1', '4', '2', '0', '1', '1', '68', '0', '1550996685', '1577765713', '0');
+INSERT INTO `tao_article` VALUES ('11', '数据查询链式操作', 'face[微笑] \r\n\r\n数据库提供的链式操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作(原生查询不支持链式操作)。\r\n\r\n使用也比较简单,假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:\r\n\r\n[pre]\r\nDb::table(\'think_user\')\r\n ->where(\'status\',1)\r\n ->order(\'create_time\')\r\n ->limit(10)\r\n ->select();\r\n[/pre]\r\n这里的where、order和limit方法就被称之为链式操作方法,除了select方法必须放到最后一个外(因为select方法并不是链式操作方法),链式操作的方法调用顺序没有先后,例如,下面的代码和上面的等效:\r\n\r\n[pre]\r\nDb::table(\'think_user\')\r\n ->order(\'create_time\')\r\n ->limit(10)\r\n ->where(\'status\',1)\r\n ->select();\r\n[/pre]\r\n其实不仅仅是查询方法可以使用连贯操作,包括所有的CURD方法都可以使用,例如:\r\n\r\n[pre]\r\nDb::table(\'think_user\')\r\n ->where(\'id\',1)\r\n ->field(\'id,name,email\')\r\n ->find(); \r\n \r\nDb::table(\'think_user\')\r\n ->where(\'status\',1)\r\n ->where(\'id\',1)\r\n ->delete();\r\n[/pre]', '1', '3', '1', '0', '0', '1', '53', '0', '1546860297', '1577773852', '0');
+INSERT INTO `tao_article` VALUES ('12', 'layui表单页面元素', '[quote]\r\n 在一个容器中设定 class=\"layui-form\" 来标识一个表单元素块,通过规范好的HTML结构及CSS类,来组装成各式各样的表单元素,并通过内置的 form模块 来完成各种交互。\r\n[/quote]\r\n[quote]\r\n 依赖加载模块:form (请注意:如果不加载form模块,select、checkbox、radio等将无法显示,并且无法使用form相关功能)\r\n[/quote]\r\n[pre]\r\n\r\n \r\n\r\n[/pre]\r\nUI的最终呈现得益于 Form模块 的全自动渲染,她将原本普通的诸如select、checkbox、radio等元素重置为你所看到的模样。或许你可以移步左侧导航的 内置模块 中的 表单 对其进行详细的了解。', '1', '2', '1', '0', '0', '1', '29', '0', '1546871441', '1577771850', '0');
+INSERT INTO `tao_article` VALUES ('13', 'thinkphp5.1开发规范', '[quote]\r\n 命名规范\r\n[/quote]\r\n\r\nThinkPHP5.1遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:\r\n\r\n[quote]\r\n 目录和文件\r\n[/quote]\r\n\r\n目录使用小写+下划线;\r\n类库、函数文件统一以.php为后缀;\r\n类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;\r\n类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;\r\n类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);\r\n[quote]\r\n 函数和类、属性命名\r\n[/quote]\r\n\r\n类的命名采用驼峰法(首字母大写),例如 User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;\r\n函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;\r\n方法的命名使用驼峰法(首字母小写),例如 getUserName;\r\n属性的命名使用驼峰法(首字母小写),例如 tableName、instance;\r\n特例:以双下划线__打头的函数或方法作为魔术方法,例如 __call 和 __autoload;\r\n[quote]\r\n 常量和配置\r\n[/quote]\r\n\r\n常量以大写字母和下划线命名,例如 APP_PATH;\r\n配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert;\r\n环境变量定义使用大写字母和下划线命名,例如APP_DEBUG;\r\n[quote]\r\n 数据表和字段\r\n[/quote]\r\n\r\n数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表及字段命名。\r\n请理解并尽量遵循以上命名规范,可以减少在开发过程中出现不必要的错误。', '1', '2', '1', '0', '0', '1', '51', '0', '1547436945', '1577772688', '0');
+INSERT INTO `tao_article` VALUES ('14', 'thinkphp5.1目录结构', '[pre]\r\nwww WEB部署目录(或者子目录)\r\n├─application 应用目录\r\n│ ├─common 公共模块目录(可以更改)\r\n│ ├─module_name 模块目录\r\n│ │ ├─common.php 模块函数文件\r\n│ │ ├─controller 控制器目录\r\n│ │ ├─model 模型目录\r\n│ │ ├─view 视图目录\r\n│ │ ├─config 配置目录\r\n│ │ └─ ... 更多类库目录\r\n│ │\r\n│ ├─command.php 命令行定义文件\r\n│ ├─common.php 公共函数文件\r\n│ └─tags.php 应用行为扩展定义文件\r\n│\r\n├─config 应用配置目录\r\n│ ├─module_name 模块配置目录\r\n│ │ ├─database.php 数据库配置\r\n│ │ ├─cache 缓存配置\r\n│ │ └─ ... \r\n│ │\r\n│ ├─app.php 应用配置\r\n│ ├─cache.php 缓存配置\r\n│ ├─cookie.php Cookie配置\r\n│ ├─database.php 数据库配置\r\n│ ├─log.php 日志配置\r\n│ ├─session.php Session配置\r\n│ ├─template.php 模板引擎配置\r\n│ └─trace.php Trace配置\r\n│\r\n├─route 路由定义目录\r\n│ ├─route.php 路由定义\r\n│ └─... 更多\r\n│\r\n├─public WEB目录(对外访问目录)\r\n│ ├─index.php 入口文件\r\n│ ├─router.php 快速测试文件\r\n│ └─.htaccess 用于apache的重写\r\n│\r\n├─thinkphp 框架系统目录\r\n│ ├─lang 语言文件目录\r\n│ ├─library 框架类库目录\r\n│ │ ├─think Think类库包目录\r\n│ │ └─traits 系统Trait目录\r\n│ │\r\n│ ├─tpl 系统模板目录\r\n│ ├─base.php 基础定义文件\r\n│ ├─convention.php 框架惯例配置文件\r\n│ ├─helper.php 助手函数文件\r\n│ └─logo.png 框架LOGO文件\r\n│\r\n├─extend 扩展类库目录\r\n├─runtime 应用的运行时目录(可写,可定制)\r\n├─vendor 第三方类库目录(Composer依赖库)\r\n├─build.php 自动生成定义文件(参考)\r\n├─composer.json composer 定义文件\r\n├─LICENSE.txt 授权说明文件\r\n├─README.md README 文件\r\n├─think 命令行入口文件\r\n[/pre]\r\n\r\n[quote]\r\n 在mac或者linux环境下面,注意需要设置runtime目录权限为777。\r\n[/quote]\r\n[quote]\r\n 由于5.1版本取消了系统路径的常量定义,因此系统的目录名称不可更改。如果需要更改应用目录或者入口文件位置,参考架构章节的入口文件部分。\r\n[/quote]\r\n', '1', '1', '1', '0', '0', '1', '239', '1', '1548325869', '1577772871', '0');
+INSERT INTO `tao_article` VALUES ('15', 'add添加文章有误', 'face[微笑] \r\n123\r\nimg[/uploads/20190310/4cc8e58de8f2765270e8475bf059ae1d.jpg] \r\n[hr]\r\n[pre]\r\njjjj\r\n[/pre]\r\n[quote]\r\n这样的风格,呵呵!\r\n[/quote]\r\n', '1', '1', '1', '0', '0', '1', '184', '0', '1551436861', '1555747615', '0');
+INSERT INTO `tao_article` VALUES ('16', '谁在使用thinkphp6.0版本', '新项目测试,更新为thinkphp6框架。', '1', '6', '1', '0', '0', '1', '12', '0', '1552182370', '1577769774', '0');
+INSERT INTO `tao_article` VALUES ('17', '2019.3.10创建TaoLer项目', '创建TaoLer项目\r\n使用Thinkphp为核心框架,\r\n前身TLBS,think5.1开发。\r\n', '1', '4', '1', '0', '0', '1', '32', '0', '1552183473', '1577769686', '0');
+INSERT INTO `tao_article` VALUES ('18', 'layui 2.5.5发布', '闲心:\r\n[quote]\r\n 之前大家在《2.5.x 问题集中收集》中反馈的内容,我已如数看到,谢谢大家的积极反馈!。其中有些被采纳在本次版本中,有些被规划到了 v2.6、v3.0 中。我深知之前反复的断更对 layui 带来的是怎样无可挽回的损失,然而 layui 终于还是不得不重新审视它所处的位置,行进的「前端河」分出了两条支流:一条是滚滚洪流,没有人能够逃脱它的流速,我们必须要在拥抱中重生;一条是波澜不惊,那是我们最初的方向,返璞归真、自诩的「经典」和不灭的执念。顺应潮流而不背离初心,layui 注定要同时流向这两条支流,虽千万里之行,亦愿独闯。\r\n[/quote]\r\n\r\n# v2.5.5(2019.09.10)\r\n● [优化] form 组件的 val() 方法,除了之前版本的赋值,目前还可支持取值\r\n● [新增] tree 组件的数据源参数 field,用于定义数据字段名\r\n● [优化] tree 组件的节点删除前的提示功能\r\n● [修复] tree 组件的数据源参数 checked 在父子节点同时设定时的异常问题\r\n● [优化] table 组件的 defaultToolbar 参数,可以扩展头部工具栏右侧图标按钮\r\n● [优化] table 组件的局部代码,减少重复的全局事件引发的卡顿问题\r\n● [修复] table 组件的合计行未按照对应列显示自定义模板的问题\r\n● [修复] table 组件导出数据时未包含合计行的问题\r\n● [修复] transfer 组件的右侧面板在使用搜索转移数据后,无法再获取右侧数据的问题\r\n● [新增] upload 组件的 progress 回调,用于监听文件的上传进度', '1', '4', '1', '1', '0', '1', '88', '0', '1568096396', '1577769315', '0');
+INSERT INTO `tao_article` VALUES ('19', 'php创建递归目录', '如果不存在,创建递归目录:\r\n[pre]\r\n/**\r\n* This function creates recursive directories if it doesn\'t already exist\r\n*\r\n* @param String The path that should be created\r\n* \r\n* @return void\r\n*/\r\npublic function create_dirs($path)\r\n{\r\n if (!is_dir($path))\r\n {\r\n $directory_path = \"\";\r\n $directories = explode(\"/\",$path);\r\n array_pop($directories);\r\n \r\n foreach($directories as $directory)\r\n {\r\n $directory_path .= $directory.\"/\";\r\n if (!is_dir($directory_path))\r\n {\r\n mkdir($directory_path);\r\n chmod($directory_path, 0777);\r\n }\r\n }\r\n }\r\n}\r\n[/pre]\r\n', '1', '2', '1', '0', '1', '1', '178', '0', '1559193830', '1577763199', '0');
+INSERT INTO `tao_article` VALUES ('22', '漂亮!2018江苏扶贫脱贫工作再报好成绩!', '2019年02月26日 21:50 新华报业网\r\n交汇点讯 以“绣花”功夫扎实推进精准扶贫精准脱贫,以决战决胜的信心和决心打赢打好脱贫攻坚战。2月26日下午,全省扶贫开发工作会议在南京召开。根据会议通报,2018年,全省人均收入6000元以下低收入农户共有267674户、675383人实现脱贫。全省有244个省定经济薄弱村集体经济收入超过18万元,扶贫工作交出亮眼“成绩单”。\r\nimg[http://n.sinaimg.cn/translate/516/w752h564/20190226/qNqo-htptaqe9309745.png] \r\n\r\n 家门口就能就业苏北5市脱贫工作成效显著\r\n\r\n 根据会议通报,苏北5市脱贫255046户、653051人,占全省脱贫人数的96.7%。苏中扬州市、泰州市脱贫12628户、22332人。苏北12个重点县(区)脱贫126548户、352630人,占苏北5市脱贫人数的54.0%。苏北5市脱贫236个村,占全省脱贫村总数的96.7%;苏中泰州市脱贫8个。苏北12个重点县(区)脱贫140个村,占苏北5市脱贫村的59.3%。\r\n\r\n 成绩单背后,是全省扶贫工作的扎实稳步推进。\r\n\r\n 以宿迁市为例,2018年该市实现12.8万建档立卡低收入人口、46个省定经济薄弱村脱贫达标,分别完成年度且标任务的126.7%、109.5%。宿迁市副市长光华介绍,该市打造优质稻米、标准化果蔬、园艺型花木、农牧循环型生猪、精深加工型肉禽、生态河蟹六大百亿级产业,带动近10万低收入人口增收;免费开展劳动力培训,累计实施“家门口就业”项目989个,带动低收入劳动力就业5.9万人,人均年增收1.32万元。\r\n\r\n “沙集模式”加入助力精准扶贫、精准脱贫\r\n\r\n 靶向发力,精准施策,才能让脱贫攻坚取得过硬成果。\r\n\r\n 2018年,睢宁县53个省定和47个县定经济薄弱村全部“摘帽”,12.14万低收入人口实现脱贫。在众多扶贫举措中,做好电商扶贫是该县扶贫工作的一大亮点。\r\n\r\n 睢宁县委副书记王敏说,睢宁县着力打造8大电商产业园区、设立600多个服务网点,全面拓宽电商就业渠道。设置1000万元电商专项扶持资金,强化扶贫小额贷款支持力度。依托全国首家地市级“淘宝大学”,实施“万人培训计划”,4年免费培训超过4万人,带动近5500名低收入户成功创业。\r\n\r\n 不仅如此,该县复制推广“沙集模式”,积极开展淘宝镇村创建,打造出东部简约家具、西南部小饰品、西北部特色农产品、中部传统店铺与网店结合的“四大电商片区”。2018年累计创成淘宝镇10个、淘宝村92个,淘宝村总量全省第一、全国第四,拥有网商3.4万户,带动从业人数超21万人,直接或间接帮助近2万人脱贫。\r\n\r\n 各类帮扶项目持续发力为扶贫增收提供保障\r\n\r\n 2018年,全省235家后方单位完成省定出资任务2.59亿元,到挂钩帮扶县(区)开展扶贫现场办公3769人次。省委驻县帮扶工作队全年协调投入资金12.55亿元,实施各类帮扶项目623个,所挂钩帮扶203个省定经济薄弱村通过不到一年的帮扶,已有140个村实现脱贫。\r\n\r\n 在淮安,省委驻涟水县帮扶工作队打造了“安东米富”品牌,整合资源,扶持经营主体,以“互联网+公司+基地+农户”的模式,打造新型农业产业化联合体。省委驻涟水县帮扶工作队队长孙国君介绍,目前已整合7个生产基地,对接15个家庭农场;“安东米富”从单一有机稻米,扩展到近二十几种产品,拥有草鸡蛋、有机大米、红薯粉丝等23个特色农产品,产业发展覆盖9个村,带动农户2066个。已经形成的长期稳定产销关系实现全年销售额超过1000万元,为村集体和农民持久增收提供了有力保障。\r\n\r\n 两地帮扶共赢为区域后续发展增添新动能\r\n\r\n 截至2018年底,全省低收入人口还剩余568883人未脱贫,97个省定经济薄弱村未达标。打赢打好脱贫攻坚战,求实求效,相生相长,也是一个有效措施。\r\n\r\n 南京市江宁区从1995年开始挂钩帮扶淮安市淮阴区。截至目前,帮扶淮阴区建设项目146个,累计投入资金5352万元;江宁开发区投入以奖代补资金8500万元。\r\n\r\n 2006年10月,江宁开发区与淮阴区携手共建淮阴工业园,随着一系列项目招引、转型升级举措的实施,这一园区在全省45家南北共建园区中,连续七年被评为共建园区先进单位;成功引进了众创空间合伙人项目,2018年9月获批省级众创空间称号,是淮安市唯一获批的省级众创空间。\r\n\r\n 南京江宁区委常委、常务副区长李滨说,目前,在众创空间注册成立企业16家,引进创业团队13个。李德发院士、王国栋院士在园区企业澳华农牧、振达钢管设立院士工作站;淮阴工学院、淮阴师范学院等高校和科研院所,常年在园区开展“百名博士帮百企”等活动,为区域后续发展增添了新动能。\r\n\r\n 【新闻延伸】\r\n\r\n 江苏全省低收入人口大病专项救治病种数增至30种\r\n\r\n 交汇点讯全省因病致贫农户从2016年的40.3万户下降到目前的14.2万户。这是记者从2月26日下午举办的全省扶贫开发工作会议上获得的消息。\r\n\r\n 据省卫生健康委巡视员何小鹏介绍,全省低收入人口治疗总费用个人自付比例由2016年的50%左右下降至2018年底的30%左右;大病专项救治病种数由20种增至30种;全省确定定点医院412家,救治大病患者7.47万人,减免医疗费用超过3.21亿元。\r\n\r\n 交汇点见习记者 胡安静', '1', '4', '3', '0', '1', '0', '4', '0', '1551996685', '1577767438', '0');
+INSERT INTO `tao_article` VALUES ('23', 'ThinkPHP6.0版本发布', '[quote]\r\n 2019 年 10 月 24 日 发布\r\n官方历时一年多倾力打造的ThinkPHP6.0版本正式发布,该版本基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规范化。\r\n\r\n由于引入了一些新特性,ThinkPHP6.0运行环境要求PHP7.1+(推荐PHP7.3+),不支持5.1的无缝升级\r\n[/quote]\r\n\r\n主要特性:\r\n采用PHP7强类型(严格模式)\r\n支持更多的PSR规范\r\n多应用支持\r\nORM组件独立\r\n改进的中间件机制\r\n核心架构服务化\r\n全新的事件系统\r\n容器功能增强\r\n模板引擎组件独立\r\n内部功能中间件化\r\nSESSION机制改进\r\n缓存及日志支持多通道\r\n引入Filesystem组件\r\n对Swoole以及协程支持改进\r\n对IDE更加友好\r\n统一和精简大量用法\r\n强类型及严格模式\r\n在主流框架里面,ThinkPHP6.0是最先采用PHP7严格模式的。所有的核心文件都是开启了严格模式的类型约束,因此有任何的变量类型不符的情况都会抛出异常,有利于规范代码中的变量类型和提前发现问题隐患。\r\n\r\n多应用模式\r\n新版框架提供了多应用模式支持,默认安装为单应用,你只需要安装一个多应用模式扩展就可以更轻松的部署多个应用而不需要重复安装依赖组件,每个应用都支持独立入口访问以及域名绑定,也可以使用一个入口文件实现自动多应用部署。并且自动多应用模式支持智能识别,对于不存在的应用访问会自动切换到单应用模式进行匹配。同时支持应用的映射和禁止访问机制。\r\n\r\n多应用模式的设计可以让开发更加模块化,因为每个应用的配置、路由及视图都可以纳入应用目录,所以更方便应用的模块化,甚至引入composer应用。\r\n\r\n容器和服务\r\n新版的容器支持PSR-11规范,容器类的功能特性主要包括:\r\n\r\n绑定类、对象实例、接口到容器\r\n创建类的实例(存在则直接获取)\r\n容器对象绑定别名\r\n支持容器对象(实例化)回调\r\n获取容器对象实例\r\n删除容器中的对象实例\r\n提供依赖注入和门面实现支持\r\n调用容器对象实例的方法(或者闭包)\r\n提供容器对象的ArrayAccess支持\r\n事件系统\r\n新版的事件系统可以看成是5.1版本行为系统的升级版,事件系统相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。支持事件智能订阅,通过反射机制来识别当前订阅者要订阅的事件。\r\n\r\n事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。\r\n\r\n中间件支持完善\r\n中间件分为全局中间件、应用中间件、路由中间件和控制器中间件,这四个中间件分组完全独立执行,但同一个分组内的中间件不会重复执行。中间件方法执行依赖注入,以及请求结束的回调机制。\r\n\r\n核心很多功能都是基于中间件来完成,包括多应用模式也是采用中间件机制执行。\r\n\r\n路由和请求\r\n新版的路由精简了很多不必要的功能,路由定义也更加规范化和语义化,并且路由定义文件支持纳入应用目录,便于模块化开发。路由注解功能独立为think-annotation库,并且使用更加规范,支持IDE提示。\r\n\r\n新版的请求对象更易扩展,系统默认安装后提供了一个app\\Request类,你可以在应用中直接自定义请求对象,增加必要的属性和方法。但不会影响对think\\Request的依赖注入和门面调用。\r\n\r\n系统服务\r\n由于核心框架采用了服务化设计,你可以在你的扩展或者应用中注册需要的服务。在系统服务中注册一个对象到容器,或者对某些对象进行相关的依赖注入。由于系统服务的执行优先级问题,可以确保相关组件在执行的时候已经完成相关依赖注入。一个服务类通常包括注册(register)和启动(boot)方法,用于不同阶段的执行。\r\n\r\nORM组件化\r\n内置的ORM功能已经完全独立为think-orm组件,可以独立使用,ThinkPHP6.0默认依赖安装了该组件,保持用法不变的同时,增强了查询功能。\r\n\r\n模板引擎组件化\r\n核心不再内置任何模板引擎,仅提供PHP模板支持,官方的模板引擎已经独立为think-template模板引擎,并默认依赖安装。你可以更方便的使用第三方模板引擎。\r\n\r\n日志系统\r\n日志支持多通道、并统一命令行和WEB日志格式,主要包括:\r\n\r\n日志增加多通道支持,可以同时或者切换写入多个通道\r\nWEB和CLI的日志记录格式统一,并支持日志格式化\r\n对JSON日志格式的改进\r\n支持日志写入事件\r\nSession机制改进\r\n6.0版本的Session机制完全重写了,并且不再使用PHP内置的Session机制,全新实现一套Session机制,可以更好的支持Swoole/Workerman等环境。\r\n\r\n所以不再支持PHP内置的session_*** 系列函数,也不再支持使用$_SESSION读取session数据,你必须通过框架提供的Session类或者门面来操作,Request类也封装了Session数据的读取。\r\n\r\nSession支持跨应用读取和自定义序列化机制,默认采用文件类型记录Session数据,由于共用了缓存机制,你还可以使用任何支持的缓存类型来记录Session数据。\r\n\r\n引入Filesystem组件\r\n新版增加了Filesystem类库对文件系统强化了支持,而且可以很方便的支持各种云存储,包括阿里云和七牛云。\r\n\r\nSwoole扩展改进\r\nSwoole扩展同时支持HTTP和Socket服务,支持数据库和缓存的连接池功能,以及RPC功能。\r\n\r\n调试工具更新\r\n原来内置的页面Trace调试工具已经更改为扩展的方式,改成安装think-trace扩展,如果通过composer安装应用的话,默认会安装topthink/think-trace扩展。\r\n\r\n基本用法和之前保持不变,但无需额外配置,默认使用html方式显示,同时仍然支持浏览器控制台显示,并仅在调试模式下有效。\r\n\r\n同时增加了一个基于debugbar的调试扩展think-debugbar,需要单独安装后才能使用。\r\n\r\ncomposer require topthink/think-debugbar\r\n统一和精简大量用法\r\n新版对很多用法进行了精简和统一,尽可能避免在开发过程中规范不一的困惑。', '1', '4', '3', '1', '0', '1', '13', '0', '1571986396', '1552186396', '0');
+INSERT INTO `tao_article` VALUES ('24', '辞旧迎新 ,回顾2019,展望2020!', '[quote]\r\n 2019,马上就要永远的留在了历史长河中,2020,在期望中到来。\r\n[/quote]\r\n\r\n要总结回顾一下二零一九年,也要展望规划新的二零二零。\r\n过去的这一年里,忙忙碌碌,喜剧哀乐各种滋味都有。丰富多彩,缤纷灿烂。这其中有学习进步,也有懒惰懈怠。\r\n但,总结一句话,2019年是不后悔的,是充满挑战的,是美好的。\r\n新的一年里,会在一点一滴中充实壮大自己。弥补不足,改变不好的,抓住美好的。', '1', '2', '1', '1', '0', '1', '4', '0', '1577775729', '1577775740', '0');
+
+-- ----------------------------
+-- Table structure for tao_auth_group
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_auth_group`;
+CREATE TABLE `tao_auth_group` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `title` varchar(100) NOT NULL DEFAULT '',
+ `rules` char(255) NOT NULL DEFAULT '',
+ `limits` varchar(255) NOT NULL COMMENT '权限范围',
+ `descr` varchar(255) NOT NULL COMMENT '权限描述',
+ `status` tinyint(1) NOT NULL DEFAULT '1',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_auth_group
+-- ----------------------------
+INSERT INTO `tao_auth_group` VALUES ('1', '超级管理员', '4,14,20,29,30,31,32,33,34,3,12,13,5,15,21,22,16,24,26,25,17,27,28,23,1,6,7,8,9,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,53,2,10,51,11,18,52,54,55,19,56,57,58,59,60', '管理所有的管理员', '所有权限', '1', '0', '0', '0');
+INSERT INTO `tao_auth_group` VALUES ('2', '管理员', '4,14,20,29,30,31,32,33,34,3,12,13,2,10,51,11,18,52,54,55,53', '所有列表的管理', '普通管理员', '1', '0', '0', '0');
+INSERT INTO `tao_auth_group` VALUES ('3', '帖子管理', '3,12,13,5,15,21,22,16,24,26,25,17,27,28,23', '负责帖子的审核', '文章专员', '1', '0', '0', '0');
+
+-- ----------------------------
+-- Table structure for tao_auth_group_access
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_auth_group_access`;
+CREATE TABLE `tao_auth_group_access` (
+ `uid` mediumint(8) unsigned NOT NULL,
+ `group_id` mediumint(8) unsigned NOT NULL,
+ UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
+ KEY `uid` (`uid`),
+ KEY `group_id` (`group_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_auth_group_access
+-- ----------------------------
+INSERT INTO `tao_auth_group_access` VALUES ('1', '1');
+INSERT INTO `tao_auth_group_access` VALUES ('2', '2');
+INSERT INTO `tao_auth_group_access` VALUES ('3', '3');
+INSERT INTO `tao_auth_group_access` VALUES ('4', '3');
+
+-- ----------------------------
+-- Table structure for tao_auth_rule
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_auth_rule`;
+CREATE TABLE `tao_auth_rule` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` char(80) NOT NULL DEFAULT '',
+ `title` char(20) NOT NULL DEFAULT '',
+ `type` tinyint(1) unsigned NOT NULL DEFAULT '1',
+ `status` enum('1','0') NOT NULL DEFAULT '1' COMMENT '菜单1启用,0禁用',
+ `pid` smallint(5) NOT NULL DEFAULT '0' COMMENT '父级ID',
+ `level` tinyint(1) NOT NULL DEFAULT '1' COMMENT '菜单层级',
+ `icon` varchar(50) NOT NULL COMMENT '图标',
+ `ishidden` enum('1','0') NOT NULL DEFAULT '1' COMMENT '0隐藏,1显示',
+ `sort` tinyint(4) NOT NULL COMMENT '排序',
+ `condition` char(100) NOT NULL DEFAULT '',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `name` (`name`)
+) ENGINE=MyISAM AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_auth_rule
+-- ----------------------------
+INSERT INTO `tao_auth_rule` VALUES ('1', 'admin', '管理', '1', '1', '0', '0', 'layui-icon-user', '1', '3', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('2', 'set', '设置', '1', '1', '0', '0', 'layui-icon-set', '1', '4', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('3', 'administrator', '账户', '1', '1', '0', '0', 'layui-icon-username', '1', '5', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('4', 'app', '应用', '1', '1', '0', '0', 'layui-icon-app', '0', '2', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('5', 'article', '内容', '1', '1', '0', '0', 'layui-icon-read', '1', '1', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('6', 'admin/user/list', '用户管理', '1', '1', '1', '1', '', '1', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('7', 'admin/admin/adminlist', '管理员', '1', '1', '1', '1', '', '1', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('8', 'admin/authgroup/list', '角色管理', '1', '1', '1', '1', '', '1', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('9', 'admin/Authrule/index', '权限管理', '1', '1', '1', '1', '', '1', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('10', 'admin/set/website', '网站设置', '1', '1', '2', '1', '', '1', '1', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('11', 'admin/set/email', '邮件服务', '1', '1', '2', '1', '', '1', '3', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('12', 'admin/admin/info', '基本资料', '1', '1', '3', '1', '', '1', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('13', 'admin/admin/repass', '修改密码', '1', '1', '3', '1', '', '1', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('15', 'admin/forum/list', '帖子列表', '1', '1', '5', '1', '', '1', '1', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('16', 'admin/forum/tags', '分类管理', '1', '1', '5', '1', '', '1', '4', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('17', 'admin/forum/replys', '评论管理', '1', '1', '5', '1', '', '0', '8', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('18', 'admin/slider/index', '广告投放', '1', '1', '2', '1', '', '1', '4', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('19', 'admin/Upgrade/index', '系统升级', '1', '1', '2', '1', '', '1', '8', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('21', 'admin/forum/edit', '编辑帖子', '1', '1', '5', '1', '', '0', '2', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('22', 'admin/forum/del', '删除帖子', '1', '1', '5', '1', '', '0', '3', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('23', 'admin/forum/check', '审核帖子', '1', '1', '5', '1', '', '0', '11', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('24', 'admin/forum/addtags', '添加分类', '1', '1', '5', '1', '', '0', '5', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('25', 'admin/forum/tagsform', '编辑分类', '1', '1', '5', '1', '', '0', '7', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('26', 'admin/forum/tagsdelete', '删除分类', '1', '1', '5', '1', '', '0', '6', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('27', 'admin/forum/commedit', '编辑评论', '1', '1', '5', '1', '', '0', '9', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('28', 'admin/forum/commdel', '删除评论', '1', '1', '5', '1', '', '0', '10', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('35', 'admin/user/userform', '添加用户', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('36', 'admin/user/useredit', '编辑用户', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('37', 'admin/user/delete', '删除用户', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('38', 'admin/user/check', '审核用户', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('39', 'admin/admin/addform', '添加管理员', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('40', 'admin/admin/addedit', '编辑管理员', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('41', 'admin/admin/delete', '删除管理员', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('42', 'admin/admin/addcheck', '审核管理员', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('43', 'admin/authgroup/roleadd', '添加角色', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('44', 'admin/authgroup/roleedit', '编辑角色', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('45', 'admin/authgroup/delete', '删除角色', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('46', 'admin/authrule/add', '添加权限', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('47', 'admin/authrule/edit', '编辑权限', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('48', 'admin/authrule/delete', '删除权限', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('49', 'admin/authrule/check', '审核权限', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('50', 'admin/authrule/menushow', '菜单权限', '1', '1', '1', '1', '', '0', '0', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('51', 'admin/set/upload', '上传logo', '1', '1', '2', '1', '', '0', '2', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('52', 'admin/slider/add', '添加广告', '1', '1', '2', '1', '', '0', '5', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('53', 'admin/slider/edit', '编辑广告', '1', '1', '2', '1', '', '0', '14', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('54', 'admin/slider/delete', '删除广告', '1', '1', '2', '1', '', '0', '6', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('55', 'admin/slider/uoloadimg', '上传广告', '1', '1', '2', '1', '', '0', '7', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('56', 'admin/upgrade/key', '设置key', '1', '1', '2', '1', '', '0', '9', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('57', 'admin/upgrade/keyedit', '修改key', '1', '1', '2', '1', '', '0', '10', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('58', 'admin/upgrade/check', '升级检测', '1', '1', '2', '1', '', '0', '11', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('59', 'admin/upgrade/upload', '自动升级', '1', '1', '2', '1', '', '0', '12', '', '0', '0', '0');
+INSERT INTO `tao_auth_rule` VALUES ('60', 'admin/upgrade/uploadzip', '上传升级包', '1', '1', '2', '1', '', '0', '13', '', '0', '0', '0');
+
+-- ----------------------------
+-- Table structure for tao_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_cate`;
+CREATE TABLE `tao_cate` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
+ `catename` varchar(20) NOT NULL COMMENT '导航名称',
+ `ename` varchar(20) NOT NULL COMMENT '分类别名',
+ `sort` int(11) NOT NULL COMMENT '排序',
+ `status` enum('0','1') NOT NULL DEFAULT '1' COMMENT '状态1启用0禁用',
+ `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0帖子1文章',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_cate
+-- ----------------------------
+INSERT INTO `tao_cate` VALUES ('1', '提问', 'ask', '1', '1', '0', '0', '0', '0');
+INSERT INTO `tao_cate` VALUES ('2', '分享', 'share', '2', '1', '0', '0', '0', '0');
+INSERT INTO `tao_cate` VALUES ('3', '讨论', 'talk', '3', '1', '0', '0', '0', '0');
+INSERT INTO `tao_cate` VALUES ('4', '新闻', 'news', '5', '1', '0', '0', '0', '0');
+INSERT INTO `tao_cate` VALUES ('5', '咸鱼', 'fish', '7', '1', '0', '0', '0', '0');
+INSERT INTO `tao_cate` VALUES ('6', '求助', 'help', '6', '1', '0', '0', '0', '0');
+INSERT INTO `tao_cate` VALUES ('7', '工作', 'work', '5', '1', '0', '0', '0', '0');
+
+-- ----------------------------
+-- Table structure for tao_collection
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_collection`;
+CREATE TABLE `tao_collection` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `article_id` int(11) NOT NULL COMMENT '文章id',
+ `user_id` int(11) NOT NULL COMMENT '用户id',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=149 DEFAULT CHARSET=utf8 COMMENT='文章收藏表';
+
+-- ----------------------------
+-- Records of tao_collection
+-- ----------------------------
+INSERT INTO `tao_collection` VALUES ('141', '11', '1', '1567586177', '0');
+INSERT INTO `tao_collection` VALUES ('144', '6', '1', '1567586767', '0');
+INSERT INTO `tao_collection` VALUES ('143', '4', '1', '1567586749', '0');
+INSERT INTO `tao_collection` VALUES ('137', '13', '1', '1555745134', '0');
+INSERT INTO `tao_collection` VALUES ('138', '10', '1', '1555745142', '0');
+INSERT INTO `tao_collection` VALUES ('142', '1', '1', '1567586744', '0');
+INSERT INTO `tao_collection` VALUES ('140', '15', '1', '1567586167', '0');
+INSERT INTO `tao_collection` VALUES ('136', '14', '1', '1555745109', '0');
+INSERT INTO `tao_collection` VALUES ('145', '17', '1', '1567586778', '0');
+INSERT INTO `tao_collection` VALUES ('146', '19', '1', '1567586785', '0');
+INSERT INTO `tao_collection` VALUES ('147', '12', '1', '1567586802', '0');
+INSERT INTO `tao_collection` VALUES ('148', '8', '1', '1577762980', '0');
+
+-- ----------------------------
+-- Table structure for tao_comment
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_comment`;
+CREATE TABLE `tao_comment` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '评论id',
+ `content` text NOT NULL COMMENT '评论',
+ `article_id` int(11) NOT NULL COMMENT '文章id',
+ `user_id` int(11) NOT NULL COMMENT '评论用户',
+ `zan` tinyint(4) NOT NULL COMMENT '赞',
+ `cai` enum('1','0') NOT NULL DEFAULT '0' COMMENT '0求解1采纳',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=77 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_comment
+-- ----------------------------
+INSERT INTO `tao_comment` VALUES ('1', '好呀', '9', '1', '0', '0', '2019', '2019', '0');
+INSERT INTO `tao_comment` VALUES ('2', 'aieok.com', '4', '1', '0', '0', '2019', '2019', '0');
+INSERT INTO `tao_comment` VALUES ('3', 'http://www.aieok.com', '10', '2', '0', '0', '2019', '1555127897', '0');
+INSERT INTO `tao_comment` VALUES ('4', '数据库提供的链式', '11', '2', '0', '0', '2019', '2019', '0');
+INSERT INTO `tao_comment` VALUES ('5', 'tp5讨论2019讨论2019讨论2019', '12', '1', '0', '0', '2019', '2019', '0');
+INSERT INTO `tao_comment` VALUES ('24', 'face[微笑] \r\n1232 a(http://www.baidu.com)[http://www.baidu.com] \r\n[pre]\r\ncode\r\najax\r\nphp\r\n[/pre]\r\n[hr]', '14', '1', '0', '0', '1551430267', '1551430267', '0');
+INSERT INTO `tao_comment` VALUES ('23', '哈哈', '14', '1', '0', '0', '1551429718', '1555128388', '0');
+INSERT INTO `tao_comment` VALUES ('22', '美女哦', '14', '1', '0', '0', '1551429702', '1555128391', '0');
+INSERT INTO `tao_comment` VALUES ('20', 'face[嘻嘻] ', '9', '1', '0', '0', '1551413067', '1551413067', '0');
+INSERT INTO `tao_comment` VALUES ('25', '11', '6', '1', '0', '0', '1551432002', '1555123067', '0');
+INSERT INTO `tao_comment` VALUES ('26', '22', '6', '1', '0', '0', '1551433089', '1551433089', '0');
+INSERT INTO `tao_comment` VALUES ('27', 'img[https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4025342085,1549348620&fm=27&gp=0.jpg] ', '3', '1', '0', '0', '1551439637', '1551439637', '0');
+INSERT INTO `tao_comment` VALUES ('36', 'face[微笑] ', '15', '1', '0', '0', '1551584959', '1551584959', '0');
+INSERT INTO `tao_comment` VALUES ('47', 'face[哈哈] ', '17', '1', '0', '0', '1552183493', '1552183493', '0');
+INSERT INTO `tao_comment` VALUES ('48', 'face[嘻嘻] ', '17', '1', '0', '0', '1552183510', '1552183510', '0');
+INSERT INTO `tao_comment` VALUES ('39', 'face[微笑] ', '13', '1', '0', '0', '1551618056', '1551618056', '0');
+INSERT INTO `tao_comment` VALUES ('40', '这是二个提问', '5', '1', '0', '0', '1551878452', '1551878452', '0');
+INSERT INTO `tao_comment` VALUES ('41', '这是二个提问', '15', '1', '0', '0', '1551878500', '1555131321', '0');
+INSERT INTO `tao_comment` VALUES ('43', 'face[微笑] ', '3', '1', '0', '0', '1552178897', '1552178897', '0');
+INSERT INTO `tao_comment` VALUES ('44', 'img[/uploads/20190310/1fdcfad1c19010df4d5f83a8e7156af1.jpg] ', '3', '1', '0', '0', '1552178930', '1552178930', '0');
+INSERT INTO `tao_comment` VALUES ('45', 'face[微笑] ', '14', '1', '0', '0', '1552179991', '1552179991', '0');
+INSERT INTO `tao_comment` VALUES ('46', 'img[/uploads/20190310/4d5120c20e9b893c108da64e5c61e97a.jpg] ', '15', '1', '0', '0', '1552181616', '1555131303', '0');
+INSERT INTO `tao_comment` VALUES ('49', 'face[嘻嘻] ', '17', '1', '0', '0', '1552185406', '1552185406', '0');
+INSERT INTO `tao_comment` VALUES ('50', 'face[微笑] ', '18', '1', '0', '0', '1568097396', '1552186489', '0');
+INSERT INTO `tao_comment` VALUES ('66', 'face[嘻嘻] ', '3', '1', '0', '0', '1552193197', '1552193197', '0');
+INSERT INTO `tao_comment` VALUES ('67', 'face[微笑] face[嘻嘻] face[哈哈] ', '19', '1', '0', '0', '1559194830', '1555120988', '0');
+INSERT INTO `tao_comment` VALUES ('68', 'face[微笑] ', '15', '1', '0', '0', '1552195005', '1555131299', '0');
+INSERT INTO `tao_comment` VALUES ('69', 'img[/uploads/20190331/8d6af3839efe2a518d0c1aa026993bb5.jpg] ', '2', '1', '0', '0', '1553991079', '1553991079', '0');
+INSERT INTO `tao_comment` VALUES ('70', '@管理员 face[微笑] ', '2', '1', '0', '0', '1553991095', '1553991095', '0');
+INSERT INTO `tao_comment` VALUES ('71', 'face[微笑] face[嘻嘻] 非常高兴工', '19', '1', '0', '0', '1559203830', '1555121920', '0');
+INSERT INTO `tao_comment` VALUES ('73', 'face[微笑] ', '11', '1', '0', '0', '1555123035', '1555123035', '0');
+INSERT INTO `tao_comment` VALUES ('74', 'face[给力] ', '14', '2', '0', '1', '1555124049', '1555128398', '0');
+INSERT INTO `tao_comment` VALUES ('75', 'face[微笑] ', '8', '2', '0', '0', '1555124079', '1555127399', '0');
+INSERT INTO `tao_comment` VALUES ('76', 'face[微笑] 好美呀,', '7', '3', '0', '0', '1555131857', '1555131857', '0');
+
+-- ----------------------------
+-- Table structure for tao_friend_link
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_friend_link`;
+CREATE TABLE `tao_friend_link` (
+ `id` int(2) unsigned NOT NULL AUTO_INCREMENT COMMENT '友情链接id',
+ `linkname` varchar(10) NOT NULL COMMENT '链接名称',
+ `linksrc` varchar(60) NOT NULL COMMENT '链接地址',
+ `linkimg` varchar(60) NOT NULL COMMENT '链接图片',
+ `creat_time` int(10) NOT NULL COMMENT '创建时间',
+ `update_time` int(10) NOT NULL COMMENT '更新时间',
+ `delete_time` int(10) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_friend_link
+-- ----------------------------
+INSERT INTO `tao_friend_link` VALUES ('1', 'ThinkPHP', 'https://www.thinkphp.cn', '', '0', '0', '0');
+INSERT INTO `tao_friend_link` VALUES ('2', 'Layui', 'https://www.layui.com', '', '0', '0', '0');
+INSERT INTO `tao_friend_link` VALUES ('3', 'TaoLer', 'http://www.aieok.com', '', '0', '0', '0');
+
+-- ----------------------------
+-- Table structure for tao_mail_server
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_mail_server`;
+CREATE TABLE `tao_mail_server` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `mail` varchar(50) NOT NULL COMMENT '邮箱设置',
+ `host` varchar(50) NOT NULL COMMENT '邮箱服务地址',
+ `port` tinyint(2) NOT NULL COMMENT '邮箱端口',
+ `nickname` varchar(20) NOT NULL DEFAULT '' COMMENT '昵称',
+ `password` varchar(16) NOT NULL COMMENT '邮箱密码',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_mail_server
+-- ----------------------------
+INSERT INTO `tao_mail_server` VALUES ('1', 'xxx@aliyun.com', 'smtp.aliyun.com', '25', '', '', '0');
+
+-- ----------------------------
+-- Table structure for tao_slider
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_slider`;
+CREATE TABLE `tao_slider` (
+ `id` int(2) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `slid_name` varchar(30) NOT NULL COMMENT '幻灯名',
+ `slid_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '类型',
+ `slid_img` varchar(70) NOT NULL COMMENT '幻灯图片地址',
+ `slid_href` varchar(70) NOT NULL COMMENT '链接',
+ `slid_start` int(11) NOT NULL COMMENT '开始时间',
+ `slid_over` int(11) NOT NULL COMMENT '结束时间',
+ `slid_status` enum('1','0') NOT NULL DEFAULT '1' COMMENT '1投放0仓库',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '更新时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_slider
+-- ----------------------------
+INSERT INTO `tao_slider` VALUES ('1', 'CODING', '1', '/uploads/images/F1.jpg', '#', '1574870400', '1575043200', '1', '0', '0', '0');
+INSERT INTO `tao_slider` VALUES ('2', '无人机', '1', '/uploads/images/F2.jpg', 'www.taobao.com', '-28800', '1606665600', '1', '0', '0', '0');
+INSERT INTO `tao_slider` VALUES ('3', 'keji', '2', '/storage/slider/20191210/6e6486b81a5b07be4425b676513b0334.jpg', 'http://www.baidu.com', '1571155200', '1577721600', '1', '0', '0', '0');
+INSERT INTO `tao_slider` VALUES ('4', '科技', '3', '/storage/slider/20191210/d35a49fda5839d4b27f65076fb57b7f2.jpg', '4', '1575907200', '1609344000', '1', '0', '0', '0');
+INSERT INTO `tao_slider` VALUES ('5', '科学', '4', '/storage/slider/20191210/e87f15527f32e690538671753010fd00.jpg', '大', '-28800', '1609344000', '1', '0', '0', '0');
+
+-- ----------------------------
+-- Table structure for tao_system
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_system`;
+CREATE TABLE `tao_system` (
+ `id` tinyint(2) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `webname` varchar(20) NOT NULL COMMENT '网站名称',
+ `webtitle` varchar(30) NOT NULL,
+ `domain` varchar(50) NOT NULL,
+ `logo` varchar(70) NOT NULL COMMENT '网站logo',
+ `copyright` varchar(80) NOT NULL COMMENT '版权',
+ `keywords` tinytext NOT NULL COMMENT '网站关键字',
+ `descript` tinytext NOT NULL COMMENT '网站描述',
+ `is_open` tinyint(4) NOT NULL COMMENT '是否开启站点1开启0关闭',
+ `is_comment` tinyint(4) NOT NULL COMMENT '是否开启评论1开启0关闭',
+ `is_reg` tinyint(4) NOT NULL COMMENT '是否开放注册1开启0禁止',
+ `icp` varchar(50) NOT NULL COMMENT '备案',
+ `blackname` varchar(255) NOT NULL COMMENT '注册黑名单',
+ `sys_version_num` varchar(5) NOT NULL COMMENT '系统版本',
+ `key` varchar(60) DEFAULT NULL COMMENT 'key',
+ `base_url` varchar(50) NOT NULL DEFAULT '',
+ `upcheck_url` varchar(255) NOT NULL COMMENT '版本检测',
+ `upgrade_url` varchar(255) NOT NULL COMMENT '升级地址',
+ `create_time` int(10) NOT NULL COMMENT '创建时间',
+ `update_time` int(10) NOT NULL COMMENT '更新时间',
+ `delete_time` int(10) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='系统配置表';
+
+-- ----------------------------
+-- Records of tao_system
+-- ----------------------------
+INSERT INTO `tao_system` VALUES ('1', 'TaoLer社区', '淘宝卖家交流平台', 'http://www.tp6.com', '/storage/logo/20191024/a5671b2c16a37ec8587f31989dab1177.png', 'aieok.com 版权所有', '淘宝,卖家,TaoLer社区', '这是一个社区论坛', '1', '1', '1', '0.0.0.0', '管理员|admin|审核员|超级|垃圾', '1.1.1', '', 'http://www.aieok.com/api/index/cy', 'http://www.aieok.com/api/upload/check', 'http://www.aieok.com/api/upload/api', '0', '1577419197', '0');
+
+-- ----------------------------
+-- Table structure for tao_user
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_user`;
+CREATE TABLE `tao_user` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+ `name` varchar(16) NOT NULL COMMENT '用户名',
+ `password` varchar(32) NOT NULL COMMENT '密码',
+ `phone` varchar(11) NOT NULL COMMENT '手机',
+ `email` varchar(50) NOT NULL COMMENT '邮箱',
+ `nickname` varchar(16) NOT NULL COMMENT '昵称',
+ `city` varchar(50) NOT NULL COMMENT '归属地',
+ `sex` enum('0','1') NOT NULL DEFAULT '0' COMMENT '性别0男1女',
+ `sign` varchar(255) NOT NULL COMMENT '签名',
+ `user_img` varbinary(70) NOT NULL COMMENT '头像',
+ `auth` enum('1','0') NOT NULL DEFAULT '0' COMMENT '0普通1超级',
+ `point` tinyint(11) NOT NULL DEFAULT '0' COMMENT '积分',
+ `area_id` int(11) NOT NULL COMMENT '用户所属区域ID',
+ `status` enum('0','1') NOT NULL DEFAULT '1' COMMENT '1启用0禁用',
+ `vip` tinyint(1) DEFAULT NULL COMMENT 'vip',
+ `last_login_ip` varchar(70) NOT NULL COMMENT '最后登陆ip',
+ `last_login_time` int(11) NOT NULL COMMENT '最后登陆时间',
+ `login_error_num` tinyint(1) NOT NULL DEFAULT '0' COMMENT '登陆错误次数',
+ `login_error_time` int(11) NOT NULL COMMENT '登陆错误时间',
+ `login_error_lock` tinyint(1) NOT NULL DEFAULT '0' COMMENT '登陆锁定0正常1锁定',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ `update_time` int(11) NOT NULL COMMENT '修改时间',
+ `delete_time` int(11) NOT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_user
+-- ----------------------------
+INSERT INTO `tao_user` VALUES ('1', 'aieok', '7596a5c80d28bf147aae75b3b6f02f1a', '2147483647', 'xxx@qq.com', '管理员', '北京市', '1', '这是我的第一个TP5系统,2019北京。OK! OK!ok@', 0x2F73746F726167652F686561645F7069632F32303139313231372F39343036636334623866336538323731613238616339646239353339333766352E6A7067, '1', '12', '1', '1', null, '127.0.0.1', '0', '0', '0', '0', '1555892325', '1577420182', '0');
+INSERT INTO `tao_user` VALUES ('2', 'liudong', '', '2147483647', 'liudong@qq.com', '刘冬', '上海', '0', '在', 0x2F7374617469632F7265732F696D616765732F6176617461722F30302E6A7067, '0', '0', '2', '1', null, '', '0', '0', '0', '0', '1555892355', '1546176176', '0');
+INSERT INTO `tao_user` VALUES ('3', 'shenlu', '', '13512345678', 'shenlu@qq.com', '沈璐', '杭州', '0', '沈璐沈璐沈璐沈璐沈璐是一个美女', 0x2F7374617469632F7265732F696D616765732F6176617461722F302E6A7067, '0', '0', '3', '1', null, '', '0', '0', '0', '0', '1555882325', '1547700180', '0');
+INSERT INTO `tao_user` VALUES ('4', '张志', '', '13513615898', 'zhangzhi@qq.com', '张志', '深圳', '0', '在一', 0x2F7374617469632F7265732F696D616765732F6176617461722F312E6A7067, '0', '0', '1', '1', null, '', '0', '0', '0', '0', '1555892336', '1551182521', '0');
+INSERT INTO `tao_user` VALUES ('5', '王龙', '', '0', 'wanglong@qq.com', 'long', '纽约', '1', '', 0x2F7374617469632F7265732F696D616765732F6176617461722F322E6A7067, '0', '0', '2', '0', null, '', '0', '0', '0', '0', '1555892347', '1555890307', '0');
+INSERT INTO `tao_user` VALUES ('6', '贺青', '', '0', 'heqing@qq.com', '贺青', '巴黎', '0', '', 0x2F7374617469632F7265732F696D616765732F6176617461722F332E6A7067, '0', '0', '3', '1', null, '', '0', '0', '0', '0', '1555893525', '1555892325', '0');
+INSERT INTO `tao_user` VALUES ('7', '李可', '', '0', 'keke@qq.com', '可可', '', '1', '', 0x2F7374617469632F7265732F696D616765732F6176617461722F342E6A7067, '0', '2', '0', '1', null, '', '0', '0', '0', '0', '1555892374', '1569247195', '0');
+INSERT INTO `tao_user` VALUES ('8', '飞儿', '', '2147483647', 'fei@qq.com', '飞儿', '', '0', '', 0x2F7374617469632F7265732F696D616765732F6176617461722F352E6A7067, '0', '0', '0', '1', null, '', '0', '0', '0', '0', '1555892388', '1576558484', '1576558484');
+
+-- ----------------------------
+-- Table structure for tao_user_area
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_user_area`;
+CREATE TABLE `tao_user_area` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
+ `area` varchar(10) NOT NULL COMMENT '所属区域',
+ `asing` varchar(2) NOT NULL COMMENT '区域简称',
+ `create_time` int(11) NOT NULL,
+ `update_time` int(11) NOT NULL,
+ `delete_time` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_user_area
+-- ----------------------------
+INSERT INTO `tao_user_area` VALUES ('1', '北京', '京', '0', '0', '0');
+INSERT INTO `tao_user_area` VALUES ('2', '上海', '沪', '0', '0', '0');
+INSERT INTO `tao_user_area` VALUES ('3', '广州', '粤', '0', '0', '0');
+
+-- ----------------------------
+-- Table structure for tao_user_sign
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_user_sign`;
+CREATE TABLE `tao_user_sign` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `uid` int(11) unsigned NOT NULL COMMENT '用户id',
+ `days` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '连续签到的天数',
+ `is_share` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否分享过',
+ `is_sign` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否签到过',
+ `stime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '签到的时间',
+ `create_time` int(11) NOT NULL COMMENT '创建时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COMMENT='用户签到表';
+
+-- ----------------------------
+-- Records of tao_user_sign
+-- ----------------------------
+INSERT INTO `tao_user_sign` VALUES ('16', '2', '1', '0', '0', '1558750514', '0');
+INSERT INTO `tao_user_sign` VALUES ('18', '1', '1', '0', '0', '1558750797', '0');
+INSERT INTO `tao_user_sign` VALUES ('19', '1', '1', '0', '0', '1566911693', '0');
+INSERT INTO `tao_user_sign` VALUES ('20', '1', '1', '0', '0', '1568346096', '0');
+INSERT INTO `tao_user_sign` VALUES ('21', '1', '1', '0', '0', '1568515766', '0');
+INSERT INTO `tao_user_sign` VALUES ('22', '1', '1', '0', '0', '1569245600', '0');
+INSERT INTO `tao_user_sign` VALUES ('23', '36', '1', '0', '0', '1569247195', '0');
+INSERT INTO `tao_user_sign` VALUES ('24', '1', '1', '0', '0', '1574650402', '0');
+
+-- ----------------------------
+-- Table structure for tao_user_signrule
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_user_signrule`;
+CREATE TABLE `tao_user_signrule` (
+ `id` int(2) unsigned NOT NULL AUTO_INCREMENT,
+ `days` int(5) unsigned NOT NULL COMMENT '连续天数',
+ `score` int(3) unsigned NOT NULL DEFAULT '0' COMMENT '积分',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='用户签到积分规则';
+
+-- ----------------------------
+-- Records of tao_user_signrule
+-- ----------------------------
+INSERT INTO `tao_user_signrule` VALUES ('1', '1', '2');
+INSERT INTO `tao_user_signrule` VALUES ('2', '3', '3');
+INSERT INTO `tao_user_signrule` VALUES ('3', '5', '5');
+
+-- ----------------------------
+-- Table structure for tao_user_zan
+-- ----------------------------
+DROP TABLE IF EXISTS `tao_user_zan`;
+CREATE TABLE `tao_user_zan` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '点赞主键id',
+ `comment_id` int(11) NOT NULL COMMENT '评论id',
+ `user_id` int(11) NOT NULL COMMENT '用户id',
+ `create_time` int(11) NOT NULL COMMENT '点赞时间',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of tao_user_zan
+-- ----------------------------
diff --git a/app/middleware.php b/app/middleware.php
new file mode 100644
index 0000000..c8d321e
--- /dev/null
+++ b/app/middleware.php
@@ -0,0 +1,10 @@
+pathinfo());
+ $response = $next($request);
+
+ if($request->controller() !== 'Login' && $request->action() !=='logout')
+ {
+ //登陆检验
+ if (!Session::has('admin_id')) {
+ return redirect('/admin/login/index');
+ }
+ $app = app('http')->getName();
+ $controller = $request->controller();
+ $action = $request->action();
+
+ // 排除权限
+ $not_check = ['admin/Index/index','admin/Index/home','admin/Set/info','admin/Set/password','admin/User/logout'];
+
+ if (!in_array($app . '/' . $controller . '/' . $action, $not_check)) {
+ $auth = new UserAuth();
+ $admin_id = Session::get('admin_id');
+
+ if (!$auth->check($app . '/' . $controller . '/' . $action, $admin_id) && $admin_id != 1) {
+ //return response('');
+ return response('没有权限');
+ }
+ }
+ }
+
+ return $response;
+ }
+
+
+}
diff --git a/app/middleware/CheckRegister.php b/app/middleware/CheckRegister.php
new file mode 100644
index 0000000..ad91129
--- /dev/null
+++ b/app/middleware/CheckRegister.php
@@ -0,0 +1,23 @@
+action(true)=='reg'){
+ $disname = Db::name('system')->where('id',1)->value('blackname');
+ $data = explode("|",$disname);
+ foreach($data as $v){
+ if ($request->param('name') == $v) {
+ return json(['msg'=>'该用户名禁止注册,请更换名称']);
+ }
+ }
+ }
+ return $next($request);
+ }
+}
diff --git a/app/middleware/LogedCheck.php b/app/middleware/LogedCheck.php
new file mode 100644
index 0000000..20df583
--- /dev/null
+++ b/app/middleware/LogedCheck.php
@@ -0,0 +1,16 @@
+ Request::class,
+ 'think\exception\Handle' => ExceptionHandle::class,
+];
diff --git a/build.example.php b/build.example.php
new file mode 100644
index 0000000..0f2222f
--- /dev/null
+++ b/build.example.php
@@ -0,0 +1,26 @@
+
+// +----------------------------------------------------------------------
+
+/**
+ * php think build 自动生成应用的目录结构的定义示例
+ */
+return [
+ // 需要自动创建的文件
+ '__file__' => [],
+ // 需要自动创建的目录
+ '__dir__' => ['controller', 'model', 'view'],
+ // 需要自动创建的控制器
+ 'controller' => ['Index'],
+ // 需要自动创建的模型
+ 'model' => ['User'],
+ // 需要自动创建的模板
+ 'view' => ['index/index'],
+];
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..254569d
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,49 @@
+{
+ "name": "topthink/think",
+ "description": "the new thinkphp framework",
+ "type": "project",
+ "keywords": [
+ "framework",
+ "thinkphp",
+ "ORM"
+ ],
+ "homepage": "http://thinkphp.cn/",
+ "license": "Apache-2.0",
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ }
+ ],
+ "require": {
+ "php": ">=7.1.0",
+ "topthink/framework": "6.0.*-dev",
+ "topthink/think-orm": "2.0.*-dev",
+ "topthink/think-view": "^1.0",
+ "topthink/think-multi-app": "^1.0",
+ "topthink/think-captcha": "^3.0",
+ "xiaodi/think-auth": "^3.0",
+ "phpmailer/phpmailer": "^6.1"
+ },
+ "require-dev": {
+ "symfony/var-dumper": "^4.2",
+ "topthink/think-trace":"^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "app\\": "app"
+ },
+ "psr-0": {
+ "": "extend/"
+ }
+ },
+ "config": {
+ "preferred-install": "dist"
+ },
+ "scripts": {
+ "post-autoload-dump": [
+ "@php think service:discover",
+ "@php think vendor:publish"
+ ]
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..611e647
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,1176 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "5a265ecc15ad9efdc9addab19cbb739a",
+ "packages": [
+ {
+ "name": "league/flysystem",
+ "version": "1.0.62",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "14dd5d7dff5fbc29ca9a2a53ff109760e40d91a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/14dd5d7dff5fbc29ca9a2a53ff109760e40d91a0",
+ "reference": "14dd5d7dff5fbc29ca9a2a53ff109760e40d91a0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^3.4",
+ "phpunit/phpunit": "^5.7.10"
+ },
+ "suggest": {
+ "ext-fileinfo": "Required for MimeType",
+ "ext-ftp": "Allows you to use FTP server storage",
+ "ext-openssl": "Allows you to use FTPS server storage",
+ "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Filesystem abstraction: Many filesystems, one API.",
+ "keywords": [
+ "Cloud Files",
+ "WebDAV",
+ "abstraction",
+ "aws",
+ "cloud",
+ "copy.com",
+ "dropbox",
+ "file systems",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "rackspace",
+ "remote",
+ "s3",
+ "sftp",
+ "storage"
+ ],
+ "time": "2019-12-29T14:46:55+00:00"
+ },
+ {
+ "name": "league/flysystem-cached-adapter",
+ "version": "1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem-cached-adapter.git",
+ "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/08ef74e9be88100807a3b92cc9048a312bf01d6f",
+ "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "league/flysystem": "~1.0",
+ "psr/cache": "^1.0.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "phpspec/phpspec": "^3.4",
+ "phpunit/phpunit": "^5.7",
+ "predis/predis": "~1.0",
+ "tedivm/stash": "~0.12"
+ },
+ "suggest": {
+ "ext-phpredis": "Pure C implemented extension for PHP"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\Cached\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "frankdejonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "An adapter decorator to enable meta-data caching.",
+ "time": "2018-07-09T20:51:04+00:00"
+ },
+ {
+ "name": "opis/closure",
+ "version": "3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/opis/closure.git",
+ "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/opis/closure/zipball/93ebc5712cdad8d5f489b500c59d122df2e53969",
+ "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.4 || ^7.0"
+ },
+ "require-dev": {
+ "jeremeamia/superclosure": "^2.0",
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Opis\\Closure\\": "src/"
+ },
+ "files": [
+ "functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marius Sarca",
+ "email": "marius.sarca@gmail.com"
+ },
+ {
+ "name": "Sorin Sarca",
+ "email": "sarca_sorin@hotmail.com"
+ }
+ ],
+ "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+ "homepage": "https://opis.io/closure",
+ "keywords": [
+ "anonymous functions",
+ "closure",
+ "function",
+ "serializable",
+ "serialization",
+ "serialize"
+ ],
+ "time": "2019-11-29T22:36:02+00:00"
+ },
+ {
+ "name": "phpmailer/phpmailer",
+ "version": "v6.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPMailer/PHPMailer.git",
+ "reference": "c5e61d0729507049cec9673aa1a679f9adefd683"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/c5e61d0729507049cec9673aa1a679f9adefd683",
+ "reference": "c5e61d0729507049cec9673aa1a679f9adefd683",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-filter": "*",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.2",
+ "friendsofphp/php-cs-fixer": "^2.2",
+ "phpunit/phpunit": "^4.8 || ^5.7"
+ },
+ "suggest": {
+ "ext-mbstring": "Needed to send email in multibyte encoding charset",
+ "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
+ "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
+ "psr/log": "For optional PSR-3 debug logging",
+ "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
+ "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPMailer\\PHPMailer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-only"
+ ],
+ "authors": [
+ {
+ "name": "Marcus Bointon",
+ "email": "phpmailer@synchromedia.co.uk"
+ },
+ {
+ "name": "Jim Jagielski",
+ "email": "jimjag@gmail.com"
+ },
+ {
+ "name": "Andy Prevost",
+ "email": "codeworxtech@users.sourceforge.net"
+ },
+ {
+ "name": "Brent R. Matzelle"
+ }
+ ],
+ "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+ "time": "2019-12-10T11:17:38+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "time": "2016-08-06T20:24:11+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2019-11-01T11:05:21+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "time": "2017-10-23T01:57:42+00:00"
+ },
+ {
+ "name": "topthink/framework",
+ "version": "6.0.x-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/framework.git",
+ "reference": "dbdf7e45e6c9a598017e15d3116c1cf96a87c0ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/framework/zipball/dbdf7e45e6c9a598017e15d3116c1cf96a87c0ae",
+ "reference": "dbdf7e45e6c9a598017e15d3116c1cf96a87c0ae",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "league/flysystem": "^1.0",
+ "league/flysystem-cached-adapter": "^1.0",
+ "opis/closure": "^3.1",
+ "php": ">=7.1.0",
+ "psr/container": "~1.0",
+ "psr/log": "~1.0",
+ "psr/simple-cache": "^1.0",
+ "topthink/think-helper": "^3.1.1",
+ "topthink/think-orm": "^2.0"
+ },
+ "require-dev": {
+ "mikey179/vfsstream": "^1.6",
+ "mockery/mockery": "^1.2",
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [],
+ "psr-4": {
+ "think\\": "src/think/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ },
+ {
+ "name": "yunwuxin",
+ "email": "448901948@qq.com"
+ }
+ ],
+ "description": "The ThinkPHP Framework.",
+ "homepage": "http://thinkphp.cn/",
+ "keywords": [
+ "framework",
+ "orm",
+ "thinkphp"
+ ],
+ "time": "2019-12-28T14:12:22+00:00"
+ },
+ {
+ "name": "topthink/think-captcha",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-captcha.git",
+ "reference": "0b4305da19e118cefd934007875a8112f9352f01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-captcha/zipball/0b4305da19e118cefd934007875a8112f9352f01",
+ "reference": "0b4305da19e118cefd934007875a8112f9352f01",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "topthink/framework": "^6.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "think": {
+ "services": [
+ "think\\captcha\\CaptchaService"
+ ],
+ "config": {
+ "captcha": "src/config.php"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "think\\captcha\\": "src/"
+ },
+ "files": [
+ "src/helper.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "yunwuxin",
+ "email": "448901948@qq.com"
+ }
+ ],
+ "description": "captcha package for thinkphp",
+ "time": "2019-10-03T07:45:11+00:00"
+ },
+ {
+ "name": "topthink/think-helper",
+ "version": "v3.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-helper.git",
+ "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-helper/zipball/4d85dfd3778623bbb1de3648f1dcd0c82f4439f4",
+ "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "think\\": "src"
+ },
+ "files": [
+ "src/helper.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "yunwuxin",
+ "email": "448901948@qq.com"
+ }
+ ],
+ "description": "The ThinkPHP6 Helper Package",
+ "time": "2019-09-30T02:36:48+00:00"
+ },
+ {
+ "name": "topthink/think-multi-app",
+ "version": "v1.0.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-multi-app.git",
+ "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/215f4a6bb88e53ad41b448c61957336eb55ce6f9",
+ "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.0",
+ "topthink/framework": "^6.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "think": {
+ "services": [
+ "think\\app\\Service"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "think\\app\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ }
+ ],
+ "description": "thinkphp6 multi app support",
+ "time": "2019-10-29T06:34:59+00:00"
+ },
+ {
+ "name": "topthink/think-orm",
+ "version": "2.0.x-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-orm.git",
+ "reference": "444277e2acff186a8066a8a42912ebea01d948c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-orm/zipball/444277e2acff186a8066a8a42912ebea01d948c5",
+ "reference": "444277e2acff186a8066a8a42912ebea01d948c5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=7.1.0",
+ "psr/log": "~1.0",
+ "psr/simple-cache": "^1.0",
+ "topthink/think-helper": "^3.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "think\\": "src"
+ },
+ "files": []
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ }
+ ],
+ "description": "think orm",
+ "keywords": [
+ "database",
+ "orm"
+ ],
+ "time": "2019-12-28T13:25:27+00:00"
+ },
+ {
+ "name": "topthink/think-template",
+ "version": "v2.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-template.git",
+ "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-template/zipball/e98bdbb4a4c94b442f17dfceba81e0134d4fbd19",
+ "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "think\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ }
+ ],
+ "description": "the php template engine",
+ "time": "2019-09-20T15:31:04+00:00"
+ },
+ {
+ "name": "topthink/think-view",
+ "version": "v1.0.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-view.git",
+ "reference": "90803b73f781db5d42619082c4597afc58b2d4c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-view/zipball/90803b73f781db5d42619082c4597afc58b2d4c5",
+ "reference": "90803b73f781db5d42619082c4597afc58b2d4c5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.0",
+ "topthink/think-template": "^2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "think\\view\\driver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ }
+ ],
+ "description": "thinkphp template driver",
+ "time": "2019-10-07T12:23:10+00:00"
+ },
+ {
+ "name": "xiaodi/think-auth",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/edenleung/think-auth.git",
+ "reference": "1ab2e2f8b85bfe55bd218578660c8ec9b90d751c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/edenleung/think-auth/zipball/1ab2e2f8b85bfe55bd218578660c8ec9b90d751c",
+ "reference": "1ab2e2f8b85bfe55bd218578660c8ec9b90d751c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.0",
+ "topthink/framework": "6.0.*-dev"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "xiaodi\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "xiaodi",
+ "email": "758861884@qq.com"
+ }
+ ],
+ "description": "Auth Package For ThinkPHP 6.0",
+ "homepage": "https://github.com/xiaodit/think-auth",
+ "time": "2019-04-24T09:54:42+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.13.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f",
+ "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.13-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2019-11-27T14:18:11+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.13.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038",
+ "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.13-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2019-11-27T13:56:44+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v4.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "be330f919bdb395d1e0c3f2bfb8948512d6bdd99"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/be330f919bdb395d1e0c3f2bfb8948512d6bdd99",
+ "reference": "be330f919bdb395d1e0c3f2bfb8948512d6bdd99",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php72": "~1.5"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/console": "<3.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^3.4|^4.0|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "twig/twig": "^1.34|^2.4|^3.0"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "time": "2019-12-18T13:41:29+00:00"
+ },
+ {
+ "name": "topthink/think-trace",
+ "version": "v1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/top-think/think-trace.git",
+ "reference": "4589d06a07945d57478cc2236f4b23d51ff919cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/top-think/think-trace/zipball/4589d06a07945d57478cc2236f4b23d51ff919cc",
+ "reference": "4589d06a07945d57478cc2236f4b23d51ff919cc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.0",
+ "topthink/framework": "^6.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "think": {
+ "services": [
+ "think\\trace\\Service"
+ ],
+ "config": {
+ "trace": "src/config.php"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "think\\trace\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "liu21st",
+ "email": "liu21st@gmail.com"
+ }
+ ],
+ "description": "thinkphp debug trace",
+ "time": "2019-10-17T02:14:09+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "topthink/framework": 20,
+ "topthink/think-orm": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.1.0"
+ },
+ "platform-dev": []
+}
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000..18feded
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,38 @@
+ Env::get('app.host', ''),
+ // 应用的命名空间
+ 'app_namespace' => '',
+ // 是否启用路由
+ 'with_route' => true,
+ // 是否启用事件
+ 'with_event' => true,
+ // 开启应用快速访问
+ 'app_express' => true,
+ // 默认应用
+ 'default_app' => 'index',
+ // 默认时区
+ 'default_timezone' => 'Asia/Shanghai',
+
+ // 应用映射(自动多应用模式有效)
+ 'app_map' => [],
+ // 域名绑定(自动多应用模式有效)
+ 'domain_bind' => [],
+ // 禁止URL访问的应用列表(自动多应用模式有效)
+ 'deny_app_list' => [],
+
+ // 异常页面的模板文件
+ 'exception_tmpl' => app()->getThinkPath() . 'tpl/think_exception.tpl',
+
+ // 错误显示信息,非调试模式有效
+ 'error_message' => '页面错误!请稍后再试~',
+ // 显示错误信息
+ 'show_error_msg' => false,
+];
diff --git a/config/cache.php b/config/cache.php
new file mode 100644
index 0000000..dd492df
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,30 @@
+ Env::get('cache.driver', 'file'),
+
+ // 缓存连接方式配置
+ 'stores' => [
+ 'file' => [
+ // 驱动方式
+ 'type' => 'File',
+ // 缓存保存目录
+ 'path' => '',
+ // 缓存前缀
+ 'prefix' => '',
+ // 缓存有效期 0表示永久缓存
+ 'expire' => 0,
+ // 缓存标签前缀
+ 'tag_prefix' => 'tag:',
+ // 序列化机制 例如 ['serialize', 'unserialize']
+ 'serialize' => [],
+ ],
+ // 更多的缓存连接
+ ],
+];
diff --git a/config/captcha.php b/config/captcha.php
new file mode 100644
index 0000000..208663d
--- /dev/null
+++ b/config/captcha.php
@@ -0,0 +1,40 @@
+ 6,
+ // 验证码字符集合
+ 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',
+ // 验证码过期时间
+ 'expire' => 1800,
+ // 是否使用中文验证码
+ 'useZh' => false,
+ // 是否使用算术验证码
+ 'math' => false,
+ // 是否使用背景图
+ 'useImgBg' => false,
+ //验证码字符大小
+ 'fontSize' => 14,
+ // 是否使用混淆曲线
+ 'useCurve' => true,
+ //是否添加杂点
+ 'useNoise' => true,
+ // 验证码字体 不设置则随机
+ 'fontttf' => '',
+ //背景颜色
+ 'bg' => [243, 251, 254],
+ // 验证码图片高度
+ 'imageH' => 36,
+ // 验证码图片宽度
+ 'imageW' => 0,
+ //算术验证码
+ 'math' => true,
+
+ // 添加额外的验证码设置
+ verify => [
+ 'length'=>6,
+ ],
+];
diff --git a/config/console.php b/config/console.php
new file mode 100644
index 0000000..a818a98
--- /dev/null
+++ b/config/console.php
@@ -0,0 +1,9 @@
+ [
+ ],
+];
diff --git a/config/cookie.php b/config/cookie.php
new file mode 100644
index 0000000..f728024
--- /dev/null
+++ b/config/cookie.php
@@ -0,0 +1,18 @@
+ 0,
+ // cookie 保存路径
+ 'path' => '/',
+ // cookie 有效域名
+ 'domain' => '',
+ // cookie 启用安全传输
+ 'secure' => false,
+ // httponly设置
+ 'httponly' => false,
+ // 是否使用 setcookie
+ 'setcookie' => true,
+];
diff --git a/config/database.php b/config/database.php
new file mode 100644
index 0000000..fb2cb4f
--- /dev/null
+++ b/config/database.php
@@ -0,0 +1,52 @@
+ [],
+ // 自动写入时间戳字段
+ // true为自动识别类型 false关闭
+ // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
+ 'auto_timestamp' => true,
+ // 时间字段取出后的默认时间格式
+ 'datetime_format' => 'Y-m-d H:i:s',
+ // 数据库连接配置信息
+ 'connections' => [
+ 'mysql' => [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'hostname' => '127.0.0.1',
+ // 数据库名
+ 'database' => '',
+ // 用户名
+ 'username' => 'root',
+ // 密码
+ 'password' => '',
+ // 端口
+ 'hostport' => '3306',
+ // 数据库连接参数
+ 'params' => [],
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8',
+ // 数据库表前缀
+ 'prefix' => 'tao_',
+ // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+ 'deploy' => 0,
+ // 数据库读写是否分离 主从式有效
+ 'rw_separate' => false,
+ // 读写分离后 主服务器数量
+ 'master_num' => 1,
+ // 指定从服务器序号
+ 'slave_no' => '',
+ // 是否严格检查字段是否存在
+ 'fields_strict' => true,
+ // 是否需要断线重连
+ 'break_reconnect' => false,
+ // 监听SQL
+ 'trigger_sql' => true,
+ // 开启字段缓存
+ 'fields_cache' => false,
+ // 字段缓存路径
+ 'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
+ ],
+ ],
+];
\ No newline at end of file
diff --git a/config/filesystem.php b/config/filesystem.php
new file mode 100644
index 0000000..c95874c
--- /dev/null
+++ b/config/filesystem.php
@@ -0,0 +1,37 @@
+ Env::get('filesystem.driver', 'local'),
+ // 磁盘列表
+ 'disks' => [
+ 'local' => [
+ 'type' => 'local',
+ 'root' => app()->getRuntimePath() . 'storage',
+ ],
+ 'public' => [
+ // 磁盘类型
+ 'type' => 'local',
+ // 磁盘路径
+ 'root' => app()->getRootPath() . 'public/storage',
+ // 磁盘路径对应的外部URL路径
+ 'url' => '/storage',
+ // 可见性
+ 'visibility' => 'public',
+ ],
+ // 更多的磁盘配置信息
+
+ 'tmp' => [
+ // 磁盘类型
+ 'type' => 'local',
+ // 磁盘路径
+ 'root' => app()->getRootPath() . 'tmp/web',
+ // 磁盘路径对应的外部URL路径
+ 'url' => '/web',
+ // 可见性
+ 'visibility' => 'tmp',
+ ],
+ ],
+];
diff --git a/config/lang.php b/config/lang.php
new file mode 100644
index 0000000..33232bd
--- /dev/null
+++ b/config/lang.php
@@ -0,0 +1,27 @@
+ Env::get('lang.default_lang', 'zh-cn'),
+ // 允许的语言列表
+ 'allow_lang_list' => [],
+ // 多语言自动侦测变量名
+ 'detect_var' => 'lang',
+ // 是否使用Cookie记录
+ 'use_cookie' => true,
+ // 多语言cookie变量
+ 'cookie_var' => 'think_lang',
+ // 扩展语言包
+ 'extend_list' => [],
+ // Accept-Language转义为对应语言包名称
+ 'accept_language' => [
+ 'zh-hans-cn' => 'zh-cn',
+ ],
+ // 是否支持语言分组
+ 'allow_group' => false,
+];
diff --git a/config/log.php b/config/log.php
new file mode 100644
index 0000000..5f7afcb
--- /dev/null
+++ b/config/log.php
@@ -0,0 +1,46 @@
+ Env::get('log.channel', 'file'),
+ // 日志记录级别
+ 'level' => [],
+ // 日志类型记录的通道 ['error'=>'email',...]
+ 'type_channel' => [],
+ // 关闭全局日志写入
+ 'close' => false,
+ // 全局日志处理 支持闭包
+ 'processor' => null,
+
+ // 日志通道列表
+ 'channels' => [
+ 'file' => [
+ // 日志记录方式
+ 'type' => 'File',
+ // 日志保存目录
+ 'path' => '',
+ // 单文件日志写入
+ 'single' => false,
+ // 独立日志级别
+ 'apart_level' => [],
+ // 最大日志文件数量
+ 'max_files' => 0,
+ // 使用JSON格式记录
+ 'json' => false,
+ // 日志处理
+ 'processor' => null,
+ // 关闭通道日志写入
+ 'close' => false,
+ // 日志输出格式化
+ 'format' => '[%s][%s] %s',
+ // 是否实时写入
+ 'realtime_write' => false,
+ ],
+ // 其它日志通道配置
+ ],
+
+];
diff --git a/config/middleware.php b/config/middleware.php
new file mode 100644
index 0000000..b40354c
--- /dev/null
+++ b/config/middleware.php
@@ -0,0 +1,11 @@
+ [
+ 'logedcheck' => \app\middleware\LogedCheck::class,
+ 'logincheck' => \app\middleware\LoginCheck::class,
+ ],
+ // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
+ 'priority' => [],
+];
diff --git a/config/route.php b/config/route.php
new file mode 100644
index 0000000..288c8f1
--- /dev/null
+++ b/config/route.php
@@ -0,0 +1,51 @@
+ '/',
+ // URL伪静态后缀
+ 'url_html_suffix' => 'html',
+ // URL普通方式参数 用于自动生成
+ 'url_common_param' => true,
+ // 是否开启路由延迟解析
+ 'url_lazy_route' => false,
+ // 是否强制使用路由
+ 'url_route_must' => false,
+ // 合并路由规则
+ 'route_rule_merge' => false,
+ // 路由是否完全匹配
+ 'route_complete_match' => false,
+ // 是否开启路由缓存
+ 'route_check_cache' => false,
+ // 路由缓存连接参数
+ 'route_cache_option' => [],
+ // 路由缓存Key
+ 'route_check_cache_key' => '',
+ // 访问控制器层名称
+ 'controller_layer' => 'controller',
+ // 空控制器名
+ 'empty_controller' => 'Error',
+ // 是否使用控制器后缀
+ 'controller_suffix' => false,
+ // 默认的路由变量规则
+ 'default_route_pattern' => '[\w\.]+',
+ // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
+ 'request_cache' => false,
+ // 请求缓存有效期
+ 'request_cache_expire' => null,
+ // 全局请求缓存排除规则
+ 'request_cache_except' => [],
+ // 默认控制器名
+ 'default_controller' => 'Index',
+ // 默认操作名
+ 'default_action' => 'index',
+ // 操作方法后缀
+ 'action_suffix' => '',
+ // 默认JSONP格式返回的处理方法
+ 'default_jsonp_handler' => 'jsonpReturn',
+ // 默认JSONP处理方法
+ 'var_jsonp_handler' => 'callback',
+];
diff --git a/config/session.php b/config/session.php
new file mode 100644
index 0000000..c1ef6e1
--- /dev/null
+++ b/config/session.php
@@ -0,0 +1,19 @@
+ 'PHPSESSID',
+ // SESSION_ID的提交变量,解决flash上传跨域
+ 'var_session_id' => '',
+ // 驱动方式 支持file cache
+ 'type' => 'file',
+ // 存储连接标识 当type使用cache的时候有效
+ 'store' => null,
+ // 过期时间
+ 'expire' => 1440,
+ // 前缀
+ 'prefix' => '',
+];
diff --git a/config/trace.php b/config/trace.php
new file mode 100644
index 0000000..fad2392
--- /dev/null
+++ b/config/trace.php
@@ -0,0 +1,10 @@
+ 'Html',
+ // 读取的日志通道名
+ 'channel' => '',
+];
diff --git a/config/view.php b/config/view.php
new file mode 100644
index 0000000..7499b1d
--- /dev/null
+++ b/config/view.php
@@ -0,0 +1,25 @@
+ 'Think',
+ // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
+ 'auto_rule' => 3,
+ // 模板目录名
+ 'view_dir_name' => 'view',
+ // 模板后缀
+ 'view_suffix' => 'html',
+ // 模板文件名分隔符
+ 'view_depr' => DIRECTORY_SEPARATOR,
+ // 模板引擎普通标签开始标记
+ 'tpl_begin' => '{',
+ // 模板引擎普通标签结束标记
+ 'tpl_end' => '}',
+ // 标签库标签开始标记
+ 'taglib_begin' => '{',
+ // 标签库标签结束标记
+ 'taglib_end' => '}',
+];
diff --git a/extend/.gitignore b/extend/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/extend/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..cbc7868
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,8 @@
+
+ Options +FollowSymlinks -Multiviews
+ RewriteEngine On
+
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
+
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e71815a
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..e3c0fe9
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,24 @@
+
+// +----------------------------------------------------------------------
+
+// [ 应用入口文件 ]
+namespace think;
+
+require __DIR__ . '/../vendor/autoload.php';
+
+// 执行HTTP应用并响应
+$http = (new App())->http;
+
+$response = $http->run();
+
+$response->send();
+
+$http->end($response);
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..eb05362
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/public/router.php b/public/router.php
new file mode 100644
index 0000000..ac7b3c8
--- /dev/null
+++ b/public/router.php
@@ -0,0 +1,17 @@
+
+// +----------------------------------------------------------------------
+// $Id$
+
+if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
+ return false;
+} else {
+ require __DIR__ . "/index.php";
+}
diff --git a/public/static/admin/config.js b/public/static/admin/config.js
new file mode 100644
index 0000000..cd7027c
--- /dev/null
+++ b/public/static/admin/config.js
@@ -0,0 +1,130 @@
+/**
+
+ @Name:layuiAdmin iframe版全局配置
+ @Author:贤心
+ @Site:http://www.layui.com/admin/
+ @License:LPPL(layui付费产品协议)
+
+ */
+
+layui.define(['laytpl', 'layer', 'element', 'util'], function(exports){
+ exports('setter', {
+ container: 'LAY_app' //容器ID
+ ,base: layui.cache.base //记录静态资源所在路径
+ ,views: layui.cache.base + 'tpl/' //动态模板所在目录
+ ,entry: 'index' //默认视图文件名
+ ,engine: '.html' //视图文件后缀名
+ ,pageTabs: true //是否开启页面选项卡功能。iframe版推荐开启
+ ,version: new Date().getTime() //这样你每次刷新页面,都会更新一次缓存
+ ,name: 'layuiAdmin'
+ ,tableName: 'layuiAdmin' //本地存储表名
+ ,MOD_NAME: 'admin' //模块事件名
+
+ ,debug: true //是否开启调试模式。如开启,接口异常时会抛出异常 URL 等信息
+
+ //自定义请求字段
+ ,request: {
+ tokenName: false //自动携带 token 的字段名(如:access_token)。可设置 false 不携带。
+ }
+
+ //自定义响应字段
+ ,response: {
+ statusName: 'code' //数据状态的字段名称
+ ,statusCode: {
+ ok: 0 //数据状态一切正常的状态码
+ ,logout: 1001 //登录状态失效的状态码
+ ,error: -1 //增加登录失败的状态码
+ }
+ ,msgName: 'msg' //状态信息的字段名称
+ ,dataName: 'data' //数据详情的字段名称
+ }
+
+ //扩展的第三方模块
+ ,extend: [
+ 'echarts', //echarts 核心包
+ 'echartsTheme' //echarts 主题
+ ]
+
+ //主题配置
+ ,theme: {
+ //内置主题配色方案
+ color: [{
+ main: '#20222A' //主题色
+ ,selected: '#009688' //选中色
+ ,alias: 'default' //默认别名
+ },{
+ main: '#03152A'
+ ,selected: '#3B91FF'
+ ,alias: 'dark-blue' //藏蓝
+ },{
+ main: '#2E241B'
+ ,selected: '#A48566'
+ ,alias: 'coffee' //咖啡
+ },{
+ main: '#50314F'
+ ,selected: '#7A4D7B'
+ ,alias: 'purple-red' //紫红
+ },{
+ main: '#344058'
+ ,logo: '#1E9FFF'
+ ,selected: '#1E9FFF'
+ ,alias: 'ocean' //海洋
+ },{
+ main: '#3A3D49'
+ ,logo: '#2F9688'
+ ,selected: '#5FB878'
+ ,alias: 'green' //墨绿
+ },{
+ main: '#20222A'
+ ,logo: '#F78400'
+ ,selected: '#F78400'
+ ,alias: 'red' //橙色
+ },{
+ main: '#28333E'
+ ,logo: '#AA3130'
+ ,selected: '#AA3130'
+ ,alias: 'fashion-red' //时尚红
+ },{
+ main: '#24262F'
+ ,logo: '#3A3D49'
+ ,selected: '#009688'
+ ,alias: 'classic-black' //经典黑
+ },{
+ logo: '#226A62'
+ ,header: '#2F9688'
+ ,alias: 'green-header' //墨绿头
+ },{
+ main: '#344058'
+ ,logo: '#0085E8'
+ ,selected: '#1E9FFF'
+ ,header: '#1E9FFF'
+ ,alias: 'ocean-header' //海洋头
+ },{
+ header: '#393D49'
+ ,alias: 'classic-black-header' //经典黑头
+ },{
+ main: '#50314F'
+ ,logo: '#50314F'
+ ,selected: '#7A4D7B'
+ ,header: '#50314F'
+ ,alias: 'purple-red-header' //紫红头
+ },{
+ main: '#28333E'
+ ,logo: '#28333E'
+ ,selected: '#AA3130'
+ ,header: '#AA3130'
+ ,alias: 'fashion-red-header' //时尚红头
+ },{
+ main: '#28333E'
+ ,logo: '#009688'
+ ,selected: '#009688'
+ ,header: '#009688'
+ ,alias: 'green-header' //墨绿头
+ }]
+
+ //初始的颜色索引,对应上面的配色方案数组索引
+ //如果本地已经有主题色记录,则以本地记录为优先,除非请求本地数据(localStorage)
+ ,initColorIndex: 0
+ }
+ });
+});
diff --git a/public/static/admin/json/console/prograss.js b/public/static/admin/json/console/prograss.js
new file mode 100644
index 0000000..13a093b
--- /dev/null
+++ b/public/static/admin/json/console/prograss.js
@@ -0,0 +1,36 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "prograss": "开会"
+ ,"time": "一小时"
+ ,"complete": "已完成"
+ ,"LAY_CHECKED": true
+ },{
+ "prograss": "项目开发"
+ ,"time": "两小时"
+ ,"complete": "进行中"
+ ,"LAY_CHECKED": true
+ },{
+ "prograss": "陪吃饭"
+ ,"time": "一小时"
+ ,"complete": "未完成"
+ },{
+ "prograss": "修改小bug"
+ ,"time": "半小时"
+ ,"complete": "未完成"
+ },{
+ "prograss": "修改大bug"
+ ,"time": "两小时"
+ ,"complete": "未完成"
+ },{
+ "prograss": "修改小bug"
+ ,"time": "半小时"
+ ,"complete": "未完成"
+ },{
+ "prograss": "修改大bug"
+ ,"time": "两小时"
+ ,"complete": "未完成"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/console/top-card.js b/public/static/admin/json/console/top-card.js
new file mode 100644
index 0000000..51ee9bb
--- /dev/null
+++ b/public/static/admin/json/console/top-card.js
@@ -0,0 +1,76 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": 111
+ ,"title": "社区开始接受 “赞助商广告” 投放"
+ ,"username": "贤心"
+ ,"channel": "公告"
+ ,"href": "http://fly.layui.com/jie/15697/"
+ ,"crt": 61632
+ },{
+ "id": 222
+ ,"title": "layui 一周年"
+ ,"username": "猫吃"
+ ,"channel": "讨论"
+ ,"href": "http://fly.layui.com/jie/16622/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "四个月的前端"
+ ,"username": "fd"
+ ,"channel": "分享"
+ ,"href": "http://fly.layui.com/jie/16651/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ },{
+ "id": 333
+ ,"title": "如何评价LayUI和他的作者闲心"
+ ,"username": "纸飞机"
+ ,"channel": "提问"
+ ,"href": "http://fly.layui.com/jie/9352/"
+ ,"crt": 61632
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/console/top-search.js b/public/static/admin/json/console/top-search.js
new file mode 100644
index 0000000..9750e5e
--- /dev/null
+++ b/public/static/admin/json/console/top-search.js
@@ -0,0 +1,46 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "keywords": "贤心是男是女"
+ ,"frequency": 8520
+ ,"userNums": 2216
+ },{
+ "keywords": "Java程序员能找到女朋友吗"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "此表格是静态模拟数据"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ },{
+ "keywords": "layui官方教程"
+ ,"frequency": 666
+ ,"userNums": 333
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/content/comment.js b/public/static/admin/json/content/comment.js
new file mode 100644
index 0000000..45b8c3f
--- /dev/null
+++ b/public/static/admin/json/content/comment.js
@@ -0,0 +1,56 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "001"
+ ,"reviewers": "赵"
+ ,"content": "我又爱上编程了"
+ ,"commtime": 20160312
+ },{
+ "id": "002"
+ ,"reviewers": "钱"
+ ,"content": "女生出门要小心"
+ ,"commtime": 20160821
+ },{
+ "id": "003"
+ ,"reviewers": "孙"
+ ,"content": "框架就用layui"
+ ,"commtime": 20161212
+ },{
+ "id": "004"
+ ,"reviewers": "李"
+ ,"content": "心姐么么哒"
+ ,"commtime": 20170311
+ },{
+ "id": "005"
+ ,"reviewers": "周"
+ ,"content": "希望明天是个好天气"
+ ,"commtime": 20170612
+ },{
+ "id": "006"
+ ,"reviewers": "吴"
+ ,"content": "我又爱上编程了"
+ ,"commtime": 20171112
+ },{
+ "id": "007"
+ ,"reviewers": "郑"
+ ,"content": "女生出门要小心"
+ ,"commtime": 20171230
+ },{
+ "id": "008"
+ ,"reviewers": "王"
+ ,"content": "框架就用layui"
+ ,"commtime": 20180112
+ },{
+ "id": "009"
+ ,"reviewers": "冯"
+ ,"content": "心姐么么哒"
+ ,"commtime": 20180221
+ },{
+ "id": "010"
+ ,"reviewers": "陈"
+ ,"content": "希望明天是个好天气"
+ ,"commtime": 20180312
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/content/list.js b/public/static/admin/json/content/list.js
new file mode 100644
index 0000000..b70f3e7
--- /dev/null
+++ b/public/static/admin/json/content/list.js
@@ -0,0 +1,62 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "001"
+ ,"label": "美食"
+ ,"title": "舌尖上的中国第一季"
+ ,"author": "作者-1"
+ ,"content": "通过中华美食的多个侧面,来展现食物给中国人生活带来的仪式、伦理等方面的文化;见识中国特色食材以及与食物相关、构成中国美食特有气质的一系列元素;了解中华饮食文化的精致和源远流长"
+ ,"uploadtime": 20121204
+ ,"status": true
+ },{
+ "id": "002"
+ ,"label": "美食"
+ ,"title": "舌尖上的中国第二季"
+ ,"author": "作者-2"
+ ,"content": "以食物为窗口,读懂中国——通过美食,使人们可以有滋有味地认知这个古老的东方国度。“一方水土一方人”,本片将通过展示人们日常生活中与美食相关的多重侧面,描绘与感知中国人的文化传统、家族观念、生活态度与故土难离。人们收获、保存、烹饪、生产美食,并在其过程中留存和传承食物所承载的味觉记忆、饮食习俗、文化样态与家常情感。"
+ ,"uploadtime": 20141204
+ ,"status": false
+ },{
+ "id": "003"
+ ,"label": "美食"
+ ,"title": "舌尖上的中国第三季"
+ ,"author": "作者-3"
+ ,"content": "以食物为窗口,读懂中国——通过美食,使人们可以有滋有味地认知这个古老的东方国度。“一方水土一方人”,本片将通过展示人们日常生活中与美食相关的多重侧面,描绘与感知中国人的文化传统、家族观念、生活态度与故土难离。人们收获、保存、烹饪、生产美食,并在其过程中留存和传承食物所承载的味觉记忆、饮食习俗、文化样态与家常情感将世界美食和中国美食进行比照。春耕、夏耘、秋收、冬藏,天人合一的东方哲学让中国饮食依时而变,智慧灵动,中医营养摄生学说创造了食材运用的新天地,儒家人伦道德则把心意和家的味道端上我们的餐桌。淘洗历史,糅合时光,一代又一代的中国人在天地间升起烟火,用至精至诚的心意烹制食物,一餐一食之间,中国人展示个性,确认归属,构建文明,理解和把握着世界的奥妙。"
+ ,"uploadtime": 20161204
+ ,"status": false
+ },{
+ "id": "004"
+ ,"label": "历史"
+ ,"title": "诸葛亮骂王朗"
+ ,"author": "作者-1"
+ ,"content": "皓首匹夫!苍髯老贼!你即将命归于九泉之下,届时,有何面目见汉朝二十四代先帝?二臣贼子!你枉活七十有六,一生未立寸功,只会摇唇舞舌,助曹为虐!一条断脊之犬,还敢在我军阵前狺狺狂吠!我从未见过如此厚颜无耻之人!!!"
+ ,"uploadtime": 20180201
+ ,"status": false
+ },{
+ "id": "005"
+ ,"label": "新闻"
+ ,"title": "新时代特色中国梦"
+ ,"author": "作者-1"
+ ,"content": "今天,我们比历史上任何时期都更接近、更有信心和能力实现中华民族伟大复兴的目标。新时代已经到来,蓝图已经绘就,中国梦离我们越来越近了。"
+ ,"uploadtime": 20180512
+ ,"status": false
+ },{
+ "id": "006"
+ ,"label": "新闻"
+ ,"title": "新时代特色中国梦"
+ ,"author": "作者-2"
+ ,"content": "梦想不会主动走向我们,只有我们去主动实现梦想。行百里者半九十。虽然中国梦离我们越来越近了,但是要实现中国梦,还要靠我们以永不懈怠的精神状态、功在不舍的坚强意志,不忘初心,继续前进。"
+ ,"uploadtime": 20180514
+ ,"status": false
+ },{
+ "id": "007"
+ ,"label": "体育"
+ ,"title": "皇马大战利物浦"
+ ,"author": "作者-3"
+ ,"content": "对欧足联而言,更想要产生个新冠军。连续三年都是同一个冠军队,这会毁掉欧冠……”格里姆表态,“皇马有梦幻般的阵容,但从促进竞争的角度而言,另一支球队获胜会更好。"
+ ,"uploadtime": 20180515
+ ,"status": false
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/content/tags.js b/public/static/admin/json/content/tags.js
new file mode 100644
index 0000000..6ca85cd
--- /dev/null
+++ b/public/static/admin/json/content/tags.js
@@ -0,0 +1,21 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "001"
+ ,"tags": "美食"
+ },{
+ "id": "002"
+ ,"tags": "新闻"
+ },{
+ "id": "003"
+ ,"tags": "八卦"
+ },{
+ "id": "004"
+ ,"tags": "体育"
+ },{
+ "id": "005"
+ ,"tags": "音乐"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/forum/list.js b/public/static/admin/json/forum/list.js
new file mode 100644
index 0000000..144e75b
--- /dev/null
+++ b/public/static/admin/json/forum/list.js
@@ -0,0 +1,62 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "1001"
+ ,"poster": "赵"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "为什么花儿这么么红"
+ ,"posttime": 20160805
+ ,"top": false
+ },{
+ "id": "1002"
+ ,"poster": "钱"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "喜欢胡歌,赞赞赞"
+ ,"posttime": 20161205
+ ,"top": true
+ },{
+ "id": "1003"
+ ,"poster": "孙"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "明天就要考试了,好紧张,求保佑"
+ ,"posttime": 20170405
+ ,"top": false
+ },{
+ "id": "1004"
+ ,"poster": "李"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "希望明天是个好天气"
+ ,"posttime": 20171005
+ ,"top": false
+ },{
+ "id": "1005"
+ ,"poster": "周"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "女追男隔层纱,是不是真的"
+ ,"posttime": 20180205
+ ,"top": false
+ },{
+ "id": "1006"
+ ,"poster": "吴"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "竟然有人跳楼,年轻人想不开啊!"
+ ,"posttime": 20180512
+ ,"top": false
+ },{
+ "id": "1007"
+ ,"poster": "郑"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "大家一定不能学那个年轻人,珍爱生命啊"
+ ,"posttime": 20180512
+ ,"top": false
+ },{
+ "id": "1008"
+ ,"poster": "王"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"content": "想知道南昌哪里有好吃的西安肉夹馍"
+ ,"posttime": 20180514
+ ,"top": false
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/forum/replys.js b/public/static/admin/json/forum/replys.js
new file mode 100644
index 0000000..0703695
--- /dev/null
+++ b/public/static/admin/json/forum/replys.js
@@ -0,0 +1,69 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "001"
+ ,"replyer": "吴"
+ ,"cardid": "1002"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "有眼光,我也喜欢胡歌!"
+ ,"replytime": 20161205
+ },{
+ "id": "002"
+ ,"replyer": "郑"
+ ,"cardid": "1002"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "同上同上。"
+ ,"replytime": 20161205
+ },{
+ "id": "003"
+ ,"replyer": "王"
+ ,"cardid": "1003"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "能过一定过,不能过紧张也没用"
+ ,"replytime": 20170405
+ },{
+ "id": "004"
+ ,"replyer": "冯"
+ ,"cardid": "1001"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "可能因为你流鼻血了。"
+ ,"replytime": 20170405
+ },{
+ "id": "005"
+ ,"replyer": "陈"
+ ,"cardid": "1003"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "加油加油,看好你"
+ ,"replytime": 20170405
+ },{
+ "id": "006"
+ ,"replyer": "褚"
+ ,"cardid": "1005"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "纯属放屁"
+ ,"replytime": 20180207
+ },{
+ "id": "007"
+ ,"replyer": "卫"
+ ,"cardid": "1005"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "可以试试"
+ ,"replytime": 20180207
+ },{
+ "id": "006"
+ ,"replyer": "蒋"
+ ,"cardid": "1006"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "是啊是啊,太恐怖了。"
+ ,"replytime": 20180512
+ },{
+ "id": "007"
+ ,"replyer": "沈"
+ ,"cardid": "1008"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"content": "魏家凉皮的凉皮就很不错奥。"
+ ,"replytime": 20180515
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/layer/photos.js b/public/static/admin/json/layer/photos.js
new file mode 100644
index 0000000..7daedc3
--- /dev/null
+++ b/public/static/admin/json/layer/photos.js
@@ -0,0 +1,39 @@
+{
+ "code": 0,
+ "msg": "",
+ "title": "JSON请求的相册",
+ "id": 8,
+ "start": 0,
+ "data": [
+ {
+ "alt": "layer",
+ "pid": 109,
+ "src": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg",
+ "thumb": ""
+ },
+ {
+ "alt": "说好的,一起Fly",
+ "pid": 110,
+ "src": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4kebemcj20ga09saa1.jpg",
+ "thumb": ""
+ },
+ {
+ "alt": "佟丽娅女神",
+ "pid": 111,
+ "src": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg",
+ "thumb": ""
+ },
+ {
+ "alt": "凤姐是个好人",
+ "pid": 112,
+ "src": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4kec9vuj20b20dwmyk.jpg",
+ "thumb": ""
+ },
+ {
+ "alt": "星空如此深邃",
+ "pid": 113,
+ "src": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4keca8ag208g06iglw.gif",
+ "thumb": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/layim/getList.js b/public/static/admin/json/layim/getList.js
new file mode 100644
index 0000000..aa88110
--- /dev/null
+++ b/public/static/admin/json/layim/getList.js
@@ -0,0 +1,96 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": {
+ "mine": {
+ "username": "纸飞机"
+ ,"id": "100000"
+ ,"status": "online"
+ ,"sign": "在深邃的编码世界,做一枚轻盈的纸飞机"
+ ,"avatar": "//res.layui.com/images/fly/avatar/00.jpg"
+ }
+ ,"friend": [{
+ "groupname": "知名人物"
+ ,"id": 0
+ ,"list": [{
+ "username": "贤心"
+ ,"id": "100001"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
+ ,"sign": "这些都是测试数据,实际使用请严格按照该格式返回"
+ ,"status": "online"
+ },{
+ "username": "刘涛tamia"
+ ,"id": "100001222"
+ ,"sign": "如约而至,不负姊妹欢乐颂"
+ ,"avatar": "//tva4.sinaimg.cn/crop.0.1.1125.1125.180/475bb144jw8f9nwebnuhkj20v90vbwh9.jpg"
+ },{
+ "username": "谢楠"
+ ,"id": "10034001"
+ ,"avatar": "//tva2.sinaimg.cn/crop.1.0.747.747.180/633f068fjw8f9h040n951j20ku0kr74t.jpg"
+ ,"sign": ""
+ },{
+ "username": "马小云"
+ ,"id": "168168"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.180.180.180/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg"
+ ,"sign": "让天下没有难写的代码"
+ },{
+ "username": "徐小峥"
+ ,"id": "666666"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.512.512.180/6a4acad5jw8eqi6yaholjj20e80e8t9f.jpg"
+ ,"sign": "代码在囧途,也要写到底"
+ }]
+ },{
+ "groupname": "网红声优"
+ ,"id": 1
+ ,"list": [{
+ "username": "罗玉凤"
+ ,"id": "121286"
+ ,"avatar": "//tva4.sinaimg.cn/crop.0.0.640.640.180/4a02849cjw8fc8vn18vktj20hs0hs75v.jpg"
+ ,"sign": "在自己实力不济的时候,不要去相信什么媒体和记者。他们不是善良的人,有时候候他们的采访对当事人而言就是陷阱"
+ },{
+ "username": "Z_子晴"
+ ,"id": "108101"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.23.1242.1242.180/8693225ajw8fbimjimpjwj20yi0zs77l.jpg"
+ ,"sign": "微电商达人"
+ },{
+ "username": "大鱼_MsYuyu"
+ ,"id": "12123454"
+ ,"avatar": "//tva2.sinaimg.cn/crop.0.0.512.512.180/005LMAegjw8f2bp9qg4mrj30e80e8dg5.jpg"
+ ,"sign": "我瘋了!這也太準了吧 超級笑點低"
+ },{
+ "username": "醋醋cucu"
+ ,"id": "102101"
+ ,"avatar": "//tva2.sinaimg.cn/crop.0.0.640.640.180/648fbe5ejw8ethmg0u9egj20hs0ht0tn.jpg"
+ ,"sign": ""
+ },{
+ "username": "柏雪近在它香"
+ ,"id": "3435343"
+ ,"avatar": "//tva2.sinaimg.cn/crop.0.8.751.751.180/961a9be5jw8fczq7q98i7j20kv0lcwfn.jpg"
+ ,"sign": ""
+ }]
+ },{
+ "groupname": "女神艺人"
+ ,"id": 2
+ ,"list": [{
+ "username": "王祖贤"
+ ,"id": "76543"
+ ,"avatar": "//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg"
+ ,"sign": "我爱贤心"
+ },{
+ "username": "佟丽娅"
+ ,"id": "4803920"
+ ,"avatar": "//tva3.sinaimg.cn/crop.0.0.750.750.180/5033b6dbjw8etqysyifpkj20ku0kuwfw.jpg"
+ ,"sign": "我也爱贤心吖吖啊"
+ }]
+ }]
+ ,"group": [{
+ "groupname": "前端群"
+ ,"id": "101"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.200.200.50/006q8Q6bjw8f20zsdem2mj305k05kdfw.jpg"
+ },{
+ "groupname": "Fly社区官方群"
+ ,"id": "102"
+ ,"avatar": "//tva2.sinaimg.cn/crop.0.0.199.199.180/005Zseqhjw1eplix1brxxj305k05kjrf.jpg"
+ }]
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/layim/getMembers.js b/public/static/admin/json/layim/getMembers.js
new file mode 100644
index 0000000..66dcba0
--- /dev/null
+++ b/public/static/admin/json/layim/getMembers.js
@@ -0,0 +1,67 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": {
+ "list": [{
+ "username": "贤心"
+ ,"id": "100001"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
+ ,"sign": "这些都是测试数据,实际使用请严格按照该格式返回"
+ },{
+ "username": "Z_子晴"
+ ,"id": "108101"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.23.1242.1242.180/8693225ajw8fbimjimpjwj20yi0zs77l.jpg"
+ ,"sign": "微电商达人"
+ },{
+ "username": "Lemon_CC"
+ ,"id": "102101"
+ ,"avatar": "//tva4.sinaimg.cn/crop.0.0.180.180.180/6d424ea5jw1e8qgp5bmzyj2050050aa8.jpg"
+ ,"sign": ""
+ },{
+ "username": "马小云"
+ ,"id": "168168"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.180.180.180/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg"
+ ,"sign": "让天下没有难写的代码"
+ },{
+ "username": "徐小峥"
+ ,"id": "666666"
+ ,"avatar": "//tva1.sinaimg.cn/crop.0.0.512.512.180/6a4acad5jw8eqi6yaholjj20e80e8t9f.jpg"
+ ,"sign": "代码在囧途,也要写到底"
+ },{
+ "username": "罗玉凤"
+ ,"id": "121286"
+ ,"avatar": "//tva4.sinaimg.cn/crop.0.0.640.640.180/4a02849cjw8fc8vn18vktj20hs0hs75v.jpg"
+ ,"sign": "在自己实力不济的时候,不要去相信什么媒体和记者。他们不是善良的人,有时候候他们的采访对当事人而言就是陷阱"
+ },{
+ "username": "刘涛tamia"
+ ,"id": "100001222"
+ ,"avatar": "//tva4.sinaimg.cn/crop.0.1.1125.1125.180/475bb144jw8f9nwebnuhkj20v90vbwh9.jpg"
+ ,"sign": "如约而至,不负姊妹欢乐颂"
+ },{
+ "username": "大鱼_MsYuyu"
+ ,"id": "12123454"
+ ,"avatar": "//tva2.sinaimg.cn/crop.0.0.512.512.180/005LMAegjw8f2bp9qg4mrj30e80e8dg5.jpg"
+ ,"sign": "我瘋了!這也太準了吧 超級笑點低"
+ },{
+ "username": "谢楠"
+ ,"id": "10034001"
+ ,"avatar": "//tva2.sinaimg.cn/crop.1.0.747.747.180/633f068fjw8f9h040n951j20ku0kr74t.jpg"
+ ,"sign": ""
+ },{
+ "username": "柏雪近在它香"
+ ,"id": "3435343"
+ ,"avatar": "//tva2.sinaimg.cn/crop.0.8.751.751.180/961a9be5jw8fczq7q98i7j20kv0lcwfn.jpg"
+ ,"sign": ""
+ },{
+ "username": "林心如"
+ ,"id": "76543"
+ ,"avatar": "//tva3.sinaimg.cn/crop.0.0.512.512.180/48f122e6jw8fcmi072lkyj20e80e8t9i.jpg"
+ ,"sign": "我爱贤心"
+ },{
+ "username": "佟丽娅"
+ ,"id": "4803920"
+ ,"avatar": "//tva3.sinaimg.cn/crop.0.0.750.750.180/5033b6dbjw8etqysyifpkj20ku0kuwfw.jpg"
+ ,"sign": "我也爱贤心吖吖啊"
+ }]
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/mall/order.js b/public/static/admin/json/mall/order.js
new file mode 100644
index 0000000..9ce2971
--- /dev/null
+++ b/public/static/admin/json/mall/order.js
@@ -0,0 +1,42 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "invoice": "X123565541"
+ ,"username": "张小三"
+ ,"orderDate": "2017-11-10"
+ ,"amount": 800
+ ,"status": 1
+ },{
+ "invoice": "X123565542"
+ ,"username": "李小四"
+ ,"orderDate": "2017-11-10"
+ ,"amount": 800
+ ,"status": 0
+ },{
+ "invoice": "X123565543"
+ ,"username": "王老五"
+ ,"orderDate": "2017-11-10"
+ ,"amount": 800
+ ,"status": 1
+ },{
+ "invoice": "X123565544"
+ ,"username": "赵小六"
+ ,"orderDate": "2017-11-09"
+ ,"amount": 1600
+ ,"status": 1
+ },{
+ "invoice": "X123565545"
+ ,"username": "孙小七"
+ ,"orderDate": "2017-11-09"
+ ,"amount": 1600
+ ,"status": -1
+ },{
+ "invoice": "X123565546"
+ ,"username": "周小八"
+ ,"orderDate": "2017-11-08"
+ ,"amount": 2600
+ ,"status": 1
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/menu.js b/public/static/admin/json/menu.js
new file mode 100644
index 0000000..0408505
--- /dev/null
+++ b/public/static/admin/json/menu.js
@@ -0,0 +1,227 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": [{
+ "name": "component"
+ ,"title": "组件"
+ ,"icon": "layui-icon-component"
+ ,"list": [{
+ "name": "grid"
+ ,"title": "栅格"
+ ,"list": [{
+ "name": "list"
+ ,"title": "等比例列表排列"
+ },{
+ "name": "mobile"
+ ,"title": "按移动端排列"
+ },{
+ "name": "mobile-pc"
+ ,"title": "移动桌面端组合"
+ },{
+ "name": "all"
+ ,"title": "全端复杂组合"
+ },{
+ "name": "stack"
+ ,"title": "低于桌面堆叠排列"
+ },{
+ "name": "speed-dial"
+ ,"title": "九宫格"
+ }]
+ }, {
+ "name": "button"
+ ,"title": "按钮"
+ }, {
+ "name": "form"
+ ,"title": "表单"
+ ,"list": [{
+ "name": "element"
+ ,"title": "表单元素"
+ },{
+ "name": "group"
+ ,"title": "表单组合"
+ }]
+ }, {
+ "name": "nav"
+ ,"title": "导航"
+ }, {
+ "name": "tabs"
+ ,"title": "选项卡"
+ }, {
+ "name": "progress"
+ ,"title": "进度条"
+ }, {
+ "name": "panel"
+ ,"title": "面板"
+ }, {
+ "name": "badge"
+ ,"title": "徽章"
+ }, {
+ "name": "timeline"
+ ,"title": "时间线"
+ }, {
+ "name": "anim"
+ ,"title": "动画"
+ }, {
+ "name": "auxiliar"
+ ,"title": "辅助"
+ }, {
+ "name": "layer"
+ ,"title": "通用弹层"
+ ,"list": [{
+ "name": "list"
+ ,"title": "功能演示"
+ },{
+ "name": "special-demo"
+ ,"title": "特殊示例"
+ },{
+ "name": "theme"
+ ,"title": "风格定制"
+ }]
+ }, {
+ "name": "laydate"
+ ,"title": "日期时间"
+ }, {
+ "name": "table"
+ ,"title": "表格"
+ }, {
+ "name": "laypage"
+ ,"title": "分页"
+ }, {
+ "name": "upload"
+ ,"title": "上传"
+ }, {
+ "name": "carousel"
+ ,"title": "轮播"
+ }, {
+ "name": "laytpl"
+ ,"title": "模板引擎"
+ }, {
+ "name": "flow"
+ ,"title": "流加载"
+ }, {
+ "name": "util"
+ ,"title": "工具"
+ }, {
+ "name": "code"
+ ,"title": "代码修饰"
+ }, {
+ "name": "layim"
+ ,"title": "即时聊天"
+ ,"jump": "senior/im/"
+ }]
+ }, {
+ "name": "template"
+ ,"title": "模板"
+ ,"icon": "layui-icon-template"
+ ,"list": [{
+ "name": "user"
+ ,"title": "用户相关"
+ ,"spread": true
+ ,"list": [{
+ "name": "reg"
+ ,"title": "注册"
+ ,"jump": "user/reg"
+ },{
+ "name": "login"
+ ,"title": "登入"
+ ,"jump": "user/login"
+ },{
+ "name": "forget"
+ ,"title": "忘记密码"
+ ,"jump": "user/forget"
+ }]
+ }, {
+ "name": "tips"
+ ,"title": "提示页面"
+ ,"spread": true
+ ,"list": [{
+ "name": "404"
+ ,"title": "404"
+ },{
+ "name": "error"
+ ,"title": "错误提示"
+ }]
+ }, {
+ "name": ""
+ ,"title": "内嵌页面"
+ ,"spread": true
+ ,"list": [{
+ "name": ""
+ ,"title": "百度一下"
+ ,"jump": "/iframe/link/baidu"
+ }, {
+ "name": ""
+ ,"title": "layui官网"
+ ,"jump": "/iframe/link/layui"
+ }, {
+ "name": ""
+ ,"title": "layuiAdmin官网"
+ ,"jump": "/iframe/link/layuiAdmin"
+ }]
+ }]
+ }, {
+ "name": "app"
+ ,"title": "应用"
+ ,"icon": "layui-icon-app"
+ ,"list": [{
+ "name": "message"
+ ,"title": "消息中心"
+ }]
+ }, {
+ "name": "senior"
+ ,"title": "高级"
+ ,"icon": "layui-icon-senior"
+ ,"list": [{
+ "name": "im"
+ ,"title": "通讯系统"
+ }]
+ }, {
+ "name": "user"
+ ,"title": "用户"
+ ,"icon": "layui-icon-user"
+ ,"list": [{
+ "name": "user"
+ ,"title": "用户"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "用户列表"
+ }]
+ },{
+ "name": "administrators"
+ ,"title": "后台管理组"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "管理员列表"
+ },{
+ "name": "role"
+ ,"title": "角色管理"
+ }]
+ }]
+ }, {
+ "name": "set"
+ ,"title": "设置"
+ ,"icon": "layui-icon-set"
+ ,"list": [{
+ "name": "base"
+ ,"title": "基本设置"
+ ,"spread": true
+ ,"list": [{
+ "name": "website"
+ ,"title": "系统设置"
+ },{
+ "name": "email"
+ ,"title": "邮件服务"
+ }]
+ },{
+ "name": "security"
+ ,"title": "安全设置"
+ }]
+ }, {
+ "name": "get"
+ ,"title": "授权"
+ ,"icon": "layui-icon-auz"
+ ,"jump": "system/get"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/menu1.js b/public/static/admin/json/menu1.js
new file mode 100644
index 0000000..0cfd0c0
--- /dev/null
+++ b/public/static/admin/json/menu1.js
@@ -0,0 +1,271 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": [{
+ "name": "component"
+ ,"title": "组件"
+ ,"icon": "layui-icon-component"
+ ,"list": [{
+ "name": "grid"
+ ,"title": "栅格"
+ ,"list": [{
+ "name": "list"
+ ,"title": "等比例列表排列"
+ },{
+ "name": "mobile"
+ ,"title": "按移动端排列"
+ },{
+ "name": "mobile-pc"
+ ,"title": "移动桌面端组合"
+ },{
+ "name": "all"
+ ,"title": "全端复杂组合"
+ },{
+ "name": "stack"
+ ,"title": "低于桌面堆叠排列"
+ },{
+ "name": "speed-dial"
+ ,"title": "九宫格"
+ }]
+ }, {
+ "name": "button"
+ ,"title": "按钮"
+ }, {
+ "name": "form"
+ ,"title": "表单"
+ ,"list": [{
+ "name": "element"
+ ,"title": "表单元素"
+ },{
+ "name": "group"
+ ,"title": "表单组合"
+ }]
+ }, {
+ "name": "nav"
+ ,"title": "导航"
+ }, {
+ "name": "tabs"
+ ,"title": "选项卡"
+ }, {
+ "name": "progress"
+ ,"title": "进度条"
+ }, {
+ "name": "panel"
+ ,"title": "面板"
+ }, {
+ "name": "badge"
+ ,"title": "徽章"
+ }, {
+ "name": "timeline"
+ ,"title": "时间线"
+ }, {
+ "name": "anim"
+ ,"title": "动画"
+ }, {
+ "name": "auxiliar"
+ ,"title": "辅助"
+ }, {
+ "name": "layer"
+ ,"title": "通用弹层"
+ ,"list": [{
+ "name": "list"
+ ,"title": "功能演示"
+ },{
+ "name": "special-demo"
+ ,"title": "特殊示例"
+ },{
+ "name": "theme"
+ ,"title": "风格定制"
+ }]
+ }, {
+ "name": "laydate"
+ ,"title": "日期时间"
+ }, {
+ "name": "table"
+ ,"title": "表格"
+ }, {
+ "name": "laypage"
+ ,"title": "分页"
+ }, {
+ "name": "upload"
+ ,"title": "上传"
+ }, {
+ "name": "carousel"
+ ,"title": "轮播"
+ }, {
+ "name": "laytpl"
+ ,"title": "模板引擎"
+ }, {
+ "name": "flow"
+ ,"title": "流加载"
+ }, {
+ "name": "util"
+ ,"title": "工具"
+ }, {
+ "name": "code"
+ ,"title": "代码修饰"
+ }, {
+ "name": "layim"
+ ,"title": "即时聊天"
+ ,"jump": "senior/im/chat"
+ }]
+ }, {
+ "name": "template"
+ ,"title": "模板"
+ ,"icon": "layui-icon-template"
+ ,"list": [{
+ "name": "user"
+ ,"title": "用户相关"
+ ,"spread": true
+ ,"list": [{
+ "name": "reg"
+ ,"title": "注册"
+ ,"jump": "user/reg"
+ },{
+ "name": "login"
+ ,"title": "登入"
+ ,"jump": "user/login"
+ },{
+ "name": "forget"
+ ,"title": "忘记密码"
+ ,"jump": "user/forget"
+ }]
+ }, {
+ "name": "tips"
+ ,"title": "提示页面"
+ ,"spread": true
+ ,"list": [{
+ "name": "404"
+ ,"title": "404"
+ },{
+ "name": "error"
+ ,"title": "错误提示"
+ }]
+ }]
+ }, {
+ "name": "app"
+ ,"title": "应用"
+ ,"icon": "layui-icon-app"
+ ,"list": [{
+ "name": "message"
+ ,"title": "消息中心"
+ },{
+ "name": "content"
+ ,"title": "内容系统"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "所有文章"
+ },{
+ "name": "comment"
+ ,"title": "评论管理"
+ },{
+ "name": "tags"
+ ,"title": "标签管理"
+ }]
+ },{
+ "name": "forum"
+ ,"title": "社区系统"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "全部帖子"
+ },{
+ "name": "replys"
+ ,"title": "所有回帖"
+ }]
+ },{
+ "name": "mall"
+ ,"title": "商城管理"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "商品列表"
+ },{
+ "name": "category"
+ ,"title": "分类管理"
+ },{
+ "name": "specs"
+ ,"title": "规格管理"
+ }]
+ }]
+ }, {
+ "name": "senior"
+ ,"title": "高级"
+ ,"icon": "layui-icon-senior"
+ ,"list": [{
+ "name": "im"
+ ,"title": "通讯系统"
+ ,"spread": true
+ ,"list": [{
+ "name": "chat"
+ ,"title": "社交聊天"
+ },{
+ "name": "kefu"
+ ,"title": "客服系统"
+ }]
+ },{
+ "name": "echarts"
+ ,"title": "Echarts 集成"
+ ,"spread": true
+ ,"list": [{
+ "name": "line"
+ ,"title": "折线图"
+ },{
+ "name": "bar"
+ ,"title": "柱状图"
+ },{
+ "name": "map"
+ ,"title": "地图"
+ }]
+ }]
+ }, {
+ "name": "user"
+ ,"title": "用户"
+ ,"icon": "layui-icon-user"
+ ,"list": [{
+ "name": "user"
+ ,"title": "用户"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "用户列表"
+ }]
+ },{
+ "name": "administrators"
+ ,"title": "后台管理组"
+ ,"spread": true
+ ,"list": [{
+ "name": "list"
+ ,"title": "管理员列表"
+ },{
+ "name": "role"
+ ,"title": "角色管理"
+ }]
+ }]
+ }, {
+ "name": "set"
+ ,"title": "设置"
+ ,"icon": "layui-icon-set"
+ ,"list": [{
+ "name": "base"
+ ,"title": "基本设置"
+ ,"spread": true
+ ,"list": [{
+ "name": "website"
+ ,"title": "系统设置"
+ },{
+ "name": "email"
+ ,"title": "邮件服务"
+ }]
+ },{
+ "name": "security"
+ ,"title": "安全设置"
+ }]
+ }, {
+ "name": "get"
+ ,"title": "授权"
+ ,"icon": "layui-icon-auz"
+ ,"jump": "system/get"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/message/all.js b/public/static/admin/json/message/all.js
new file mode 100644
index 0000000..da50293
--- /dev/null
+++ b/public/static/admin/json/message/all.js
@@ -0,0 +1,46 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": 60
+ ,"data": [{
+ "id": 123
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510363800000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1507447570000
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/message/detail.js b/public/static/admin/json/message/detail.js
new file mode 100644
index 0000000..010b950
--- /dev/null
+++ b/public/static/admin/json/message/detail.js
@@ -0,0 +1,10 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"content": "一直以来,layui 秉承无偿开源的初心,虔诚致力于服务各层次前后端 Web 开发者,在商业横飞的当今时代,这一信念从未动摇。即便身单力薄,仍然重拾决心,埋头造轮,以尽可能地填补产品本身的缺口。在过去的一段的时间,我一直在寻求持久之道,已维持你眼前所见的一切。而 layuiAdmin 是我们尝试解决的手段之一。我相信真正有爱于 layui 生态的你,定然不会错过这一拥抱吧。
子曰:君子不用防,小人防不住。请务必通过官网正规渠道,获得 layuiAdmin!
—— 贤心(layui.com)
"
+ ,"time": 1510363800000
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/message/direct.js b/public/static/admin/json/message/direct.js
new file mode 100644
index 0000000..8f0ddbe
--- /dev/null
+++ b/public/static/admin/json/message/direct.js
@@ -0,0 +1,46 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": 60
+ ,"data": [{
+ "id": 123
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510363800000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "贤心发来了一段私信"
+ ,"time": 1507447570000
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/message/new.js b/public/static/admin/json/message/new.js
new file mode 100644
index 0000000..668f4b5
--- /dev/null
+++ b/public/static/admin/json/message/new.js
@@ -0,0 +1,7 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": {
+ "newmsg": 3
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/message/notice.js b/public/static/admin/json/message/notice.js
new file mode 100644
index 0000000..665f677
--- /dev/null
+++ b/public/static/admin/json/message/notice.js
@@ -0,0 +1,46 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": 60
+ ,"data": [{
+ "id": 123
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510363800000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1510212370000
+ }, {
+ "id": 111
+ ,"title": "你好新朋友,感谢使用 layuiAdmin"
+ ,"time": 1507447570000
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/table/demo.js b/public/static/admin/json/table/demo.js
new file mode 100644
index 0000000..8f90d90
--- /dev/null
+++ b/public/static/admin/json/table/demo.js
@@ -0,0 +1,96 @@
+
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": 3000000
+ ,"data": [{
+ "id": "10001"
+ ,"username": "杜甫"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "点击此处,显示更多。当内容超出时,点击单元格会自动显示更多内容。"
+ ,"experience": "116"
+ ,"ip": "192.168.0.8"
+ ,"logins": "108"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10002"
+ ,"username": "李白"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子,丹丘生,将进酒,杯莫停。 与君歌一曲,请君为我倾耳听。(倾耳听 一作:侧耳听) 钟鼓馔玉不足贵,但愿长醉不复醒。(不足贵 一作:何足贵;不复醒 一作:不愿醒/不用醒) 古来圣贤皆寂寞,惟有饮者留其名。(古来 一作:自古;惟 通:唯) 陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱,径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。"
+ ,"experience": "12"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ ,"LAY_CHECKED": true
+ }, {
+ "id": "10003"
+ ,"username": "王勃"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "65"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10004"
+ ,"username": "李清照"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "女"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "666"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10005"
+ ,"username": "冰心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "女"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "86"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10006"
+ ,"username": "贤心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "12"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10007"
+ ,"username": "贤心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "16"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10008"
+ ,"username": "贤心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "106"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/table/demo2.js b/public/static/admin/json/table/demo2.js
new file mode 100644
index 0000000..f6fae59
--- /dev/null
+++ b/public/static/admin/json/table/demo2.js
@@ -0,0 +1,61 @@
+
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": 66
+ ,"data": [{
+ "username": "张小三"
+ ,"amount": 18
+ ,"province": "浙江"
+ ,"city": "杭州"
+ ,"zone": "西湖区"
+ ,"street": "西溪街道"
+ ,"address": "西溪花园"
+ ,"house": "30栋1单元"
+ }, {
+ "username": "李小四"
+ ,"amount": 39
+ ,"province": "江苏"
+ ,"city": "苏州"
+ ,"zone": "姑苏区"
+ ,"street": "丝绸路"
+ ,"address": "天墅之城"
+ ,"house": "9幢2单元"
+ }, {
+ "username": "王小五"
+ ,"amount": 8
+ ,"province": "江西"
+ ,"city": "南昌"
+ ,"zone": "青山湖区"
+ ,"street": "艾溪湖办事处"
+ ,"address": "中兴和园"
+ ,"house": "1幢3单元"
+ }, {
+ "username": "赵小六"
+ ,"amount": 16
+ ,"province": "福建"
+ ,"city": "泉州"
+ ,"zone": "丰泽区"
+ ,"street": "南洋街道"
+ ,"address": "南洋村"
+ ,"house": "6幢1单元"
+ }, {
+ "username": "孙小七"
+ ,"amount": 12
+ ,"province": "湖北"
+ ,"city": "武汉"
+ ,"zone": "武昌区"
+ ,"street": "武昌大道"
+ ,"address": "两湖花园"
+ ,"house": "16幢2单元"
+ }, {
+ "username": "周小八"
+ ,"amount": 11
+ ,"province": "安徽"
+ ,"city": "黄山"
+ ,"zone": "黄山区"
+ ,"street": "汤口镇"
+ ,"address": "温泉村"
+ ,"house": "21号"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/table/demo3.js b/public/static/admin/json/table/demo3.js
new file mode 100644
index 0000000..93d0e65
--- /dev/null
+++ b/public/static/admin/json/table/demo3.js
@@ -0,0 +1,96 @@
+{
+ "status": 200
+ ,"message": ""
+ ,"total": 8
+ ,"rows": {
+ "item": [{
+ "id": "10001"
+ ,"username": "杜甫"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "点击此处,显示更多。当内容超出时,点击单元格会自动显示更多内容。"
+ ,"experience": "116"
+ ,"ip": "192.168.0.8"
+ ,"logins": "108"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10002"
+ ,"username": "李白"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子,丹丘生,将进酒,杯莫停。 与君歌一曲,请君为我倾耳听。(倾耳听 一作:侧耳听) 钟鼓馔玉不足贵,但愿长醉不复醒。(不足贵 一作:何足贵;不复醒 一作:不愿醒/不用醒) 古来圣贤皆寂寞,惟有饮者留其名。(古来 一作:自古;惟 通:唯) 陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱,径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。"
+ ,"experience": "12"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10003"
+ ,"username": "王勃"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "65"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10004"
+ ,"username": "李清照"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "女"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "666"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10005"
+ ,"username": "冰心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "女"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "86"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10006"
+ ,"username": "贤心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "12"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10007"
+ ,"username": "贤心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "16"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }, {
+ "id": "10008"
+ ,"username": "贤心"
+ ,"email": "xianxin@layui.com"
+ ,"sex": "男"
+ ,"city": "浙江杭州"
+ ,"sign": "人生恰似一场修行"
+ ,"experience": "106"
+ ,"ip": "192.168.0.8"
+ ,"logins": "106"
+ ,"joinTime": "2016-10-14"
+ }]
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/table/user.js b/public/static/admin/json/table/user.js
new file mode 100644
index 0000000..240c7aa
--- /dev/null
+++ b/public/static/admin/json/table/user.js
@@ -0,0 +1,2 @@
+
+{"code":0,"msg":"","count":1000,"data":[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75}]}
\ No newline at end of file
diff --git a/public/static/admin/json/table/user30.js b/public/static/admin/json/table/user30.js
new file mode 100644
index 0000000..0246bbd
--- /dev/null
+++ b/public/static/admin/json/table/user30.js
@@ -0,0 +1,2 @@
+
+{"code":0,"msg":"","count":1000,"data":[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75},{"id":10010,"username":"user-10","sex":"女","city":"城市-10","sign":"签名-10","experience":1016,"logins":182,"wealth":71294671,"classify":"诗人","score":34},{"id":10011,"username":"user-11","sex":"女","city":"城市-11","sign":"签名-11","experience":492,"logins":107,"wealth":8062783,"classify":"诗人","score":6},{"id":10012,"username":"user-12","sex":"女","city":"城市-12","sign":"签名-12","experience":106,"logins":176,"wealth":42622704,"classify":"词人","score":54},{"id":10013,"username":"user-13","sex":"男","city":"城市-13","sign":"签名-13","experience":1047,"logins":94,"wealth":59508583,"classify":"诗人","score":63},{"id":10014,"username":"user-14","sex":"男","city":"城市-14","sign":"签名-14","experience":873,"logins":116,"wealth":72549912,"classify":"词人","score":8},{"id":10015,"username":"user-15","sex":"女","city":"城市-15","sign":"签名-15","experience":1068,"logins":27,"wealth":52737025,"classify":"作家","score":28},{"id":10016,"username":"user-16","sex":"女","city":"城市-16","sign":"签名-16","experience":862,"logins":168,"wealth":37069775,"classify":"酱油","score":86},{"id":10017,"username":"user-17","sex":"女","city":"城市-17","sign":"签名-17","experience":1060,"logins":187,"wealth":66099525,"classify":"作家","score":69},{"id":10018,"username":"user-18","sex":"女","city":"城市-18","sign":"签名-18","experience":866,"logins":88,"wealth":81722326,"classify":"词人","score":74},{"id":10019,"username":"user-19","sex":"女","city":"城市-19","sign":"签名-19","experience":682,"logins":106,"wealth":68647362,"classify":"词人","score":51},{"id":10020,"username":"user-20","sex":"男","city":"城市-20","sign":"签名-20","experience":770,"logins":24,"wealth":92420248,"classify":"诗人","score":87},{"id":10021,"username":"user-21","sex":"男","city":"城市-21","sign":"签名-21","experience":184,"logins":131,"wealth":71566045,"classify":"词人","score":99},{"id":10022,"username":"user-22","sex":"男","city":"城市-22","sign":"签名-22","experience":739,"logins":152,"wealth":60907929,"classify":"作家","score":18},{"id":10023,"username":"user-23","sex":"女","city":"城市-23","sign":"签名-23","experience":127,"logins":82,"wealth":14765943,"classify":"作家","score":30},{"id":10024,"username":"user-24","sex":"女","city":"城市-24","sign":"签名-24","experience":212,"logins":133,"wealth":59011052,"classify":"词人","score":76},{"id":10025,"username":"user-25","sex":"女","city":"城市-25","sign":"签名-25","experience":938,"logins":182,"wealth":91183097,"classify":"作家","score":69},{"id":10026,"username":"user-26","sex":"男","city":"城市-26","sign":"签名-26","experience":978,"logins":7,"wealth":48008413,"classify":"作家","score":65},{"id":10027,"username":"user-27","sex":"女","city":"城市-27","sign":"签名-27","experience":371,"logins":44,"wealth":64419691,"classify":"诗人","score":60},{"id":10028,"username":"user-28","sex":"女","city":"城市-28","sign":"签名-28","experience":977,"logins":21,"wealth":75935022,"classify":"作家","score":37},{"id":10029,"username":"user-29","sex":"男","city":"城市-29","sign":"签名-29","experience":647,"logins":107,"wealth":97450636,"classify":"酱油","score":27}]}
\ No newline at end of file
diff --git a/public/static/admin/json/upload/demo.js b/public/static/admin/json/upload/demo.js
new file mode 100644
index 0000000..77674fe
--- /dev/null
+++ b/public/static/admin/json/upload/demo.js
@@ -0,0 +1,7 @@
+{
+ "code": 0,
+ "msg": "",
+ "data": {
+ "src": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/forget.js b/public/static/admin/json/user/forget.js
new file mode 100644
index 0000000..836bba4
--- /dev/null
+++ b/public/static/admin/json/user/forget.js
@@ -0,0 +1,7 @@
+{
+ "code": 0
+ ,"msg": "注册成功"
+ ,"data": {
+
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/login.js b/public/static/admin/json/user/login.js
new file mode 100644
index 0000000..ff906d5
--- /dev/null
+++ b/public/static/admin/json/user/login.js
@@ -0,0 +1,7 @@
+{
+ "code": 0
+ ,"msg": "登入成功"
+ ,"data": {
+ "access_token": "c262e61cd13ad99fc650e6908c7e5e65b63d2f32185ecfed6b801ee3fbdd5c0a"
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/logout.js b/public/static/admin/json/user/logout.js
new file mode 100644
index 0000000..9fd1ff2
--- /dev/null
+++ b/public/static/admin/json/user/logout.js
@@ -0,0 +1,5 @@
+{
+ "code": 0
+ ,"msg": "退出成功"
+ ,"data": null
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/reg.js b/public/static/admin/json/user/reg.js
new file mode 100644
index 0000000..836bba4
--- /dev/null
+++ b/public/static/admin/json/user/reg.js
@@ -0,0 +1,7 @@
+{
+ "code": 0
+ ,"msg": "注册成功"
+ ,"data": {
+
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/resetpass.js b/public/static/admin/json/user/resetpass.js
new file mode 100644
index 0000000..836bba4
--- /dev/null
+++ b/public/static/admin/json/user/resetpass.js
@@ -0,0 +1,7 @@
+{
+ "code": 0
+ ,"msg": "注册成功"
+ ,"data": {
+
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/session.js b/public/static/admin/json/user/session.js
new file mode 100644
index 0000000..54ce1ef
--- /dev/null
+++ b/public/static/admin/json/user/session.js
@@ -0,0 +1,9 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"data": {
+ "username": "贤心"
+ ,"sex": "男"
+ ,"role": 1
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/user/sms.js b/public/static/admin/json/user/sms.js
new file mode 100644
index 0000000..836bba4
--- /dev/null
+++ b/public/static/admin/json/user/sms.js
@@ -0,0 +1,7 @@
+{
+ "code": 0
+ ,"msg": "注册成功"
+ ,"data": {
+
+ }
+}
\ No newline at end of file
diff --git a/public/static/admin/json/useradmin/mangadmin.js b/public/static/admin/json/useradmin/mangadmin.js
new file mode 100644
index 0000000..50d3e28
--- /dev/null
+++ b/public/static/admin/json/useradmin/mangadmin.js
@@ -0,0 +1,78 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "1001"
+ ,"loginname": "admin"
+ ,"telphone": "11111111111"
+ ,"email": "111@qq.com"
+ ,"role": "超级管理员"
+ ,"jointime": "20150217"
+ ,"check": true
+ },{
+ "id": "1002"
+ ,"loginname": "common-1"
+ ,"telphone": "22222222222"
+ ,"email": "222@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20160217"
+ ,"check": false
+ },{
+ "id": "1003"
+ ,"loginname": "common-2"
+ ,"telphone": "33333333333"
+ ,"email": "333@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20161012"
+ ,"check": false
+ },{
+ "id": "1004"
+ ,"loginname": "common-3"
+ ,"telphone": "44444444444"
+ ,"email": "444@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20170518"
+ ,"check": true
+ },{
+ "id": "1005"
+ ,"loginname": "common-4"
+ ,"telphone": "55555555555"
+ ,"email": "555@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20180101"
+ ,"check": false
+ },{
+ "id": "1006"
+ ,"loginname": "common-5"
+ ,"telphone": "66666666666"
+ ,"email": "666@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20160217"
+ ,"check": false
+ },{
+ "id": "1007"
+ ,"loginname": "common-6"
+ ,"telphone": "77777777777"
+ ,"email": "777@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20161012"
+ ,"check": false
+ },{
+ "id": "1008"
+ ,"loginname": "common-7"
+ ,"telphone": "88888888888"
+ ,"email": "888@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20170518"
+ ,"check": true
+ },{
+ "id": "1009"
+ ,"loginname": "common-8"
+ ,"telphone": "99999999999"
+ ,"email": "999@qq.com"
+ ,"role": "管理员"
+ ,"jointime": "20180101"
+ ,"check": false
+ }]
+}
diff --git a/public/static/admin/json/useradmin/role.js b/public/static/admin/json/useradmin/role.js
new file mode 100644
index 0000000..6d5ba5d
--- /dev/null
+++ b/public/static/admin/json/useradmin/role.js
@@ -0,0 +1,54 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "1"
+ ,"rolename": "超级管理员"
+ ,"limits": "管理所有的管理员"
+ ,"descr": "拥有至高无上的权利"
+ ,"check": true
+ },{
+ "id": "2"
+ ,"rolename": "管理员"
+ ,"limits": "所有列表的管理"
+ ,"descr": "事情很多,权力很大"
+ ,"check": true
+ },{
+ "id": "3"
+ ,"rolename": "文章撰写员"
+ ,"limits": "负责文章的编写"
+ ,"descr": "文采第一的人才集合"
+ ,"check": false
+ },{
+ "id": "4"
+ ,"rolename": "纠错员"
+ ,"limits": "负责文章内容的修改"
+ ,"descr": "暂无"
+ ,"check": false
+ },{
+ "id": "5"
+ ,"rolename": "统计人员"
+ ,"limits": "对数据进行统计"
+ ,"descr": "暂无"
+ ,"check": false
+ },{
+ "id": "6"
+ ,"rolename": "评估员"
+ ,"limits": "对统计数据进行评估"
+ ,"descr": "及时捕捉市场发展动态"
+ ,"check": false
+ },{
+ "id": "7"
+ ,"rolename": "采购员"
+ ,"limits": "负责员工的伙食"
+ ,"descr": "暂无"
+ ,"check": false
+ },{
+ "id": "8"
+ ,"rolename": "推销员"
+ ,"limits": "介绍销售公司产品"
+ ,"descr": "暂无"
+ ,"check": false
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/useradmin/webuser.js b/public/static/admin/json/useradmin/webuser.js
new file mode 100644
index 0000000..02a7b41
--- /dev/null
+++ b/public/static/admin/json/useradmin/webuser.js
@@ -0,0 +1,143 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "id": "001"
+ ,"username": "用户-1"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "002"
+ ,"username": "用户-2"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "003"
+ ,"username": "用户-3"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "女"
+ ,"ip": "1111111"
+ ,"jointime": 20171011
+ ,"LAY_CHECKED": true
+ },{
+ "id": "004"
+ ,"username": "用户-4"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20160505
+ },{
+ "id": "005"
+ ,"username": "用户-5"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "006"
+ ,"username": "用户-6"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "007"
+ ,"username": "用户-7"
+ ,"avatar": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4keca8ag208g06iglw.gif"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20180210
+ },{
+ "id": "008"
+ ,"username": "用户-8"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "女"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "009"
+ ,"username": "用户-9"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "女"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "010"
+ ,"username": "用户-10"
+ ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20170719
+ },{
+ "id": "011"
+ ,"username": "用户-11"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "012"
+ ,"username": "用户-12"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "女"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "013"
+ ,"username": "用户-13"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "女"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ ,"LAY_CHECKED": true
+ },{
+ "id": "014"
+ ,"username": "用户-14"
+ ,"avatar": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4keca8ag208g06iglw.gif"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ },{
+ "id": "015"
+ ,"username": "用户-15"
+ ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg"
+ ,"phone": 12345678901
+ ,"email": "11111@qq.com"
+ ,"sex": "男"
+ ,"ip": "1111111"
+ ,"jointime": 20171204
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/workorder/demo.js b/public/static/admin/json/workorder/demo.js
new file mode 100644
index 0000000..81066c2
--- /dev/null
+++ b/public/static/admin/json/workorder/demo.js
@@ -0,0 +1,78 @@
+{
+ "code": 0
+ ,"msg": ""
+ ,"count": "100"
+ ,"data": [{
+ "orderid": 111
+ ,"title": "移动支付踏入马来西亚,聚合支付紧随其后"
+ ,"attr": "公告"
+ ,"progress": "25%"
+ ,"submit": "贤心"
+ ,"accept": "员工-1"
+ ,"state": "处理中"
+ },{
+ "orderid": 222
+ ,"title": "凡科拖拽式免费建站神器,享双重优惠!"
+ ,"attr": "讨论"
+ ,"progress": "100%"
+ ,"submit": "猫吃"
+ ,"accept": "员工-1"
+ ,"state": "已处理"
+ },{
+ "orderid": 333
+ ,"title": "看着别人的老板给员工送汽车有感"
+ ,"attr": "分享"
+ ,"progress": "0%"
+ ,"submit": "纸飞机"
+ ,"accept": ""
+ ,"state": "未分配"
+ },{
+ "orderid": 444
+ ,"title": "DISCUZ的云平台应该彻底完了"
+ ,"attr": "提问"
+ ,"progress": "0%"
+ ,"submit": "纸飞机"
+ ,"accept": ""
+ ,"state": "未分配"
+ },{
+ "orderid": 555
+ ,"title": "现在个人网站还有必要长期坚持下去吗?"
+ ,"attr": "提问"
+ ,"progress": "50%"
+ ,"submit": "纸飞机"
+ ,"accept": "员工-2"
+ ,"state": "处理中"
+ },{
+ "orderid": 666
+ ,"title": "向北京公安局投诉了京东商城"
+ ,"attr": "公告"
+ ,"progress": "25%"
+ ,"submit": "纸飞机"
+ ,"accept": "员工-3"
+ ,"state": "处理中"
+ },{
+ "orderid": 777
+ ,"title": "游戏 网页美工,一个月多少工资才正常?"
+ ,"attr": "提问"
+ ,"progress": "100%"
+ ,"submit": "纸飞机"
+ ,"accept": "员工-1"
+ ,"state": "已处理"
+ },{
+ "orderid": 888
+ ,"title": "几年没来了,蓝色理想帖子这么少了啊"
+ ,"attr": "提问"
+ ,"progress": "0%"
+ ,"submit": "纸飞机"
+ ,"accept": ""
+ ,"state": "未分配"
+ },{
+ "orderid": 999
+ ,"title": "我的天,求推荐靠谱的学习网站"
+ ,"attr": "提问"
+ ,"progress": "50%"
+ ,"submit": "纸飞机"
+ ,"accept": "员工-2"
+ ,"state": "处理中"
+ }]
+}
\ No newline at end of file
diff --git a/public/static/admin/json/璇存槑.txt b/public/static/admin/json/璇存槑.txt
new file mode 100644
index 0000000..ff402e5
--- /dev/null
+++ b/public/static/admin/json/璇存槑.txt
@@ -0,0 +1,3 @@
+
+注意:这里是模拟的数据。
+实际应用时,请在模板文件(.html)中的 lay-url="" 和其它相关接口的 url 设置成你真实的接口地址
\ No newline at end of file
diff --git a/public/static/admin/layui/css/layui.css b/public/static/admin/layui/css/layui.css
new file mode 100644
index 0000000..0e8508f
--- /dev/null
+++ b/public/static/admin/layui/css/layui.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-body,.layui-edge,.layui-elip{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=250);src:url(../font/iconfont.eot?v=250#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=250) format('woff2'),url(../font/iconfont.woff?v=250) format('woff'),url(../font/iconfont.ttf?v=250) format('truetype'),url(../font/iconfont.svg?v=250#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-home:before{content:"\e68e"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-cols:before{content:"\e610"}.layui-icon-export:before{content:"\e67d"}.layui-icon-print:before{content:"\e66d"}.layui-icon-slider:before{content:"\e714"}.layui-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-service:before{content:"\e626"}.layui-icon-transfer:before{content:"\e691"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:fixed;top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#e6e6e6}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#e6e6e6;color:#C9C9C9}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f2f2f2;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #e6e6e6;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;z-index:66666666;width:280px;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#e2e2e2;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #e6e6e6;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-15px}.layui-slider-input-btn{display:none;position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #d2d2d2}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #d2d2d2}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:34px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:'';position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:'';position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:'';position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/layui.mobile.css b/public/static/admin/layui/css/layui.mobile.css
new file mode 100644
index 0000000..0743570
--- /dev/null
+++ b/public/static/admin/layui/css/layui.mobile.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/code.css b/public/static/admin/layui/css/modules/code.css
new file mode 100644
index 0000000..d5ecb86
--- /dev/null
+++ b/public/static/admin/layui/css/modules/code.css
@@ -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}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/laydate/default/laydate.css b/public/static/admin/layui/css/modules/laydate/default/laydate.css
new file mode 100644
index 0000000..6b10891
--- /dev/null
+++ b/public/static/admin/layui/css/modules/laydate/default/laydate.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layer/default/icon-ext.png b/public/static/admin/layui/css/modules/layer/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/icon-ext.png differ
diff --git a/public/static/admin/layui/css/modules/layer/default/icon.png b/public/static/admin/layui/css/modules/layer/default/icon.png
new file mode 100644
index 0000000..3e17da8
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/icon.png differ
diff --git a/public/static/admin/layui/css/modules/layer/default/layer.css b/public/static/admin/layui/css/modules/layer/default/layer.css
new file mode 100644
index 0000000..7c50462
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layer/default/layer.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-0.gif b/public/static/admin/layui/css/modules/layer/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-0.gif differ
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-1.gif b/public/static/admin/layui/css/modules/layer/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-1.gif differ
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-2.gif b/public/static/admin/layui/css/modules/layer/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-2.gif differ
diff --git a/public/static/admin/layui/css/modules/layim/html/chatlog.html b/public/static/admin/layui/css/modules/layim/html/chatlog.html
new file mode 100644
index 0000000..9cbc571
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layim/html/chatlog.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+聊天记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/static/admin/layui/css/modules/layim/html/find.html b/public/static/admin/layui/css/modules/layim/html/find.html
new file mode 100644
index 0000000..ff5cab1
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layim/html/find.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+发现
+
+
+
+
+
+
+
+
此为自定义的【查找】页面,因需求不一,所以官方暂不提供该模版结构与样式,实际使用时,可移至该文件到你的项目中,对页面自行把控。
+
文件所在目录(相对于layui.js):/css/modules/layim/html/find.html
+
+
+
+
+
+
+
+
diff --git a/public/static/admin/layui/css/modules/layim/html/getmsg.json b/public/static/admin/layui/css/modules/layim/html/getmsg.json
new file mode 100644
index 0000000..3d9b9d4
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layim/html/getmsg.json
@@ -0,0 +1,87 @@
+{
+ "code": 0,
+ "pages": 1,
+ "data": [
+ {
+ "id": 76,
+ "content": "申请添加你为好友",
+ "uid": 168,
+ "from": 166488,
+ "from_group": 0,
+ "type": 1,
+ "remark": "有问题要问",
+ "href": null,
+ "read": 1,
+ "time": "刚刚",
+ "user": {
+ "id": 166488,
+ "avatar": "http://q.qlogo.cn/qqapp/101235792/B704597964F9BD0DB648292D1B09F7E8/100",
+ "username": "李彦宏",
+ "sign": null
+ }
+ },
+ {
+ "id": 75,
+ "content": "申请添加你为好友",
+ "uid": 168,
+ "from": 347592,
+ "from_group": 0,
+ "type": 1,
+ "remark": "你好啊!",
+ "href": null,
+ "read": 1,
+ "time": "刚刚",
+ "user": {
+ "id": 347592,
+ "avatar": "http://q.qlogo.cn/qqapp/101235792/B78751375E0531675B1272AD994BA875/100",
+ "username": "麻花疼",
+ "sign": null
+ }
+ },
+ {
+ "id": 62,
+ "content": "雷军 拒绝了你的好友申请",
+ "uid": 168,
+ "from": null,
+ "from_group": null,
+ "type": 1,
+ "remark": null,
+ "href": null,
+ "read": 1,
+ "time": "10天前",
+ "user": {
+ "id": null
+ }
+ },
+ {
+ "id": 60,
+ "content": "马小云 已经同意你的好友申请",
+ "uid": 168,
+ "from": null,
+ "from_group": null,
+ "type": 1,
+ "remark": null,
+ "href": null,
+ "read": 1,
+ "time": "10天前",
+ "user": {
+ "id": null
+ }
+ },
+ {
+ "id": 61,
+ "content": "贤心 已经同意你的好友申请",
+ "uid": 168,
+ "from": null,
+ "from_group": null,
+ "type": 1,
+ "remark": null,
+ "href": null,
+ "read": 1,
+ "time": "10天前",
+ "user": {
+ "id": null
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layim/html/msgbox.html b/public/static/admin/layui/css/modules/layim/html/msgbox.html
new file mode 100644
index 0000000..0adf002
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layim/html/msgbox.html
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+消息盒子
+
+
+
+
+
+
+
+
+
+
注意:这些都是模拟数据,实际使用时,需将其中的模拟接口改为你的项目真实接口。
+
该模版文件所在目录(相对于layui.js):/css/modules/layim/html/msgbox.html
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/static/admin/layui/css/modules/layim/layim.css b/public/static/admin/layui/css/modules/layim/layim.css
new file mode 100644
index 0000000..69ad58a
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layim/layim.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ html #layuicss-skinlayimcss{display:none;position:absolute;width:1989px}body .layui-layim,body .layui-layim-chat{border:1px solid #D9D9D9;border-color:rgba(0,0,0,.05);background-repeat:no-repeat;background-color:#F6F6F6;color:#333;font-family:\5FAE\8F6F\96C5\9ED1}body .layui-layim-chat{background-size:cover}body .layui-layim .layui-layer-title{height:110px;border-bottom:none;background:0 0}.layui-layim-main{position:relative;top:-98px;left:0}body .layui-layim .layui-layer-content,body .layui-layim-chat .layui-layer-content{overflow:visible}.layui-layim cite,.layui-layim em,.layui-layim-chat cite,.layui-layim-chat em{font-style:normal}.layui-layim-info{height:50px;font-size:0;padding:0 15px}.layui-layim-info *{font-size:14px}.layim-tab-content li h5 *,.layui-layim-info div,.layui-layim-skin li,.layui-layim-tab li,.layui-layim-tool li{display:inline-block;vertical-align:top;*zoom:1;*display:inline}.layim-tab-content li h5 span,.layui-layim-info .layui-layim-user,.layui-layim-list li p,.layui-layim-list li span,.layui-layim-remark{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-layim-info .layui-layim-user{max-width:150px;margin-right:5px;font-size:16px}.layui-layim-status{position:relative;top:2px;line-height:19px;cursor:pointer}.layim-status-online{color:#3FDD86}.layim-status-hide{color:#DD691D}.layim-menu-box{display:none;position:absolute;z-index:100;top:24px;left:-31px;padding:5px 0;width:85px;border:1px solid #E2E2E2;border-radius:2px;background-color:#fff;box-shadow:1px 1px 20px rgba(0,0,0,.1)}.layim-menu-box li{position:relative;line-height:22px;padding-left:30px;font-size:12px}.layim-menu-box li cite{padding-right:5px;font-size:14px}.layim-menu-box li i{display:none;position:absolute;left:8px;top:0;font-weight:700;color:#5FB878}.layim-menu-box .layim-this i{display:block}.layim-menu-box li:hover{background-color:#eee}.layui-layim-remark{position:relative;left:-6px;display:block;width:100%;border:1px solid transparent;margin-top:8px;padding:0 5px;height:26px;line-height:26px;background:0 0;border-radius:2px}.layui-layim-remark:focus,.layui-layim-remark:hover{border:1px solid #d2d2d2;border-color:rgba(0,0,0,.15)}.layui-layim-remark:focus{background-color:#fff}.layui-layim-tab{margin-top:10px;padding:9px 0;font-size:0}.layui-layim-tab li{position:relative;width:33.33%;height:24px;line-height:24px;font-size:22px;text-align:center;color:#666;color:rgba(0,0,0,.6);cursor:pointer}.layim-tab-two li{width:50%}.layui-layim-tab li.layim-this:after{content:'';position:absolute;left:0;bottom:-9px;width:100%;height:3px;background-color:#3FDD86}.layui-layim-tab li.layim-hide{display:none}.layui-layim-tab li:hover{opacity:.8;filter:Alpha(opacity=80)}.layim-tab-content{display:none;padding:10px 0;height:349px;overflow:hidden;background-color:#fff;background-color:rgba(255,255,255,.9)}.layim-tab-content:hover{overflow-y:auto}.layim-tab-content li h5{position:relative;margin-right:15px;padding-left:30px;height:28px;line-height:28px;cursor:pointer;font-size:0;white-space:nowrap;overflow:hidden}.layim-tab-content li h5 *{font-size:14px}.layim-tab-content li h5 span{max-width:125px}.layim-tab-content li h5 i{position:absolute;left:12px;top:0;color:#C9BDBB}.layim-tab-content li h5 em{padding-left:5px;color:#999}.layim-tab-content li h5[lay-type=true] i{top:2px}.layim-tab-content li ul{display:none;margin-bottom:10px}.layui-layim-list li{position:relative;height:42px;padding:5px 15px 5px 60px;font-size:0;cursor:pointer}.layui-layim-list li:hover{background-color:#F2F2F2;background-color:rgba(0,0,0,.05)}.layui-layim-list li.layim-null{height:20px;line-height:20px;padding:0;font-size:14px;color:#999;text-align:center;cursor:default}.layui-layim-list li.layim-null:hover{background:0 0}.layui-layim-list li *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layui-layim-list li span{margin-top:4px;max-width:155px}.layui-layim-list li img{position:absolute;left:15px;top:8px;width:36px;height:36px;border-radius:100%}.layui-layim-list li p{display:block;padding-right:30px;line-height:18px;font-size:12px;color:#999}.layui-layim-list li .layim-msg-status{display:none;position:absolute;right:10px;bottom:7px;padding:0 5px;height:16px;line-height:16px;border-radius:16px;text-align:center;font-size:10px;background-color:#F74C31;color:#fff}.layim-list-gray{-webkit-filter:grayscale(100%);-ms-filter:grayscale(100%);filter:grayscale(100%);filter:gray}.layui-layim-tool{padding:0 10px;font-size:0;background-color:#F6F6F6;border-radius:0 0 2px 2px}.layui-layim-tool li{position:relative;width:48px;height:37px;line-height:40px;text-align:center;font-size:22px;cursor:pointer}.layui-layim-tool li:active{background-color:#e2e2e2}.layui-layim-tool .layim-tool-msgbox{line-height:37px}.layui-layim-tool .layim-tool-find{line-height:38px}.layui-layim-tool .layim-tool-skin{font-size:26px}.layim-tool-msgbox span{display:none;position:absolute;left:12px;top:-12px;height:20px;line-height:20px;padding:0 10px;border-radius:2px;background-color:#33DF83;color:#fff;font-size:12px;-webkit-animation-duration:1s;animation-duration:1s}.layim-tool-msgbox .layer-anim-05{display:block}.layui-layim-search{display:none;position:absolute;bottom:5px;left:5px;height:28px;line-height:28px}.layui-layim-search input{width:210px;padding:0 30px 0 10px;height:30px;line-height:30px;border:none;border-radius:3px;background-color:#ddd}.layui-layim-search label{position:absolute;right:6px;top:4px;font-size:20px;cursor:pointer;color:#333;font-weight:400}.layui-layim-skin{margin:10px 0 0 10px;font-size:0}.layui-layim-skin li{margin:0 10px 10px 0;line-height:60px;text-align:center;background-color:#f6f6f6}.layui-layim-skin li,.layui-layim-skin li img{width:86px;height:60px;cursor:pointer}.layui-layim-skin li img:hover{opacity:.8;filter:Alpha(opacity=80)}.layui-layim-skin li cite{font-size:14px;font-style:normal}body .layui-layim-chat{background-color:#fff}body .layui-layim-chat-list{width:760px}body .layui-layim-chat .layui-layer-title{height:80px;border-bottom:none;background-color:#F8F8F8;background-color:rgba(245,245,245,.7)}body .layui-layim-chat .layui-layer-content{background:0 0}.layim-chat-list li *,.layui-layim-min .layui-layer-content *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layim-chat-list{display:none;position:absolute;z-index:1000;top:-80px;width:200px;height:100%;background-color:#D9D9D9;overflow:hidden;font-size:0}.layim-chat-list:hover{overflow-y:auto}.layim-chat-list li,.layui-layim-min .layui-layer-content{position:relative;margin:5px;padding:5px 30px 5px 5px;line-height:40px;cursor:pointer;border-radius:3px}.layim-chat-list li img,.layui-layim-min .layui-layer-content img{width:40px;height:40px;border-radius:100%}.layui-layim-photos{cursor:crosshair}.layim-chat-list li{white-space:nowrap}.layim-chat-list li span,.layui-layim-min .layui-layer-content span{width:100px;padding-left:10px;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layim-chat-list li span cite{color:#999;padding-left:10px}.layim-chat-list li:hover{background-color:#E2E2E2}.layim-chat-list li.layim-this{background-color:#F3F3F3}.layim-chat-list li .layui-icon{display:none;position:absolute;right:5px;top:7px;color:#555;font-size:22px}.layim-chat-list li .layui-icon:hover{color:#c00}.layim-chat-list li:hover .layui-icon{display:inline-block}.layim-chat-system{margin:10px 0;text-align:center}.layim-chat-system span{display:inline-block;line-height:30px;padding:0 15px;border-radius:3px;background-color:#e2e2e2;cursor:default;font-size:14px}.layim-chat{display:none;position:relative;background-color:#fff;background-color:rgba(255,255,255,.9)}.layim-chat-title{position:absolute;top:-80px;height:80px}.layim-chat-other{position:relative;top:15px;left:15px;padding-left:60px;cursor:default}.layim-chat-other img{position:absolute;left:0;top:0;width:50px;height:50px;border-radius:100%}.layim-chat-username{position:relative;top:5px;font-size:18px}.layim-chat-status{margin-top:6px;font-size:14px;color:#999}.layim-chat-group .layim-chat-other .layim-chat-username{cursor:pointer}.layim-chat-group .layim-chat-other .layim-chat-username em{padding:0 10px;color:#999}.layim-chat-main{height:262px;padding:15px 15px 5px;overflow-x:hidden;overflow-y:auto}.layim-chat-main ul li{position:relative;font-size:0;margin-bottom:10px;padding-left:60px;min-height:68px}.layim-chat-text,.layim-chat-user{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layim-chat-user{position:absolute;left:3px}.layim-chat-user img{width:40px;height:40px;border-radius:100%}.layim-chat-user cite{position:absolute;left:60px;top:-2px;width:500px;line-height:24px;font-size:12px;white-space:nowrap;color:#999;text-align:left;font-style:normal}.layim-chat-user cite i{padding-left:15px;font-style:normal}.layim-chat-text{position:relative;line-height:22px;margin-top:25px;padding:8px 15px;background-color:#e2e2e2;border-radius:3px;color:#333;word-break:break-all;max-width:462px\9}.layim-chat-text:after{content:'';position:absolute;left:-10px;top:13px;width:0;height:0;border-style:solid dashed dashed;border-color:#e2e2e2 transparent transparent;overflow:hidden;border-width:10px}.layim-chat-text a{color:#33DF83}.layim-chat-text img{max-width:100%;vertical-align:middle}.layim-chat-text .layui-layim-file,.layui-layim-file{display:block;text-align:center}.layim-chat-text .layui-layim-file{color:#333}.layui-layim-file:hover{opacity:.9}.layui-layim-file i{font-size:80px;line-height:80px}.layui-layim-file cite{display:block;line-height:20px;font-size:14px}.layui-layim-audio{text-align:center;cursor:pointer}.layui-layim-audio .layui-icon{position:relative;top:5px;font-size:24px}.layui-layim-audio p{margin-top:3px}.layui-layim-video{width:120px;height:80px;line-height:80px;background-color:#333;text-align:center;border-radius:3px}.layui-layim-video .layui-icon{font-size:36px;cursor:pointer;color:#fff}.layim-chat-main ul .layim-chat-system{min-height:0;padding:0}.layim-chat-main ul .layim-chat-mine{text-align:right;padding-left:0;padding-right:60px}.layim-chat-mine .layim-chat-user{left:auto;right:3px}.layim-chat-mine .layim-chat-user cite{left:auto;right:60px;text-align:right}.layim-chat-mine .layim-chat-user cite i{padding-left:0;padding-right:15px}.layim-chat-mine .layim-chat-text{margin-left:0;text-align:left;background-color:#5FB878;color:#fff}.layim-chat-mine .layim-chat-text:after{left:auto;right:-10px;border-top-color:#5FB878}.layim-chat-mine .layim-chat-text a{color:#fff}.layim-chat-footer{border-top:1px solid #F1F1F1}.layim-chat-tool{position:relative;padding:0 8px;height:38px;line-height:38px;font-size:0}.layim-chat-tool span{position:relative;margin:0 10px;display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:24px;cursor:pointer}.layim-chat-tool .layim-tool-log{position:absolute;right:5px;font-size:14px}.layim-tool-log i{position:relative;top:2px;margin-right:5px;font-size:20px;color:#999}.layim-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}body .layui-layim-face{margin:10px 0 0 -18px;border:none;background:0 0}body .layui-layim-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-layim-face .layui-layer-TipsG{display:none}.layui-layim-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-layim-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-layim-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layim-chat-textarea{margin-left:10px}.layim-chat-textarea textarea{display:block;width:100%;padding:5px 0 0;height:68px;line-height:20px;border:none;overflow:auto;resize:none;background:0 0}.layim-chat-textarea textarea:focus{outline:0}.layim-chat-bottom{position:relative;height:46px}.layim-chat-send{position:absolute;right:15px;top:3px;height:32px;line-height:32px;font-size:0;cursor:pointer}.layim-chat-send span{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px;line-height:32px;margin-left:5px;padding:0 20px;background-color:#5FB878;color:#fff;border-radius:3px}.layim-chat-send span:hover{background-color:#69BC80}.layim-chat-send span:active{background-color:#59B573}.layim-chat-send .layim-send-btn{border-radius:3px 0 0 3px}.layim-chat-send .layim-send-set{position:relative;width:30px;height:32px;margin-left:0;padding:0;border-left:1px solid #85C998;border-radius:0 3px 3px 0}.layim-send-set .layui-edge{position:absolute;top:14px;left:9px;border-width:6px;border-top-style:solid;border-top-color:#fff}.layim-chat-send .layim-menu-box{left:auto;right:0;top:33px;width:180px;padding:10px 0}.layim-chat-send .layim-menu-box li{padding-right:15px;line-height:28px}body .layui-layim-min{border:1px solid #D9D9D9}.layui-layim-min .layui-layer-content{margin:0 5px;padding:5px 10px;white-space:nowrap}.layui-layim-close .layui-layer-content span{width:auto;max-width:120px}body .layui-layim-members{margin:25px 0 0 -75px;border:none;background:0 0}body .layui-layim-members .layui-layer-content{padding:0;background:0 0;color:#666;box-shadow:none}.layui-layim-members .layui-layer-TipsG{display:none}.layui-layim-members ul{position:relative;width:578px;height:200px;padding:10px 10px 0;border:1px solid #D9D9D9;background-color:#fff;background-color:rgba(255,255,255,.9);box-shadow:none;overflow:hidden;font-size:0}.layui-layim-members ul:hover{overflow:auto}.layim-add-img,.layim-add-remark,.layui-layim-members li{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layui-layim-members li{width:112px;margin:10px 0;text-align:center}.layui-layim-members li a{position:relative;display:inline-block;max-width:100%}.layui-layim-members li a:after{content:'';position:absolute;width:46px;height:46px;left:50%;margin-left:-23px;top:0;border:1px solid #eee;border-color:rgba(0,0,0,.1);border-radius:100%}.layui-layim-members li img{width:48px;height:48px;border-radius:100%}.layui-layim-members li:hover{opacity:.9}.layui-layim-members li a cite{display:block;padding:0 3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .layui-layim-contextmenu{margin:70px 0 0 30px;width:200px;padding:5px 0;border:1px solid #ccc;background:#fff;border-radius:0;box-shadow:0 0 5px rgba(0,0,0,.2)}body .layui-layim-contextmenu .layui-layer-content{padding:0;background-color:#fff;color:#333;font-size:14px;box-shadow:none}.layui-layim-contextmenu .layui-layer-TipsG{display:none}.layui-layim-contextmenu li{padding:0 15px 0 35px;cursor:pointer;line-height:30px}.layui-layim-contextmenu li:hover{background-color:#F2F2F2}.layim-add-box{margin:15px;font-size:0}.layim-add-img img,.layim-add-remark p{margin-bottom:10px}.layim-add-img{width:100px;margin-right:20px;text-align:center}.layim-add-img img{width:100px;height:100px}.layim-add-remark{width:280px}.layim-add-remark .layui-select{width:100%;margin-bottom:10px}.layim-add-remark .layui-textarea{height:80px;min-height:80px;resize:none}.layim-tab-content,.layui-layim-face ul,.layui-layim-tab{margin-bottom:0}.layim-tab-content li h5{margin-top:0;margin-bottom:0},.layui-layim-face img{vertical-align:bottom}.layim-chat-other span{color:#444}.layim-chat-other span cite{padding:0 15px;color:#999}.layim-chat-other:hover{text-decoration:none}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layim/mobile/layim.css b/public/static/admin/layui/css/modules/layim/mobile/layim.css
new file mode 100644
index 0000000..129721b
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layim/mobile/layim.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ .layim-tab-content li h5,.layui-layim-list li{border-bottom:1px solid #f2f2f2;cursor:pointer}html #layuicss-skinlayim-mobilecss{display:none;position:absolute;width:1989px}.layim-tab-content li h5 *,.layui-layim-skin li,.layui-layim-tab li,.layui-layim-tool li{display:inline-block;vertical-align:top;*zoom:1;*display:inline}.layim-tab-content li h5 span,.layui-layim-list li p,.layui-layim-list li span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-layim-tab{position:absolute;bottom:0;left:0;right:0;height:50px;border-top:1px solid #f2f2f2;background-color:#fff}.layui-layim-tab li{position:relative;width:33.33%;height:50px;text-align:center;color:#666;color:rgba(0,0,0,.6);cursor:pointer}.layui-layim-tab li .layui-icon{position:relative;top:7px;font-size:25px}.layui-layim-tab li span{position:relative;bottom:-3px;display:block;font-size:12px}.layui-layim-tab li[lay-type=more] .layui-icon{top:4px;font-size:22px}.layui-layim-tab li.layim-this{color:#3FDD86}.layim-new{display:none;position:absolute;top:5px;left:50%;margin-left:15px;width:10px;height:10px;border-radius:10px;background-color:#F74C31;color:#fff}.layim-list-top .layim-new{position:relative;vertical-align:top;top:10px;left:initial;margin-left:5px}.layim-list-top i.layui-show{display:inline-block!important}.layim-tab-content,.layim-tab-content li ul{display:none}.layui-layim{position:fixed;left:0;right:0;top:50px;bottom:50px;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}.layim-tab-content li h5{position:relative;padding-left:35px;height:45px;line-height:45px;font-size:0;white-space:nowrap;overflow:hidden}.layim-tab-content li h5 *{font-size:17px}.layim-tab-content li h5 span{max-width:80%}.layim-tab-content li h5 i{position:absolute;left:12px;top:0;color:#C9BDBB}.layim-tab-content li h5 em{padding-left:5px;color:#999}.layim-list-friend,.layim-list-group{background-color:#fff}.layui-layim-list li{position:relative;height:42px;padding:5px 15px 5px 60px;font-size:0}.layui-layim-list li:active{background-color:#F2F2F2;background-color:rgba(0,0,0,.05)}.layui-layim-list li.layim-null{height:20px;line-height:20px;padding:10px 0;color:#999;text-align:center;cursor:default;font-size:14px}.layim-list-history li.layim-null{padding:30px 0;border-bottom:none;background-color:#eee}.layui-layim-list li *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:17px}.layui-layim-list li span{margin-top:2px;max-width:155px;font-size:17px}.layui-layim-list li img{position:absolute;left:12px;top:8px;width:36px;height:36px;border-radius:100%}.layui-layim-list li p{display:block;padding-right:30px;line-height:18px;font-size:13px;color:#999}.layui-layim-list li .layim-msg-status{display:none;position:absolute;right:10px;bottom:7px;padding:0 5px;height:17px;line-height:17px;border-radius:17px;text-align:center;font-size:10px;background-color:#F74C31;color:#fff}.layim-list-gray{-webkit-filter:grayscale(100%);-ms-filter:grayscale(100%);filter:grayscale(100%);filter:gray}.layim-list-top{background-color:#fff;font-size:17px}.layim-list-top li{position:relative;padding:0 15px 0 50px;line-height:45px;border-bottom:1px solid #f2f2f2;cursor:pointer}.layim-list-top li:last-child{margin-bottom:10px;border-bottom:none}.layim-list-top li .layui-icon{position:absolute;left:12px;top:0;margin-right:10px;color:#36373C;font-size:24px}.layim-list-top li[layim-event=newFriend] .layui-icon{left:15px}.layim-panel,.layim-title{position:fixed;left:0;right:0;top:0}.layim-list-top li[layim-event=group] .layui-icon{font-size:20px}.layim-list-top li[layim-event=about] .layui-icon{font-size:25px}.layim-panel{bottom:0;background-color:#eee;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layim-title{height:50px;line-height:50px;padding:0 15px;background-color:#36373C;color:#fff;font-size:18px}.layim-chat-status{padding-left:15px;font-size:14px;opacity:.7}.layim-title .layim-chat-back{display:inline-block;vertical-align:middle;position:relative;padding:0 15px;margin-left:-10px;top:0;font-size:24px;cursor:pointer}.layim-chat-detail{position:absolute;right:0;top:0;padding:0 15px;font-size:18px;cursor:pointer}.layim-chat-main,.layim-content{position:fixed;top:50px;left:0;right:0;overflow-y:auto;overflow-x:hidden}.layim-chat-detail:active,.layim-title .layim-chat-back:active{opacity:.8}.layui-layim .layim-title{text-align:left}.layui-layim .layim-title p{padding:0 15px}.layim-content{bottom:0}.layim-chat-main{width:100%;bottom:85px;padding:15px;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layim-chat-main ul{overflow-x:hidden}.layim-chat-main ul li{position:relative;font-size:0;margin-bottom:10px;padding-left:60px;min-height:68px}.layim-chat-text,.layim-chat-user{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:15px}.layim-chat-user{position:absolute;left:3px}.layim-chat-user img{width:40px;height:40px;border-radius:100%}.layim-chat-user cite{position:absolute;left:60px;top:-2px;width:500px;line-height:24px;font-size:12px;white-space:nowrap;color:#999;text-align:left;font-style:normal}.layim-chat-user cite i{padding-left:15px;font-style:normal}.layim-chat-text{position:relative;min-height:22px;line-height:22px;margin-top:25px;padding:8px 15px;background-color:#fff;border-radius:3px;color:#333;word-break:break-all}.layim-chat-text:after{content:'';position:absolute;left:-10px;top:13px;width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;border-width:10px}.layim-chat-text a{color:#33DF83}.layim-chat-text img{max-width:100%;vertical-align:middle}.layim-chat-text .layui-layim-file,.layui-layim-file{display:block;text-align:center}.layim-chat-text .layui-layim-file{color:#333}.layui-layim-file:active{opacity:.9}.layui-layim-file i{font-size:80px;line-height:80px}.layui-layim-file cite{display:block;line-height:20px;font-size:17px}.layui-layim-audio{text-align:center;cursor:pointer}.layui-layim-audio .layui-icon{position:relative;top:5px;font-size:24px}.layui-layim-audio p{margin-top:3px}.layui-layim-video{width:120px;height:80px;line-height:80px;background-color:#333;text-align:center;border-radius:3px}.layui-layim-video .layui-icon{font-size:36px;cursor:pointer;color:#fff}.layim-chat-main ul .layim-chat-mine{text-align:right;padding-left:0;padding-right:60px}.layim-chat-mine .layim-chat-user{left:auto;right:3px}.layim-chat-mine .layim-chat-user cite{left:auto;right:60px;text-align:right}.layim-chat-mine .layim-chat-user cite i{padding-left:0;padding-right:15px}.layim-chat-mine .layim-chat-text{margin-left:0;text-align:left;background-color:#5FB878;color:#fff}.layim-chat-mine .layim-chat-text:after{left:auto;right:-10px;border-top-color:#5FB878}.layim-chat-mine .layim-chat-text a{color:#fff}.layim-chat-main ul .layim-chat-system{min-height:0;margin:20px 0 5px;padding:0}.layim-chat-system{margin:10px 0;text-align:center}.layim-chat-system span{display:inline-block;line-height:30px;padding:0 15px;border-radius:3px;background-color:#ddd;color:#fff;font-size:14px;cursor:pointer}.layim-chat-footer{position:fixed;bottom:0;left:10px;right:10px;height:80px}.layim-chat-send{display:-webkit-box;display:-webkit-flex;display:flex}.layim-chat-send input{-webkit-box-flex:1;-webkit-flex:1;flex:1;height:40px;padding-left:5px;border:0;background-color:#fff;border-radius:3px}.layim-chat-send button{border-radius:3px;height:40px;padding:0 20px;border:0;margin-left:10px;background-color:#5FB878;color:#fff}.layim-chat-tool{position:relative;width:100%;overflow-x:auto;padding:0;height:38px;line-height:38px;margin-top:3px;font-size:0;white-space:nowrap}.layim-chat-tool span{position:relative;margin:0 15px;display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:28px;cursor:pointer}.layim-chat-tool .layim-tool-log{position:absolute;right:5px;font-size:14px}.layim-tool-log i{position:relative;top:2px;margin-right:5px;font-size:20px;color:#999}.layim-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layim-layer{position:fixed;bottom:85px;left:10px;right:10px;margin:0 auto}.layui-layim-face{position:relative;max-height:180px;overflow:auto;padding:10px;font-size:0}.layui-layim-face li{cursor:pointer;display:inline-block;vertical-align:bottom;padding:5px 2px;text-align:center;width:10%;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-layim-face li img{width:22px;height:22px}.layim-about{font-size:17px}.layim-about .layui-m-layercont{text-align:left}.layim-about .layui-m-layercont p{line-height:30px}.layim-about .layui-m-layercont a{color:#01AAED}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layim/skin/1.jpg b/public/static/admin/layui/css/modules/layim/skin/1.jpg
new file mode 100644
index 0000000..d9f9926
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/skin/1.jpg differ
diff --git a/public/static/admin/layui/css/modules/layim/skin/2.jpg b/public/static/admin/layui/css/modules/layim/skin/2.jpg
new file mode 100644
index 0000000..0bffb50
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/skin/2.jpg differ
diff --git a/public/static/admin/layui/css/modules/layim/skin/3.jpg b/public/static/admin/layui/css/modules/layim/skin/3.jpg
new file mode 100644
index 0000000..53ba921
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/skin/3.jpg differ
diff --git a/public/static/admin/layui/css/modules/layim/skin/4.jpg b/public/static/admin/layui/css/modules/layim/skin/4.jpg
new file mode 100644
index 0000000..83b4738
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/skin/4.jpg differ
diff --git a/public/static/admin/layui/css/modules/layim/skin/5.jpg b/public/static/admin/layui/css/modules/layim/skin/5.jpg
new file mode 100644
index 0000000..8ed74b9
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/skin/5.jpg differ
diff --git a/public/static/admin/layui/css/modules/layim/skin/logo.jpg b/public/static/admin/layui/css/modules/layim/skin/logo.jpg
new file mode 100644
index 0000000..26c7358
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/skin/logo.jpg differ
diff --git a/public/static/admin/layui/css/modules/layim/voice/default.mp3 b/public/static/admin/layui/css/modules/layim/voice/default.mp3
new file mode 100644
index 0000000..90013c5
Binary files /dev/null and b/public/static/admin/layui/css/modules/layim/voice/default.mp3 differ
diff --git a/public/static/admin/layui/font/iconfont.eot b/public/static/admin/layui/font/iconfont.eot
new file mode 100644
index 0000000..f30753f
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.eot differ
diff --git a/public/static/admin/layui/font/iconfont.svg b/public/static/admin/layui/font/iconfont.svg
new file mode 100644
index 0000000..f407df7
--- /dev/null
+++ b/public/static/admin/layui/font/iconfont.svg
@@ -0,0 +1,485 @@
+
+
+
+
diff --git a/public/static/admin/layui/font/iconfont.ttf b/public/static/admin/layui/font/iconfont.ttf
new file mode 100644
index 0000000..3c22a23
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.ttf differ
diff --git a/public/static/admin/layui/font/iconfont.woff b/public/static/admin/layui/font/iconfont.woff
new file mode 100644
index 0000000..8c660ce
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.woff differ
diff --git a/public/static/admin/layui/font/iconfont.woff2 b/public/static/admin/layui/font/iconfont.woff2
new file mode 100644
index 0000000..928d66a
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.woff2 differ
diff --git a/public/static/admin/layui/images/face/0.gif b/public/static/admin/layui/images/face/0.gif
new file mode 100644
index 0000000..a63f0d5
Binary files /dev/null and b/public/static/admin/layui/images/face/0.gif differ
diff --git a/public/static/admin/layui/images/face/1.gif b/public/static/admin/layui/images/face/1.gif
new file mode 100644
index 0000000..b2b78b2
Binary files /dev/null and b/public/static/admin/layui/images/face/1.gif differ
diff --git a/public/static/admin/layui/images/face/10.gif b/public/static/admin/layui/images/face/10.gif
new file mode 100644
index 0000000..556c7e3
Binary files /dev/null and b/public/static/admin/layui/images/face/10.gif differ
diff --git a/public/static/admin/layui/images/face/11.gif b/public/static/admin/layui/images/face/11.gif
new file mode 100644
index 0000000..2bfc58b
Binary files /dev/null and b/public/static/admin/layui/images/face/11.gif differ
diff --git a/public/static/admin/layui/images/face/12.gif b/public/static/admin/layui/images/face/12.gif
new file mode 100644
index 0000000..1c321c7
Binary files /dev/null and b/public/static/admin/layui/images/face/12.gif differ
diff --git a/public/static/admin/layui/images/face/13.gif b/public/static/admin/layui/images/face/13.gif
new file mode 100644
index 0000000..300bbc2
Binary files /dev/null and b/public/static/admin/layui/images/face/13.gif differ
diff --git a/public/static/admin/layui/images/face/14.gif b/public/static/admin/layui/images/face/14.gif
new file mode 100644
index 0000000..43b6d0a
Binary files /dev/null and b/public/static/admin/layui/images/face/14.gif differ
diff --git a/public/static/admin/layui/images/face/15.gif b/public/static/admin/layui/images/face/15.gif
new file mode 100644
index 0000000..c9f25fa
Binary files /dev/null and b/public/static/admin/layui/images/face/15.gif differ
diff --git a/public/static/admin/layui/images/face/16.gif b/public/static/admin/layui/images/face/16.gif
new file mode 100644
index 0000000..34f28e4
Binary files /dev/null and b/public/static/admin/layui/images/face/16.gif differ
diff --git a/public/static/admin/layui/images/face/17.gif b/public/static/admin/layui/images/face/17.gif
new file mode 100644
index 0000000..39cd035
Binary files /dev/null and b/public/static/admin/layui/images/face/17.gif differ
diff --git a/public/static/admin/layui/images/face/18.gif b/public/static/admin/layui/images/face/18.gif
new file mode 100644
index 0000000..7bce299
Binary files /dev/null and b/public/static/admin/layui/images/face/18.gif differ
diff --git a/public/static/admin/layui/images/face/19.gif b/public/static/admin/layui/images/face/19.gif
new file mode 100644
index 0000000..adac542
Binary files /dev/null and b/public/static/admin/layui/images/face/19.gif differ
diff --git a/public/static/admin/layui/images/face/2.gif b/public/static/admin/layui/images/face/2.gif
new file mode 100644
index 0000000..7edbb58
Binary files /dev/null and b/public/static/admin/layui/images/face/2.gif differ
diff --git a/public/static/admin/layui/images/face/20.gif b/public/static/admin/layui/images/face/20.gif
new file mode 100644
index 0000000..50631a6
Binary files /dev/null and b/public/static/admin/layui/images/face/20.gif differ
diff --git a/public/static/admin/layui/images/face/21.gif b/public/static/admin/layui/images/face/21.gif
new file mode 100644
index 0000000..b984212
Binary files /dev/null and b/public/static/admin/layui/images/face/21.gif differ
diff --git a/public/static/admin/layui/images/face/22.gif b/public/static/admin/layui/images/face/22.gif
new file mode 100644
index 0000000..1f0bd8b
Binary files /dev/null and b/public/static/admin/layui/images/face/22.gif differ
diff --git a/public/static/admin/layui/images/face/23.gif b/public/static/admin/layui/images/face/23.gif
new file mode 100644
index 0000000..e05e0f9
Binary files /dev/null and b/public/static/admin/layui/images/face/23.gif differ
diff --git a/public/static/admin/layui/images/face/24.gif b/public/static/admin/layui/images/face/24.gif
new file mode 100644
index 0000000..f35928a
Binary files /dev/null and b/public/static/admin/layui/images/face/24.gif differ
diff --git a/public/static/admin/layui/images/face/25.gif b/public/static/admin/layui/images/face/25.gif
new file mode 100644
index 0000000..0b4a883
Binary files /dev/null and b/public/static/admin/layui/images/face/25.gif differ
diff --git a/public/static/admin/layui/images/face/26.gif b/public/static/admin/layui/images/face/26.gif
new file mode 100644
index 0000000..45c4fb5
Binary files /dev/null and b/public/static/admin/layui/images/face/26.gif differ
diff --git a/public/static/admin/layui/images/face/27.gif b/public/static/admin/layui/images/face/27.gif
new file mode 100644
index 0000000..7a4c013
Binary files /dev/null and b/public/static/admin/layui/images/face/27.gif differ
diff --git a/public/static/admin/layui/images/face/28.gif b/public/static/admin/layui/images/face/28.gif
new file mode 100644
index 0000000..fc5a0cf
Binary files /dev/null and b/public/static/admin/layui/images/face/28.gif differ
diff --git a/public/static/admin/layui/images/face/29.gif b/public/static/admin/layui/images/face/29.gif
new file mode 100644
index 0000000..5dd7442
Binary files /dev/null and b/public/static/admin/layui/images/face/29.gif differ
diff --git a/public/static/admin/layui/images/face/3.gif b/public/static/admin/layui/images/face/3.gif
new file mode 100644
index 0000000..86df67b
Binary files /dev/null and b/public/static/admin/layui/images/face/3.gif differ
diff --git a/public/static/admin/layui/images/face/30.gif b/public/static/admin/layui/images/face/30.gif
new file mode 100644
index 0000000..b751f98
Binary files /dev/null and b/public/static/admin/layui/images/face/30.gif differ
diff --git a/public/static/admin/layui/images/face/31.gif b/public/static/admin/layui/images/face/31.gif
new file mode 100644
index 0000000..c9476d7
Binary files /dev/null and b/public/static/admin/layui/images/face/31.gif differ
diff --git a/public/static/admin/layui/images/face/32.gif b/public/static/admin/layui/images/face/32.gif
new file mode 100644
index 0000000..9931b06
Binary files /dev/null and b/public/static/admin/layui/images/face/32.gif differ
diff --git a/public/static/admin/layui/images/face/33.gif b/public/static/admin/layui/images/face/33.gif
new file mode 100644
index 0000000..59111a3
Binary files /dev/null and b/public/static/admin/layui/images/face/33.gif differ
diff --git a/public/static/admin/layui/images/face/34.gif b/public/static/admin/layui/images/face/34.gif
new file mode 100644
index 0000000..a334548
Binary files /dev/null and b/public/static/admin/layui/images/face/34.gif differ
diff --git a/public/static/admin/layui/images/face/35.gif b/public/static/admin/layui/images/face/35.gif
new file mode 100644
index 0000000..a932264
Binary files /dev/null and b/public/static/admin/layui/images/face/35.gif differ
diff --git a/public/static/admin/layui/images/face/36.gif b/public/static/admin/layui/images/face/36.gif
new file mode 100644
index 0000000..6de432a
Binary files /dev/null and b/public/static/admin/layui/images/face/36.gif differ
diff --git a/public/static/admin/layui/images/face/37.gif b/public/static/admin/layui/images/face/37.gif
new file mode 100644
index 0000000..d05f2da
Binary files /dev/null and b/public/static/admin/layui/images/face/37.gif differ
diff --git a/public/static/admin/layui/images/face/38.gif b/public/static/admin/layui/images/face/38.gif
new file mode 100644
index 0000000..8b1c88a
Binary files /dev/null and b/public/static/admin/layui/images/face/38.gif differ
diff --git a/public/static/admin/layui/images/face/39.gif b/public/static/admin/layui/images/face/39.gif
new file mode 100644
index 0000000..38b84a5
Binary files /dev/null and b/public/static/admin/layui/images/face/39.gif differ
diff --git a/public/static/admin/layui/images/face/4.gif b/public/static/admin/layui/images/face/4.gif
new file mode 100644
index 0000000..d52200c
Binary files /dev/null and b/public/static/admin/layui/images/face/4.gif differ
diff --git a/public/static/admin/layui/images/face/40.gif b/public/static/admin/layui/images/face/40.gif
new file mode 100644
index 0000000..ae42991
Binary files /dev/null and b/public/static/admin/layui/images/face/40.gif differ
diff --git a/public/static/admin/layui/images/face/41.gif b/public/static/admin/layui/images/face/41.gif
new file mode 100644
index 0000000..b9c715c
Binary files /dev/null and b/public/static/admin/layui/images/face/41.gif differ
diff --git a/public/static/admin/layui/images/face/42.gif b/public/static/admin/layui/images/face/42.gif
new file mode 100644
index 0000000..0eb1434
Binary files /dev/null and b/public/static/admin/layui/images/face/42.gif differ
diff --git a/public/static/admin/layui/images/face/43.gif b/public/static/admin/layui/images/face/43.gif
new file mode 100644
index 0000000..ac0b700
Binary files /dev/null and b/public/static/admin/layui/images/face/43.gif differ
diff --git a/public/static/admin/layui/images/face/44.gif b/public/static/admin/layui/images/face/44.gif
new file mode 100644
index 0000000..ad44497
Binary files /dev/null and b/public/static/admin/layui/images/face/44.gif differ
diff --git a/public/static/admin/layui/images/face/45.gif b/public/static/admin/layui/images/face/45.gif
new file mode 100644
index 0000000..6837fca
Binary files /dev/null and b/public/static/admin/layui/images/face/45.gif differ
diff --git a/public/static/admin/layui/images/face/46.gif b/public/static/admin/layui/images/face/46.gif
new file mode 100644
index 0000000..d62916d
Binary files /dev/null and b/public/static/admin/layui/images/face/46.gif differ
diff --git a/public/static/admin/layui/images/face/47.gif b/public/static/admin/layui/images/face/47.gif
new file mode 100644
index 0000000..58a0836
Binary files /dev/null and b/public/static/admin/layui/images/face/47.gif differ
diff --git a/public/static/admin/layui/images/face/48.gif b/public/static/admin/layui/images/face/48.gif
new file mode 100644
index 0000000..7ffd161
Binary files /dev/null and b/public/static/admin/layui/images/face/48.gif differ
diff --git a/public/static/admin/layui/images/face/49.gif b/public/static/admin/layui/images/face/49.gif
new file mode 100644
index 0000000..959b992
Binary files /dev/null and b/public/static/admin/layui/images/face/49.gif differ
diff --git a/public/static/admin/layui/images/face/5.gif b/public/static/admin/layui/images/face/5.gif
new file mode 100644
index 0000000..4e8b09f
Binary files /dev/null and b/public/static/admin/layui/images/face/5.gif differ
diff --git a/public/static/admin/layui/images/face/50.gif b/public/static/admin/layui/images/face/50.gif
new file mode 100644
index 0000000..6e22e7f
Binary files /dev/null and b/public/static/admin/layui/images/face/50.gif differ
diff --git a/public/static/admin/layui/images/face/51.gif b/public/static/admin/layui/images/face/51.gif
new file mode 100644
index 0000000..ad3f4d3
Binary files /dev/null and b/public/static/admin/layui/images/face/51.gif differ
diff --git a/public/static/admin/layui/images/face/52.gif b/public/static/admin/layui/images/face/52.gif
new file mode 100644
index 0000000..39f8a22
Binary files /dev/null and b/public/static/admin/layui/images/face/52.gif differ
diff --git a/public/static/admin/layui/images/face/53.gif b/public/static/admin/layui/images/face/53.gif
new file mode 100644
index 0000000..a181ee7
Binary files /dev/null and b/public/static/admin/layui/images/face/53.gif differ
diff --git a/public/static/admin/layui/images/face/54.gif b/public/static/admin/layui/images/face/54.gif
new file mode 100644
index 0000000..e289d92
Binary files /dev/null and b/public/static/admin/layui/images/face/54.gif differ
diff --git a/public/static/admin/layui/images/face/55.gif b/public/static/admin/layui/images/face/55.gif
new file mode 100644
index 0000000..4351083
Binary files /dev/null and b/public/static/admin/layui/images/face/55.gif differ
diff --git a/public/static/admin/layui/images/face/56.gif b/public/static/admin/layui/images/face/56.gif
new file mode 100644
index 0000000..e0eff22
Binary files /dev/null and b/public/static/admin/layui/images/face/56.gif differ
diff --git a/public/static/admin/layui/images/face/57.gif b/public/static/admin/layui/images/face/57.gif
new file mode 100644
index 0000000..0bf130f
Binary files /dev/null and b/public/static/admin/layui/images/face/57.gif differ
diff --git a/public/static/admin/layui/images/face/58.gif b/public/static/admin/layui/images/face/58.gif
new file mode 100644
index 0000000..0f06508
Binary files /dev/null and b/public/static/admin/layui/images/face/58.gif differ
diff --git a/public/static/admin/layui/images/face/59.gif b/public/static/admin/layui/images/face/59.gif
new file mode 100644
index 0000000..7081e4f
Binary files /dev/null and b/public/static/admin/layui/images/face/59.gif differ
diff --git a/public/static/admin/layui/images/face/6.gif b/public/static/admin/layui/images/face/6.gif
new file mode 100644
index 0000000..f7715bf
Binary files /dev/null and b/public/static/admin/layui/images/face/6.gif differ
diff --git a/public/static/admin/layui/images/face/60.gif b/public/static/admin/layui/images/face/60.gif
new file mode 100644
index 0000000..6e15f89
Binary files /dev/null and b/public/static/admin/layui/images/face/60.gif differ
diff --git a/public/static/admin/layui/images/face/61.gif b/public/static/admin/layui/images/face/61.gif
new file mode 100644
index 0000000..f092d7e
Binary files /dev/null and b/public/static/admin/layui/images/face/61.gif differ
diff --git a/public/static/admin/layui/images/face/62.gif b/public/static/admin/layui/images/face/62.gif
new file mode 100644
index 0000000..7fe4984
Binary files /dev/null and b/public/static/admin/layui/images/face/62.gif differ
diff --git a/public/static/admin/layui/images/face/63.gif b/public/static/admin/layui/images/face/63.gif
new file mode 100644
index 0000000..cf8e23e
Binary files /dev/null and b/public/static/admin/layui/images/face/63.gif differ
diff --git a/public/static/admin/layui/images/face/64.gif b/public/static/admin/layui/images/face/64.gif
new file mode 100644
index 0000000..a779719
Binary files /dev/null and b/public/static/admin/layui/images/face/64.gif differ
diff --git a/public/static/admin/layui/images/face/65.gif b/public/static/admin/layui/images/face/65.gif
new file mode 100644
index 0000000..7bb98f2
Binary files /dev/null and b/public/static/admin/layui/images/face/65.gif differ
diff --git a/public/static/admin/layui/images/face/66.gif b/public/static/admin/layui/images/face/66.gif
new file mode 100644
index 0000000..bb6d077
Binary files /dev/null and b/public/static/admin/layui/images/face/66.gif differ
diff --git a/public/static/admin/layui/images/face/67.gif b/public/static/admin/layui/images/face/67.gif
new file mode 100644
index 0000000..6e33f7c
Binary files /dev/null and b/public/static/admin/layui/images/face/67.gif differ
diff --git a/public/static/admin/layui/images/face/68.gif b/public/static/admin/layui/images/face/68.gif
new file mode 100644
index 0000000..1a6c400
Binary files /dev/null and b/public/static/admin/layui/images/face/68.gif differ
diff --git a/public/static/admin/layui/images/face/69.gif b/public/static/admin/layui/images/face/69.gif
new file mode 100644
index 0000000..a02f0b2
Binary files /dev/null and b/public/static/admin/layui/images/face/69.gif differ
diff --git a/public/static/admin/layui/images/face/7.gif b/public/static/admin/layui/images/face/7.gif
new file mode 100644
index 0000000..e6d4db8
Binary files /dev/null and b/public/static/admin/layui/images/face/7.gif differ
diff --git a/public/static/admin/layui/images/face/70.gif b/public/static/admin/layui/images/face/70.gif
new file mode 100644
index 0000000..416c5c1
Binary files /dev/null and b/public/static/admin/layui/images/face/70.gif differ
diff --git a/public/static/admin/layui/images/face/71.gif b/public/static/admin/layui/images/face/71.gif
new file mode 100644
index 0000000..c17d60c
Binary files /dev/null and b/public/static/admin/layui/images/face/71.gif differ
diff --git a/public/static/admin/layui/images/face/8.gif b/public/static/admin/layui/images/face/8.gif
new file mode 100644
index 0000000..66f967b
Binary files /dev/null and b/public/static/admin/layui/images/face/8.gif differ
diff --git a/public/static/admin/layui/images/face/9.gif b/public/static/admin/layui/images/face/9.gif
new file mode 100644
index 0000000..6044740
Binary files /dev/null and b/public/static/admin/layui/images/face/9.gif differ
diff --git a/public/static/admin/layui/lay/modules/carousel.js b/public/static/admin/layui/lay/modules/carousel.js
new file mode 100644
index 0000000..684fff8
--- /dev/null
+++ b/public/static/admin/layui/lay/modules/carousel.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('- '+o.replace(/[\r\t\n]+/g,"
- ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend(''+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"
");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss");
\ No newline at end of file
diff --git a/public/static/admin/layui/lay/modules/colorpicker.js b/public/static/admin/layui/lay/modules/colorpicker.js
new file mode 100644
index 0000000..9c9cccc
--- /dev/null
+++ b/public/static/admin/layui/lay/modules/colorpicker.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
"].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['','
",'
",function(){if(o.predefine){var e=['
'];return layui.each(o.colors,function(i,o){e.push(['
"].join(""))}),e.push("
"),e.join("")}return""}(),'
','
','',"
",'
','','',"
","
"].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:f
a()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});
\ No newline at end of file
diff --git a/public/static/admin/layui/lay/modules/element.js b/public/static/admin/layui/lay/modules/element.js
new file mode 100644
index 0000000..93610f8
--- /dev/null
+++ b/public/static/admin/layui/lay/modules/element.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='"+(i.title||"unnaming")+"";return s[0]?s.before(r):n.append(r),o.append(''+(i.content||"")+"
"),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('ဆ');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});
\ No newline at end of file
diff --git a/public/static/admin/layui/lay/modules/flow.js b/public/static/admin/layui/lay/modules/flow.js
new file mode 100644
index 0000000..9343bcc
--- /dev/null
+++ b/public/static/admin/layui/lay/modules/flow.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});
\ No newline at end of file
diff --git a/public/static/admin/layui/lay/modules/form.js b/public/static/admin/layui/lay/modules/form.js
new file mode 100644
index 0000000..1297eb0
--- /dev/null
+++ b/public/static/admin/layui/lay/modules/form.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),g.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项'):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['','
','','
','
',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("- "+a.label+"
"):t.push('- '+a.innerHTML+"
"):t.push('- '+(a.innerHTML||i)+"
")}),0===t.length&&t.push('- 没有选项
'),t.join("")}(r.find("*"))+"
","
"].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['','
'+i[l.checked?0:1]+"","
"+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
","
"].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});
\ No newline at end of file
diff --git a/public/static/admin/layui/lay/modules/jquery.js b/public/static/admin/layui/lay/modules/jquery.js
new file mode 100644
index 0000000..5b0d3e8
--- /dev/null
+++ b/public/static/admin/layui/lay/modules/jquery.js
@@ -0,0 +1,5 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),
+l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.lengtha",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,""],area:[1,""],param:[1,""],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:fe.htmlSerialize?[0,"",""]:[1,"X","
"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/
+
+
+
+
+
+
+
+ layuiAdmin 受国家计算机软件著作权保护(登记号:2018SR410669),必须经官网授权才可获得源文件使用权。不得恶意分享产品源代码、二次转售等,违者将承担相应的法律责任。
+
详见:《layui 付费产品服务条款》
+
+
© 2018 layui.com 版权所有
+
\ No newline at end of file
diff --git a/public/static/admin/tpl/system/get.html b/public/static/admin/tpl/system/get.html
new file mode 100644
index 0000000..7585a7e
--- /dev/null
+++ b/public/static/admin/tpl/system/get.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+ 授权获得 layuiAdmin
+
+
+
+
+
+
+
+
+
+
+
+
+
专业版
+
+ - 始终基于全新的 layui 版本
+ - 单页面应用,所有操作无需跳转
+ - 支持前后端分离开发模式
+ - 面向全屏幕尺寸的响应式适配能力
+ - 灵活的主题色配置
+ - 专属的开发者文档,助你快速掌握
+ - 版本的持续更新,集大众之所需
+ - 专属的会员群,与同道中人隔空交流
+ - layui 社区 VIP 标识
+ - 不限制域名、不限制应用的项目数量
+
+
+
+
+
+ 你所获得的不仅仅是一款高精品的后台管理模板系统,更是一项关于时间与效率的高收益回报
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/static/admin/tpl/system/more.html b/public/static/admin/tpl/system/more.html
new file mode 100644
index 0000000..c1f570b
--- /dev/null
+++ b/public/static/admin/tpl/system/more.html
@@ -0,0 +1,22 @@
+
+
+
diff --git a/public/static/admin/tpl/system/theme.html b/public/static/admin/tpl/system/theme.html
new file mode 100644
index 0000000..9c497fa
--- /dev/null
+++ b/public/static/admin/tpl/system/theme.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
diff --git a/public/static/admin/tpl/system/璇存槑.txt b/public/static/admin/tpl/system/璇存槑.txt
new file mode 100644
index 0000000..e9d0a23
--- /dev/null
+++ b/public/static/admin/tpl/system/璇存槑.txt
@@ -0,0 +1,3 @@
+
+注意:
+该目录存放的是 layuiAdmin 的系统模板碎片,很多界面需要依赖到它,切勿随意剔除。
\ No newline at end of file
diff --git a/public/static/admin/tpl/璇存槑.txt b/public/static/admin/tpl/璇存槑.txt
new file mode 100644
index 0000000..d4d4a31
--- /dev/null
+++ b/public/static/admin/tpl/璇存槑.txt
@@ -0,0 +1,3 @@
+
+注意:
+该目录存放的是 layuiAdmin 的动态模板碎片
\ No newline at end of file
diff --git a/public/static/res/css/admin.css b/public/static/res/css/admin.css
new file mode 100644
index 0000000..201cb58
--- /dev/null
+++ b/public/static/res/css/admin.css
@@ -0,0 +1,103 @@
+body{background:#fff}
+.cl{zoom:1}
+.cl:after{content:'\20';display:block;height:0;clear:both;visibility:hidden}
+.z{float:left}
+.y{float:right}
+.header{background:#009688;height:60px;width:100%;position:fixed;left:0;top:0;z-index:999}
+.header a{font-size:18px;padding:0 30px 0 0;line-height:60px;font-weight:100;color:#fff}
+.header h2{font-size:18px;padding:0 0 0 30px;line-height:60px;font-weight:100;color:#fff}
+.header a:hover{color:#fff}
+.admin{background:#fff;min-height:100%;width:100%}
+.aleft{position:fixed;left:0;top:60px;width:200px;height:100%;background:#fff;border-right:1px solid #EAEAEA}
+.aright{margin-left:200px;margin-top:80px}
+.bform{margin:20px 30px 0 10px}
+.aright .arz a{color:#fff;padding:10px 18px;background:#009688;height:36px;line-height:36px;border-radius:2px}
+.aright .arz a i{position:relative;right:3px;top:1px}
+.aright .arz{margin:20px 0 0 30px}
+.aright .arz a:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}
+.aform tr{border:1px solid #EAEAEA}
+.aform tr th{border-left:1px solid #EAEAEA;background:#F9F9F9;line-height:45px}
+.aform tr td{border-left:1px solid #EAEAEA;line-height:40px}
+.aform{margin:20px 30px 0 30px}
+.aleft h3{font-size:16px;padding:15px 30px;font-weight:100;color:#333;border-bottom:1px solid #EAEAEA;background:#F9F9F9}
+.aleft ul li{padding:12px 0 12px 50px;float:left;color:#333;width:150px;border-bottom:1px solid #EAEAEA}
+.aleft ul li a:hover{color:#009688}
+.aleft ul li i{position:relative;right:3px;top:1px;color:#009688}
+.sort-input{width:25px;text-align:center}
+.file-box img{margin-top:15px;}
+.file-box{position:relative;width:800px}
+.file-txt{width:660px;height:36px;line-height:36px;background:#fff;border:0 solid #fff;padding-left:5px}
+.file-box i{position:absolute;left:16px;top:11px;font-size:16px;color:#5FB878}
+.file-btn:hover{border-color:#D2D2D2!important}
+.file-btn{width:110px;height:36px;line-height:36px;background:#fff;border:1px solid #e6e6e6;padding-left:15px;border-radius:2px}
+.file-file{position:absolute;top:0;left:0;height:36px;filter:alpha(opacity:0);opacity:0;width:110px}
+.pages{float:left;margin:20px 30px 0 30px}
+.pages .current,.pages a,.pages a:hover{display:inline-block;height:28px;line-height:28px;vertical-align:middle}
+.pages a{color:#333;background-color:#f0f0f0}
+.pages .current,.pages a:hover{text-decoration:none;color:#FFF;background-color:#009688;vertical-align:middle}
+.pages .next,.pages .prev{padding:0 15px;font-family:"����"}
+.pages .current,.pages .num{margin:0 3px;padding:0 11px}
+#login{background:#179898}
+.login{border-radius:4px;width:260px;margin-top:100px!important;margin:0 auto;background:#fff;padding:60px 80px}
+.login h2{font-size:28px;font-weight:100;color:#333;text-align:center;margin-bottom:50px}
+.aright_1{margin:20px 30px 0 30px}
+.aright_1 tr{font-size:13px;line-height:38px;border-bottom:1px solid #EAEAEA}
+.aright_1 table{margin-bottom:10px}
+.aright_1 tr:last-child{border:none}
+.inside{width:100%;min-width:1000px;height:65px;background:#393D49}
+.inside h2 img{float:left;padding:0}
+.inside ul{width:120px;height:65px;float:left;margin-left:68px}
+.inside .innumber1{background:#FF5722!important;color:#fff!important}
+.inside .innumber{margin-top:12px;width:40px;height:40px;line-height:40px;text-align:center;font-size:20px;border-radius:50%;background:#fff;float:left;color:#009688}
+.inside .inword{width:80px;height:65px;float:left;line-height:65px;text-indent:10px;font-size:16px;color:#fff}
+.inwp{width:1000px;margin:0 auto}
+.inout1 a{float:left;border:1px solid #C9C9C9;background-color:#fff;color:#555;padding:8px 18px;border-radius:2px;margin-right:10px;margin-top:20px}
+.inout2 a{float:left;color:#fff;padding:9px 18px;background:#009688;border-radius:2px;margin-top:20px}
+.inout1 a:hover{color:#555;opacity:.8;filter:alpha(opacity=80)}
+.inout2 a:hover{color:#fff;opacity:.8;filter:alpha(opacity=80)}
+.inout2 input{float:left;color:#fff;padding:9px 18px;background:#009688;border-radius:2px;margin-top:20px;border:none}
+.inout2 input:hover{color:#fff;opacity:.8;filter:alpha(opacity=80)}
+.inside2 h2{font-size:20px;margin:20px 0}
+.inside2 h3{font-size:16px;margin:20px 0 10px 0;color:#FF5722}
+.inside2 p{font-size:14px;line-height:28px;margin-bottom:10px}
+.inside2 tr{border:1px solid #EAEAEA}
+.inside2 tr th{border-left:1px solid #EAEAEA;background:#F9F9F9;line-height:45px}
+.inside2 tr td{border-left:1px solid #EAEAEA;line-height:40px;padding-left:20px}
+.layui-form-pane .layui-form-label{width:132px!important}
+.layui-form-pane .layui-input-block{margin-left:132px!important}
+.formbtngroup {
+float:right;margin-right:30px;
+ }
+
+.login .login-title {color: #fff;text-align: center;font-size: 20px;margin-top: 200px;}
+.login .login-form {max-width: 450px;margin: 10px auto;position: relative;left: -50px;color: #fff;}
+.login .login-form .captcha {width: 140px;height: 38px;}
+.login .login-form input {background-color: rgba(255, 255, 255, 0.3);border: 1px solid rgba(255, 255, 255, 0.3);color: #fff;}
+.login .login-form button {width: 100%;background-color: #048f74;}
+
+.logo {margin-top: 20px;margin-left: 20px;}
+
+.header {background-color: #393D49;}
+
+.footer {line-height: 44px;}
+
+.layui-body {left: 210px;}
+.layui-side {top: 60px;}
+.layui-table tbody tr:hover {background-color: #f2f2f2;}
+.layui-tab {overflow: visible;}
+.layui-tab-title > li > a {display: block;}
+.layui-btn-normal {background: #4caf50;}
+.layui-btn-danger {background: #e90d24;}
+.layui-nav-tree .layui-nav-child dd a {text-indent: 16px;}
+
+.form-container {max-width: 800px;}
+.form-container .edui-editor {margin-top: -7px;margin-bottom: -7px;margin-left: -11px;}
+
+/*分页*/
+.pagination {}
+.pagination li {display: inline-block;margin-right: -1px;padding: 5px;border: 1px solid #e2e2e2;min-width: 20px;text-align: center;padding: 5px 8px; font-size: 18px; line-height: 1.3333333;}
+
+.pagination li.active {background: #009688;color: #fff;border: 1px solid #009688;}
+.pagination li a {display: block;text-align: center;}
+
+.photo-list {margin: 5px 0;}
\ No newline at end of file
diff --git a/public/static/res/css/font-awesome.min.css b/public/static/res/css/font-awesome.min.css
new file mode 100644
index 0000000..ee4e978
--- /dev/null
+++ b/public/static/res/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
diff --git a/public/static/res/css/font_24081_qs69ykjbea.css b/public/static/res/css/font_24081_qs69ykjbea.css
new file mode 100644
index 0000000..b3d6a28
--- /dev/null
+++ b/public/static/res/css/font_24081_qs69ykjbea.css
@@ -0,0 +1,157 @@
+
+@font-face {font-family: "iconfont";
+ src: url('//at.alicdn.com/t/font_24081_qs69ykjbea.eot?t=1535387101554'); /* IE9*/
+ src: url('//at.alicdn.com/t/font_24081_qs69ykjbea.eot?t=1535387101554#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
+ url('//at.alicdn.com/t/font_24081_qs69ykjbea.ttf?t=1535387101554') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('//at.alicdn.com/t/font_24081_qs69ykjbea.svg?t=1535387101554#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family:"iconfont" !important;
+ font-size:16px;
+ font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-zan:before { content: "\e612"; }
+
+.icon-jiazaizhong:before { content: "\e60e"; }
+
+.icon-sousuo:before { content: "\e621"; }
+
+.icon-quanpingpad:before { content: "\e61d"; }
+
+.icon-shezhi:before { content: "\e607"; }
+
+.icon-renzhengv:before { content: "\e62b"; }
+
+.icon-shijian:before { content: "\e60a"; }
+
+.icon-guanbi:before { content: "\e614"; }
+
+.icon-tianjia:before { content: "\e616"; }
+
+.icon-tuichu:before { content: "\e601"; }
+
+.icon-shui:before { content: "\e602"; }
+
+.icon-qq:before { content: "\e618"; }
+
+.icon-weibo:before { content: "\e617"; }
+
+.icon-tupian:before { content: "\e608"; }
+
+.icon-logo:before { content: "\e603"; }
+
+.icon-daima:before { content: "\e609"; }
+
+.icon-biaoqing:before { content: "\e60f"; }
+
+.icon-nan:before { content: "\e619"; }
+
+.icon-nv:before { content: "\e61a"; }
+
+.icon-quitquanping:before { content: "\e61e"; }
+
+.icon-zuichun:before { content: "\e61c"; }
+
+.icon-charushuipingxian:before { content: "\e622"; }
+
+.icon-yulan:before { content: "\e60d"; }
+
+.icon-liulanyanjing:before { content: "\e60b"; }
+
+.icon-touxiang:before { content: "\e604"; }
+
+.icon-caina:before { content: "\e613"; }
+
+.icon-room:before { content: "\e615"; }
+
+.icon-svgmoban53:before { content: "\e610"; }
+
+.icon-shichang:before { content: "\e600"; }
+
+.icon-shouye:before { content: "\e605"; }
+
+.icon-tishilian:before { content: "\e629"; }
+
+.icon-fabu:before { content: "\e606"; }
+
+.icon-pinglun:before { content: "\e60c"; }
+
+.icon-zan1:before { content: "\e611"; }
+
+.icon-chengshi:before { content: "\e61b"; }
+
+.icon-lianjie:before { content: "\e620"; }
+
+.icon-yulan1:before { content: "\e785"; }
+
+.icon-renshu:before { content: "\e61f"; }
+
+.icon-huizongzuoyoutuodong:before { content: "\e623"; }
+
+.icon-404:before { content: "\e627"; }
+
+.icon-iconmingxinganli:before { content: "\e652"; }
+
+.icon-wenda:before { content: "\e626"; }
+
+.icon-top:before { content: "\e624"; }
+
+.icon-ui:before { content: "\e625"; }
+
+.icon-fengexian:before { content: "\e63a"; }
+
+.icon-jiacu:before { content: "\e62f"; }
+
+.icon-kiss:before { content: "\e6cd"; }
+
+.icon-biaoqing1:before { content: "\e63b"; }
+
+.icon-liwu:before { content: "\e9c5"; }
+
+.icon-emwdaima:before { content: "\e62a"; }
+
+.icon-quanzi:before { content: "\e7bb"; }
+
+.icon-wendang:before { content: "\e722"; }
+
+.icon-jifen:before { content: "\e632"; }
+
+.icon-aqrenzheng:before { content: "\e62d"; }
+
+.icon-pinglun1:before { content: "\e631"; }
+
+.icon-web:before { content: "\e6e9"; }
+
+.icon-yxj-expression:before { content: "\e628"; }
+
+.icon-tongzhi:before { content: "\e647"; }
+
+.icon-kaifashili:before { content: "\e638"; }
+
+.icon-huiyuan:before { content: "\e637"; }
+
+.icon-pinglun2:before { content: "\e62c"; }
+
+.icon-alipay:before { content: "\e630"; }
+
+.icon-jiaoliu:before { content: "\e6b7"; }
+
+.icon-chanpin:before { content: "\e634"; }
+
+.icon-renzheng:before { content: "\e62e"; }
+
+.icon-tiezi:before { content: "\e635"; }
+
+.icon-rizhi:before { content: "\e69d"; }
+
+.icon-weixinzhifu:before { content: "\e633"; }
+
+.icon-yinyong:before { content: "\e636"; }
+
+.icon-xiazai:before { content: "\e78e"; }
+
diff --git a/public/static/res/css/font_24081_qs69ykjbea.ttf b/public/static/res/css/font_24081_qs69ykjbea.ttf
new file mode 100644
index 0000000..9591644
Binary files /dev/null and b/public/static/res/css/font_24081_qs69ykjbea.ttf differ
diff --git a/public/static/res/css/full.css b/public/static/res/css/full.css
new file mode 100644
index 0000000..75b65c9
--- /dev/null
+++ b/public/static/res/css/full.css
@@ -0,0 +1,53 @@
+/*! 默认风格 */
+
+html body{margin-top:0; margin-left: 136px;}
+html .fly-full{margin-top: 0;}
+
+.main{width:auto; margin:15px 24px 15px 24px;}
+.content{margin-right: 360px;}
+.jie-row li .jie-title{max-width:70%;}
+
+/* 头部 */
+.header{width:136px; height:100%;}
+.header .main{position: static; width:auto;}
+.logo{top:20px; left:50%; width:86px; height:74px; margin-left:-43px; background:url(../images/logo-1.png);}
+.nav{position:relative; left:0; top:110px; border-top:1px solid #282C35;}
+.nav a{display:block; height:50px; line-height:50px; padding:0; text-align:center;}
+.nav a:first-child{border-top:1px solid #424857;}
+.nav-user span{margin-top: 10px;}
+
+.icon-touxiang{font-size: 60px;}
+
+.nav-user{top: auto; bottom:20px; left:0; width:100%;}
+.nav-user span,
+.nav-user .unlogin,
+.out-login,
+.avatar,
+.avatar cite,
+.nav-user .nav{display:block; *display:block; text-align:center;}
+.nav-user span{top: 0;}
+.nav-user span a{padding:0 6px;}
+.nav-user .unlogin{margin-right: 0;}
+.out-login{margin-left:0; margin-top:20px;}
+.out-login a{ padding:0 5px;}
+.nav-user .nav{position:relative; margin-left: 0; margin-top: 15px;}
+
+.avatar img{width:60px; height:60px;}
+.avatar cite{margin-left: 0; margin-top:10px; }
+.avatar i{margin-left: 0;}
+
+.nav-message{left: auto; right: 10px;}
+
+/* 适配 */
+@media screen and (max-width: 1024px) {
+ html body{margin-left: 140px;}
+ .main{margin: 15px 10px;}
+ .content{margin: 0;}
+ .edge{display:none}
+}
+
+@media screen and (max-width: 750px) {
+ html body{margin-left:0;}
+ .header{left:-140px;}
+ .edge{display: block;}
+}
diff --git a/public/static/res/css/global.css b/public/static/res/css/global.css
new file mode 100644
index 0000000..04c3197
--- /dev/null
+++ b/public/static/res/css/global.css
@@ -0,0 +1,733 @@
+/**
+
+ @Name: Fly社区
+ @Author: 贤心
+ @Site: fly.layui.com
+
+ */
+
+
+/* 全局 */
+html,body{overflow-x: hidden;}
+html body{margin-top: 61px;}
+html{background-color: #F2F2F2;}
+i{font-style: normal;}
+
+/* 图标 */
+
+@font-face {font-family: "iconfont";
+ src: url('//at.alicdn.com/t/font_24081_qs69ykjbea.eot?t=1535387101554'); /* IE9*/
+ src: url('//at.alicdn.com/t/font_24081_qs69ykjbea.eot?t=1535387101554#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
+ url('//at.alicdn.com/t/font_24081_qs69ykjbea.ttf?t=1535387101554') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('//at.alicdn.com/t/font_24081_qs69ykjbea.svg?t=1535387101554#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family:"iconfont" !important;
+ font-size:16px;
+ font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-zan:before { content: "\e612"; }
+
+.icon-jiazaizhong:before { content: "\e60e"; }
+
+.icon-sousuo:before { content: "\e621"; }
+
+.icon-quanpingpad:before { content: "\e61d"; }
+
+.icon-shezhi:before { content: "\e607"; }
+
+.icon-renzhengv:before { content: "\e62b"; }
+
+.icon-shijian:before { content: "\e60a"; }
+
+.icon-guanbi:before { content: "\e614"; }
+
+.icon-tianjia:before { content: "\e616"; }
+
+.icon-tuichu:before { content: "\e601"; }
+
+.icon-shui:before { content: "\e602"; }
+
+.icon-qq:before { content: "\e618"; }
+
+.icon-weibo:before { content: "\e617"; }
+
+.icon-tupian:before { content: "\e608"; }
+
+.icon-logo:before { content: "\e603"; }
+
+.icon-daima:before { content: "\e609"; }
+
+.icon-biaoqing:before { content: "\e60f"; }
+
+.icon-nan:before { content: "\e619"; }
+
+.icon-nv:before { content: "\e61a"; }
+
+.icon-quitquanping:before { content: "\e61e"; }
+
+.icon-zuichun:before { content: "\e61c"; }
+
+.icon-charushuipingxian:before { content: "\e622"; }
+
+.icon-yulan:before { content: "\e60d"; }
+
+.icon-liulanyanjing:before { content: "\e60b"; }
+
+.icon-touxiang:before { content: "\e604"; }
+
+.icon-caina:before { content: "\e613"; }
+
+.icon-room:before { content: "\e615"; }
+
+.icon-svgmoban53:before { content: "\e610"; }
+
+.icon-shichang:before { content: "\e600"; }
+
+.icon-shouye:before { content: "\e605"; }
+
+.icon-tishilian:before { content: "\e629"; }
+
+.icon-fabu:before { content: "\e606"; }
+
+.icon-pinglun:before { content: "\e60c"; }
+
+.icon-zan1:before { content: "\e611"; }
+
+.icon-chengshi:before { content: "\e61b"; }
+
+.icon-lianjie:before { content: "\e620"; }
+
+.icon-yulan1:before { content: "\e785"; }
+
+.icon-renshu:before { content: "\e61f"; }
+
+.icon-huizongzuoyoutuodong:before { content: "\e623"; }
+
+.icon-404:before { content: "\e627"; }
+
+.icon-iconmingxinganli:before { content: "\e652"; }
+
+.icon-wenda:before { content: "\e626"; }
+
+.icon-top:before { content: "\e624"; }
+
+.icon-ui:before { content: "\e625"; }
+
+.icon-fengexian:before { content: "\e63a"; }
+
+.icon-jiacu:before { content: "\e62f"; }
+
+.icon-kiss:before { content: "\e6cd"; }
+
+.icon-biaoqing1:before { content: "\e63b"; }
+
+.icon-liwu:before { content: "\e9c5"; }
+
+.icon-emwdaima:before { content: "\e62a"; }
+
+.icon-quanzi:before { content: "\e7bb"; }
+
+.icon-wendang:before { content: "\e722"; }
+
+.icon-jifen:before { content: "\e632"; }
+
+.icon-aqrenzheng:before { content: "\e62d"; }
+
+.icon-pinglun1:before { content: "\e631"; }
+
+.icon-web:before { content: "\e6e9"; }
+
+.icon-yxj-expression:before { content: "\e628"; }
+
+.icon-tongzhi:before { content: "\e647"; }
+
+.icon-kaifashili:before { content: "\e638"; }
+
+.icon-huiyuan:before { content: "\e637"; }
+
+.icon-pinglun2:before { content: "\e62c"; }
+
+.icon-alipay:before { content: "\e630"; }
+
+.icon-jiaoliu:before { content: "\e6b7"; }
+
+.icon-chanpin:before { content: "\e634"; }
+
+.icon-renzheng:before { content: "\e62e"; }
+
+.icon-tiezi:before { content: "\e635"; }
+
+.icon-rizhi:before { content: "\e69d"; }
+
+.icon-weixinzhifu:before { content: "\e633"; }
+
+.icon-yinyong:before { content: "\e636"; }
+
+.icon-xiazai:before { content: "\e78e"; }
+
+
+
+
+/* 辅助 */
+a:hover{color: #009688; transition: all .3s;}
+pre{padding: 10px 15px; margin: 10px 0; font-size: 12px; border-left: 6px solid #009688; background-color: #f8f8f8; font-family: Courier New; overflow: auto;}
+a:hover{color: #009688; transition: all .3s;}
+pre{padding: 10px 15px; margin: 10px 0; font-size: 12px; border-left: 6px solid #009688; background-color: #f8f8f8; font-family: Courier New; overflow: auto;}
+
+pre{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}
+pre{border: none; border-left: 5px solid #ddd;}
+
+.layui-container{padding: 0;}
+.fly-main{width: 1079px; min-height: 600px; margin: 0 auto 15px;}
+.layui-badge{height: 20px; line-height: 20px; border-radius: 2px;}
+
+.fly-link{color: #01AAED;}
+.fly-link:hover{color: #5FB878;}
+.fly-grey{color: #999;}
+
+.fly-msg, .fly-error{padding: 10px 15px; line-height: 24px;}
+.fly-msg{background-color:#F8F8F8; color:#666;}
+.fly-msg a{color:#4F99CF}
+.fly-editbox{position: relative;}
+
+.fly-marginTop{margin-top: 15px;}
+.fly-mid{display: inline-block; height: 10px; width: 1px; margin: 0 10px; vertical-align: middle; background-color: #e2e2e2;}
+.fly-right{position: absolute; right: 15px; top: 0;}
+
+/* 过度 */
+.fly-loading{position: absolute; top: 50%; left: 50%; margin: -12px 0 0 -15px; font-size: 30px; color: #c2c2c2;}
+
+/* 头像 */
+.fly-avatar{position: absolute; left: 15px; top: 15px;}
+.fly-avatar img{display: block; width: 45px; height: 45px; margin: 0; border-radius: 2px;}
+
+/* 徽章 */
+.fly-badge-vip{height: 16px; line-height: 16px; padding: 0 3px; background-color: #FF5722; color: #fff; border-radius: 2px;}
+.fly-badge-accept{height: 18px; line-height: 18px; padding: 0 5px !important; background-color: #5FB878; border-radius: 2px;}
+
+/* 赞助商 */
+.fly-zanzhu{display: block; position: relative; height: 60px; line-height: 60px; margin-top: 10px; padding: 0 20px; text-align: center; font-size: 16px; font-weight: 300; background-color: #009688; color: #fff;}
+.fly-zanzhu:first-child{margin-top: 0;}
+.fly-zanzhu:hover{opacity: 0.9; color: #fff;}
+
+/* 图标 */
+.icon-touxiang{display: inline-block; font-size: 34px;}
+.icon-qq, .icon-weibo{font-size: 30px;}
+.icon-renzheng{position: relative; color: #FFB800;}
+.icon-kiss{font-size: 18px;}
+.icon-pinglun1{position: relative; top: 2px;}
+
+/* 头部 */
+.fly-header{position: fixed; left: 0; top: 0; z-index: 10000; width: 100%; height: 60px; border-bottom: 1px solid #404553; border-right: 1px solid #404553; border-radius: 0;}
+.fly-logo{position: absolute; left: 15px; top: 11px;}
+.fly-nav{margin-left: 200px;}
+.fly-nav a i{position: absolute; left: 25px; top: 0; padding-right: 10px; font-size: 26px;}
+.fly-nav a .icon-shouye, .nav a .icon-shezhi{top: 2px;}
+
+.fly-nav-user{position: absolute; top: 0; right: 0;}
+.fly-nav-user .iconfont{position: relative;}
+.fly-nav-avatar img{width: 36px; height: 36px; margin-left: 10px; border-radius: 100%;}
+.fly-nav-avatar .icon-renzheng{font-size: 16px; top: 1px;}
+.fly-nav-avatar .fly-badge-vip{position: relative; margin-left: 10px;}
+.fly-nav-user .layui-nav-child a i{position: relative; top: 2px; margin-right: 10px; font-size: 26px;}
+
+.fly-nav-msg{position:absolute; top: 50%; left: -25px; height: 20px; line-height: 20px; margin-top: -10px; padding:0 6px; background-color: #FF7200; color: #fff; border-radius: 2px;}
+.fly-nav-msg:hover{color:#fff;}
+
+.fly-header .layui-nav{padding: 0; background: none;}
+.fly-header .fly-nav a{padding: 0 25px 0 60px;}
+.fly-header .fly-nav-user li a{padding: 0 10px;}
+.fly-header .fly-nav-user li .fly-nav-avatar{padding-right: 0;}
+.fly-header .fly-nav-user a.iconfont{color: #A9B7B7;}
+.fly-header>.layui-nav-item a{color: rgba(255,255,255,0.5);}
+.fly-header .layui-this a{color: #fff;}
+.fly-header .layui-nav .layui-this:after,
+.fly-header .layui-nav .layui-nav-bar,
+.fly-header .fly-nav-user .layui-nav-more{display: none !important;}
+.fly-header .fly-nav-user .layui-nav-child{left: auto; right: 0; width: 120px; min-width: 0;}
+
+.fly-html-layui .fly-nav-avatar .layui-nav-more{display: none !important;}
+.fly-header .fly-nav-user .layui-nav-child{left: auto; right: 0; width: 120px; min-width: 0;}
+.fly-html-layui .fly-nav-msg{left: -30px;}
+.fly-html-layui .layui-header .layui-nav-child dd{text-align: center;}
+.fly-html-layui .layui-header .layui-nav-item a cite{padding: 0 0 0 10px;}
+.fly-html-layui .layui-header .layui-nav .fly-layui-user{margin: 0; margin-left: 40px;}
+.fly-html-layui .layui-header .layui-nav .fly-layui-user a{padding: 0;}
+.fly-layui-user .layui-nav-child{left: auto; right: 0; min-width: 0; width: 120px;}
+
+
+
+/* 底部 */
+.fly-footer {margin: 50px 0 0; padding: 20px 0 30px; line-height: 30px; text-align: center; color: #737573; border-top: 1px solid #e2e2e2;}
+.fly-footer a{padding:0 6px; font-weight: 300; color: #333;}
+.fly-footer a:hover{color: #777;}
+.fly-union{margin-top: 10px; color: #999;}
+.fly-union>*{display: inline-block; vertical-align: middle;}
+.fly-union a[upyun] img{width: 80px;}
+.fly-union span{position: relative; top: 3px;}
+.fly-union span a{padding: 0; display: inline; color: #999;}
+.fly-union span a:hover{text-decoration: underline;}
+
+/* 面板 */
+.fly-panel{margin-bottom: 15px; border-radius: 2px; background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);}
+.fly-panel[pad20]{padding: 20px;}
+.fly-panel-title{position: relative; height: 50px; line-height: 50px; padding: 0 15px; border-bottom: 1px dotted #E9E9E9; color: #333; border-radius: 2px 2px 0 0; font-size: 14px;}
+.fly-panel-main{padding: 10px 15px;}
+.fly-panel-border{border: 1px solid #e6e6e6; box-shadow: none;}
+.fly-panel-border .fly-panel-title{border-bottom: 1px solid #e6e6e6;}
+
+/* 专栏 */
+.fly-column{height: 50px; line-height: 50px;}
+.fly-column ul li{position: relative; display: inline-block; height: 50px;}
+.fly-column ul li a{padding: 0 20px;}
+.fly-column ul li.layui-this:after{ position: absolute; bottom: 13px; left: 8px; z-index: 0; width: 50px; height: 22px; border: 1px solid #5FB878; border-radius: 2px;}
+.fly-column ul li.layui-this a{color: #5FB878;}
+.fly-column ul li .fly-mid{margin: 0 20px;}
+.fly-column-right{position: absolute; right: 0; top: 0;}
+.fly-column-right .layui-btn{vertical-align: initial;}
+.fly-column .layui-badge-dot{position: absolute; top: 50%; left: 50%; margin: -4px 0 0 20px;}
+
+/* 搜索 */
+.fly-search{display: inline-block; vertical-align: top; width: 50px; height: 50px; margin-right: 10px; text-align: center; cursor: pointer; font-size: 20px;}
+.fly-search .layui-icon{font-size: 20px;}
+.fly-search:hover{color: #5FB878;}
+.fly-layer-search input{height: 75px; line-height: 75px; width: 500px; padding: 0 15px; font-size: 20px; border: none 0; background: none;}
+
+/* 幻灯 */
+.fly-topline{height: 195px;}
+.fly-topline img{max-width: 100%;}
+.fly-topline .layui-carousel-ind{top: -25px;}
+.fly-topline .layui-carousel-ind ul{background: none;}
+.fly-topline .layui-carousel-ind ul li{width: 30px; height: 3px; border-radius: 0;}
+
+@media screen and (min-width: 768px) {
+ .fly-topline{height: 166px;}
+}
+@media screen and (min-width: 992px) {
+ .fly-topline{height: 141px;}
+}
+@media screen and (min-width: 1200px) {
+ .fly-topline{height: 172px;}
+}
+
+/* 筛选 */
+.fly-filter a{padding: 0 8px; color: #666;}
+.fly-filter a.layui-this{color: #5FB878;}
+.fly-filter .fly-mid{margin: 0 8px;}
+.fly-filter-right{position: absolute; right: 10px; top: 0;}
+
+/* Tab */
+.fly-tab{position: relative; padding-top: 3px;}
+.fly-tab .layui-tab{margin: 0;}
+.fly-tab .layui-tab-title{border-bottom: 1px dotted #e2e2e2;}
+
+.fly-tab-border{position:relative; margin-bottom: 15px;}
+.fly-tab-border span,
+.fly-tab-border span a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
+.fly-tab-border span{border: 1px solid #ddd; border-right: none; font-size:0;}
+.fly-tab-border span a{position: relative; height: 36px; line-height: 36px; padding: 0 20px; border-right: 1px solid #ddd; font-size: 14px; background-color: #fff;}
+.fly-tab-border .tab-this{color: #000;}
+.fly-tab-border .tab-this:after{content: ''; position: absolute; bottom: -1px; left: -1px; width: 100%; height: 1px; padding: 0 1px; background-color: #009688;}
+
+/* 分页 */
+.laypage-main,
+.laypage-main *{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
+.laypage-main{margin: 20px 0; border: 1px solid #009E94; border-right: none; border-bottom: none; font-size: 0;}
+.laypage-main *{padding: 0 20px; line-height: 36px; border-right: 1px solid #009E94; border-bottom: 1px solid #009E94; font-size: 14px;}
+.laypage-main .laypage-curr{background-color:#009E94; color:#fff;}
+
+/* 简易编辑器 */
+.fly-edit{position:relative; display: block; height: 38px; top: 1px; left:0; border: 1px solid #e6e6e6; border-radius: 2px 2px 0 0; background-color: #FBFBFB; font-size: 0;}
+.fly-edit span{position: relative; display: inline-block; vertical-align: top; width: 50px; height: 38px; line-height: 38px; border-right: 1px solid #e6e6e6; text-align: center; color: #009E94; cursor: pointer; font-size: 18px;}
+.fly-edit span i{position: relative; font-size: 18px;}
+.fly-edit span.layui-this,
+.fly-edit span:hover{background-color: #f2f2f2; color: #5DB276;}
+.layui-textarea:hover,
+.layui-textarea:focus{border-color: #e6e6e6 !important;}
+
+/* 列表 */
+.fly-list li{position: relative; height: 45px; line-height: 22px; padding: 15px 15px 15px 75px; border-bottom: 1px dotted #e2e2e2;}
+.fly-list li:last-child{border-bottom: none;}
+.fly-list li h2,
+.fly-list li h2 a,
+.fly-list-info{white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}
+.fly-list li h2{height: 26px; font-size: 0;}
+.fly-list li h2 a{display: inline-block; max-width: 80%; padding-right: 10px; font-size: 16px;}
+.fly-list li h2 .layui-badge{top: -2px; height: 16px; line-height: 16px; padding: 0 5px; margin-right: 10px; font-size: 12px; border: 1px solid #5FB878; background: none; color: #5FB878;}
+
+.fly-list-info{position: relative; font-size: 13px; color: #999;}
+.fly-list-info>*{padding-right: 15px;}
+.fly-list-info a[link]{color: #999;}
+.fly-list-info a[link]:hover{color: #5FB878;}
+.fly-list-info .icon-renzheng{position: relative; top: 1px; margin-right: 3px;}
+.fly-list-info .fly-badge-vip{position: relative; margin-left: 2px;}
+.fly-list-kiss{color: #FF5722;}
+.fly-list-nums{position: absolute; right: 0; top: 0; padding-right: 0!important;}
+.fly-list-nums i{position: relative; padding: 0 3px 0 15px;}
+
+.fly-list-badge{position: absolute; right: 15px; top: 15px; font-size: 0;}
+.fly-list-badge .layui-badge{margin-left: 5px; border-radius: 2px; font-size: 12px;}
+
+/* 单行列表 */
+.fly-list-one .fly-panel-title{margin-bottom: 5px;}
+.fly-list-one dd{margin: 0 15px; line-height: 26px; white-space: nowrap; overflow: hidden; list-style: decimal-leading-zero inside; *list-style-type: decimal inside; color: #009E94;}
+.fly-list-one dd a,
+.fly-list-one dd span{display: inline-block; *display: inline; *zoom: 1; vertical-align: top; font-style: normal}
+.fly-list-one dd a{max-width: 85%; margin-right: 5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px;}
+.fly-list-one dd span{font-size: 12px; color: #ccc;}
+.fly-list-one dd:last-child{padding-bottom: 5px;}
+
+body .layui-edit-face{ border:none; background:none;}
+body .layui-edit-face .layui-layer-content{padding:0; background-color:#fff; color:#666; box-shadow:none}
+.layui-edit-face .layui-layer-TipsG{display:none;}
+.layui-edit-face ul{position:relative; width:372px; padding:10px; border:1px solid #D9D9D9; background-color:#fff; box-shadow: 0 0 20px rgba(0,0,0,.2);}
+.layui-edit-face ul li{cursor: pointer; float: left; border: 1px solid #e8e8e8; height: 22px; width: 26px; overflow: hidden; margin: -1px 0 0 -1px; padding: 4px 2px; text-align: center;}
+.layui-edit-face ul li:hover{position: relative; z-index: 2; border: 1px solid #eb7350; background: #fff9ec;}
+
+/* 签到 */
+.fly-signin cite{padding: 0 5px; color: #FF5722; font-style: normal;}
+.fly-signin .layui-badge-dot{top: -7px; margin-left: 0px;}
+.fly-signin-list{padding: 0; line-height: 30px;}
+.fly-signin-list .layui-tab-item{padding: 10px; height: 320px; overflow-x: hidden; overflow-y: auto;}
+.fly-signin-list li{margin-top: 5px; padding-bottom: 5px; border-bottom: 1px dotted #e2e2e2; white-space: nowrap;}
+.fly-signin-list li:first-child{margin-top: 0;}
+.fly-signin-list li:last-child{border: none 0;}
+.fly-signin-list img{width: 30px; height: 30px; margin-right: 10px; border-radius: 2px;}
+.fly-signin-list span{padding-left: 10px;}
+.fly-signin-list span i{color: #FF5722;}
+.fly-signin-list .fly-none{padding-top: 20px; min-height: 0;}
+.fly-signin-days{position: absolute; right: 15px; padding-left: 10px; color: #999;}
+.fly-signin-main{position: relative; height: 38px; padding: 24px 15px; text-align: center;}
+.fly-signin-main span{padding-left: 10px;}
+
+/* 榜单 */
+.fly-rank{padding-bottom: 10px;}
+.fly-rank dl{position: relative; overflow: hidden; margin-left: 20px; text-align: center; font-size: 0;}
+.fly-rank dd{position: relative; width: 65px; height: 85px; margin: 10px 25px 5px 0; display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}
+.fly-rank dd a img{width: 65px; height: 65px; border-radius: 2px;}
+.fly-rank dd a cite{ position:absolute; bottom: 20px; left: 0; width: 100%; height:20px; line-height:20px; text-align:center; background-color:rgba(0,0,0,.2); color:#fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
+.fly-rank dd a:hover cite{display: block;}
+.fly-rank dd a i{position:absolute; bottom: 0; left: 0; width: 100%; text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-style: normal;}
+
+/* 温馨通道 */
+.fly-list-quick{border: 1px solid #f2f2f2; border-bottom: none; border-right: 0;}
+.fly-list-quick .layui-col-xs6{height: 40px; line-height: 40px; padding: 0 10px; border: 1px solid #f2f2f2; border-left: none; border-top: none; text-align: center; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;}
+.fly-list-quick a{display: block;}
+.fly-list-quick a:hover{color: #5FB878;}
+
+/* 静态列表 */
+.fly-list-static li{line-height: 26px; list-style-position: inside; list-style-type: disc; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;}
+.fly-list-static li a{color: #01AAED;}
+.fly-list-static li a:hover{opacity: 0.8;}
+
+/* 单行列表 */
+.jie-row li{position: relative; margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px dotted #E9E9E9; font-size: 0;}
+.jie-row li *{position: relative; display:inline-block; *display:inline; *zoom:1; vertical-align: top; line-height: 20px; font-size:12px;}
+.jie-row li span{padding: 0 6px; margin-right: 10px; background-color: #DADADA; color:#fff; font-size:12px;}
+.jie-row li .fly-stick{background-color:#393D49;}
+.jie-row li .fly-jing{background-color:#CC0000;}
+.jie-row li .jie-status{margin:0 10px 0 0;}
+.jie-row li .jie-status-ok{background-color:#8FCDA0;}
+.jie-row li a{ padding-right:15px; font-size:14px;}
+.jie-row li cite{padding-right:15px;}
+.jie-row li i, .jie-row li em, .jie-row li cite{font-size:12px; color:#999; font-style: normal;}
+.jie-row li .mine-edit{margin-left:15px; padding:0 6px; background-color: #8FCDA0; color:#fff; font-size:12px;}
+.jie-row li em{position:absolute; right:0; top:0;}
+.jie-row li .jie-user{}
+.jie-row li .jie-title{max-width: 70%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
+.jie-row li .jie-user img{position:relative; top: 16px; width: 35px; height: 35px;}
+
+/* Detail页 */
+.detail-box{padding: 20px;}
+.detail h1{font-size: 24px; line-height: 36px;}
+.fly-detail-info{position: relative; margin: 10px 0 15px;}
+.fly-detail-info .layui-btn{height: 20px; line-height: 20px; vertical-align: top; border-radius: 0;}
+.fly-detail-info .layui-btn+.layui-btn{margin-left: 0;}
+.fly-admin-box{position: relative; display: inline-block; vertical-align: top; margin-left: 20px;}
+.fly-detail-info .fly-list-nums{top: -3px; font-size: 16px;}
+.fly-detail-info .fly-list-nums i{padding: 0 3px 0 15px; font-size: 22px; color: #999;}
+
+.detail-about{position: relative; line-height: 20px; padding: 15px 15px 15px 75px; font-size: 13px; background-color: #f8f8f8; color: #999;}
+.detail-about .jie-status, .detail-about .jie-status-ok{color:#fff;}
+.detail-about .fly-jing{padding:0 6px; background-color:#c00; color:#fff;}
+.detail-about .detail-hits{position: relative; top: 5px; line-height: 20px;}
+.fly-detail-user{white-space: nowrap; overflow: hidden;}
+.fly-detail-user a{padding-right: 10px; font-size: 14px;}
+.fly-detail-user .icon-renzheng{top: 1px;}
+
+.detail-hits span{height: 20px; line-height: 20px;}
+.detail-hits .layui-btn{border-radius: 0;}
+.detail-hits .layui-btn+.layui-btn{margin-left: 5px;}
+.detail-hits .jie-admin{margin-right: 1px;}
+.detail-body{margin: 20px 0 0; min-height: 306px; line-height: 26px; font-size: 16px; color: #333; word-wrap: break-word;}
+.detail-body p{margin-bottom:15px;}
+.detail-body img{max-width: 100%; cursor: pointer;}
+/*
+.detail-body table{margin: 10px 0 15px;}
+.detail-body table thead{background-color:#f2f2f2;}
+.detail-body table th,
+.detail-body table td{padding: 10px 20px; line-height: 22px; border: 1px solid #DFDFDF; font-size: 14px; font-weight: 400;}
+*/
+
+.detail-body .layui-btn{margin: 0 10px 10px 0;}
+.detail-body .layui-btn a{color: #fff;}
+.detail-body ul>li{margin-top: 0;}
+.detail-body .layui-elem-quote{margin: 10px 0; font-size: 14px; line-height: 26px;}
+
+/* 发帖 */
+.layui-form-item.layui-col-space15{margin-bottom: 7.5px;}
+
+
+/* 求解管理 */
+.jie-admin{cursor: pointer;}
+.detail-hits .jie-admin{color: #fff; padding: 0 10px; }
+.detail-hits .jie-admin a{color: #fff;}
+.jieda-admin{position:absolute; right: 0; top: 4px;}
+
+/* 回答 */
+.jieda{margin-bottom: 30px;}
+.jieda li{position: relative; padding: 20px 0 10px; border-bottom: 1px dotted #DFDFDF;}
+.jieda li:last-child{border-bottom: none;}
+.jieda .fly-none{height: 50px; min-height: 0;}
+.jieda .icon-caina{position:absolute; right:10px; top:15px; font-size:60px; color: #58A571;}
+
+.detail-about-reply{padding: 0 0 0 55px; background: none;}
+.detail-about-reply .detail-hits{left: 0; bottom: 0;}
+.detail-about-reply .fly-avatar{left: 0; top: 0;}
+
+.jieda-body{margin: 25px 0 20px; min-height: 0; line-height: 24px; font-size:14px;}
+.jieda-body p{margin-bottom: 10px;}
+.jieda-body a{color:#4f99cf}
+.jieda-reply{position:relative;}
+.jieda-reply span{padding-right:20px; color:#999; cursor:pointer;}
+.jieda-reply span:hover{color:#666;}
+.jieda-reply span i{margin-right:5px; font-size:16px;}
+.jieda-reply span em{font-style: normal;}
+.jieda-reply span .icon-zan{font-size: 22px;}
+.jieda-reply .zanok,
+.jieda-reply .jieda-zan:hover{color:#c00}
+.jieda-reply span .icon-svgmoban53{position: relative; top: 1px;}
+
+
+/* 用户中心 */
+body .fly-user-main{position: relative; min-height: 600px;}
+.fly-user-main>.layui-nav{position: absolute; left: 0; top: 0; z-index: 1000; height: 100%; padding: 10px 0;}
+.fly-user-main>.layui-nav .layui-icon{position: relative; top: 2px; font-size: 20px; margin-right: 10px;}
+.fly-user-main>.fly-panel{min-height: 575px; margin: 0 0 10px 215px;}
+.fly-user-main .fly-none{min-height: 0;}
+.fly-panel-user[pad20]{padding-top: 5px;}
+
+.fly-form-app{margin-top:30px;}
+.fly-form-app .iconfont{font-size:26px; padding: 0 5px;}
+.fly-form-app .icon-qq{color:#7CA9C9}
+.fly-form-app .icon-weibo{color:#E6162D}
+
+.user-tab{margin:20px 0;}
+.user-about{position:relative; padding:0 0 0px 20px; border-left:1px solid #DFDFDF; text-align:center;}
+.user-about .user-avatar{width:100px; height:100px; border-radius:100%;}
+.user-about p{line-height:30px;}
+.user-about p span{padding:0 5px; color:#999;}
+
+/* 个人主页 */
+.fly-home{position: relative; padding: 30px 0 30px; text-align: center;}
+.fly-home img{width:120px; height:120px; border-radius:100%;}
+.fly-home h1{font-size:26px; line-height:30px; margin-top:10px;}
+.fly-home h1 span{font-size:14px; color:#999;}
+.fly-home h1 .icon-nan{color:#4EBBF9}
+.fly-home h1 .icon-nv{color:#F581B1}
+.fly-home-sign{padding: 0 10px; color: #999; margin-top: 10px;}
+.fly-home .icon-renzheng{display: inline-block; width: 20px; height: 20px; line-height: 20px; top: 45px; left: -15px; background-color: #FFB800; color: #fff; border-radius: 50%; font-size: 12px;}
+
+.fly-home-info i{padding-right: 5px; padding-left: 10px; color: #666;}
+.fly-home-info span{color: #999;}
+.fly-sns{margin-top: 10px;}
+
+.fly-home-jie .jie-row,
+.fly-home-da .home-jieda{min-height: 500px; padding: 5px 20px;}
+
+/*.home-jieda li{margin-bottom:20px; padding-bottom:10px; line-height:24px; border-bottom: 1px dotted #DFDFDF;}*/
+.home-jieda li{ margin-bottom:20px; line-height:24px;}
+.home-dacontent{margin-top:10px; padding:10px 15px; background-color:#F2F2F5; border-radius:5px; word-wrap: break-word;;}
+.home-dacontent pre{ background-color:#F2F2F5;}
+.home-dacontent img{max-width:100%;}
+.home-jieda li a{padding:0 5px; color:#4F99CF;}
+.home-jieda li p{color:#999;}
+.home-jieda li p span{padding-right:5px;}
+
+/* */
+.fly-shortcut{margin: 5px 0;}
+.fly-shortcut li{text-align: center;}
+.fly-shortcut li .layui-icon{display: inline-block; width: 100%; height: 60px; line-height: 60px; text-align: center; color: #fff; border-radius: 2px; font-size: 30px; transition: all .3s; -webkit-transition: all .3s;}
+.fly-shortcut li cite{position: relative; top: 2px; display: block; color: #666; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; font-size: 14px;}
+.fly-shortcut li:hover .layui-icon{opacity: 0.9;}
+.fly-shortcut li .layui-icon{background-color: #2F9688;}
+
+/* 我的消息 */
+#LAY-minemsg{min-height:420px;}
+.mine-msg li{position:relative; margin-bottom: 15px; padding: 10px 0 5px; line-height:24px; border-bottom:1px dotted #E9E9E9}
+.mine-msg li cite{padding: 0 5px; color: #4F99CF;}
+.mine-msg li i{color:#4F99CF; padding-right:5px;}
+.mine-msg li>p{position: relative; margin-top: 5px; line-height: 26px; text-align: right;}
+.mine-msg li>p span{position: absolute; left: 0; top: 0; color:#999;}
+.mine-msg li .fly-delete{position: relative; top: -3px;}
+.mine-msg li .layui-elem-quote p[download]{padding: 10px 0 5px;}
+
+/* 设置 */
+.avatar-add{position:relative; width:373px; height:373px; background-color:#F2F2F5;}
+.avatar-add .upload-img{position:absolute; left:50%; top:35px; margin:0 0 0 -56px;}
+.avatar-add img{position:absolute; left:50%; top:50%; width:168px; height:168px; margin:-50px 0 0 -84px; border-radius:100%;}
+.avatar-add .loading{display:none; position:absolute; width:100%; height:100%; left:0; top:0; padding: 0; background-color:#000; opacity:0.5; filter: Alpha(opacity=50);}
+.avatar-add p{position:absolute; top:70px; width:100%; margin-top: 10px;; font-size:12px; text-align:center; color:#999;}
+.app-bind li{margin-bottom:10px; line-height:30px; color:#999;}
+.app-bind li .iconfont{position: relative; top: 3px; margin-right: 5px; font-size:28px; }
+.app-bind .app-havebind{color:#333;}
+.app-bind .app-havebind .icon-qq{color:#7CA9C9}
+.app-bind .app-havebind .icon-weibo{color:#E6162D}
+
+/* 案例 */
+.fly-case-header{position: relative; height: 260px; text-align: center; background: #393D49;}
+.fly-case-year{position: absolute; top: 30px; width: 100%; line-height: 50px; font-size: 50px; text-align: center; color: #fff; font-weight: 300;}
+.fly-case-banner{position: absolute; left: 50%; top: 100px; width: 670px; margin-left: -335px;}
+.fly-case-btn{position: absolute; bottom: 30px; left: 0; width: 100%; text-align: center;}
+.fly-case-btn a{color: #fff;}
+.fly-case-btn .layui-btn-primary{background: none; color: #fff;}
+.fly-case-btn .layui-btn-primary:hover{border-color: #5FB878;}
+
+.fly-case-tab{margin-top: 20px; text-align: center;}
+.fly-case-tab span,
+.fly-case-tab span a{border-color: #009688;}
+.fly-case-tab .tab-this{background-color: #009688; color: #fff;}
+
+.fly-case-list{margin-top: 15px; font-size: 0;}
+.fly-case-list li,
+.layer-ext-ul li{display: inline-block; vertical-align: middle; *display: inline; *zoom:1; font-size: 14px; background-color: #fff;}
+.fly-case-list{width: 110%;}
+.fly-case-list li{width: 239px; margin: 0 15px 15px 0; padding: 10px;}
+.fly-case-list li:hover{box-shadow: 1px 1px 5px rgba(0,0,0,.1);}
+.fly-case-img{position: relative; display: block;}
+.fly-case-img img{width: 239px; height: 150px;}
+.fly-case-img .layui-btn{display: none; position: absolute; bottom: 20px; left: 50%; margin-left: -29px;}
+.fly-case-img:hover .layui-btn{display: inline-block;}
+.fly-case-list li h2{padding: 10px 0 5px; line-height: 22px; font-size: 18px; white-space: nowrap; overflow: hidden; text-align: center;}
+.fly-case-desc{height: 60px; line-height: 20px; font-size: 12px; color: #666; overflow: hidden;}
+.fly-case-info{position: relative; margin: 10px 0 0; padding: 10px 65px 0 45px; border-top: 1px dotted #eee;}
+.fly-case-info p{height:24px; line-height: 24px;}
+.fly-case-user{position: absolute; left: 0; top: 15px; width: 35px; height: 35px;}
+.fly-case-user img{width: 35px; height: 35px; border-radius: 100%;}
+.fly-case-info .layui-btn{position: absolute; right: 0; top: 15px; padding: 0 15px;}
+.layer-ext-ul{margin: 10px; max-height: 500px;}
+.layer-ext-ul img{width: 50px; height: 50px; border-radius: 100%;}
+.layer-ext-ul li{margin: 8px;}
+.layer-ext-case .layui-layer-title{border: none; background-color: #009688; color: #fff;}
+
+/* 广告 */
+.fly-ad{position: relative; background-color: #f2f2f2; overflow:hidden;}
+.fly-ad:before{content: '广告位'; position: absolute; z-index: 0; top: 50%; left: 50%; left: 50%; margin: -10px 0 0 -25px; color: #aaa; font-size: 18px; font-weight: 300;}
+.fly-ad div{position: relative; z-index: 1;}
+
+/* 友链 */
+.fly-link dd{display: inline-block; vertical-align: top;}
+.fly-link a{line-height: 24px; padding-right: 15px;}
+
+/* 404或提示 */
+.fly-none{min-height: 600px; text-align: center; padding-top:50px; color: #999;}
+.fly-none .iconfont{line-height: 300px; font-size: 300px; color: #393D49;}
+.fly-none .icon-tishilian{display: inline-block; margin: 30px 0 20px;}
+.fly-none p{margin-top: 50px; padding: 0 15px; font-size: 20px; color: #999; font-weight: 300;}
+.fly-list-one .fly-none{min-height: 70px;}
+
+
+@media screen and (max-width: 768px) {
+ .fly-main{width: 100%;}
+
+ /* 顶边距 */
+ .fly-marginTop{margin-top: 0;}
+
+ /* 头部 */
+ .fly-header .fly-nav-user li .fly-nav-avatar{padding-right: 15px;}
+ .fly-header .fly-nav-user{margin-right: 5px;}
+
+ /* 专栏 */
+ .fly-column{height: auto;}
+ .fly-column ul{padding: 10px; font-size: 0;}
+ .fly-column ul li{float: left; width: 33.33%; height: 36px; line-height: 36px; font-size: 14px; vertical-align: middle; text-align: center; box-sizing: border-box;}
+ .fly-column-right{right: 10px;}
+ .fly-column ul li.layui-this:after{display: none;}
+
+ /* 页脚 */
+ .fly-footer{margin-top: 0; border-top: none;}
+
+ /* 分页 */
+ .laypage-main a, .laypage-main span{display: none;}
+ .laypage-main .laypage-prev,
+ .laypage-main .laypage-curr,
+ .laypage-main .laypage-next{display: inline-block;}
+
+ /* 列表 */
+ .fly-list li h2 a{max-width: 72%;}
+
+ /* Detail 页 */
+ .fly-admin-box{display: block; margin: 0; margin-top: 10px;}
+ .fly-detail-info .fly-list-nums{top: -2px;}
+ .fly-edit span{border-right: none;}
+
+ /* 案例 */
+ .fly-case-list,
+ .fly-case-list li{width: 100%; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}
+ .fly-case-img{text-align: center;}
+ .fly-case-img img{max-width: 100%;}
+ .fly-case-banner{width: 300px; margin-left: -150px;}
+
+ body .fly-user-main{width: auto;}
+ .fly-user-main>.layui-nav{left: -300px; transition: all .3s; -webkit-transition: all .3s;}
+ .fly-user-main>.fly-panel-user{width: auto; margin-left: 0; transition: all .3s; -webkit-transition: all .3s;}
+ .site-tree-mobile{display: block!important; position: fixed; z-index: 100000; bottom: 20px; left: 10px; width: 50px; height: 50px; line-height: 50px; border-radius: 2px; text-align: center; background-color: rgba(0,0,0,.7); color: #fff;}
+ .site-mobile .site-tree-mobile{display: none !important;}
+ .site-mobile .fly-user-main>.layui-nav{left: 0;}
+ .site-mobile .site-mobile-shade{content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.9); z-index: 999;}
+}
+
+/*前台公用样式*/
+
+/*分页*/
+.pagination {
+ display: inline-block;
+ padding: 0 auto;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+.pagination li {
+ display: inline;
+}
+.pagination li a,
+.pagination li span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.42857143;
+ color: #393D49;
+ background: #fff;
+ margin: 0 0 0 8px;
+ border: 1px solid #eee;
+}
+
+.pagination li a:hover {
+ color: #fff;
+ background: #009688;
+}
+.pagination .active span{
+background: #009688;
+color: #fff;
+}
+.pagination .disabled{
+display: none;
+
+@media screen and (max-width: 992px) {
+ body .header .layui-nav .layui-nav-item{margin: 0 5px;}
+}
diff --git a/public/static/res/css/iconfont.eot b/public/static/res/css/iconfont.eot
new file mode 100644
index 0000000..9f37790
Binary files /dev/null and b/public/static/res/css/iconfont.eot differ
diff --git a/public/static/res/css/iconfont.svg b/public/static/res/css/iconfont.svg
new file mode 100644
index 0000000..1c7ffe9
--- /dev/null
+++ b/public/static/res/css/iconfont.svg
@@ -0,0 +1,473 @@
+
+
+
+
diff --git a/public/static/res/css/iconfont.ttf b/public/static/res/css/iconfont.ttf
new file mode 100644
index 0000000..0c8b0a5
Binary files /dev/null and b/public/static/res/css/iconfont.ttf differ
diff --git a/public/static/res/css/iconfont.woff b/public/static/res/css/iconfont.woff
new file mode 100644
index 0000000..786bb2a
Binary files /dev/null and b/public/static/res/css/iconfont.woff differ
diff --git a/public/static/res/home/css/global.css b/public/static/res/home/css/global.css
new file mode 100644
index 0000000..779a6c3
--- /dev/null
+++ b/public/static/res/home/css/global.css
@@ -0,0 +1,466 @@
+/**
+
+ layui官网
+ By 贤心
+
+*/
+
+h1,h2,h3{font-size: 14px;}
+::-webkit-input-placeholder{color: #999}
+
+/* 布局 */
+.site-inline{font-size: 0;}
+.site-tree, .site-content{display: inline-block; *display:inline; *zoom:1; vertical-align: top; font-size: 14px;}
+.site-tree{width: 220px; min-height: 900px; padding: 5px 0 20px;}
+.site-content{width: 899px; min-height: 900px; padding: 20px 0 10px 20px;}
+
+/* 头部 */
+.header{height: 59px; border-bottom: 1px solid #404553; background-color: #393D49;}
+.logo{position: absolute; left: 0; top: 16px;}
+.logo img{width: 82px; height: 31px;}
+
+.header .layui-nav{position: absolute; right: 0; top: 0; padding: 0; background: none;}
+.header .layui-nav .layui-nav-item{margin: 0 20px; }
+.header .layui-nav .layui-nav-item[mobile]{display: none;}
+
+.header .layui-container .logo{left: 15px;}
+.header .layui-container .layui-nav{right: 15px;}
+
+.menu{position: absolute; right: 0; top: 0; line-height: 65px;}
+.menu a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
+.menu a{position: relative; padding: 0 20px; margin: 0 20px; color: #c2c2c2; font-size: 14px;}
+.menu a:hover{color: #fff; transition: all .5s; -webkit-transition: all .5s}
+.menu a.this{color: #fff}
+.menu a.this::after{content: ''; position: absolute; left: 0; bottom: -1px; width: 100%; height: 5px; background-color: #5FB878;}
+
+.header-index{background-color: #05031A; border: none;}
+.header-index .site-banner-bg{}
+.header-index[spring]{background-color: #0D1206}
+.header-index[summer]{background-color: #0A0E11}
+.header-index[autumn]{background-color: #100903}
+.header-index[winter]{background-color: #110F25/*#06041C*/}
+
+.header-demo{height: 60px; border-bottom: none;}
+.header-demo .logo{left: 40px;}
+.header-demo .layui-nav{top: 0;}
+.header-demo .layui-nav .layui-nav-item{margin: 0 10px;}
+
+.header-demo .layui-nav .layui-this a{padding: 0 30px;}
+
+.component{position: absolute; width: 160px; left: 120px; top: 16px; }
+.component .layui-input{height: 30px; padding-left: 12px; background-color: #424652; background-color: rgba(255,255,255,.05); border: none 0; color: #fff; color: rgba(255,255,255,.5); font-size: 12px;}
+.component .layui-form-select .layui-edge{display: none; border-top-color: #999;}
+.component .layui-form-select dl{top: 36px; background-color: rgba(255,255,255,.9)}
+.header-demo .component{left: 185px;}
+
+
+/* 子侧边 */
+.layui-side-child{width: 160px!important; left: 200px; bottom: 60px!important; border-right: 1px solid #eee; background-color: #fff;}
+.layui-side-child .layui-side-scroll{width: 170px;}
+.layui-side-child .layui-nav{padding: 10px 0; width: 160px; border-radius: 0; background: none}
+.layui-side-child .layui-nav-child{border-radius: 0;}
+.layui-side-child .layui-nav .layui-nav-title a,
+.layui-side-child .layui-nav .layui-nav-title a:hover,
+.layui-side-child .layui-nav-itemed>a{color: #666 !important;}
+.layui-side-child .layui-nav-itemed .layui-nav-child{margin-bottom: 10px; background: none !important;}
+.layui-side-child .layui-nav .layui-nav-item a{height: 30px; line-height: 30px; color: #666;}
+.layui-side-child .layui-nav .layui-nav-item a:hover{background: none !important;}
+.layui-side-child .layui-nav .layui-nav-child a{color: #999 !important;}
+.layui-side-child .layui-nav .layui-nav-more{display: none;}
+.layui-side-child .layui-nav-tree .layui-this,
+.layui-side-child .layui-nav-tree .layui-this>a,
+.layui-side-child .layui-nav-tree .layui-nav-child dd.layui-this,
+.layui-side-child .layui-nav-tree .layui-nav-child dd.layui-this a{background: none; color: #5FB878 !important;}
+.layui-side-child .layui-nav .layui-nav-child a:hover{color: #009688 !important}
+.layui-side-child .layui-nav-bar{background-color: #5FB878;}
+
+
+/* 底部 */
+.footer{padding: 30px 0; line-height: 30px; text-align: center; color: #666; font-weight: 300;}
+body .layui-layout-admin .footer-demo{height: 50px; padding: 5px 0;}
+.footer a{padding: 0 5px;}
+.site-union{margin-top: 10px; color: #999;}
+.site-union>*{display: inline-block; vertical-align: middle;}
+.site-union a[upyun] img{width: 80px;}
+.site-union span{position: relative; top: 3px;}
+.site-union span a{padding: 0; display: inline; color: #999;}
+.site-union span a:hover{text-decoration: underline;}
+
+.footer-demo p{display: inline-block; vertical-align: middle; height: 50px; padding-right: 10px;}
+.footer-demo .site-union{position: relative; top: -9px;}
+
+/* 首页banner部分 */
+.site-banner{position: relative; height: 600px; text-align: center; overflow: hidden; background-color: #393D49;}
+.site-banner-bg
+,.site-banner-main{position: absolute; left: 0; top: 0; width: 100%; height: 100%;}
+.site-banner-bg{background-position: center 0;}
+
+
+.site-zfj{padding-top: 25px; height: 220px;}
+.site-zfj i{position: absolute; left: 50%; top: 50px; width: 200px; height: 200px; margin-left: -100px; font-size: 180px; color: #c2c2c2;}
+
+@-webkit-keyframes site-zfj {
+ 0% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(0deg) scale(1);}
+ 10% {opacity: 0.8; -webkit-transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);}
+ 35% {opacity: 0.6; -webkit-transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);}
+ 50% {opacity: 0.4; -webkit-transform: translate3d(0, 0, 0) rotate(360deg) scale(0);}
+ 80% {opacity: 0.2; -webkit-transform: translate3d(0, 0, 0) rotate(720deg) scale(1);}
+ 90% {opacity: 0.1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);}
+ 100% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);}
+}
+@keyframes site-zfj {
+ 0% {opacity: 1; transform: translate3d(0, 0, 0) rotate(0deg) scale(1);}
+ 10% {opacity: 0.8; transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);}
+ 35% {opacity: 0.6; transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);}
+ 50% {opacity: 0.4; transform: translate3d(0, 0, 0) rotate(360deg) scale(0);}
+ 80% {opacity: 0.2; transform: translate3d(0, 0, 0) rotate(720deg) scale(1);}
+ 90% {opacity: 0.1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);}
+ 100% {opacity: 1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);}
+}
+
+@-webkit-keyframes site-desc {
+ 0% { -webkit-transform: scale(1.1);}
+ 100% {opacity: 1; -webkit-transform: scale(1);}
+}
+@keyframes site-desc {
+ 0% { transform: scale(1.1);}
+ 100% {transform: scale(1);}
+}
+
+.site-zfj-anim i{-webkit-animation-name: site-zfj; animation-name: site-zfj; -webkit-animation-duration: 5s; animation-duration: 5s; -webkit-animation-timing-function: linear; animation-timing-function: linear;}
+
+
+/* 描述字体 */
+@font-face {font-family: 'webfont-desc';
+ src: url('//at.alicdn.com/t/webfont_eovt4pxxy5.eot'); /* IE9*/
+ src: url('//at.alicdn.com/t/webfont_eovt4pxxy5.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('//at.alicdn.com/t/webfont_eovt4pxxy5.woff') format('woff'), /* chrome、firefox */
+ url('//at.alicdn.com/t/webfont_eovt4pxxy5.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
+ url('//at.alicdn.com/t/webfont_eovt4pxxy5.svg#思源黑体-极细') format('svg'); /* iOS 4.1- */
+}
+.web-font-desc{
+ font-family:"webfont-desc" !important;
+ font-size:16px;font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+
+.site-desc{position: relative; height: 70px; margin-top: 20px;}
+.site-desc .web-font-desc{color: #fff; color: rgba(255,255,255,.8); font-size: 61px;}
+
+.site-desc-anim{-webkit-animation-name: site-desc; animation-name: site-desc;}
+.site-desc cite{position: absolute; bottom: -40px; left: 0; width: 100%; color: #c2c2c2; font-style: normal;}
+
+.site-download{margin-top: 80px; font-size: 0;}
+.site-download a{position: relative; padding: 0 45px 0 90px; height: 60px; line-height: 60px; border: 1px solid #c2c2c2; border-color: rgba(255,255,255,.2); font-size: 24px; color: #ccc; transition: all .5s; -webkit-transition: all .5s;}
+.site-download a:hover{border-color: rgba(255,255,255,.3); color: #fff; background-color: rgba(255,255,255,.05); border-radius: 30px;}
+.site-download a cite{position: absolute; left: 45px; font-size: 30px;}
+.site-version{position: relative; margin-top: 15px; color: #ccc; font-size: 12px;}
+.site-version span{padding: 0 3px;}
+.site-version *{font-style: normal;}
+.site-version a{color: #e2e2e2; text-decoration: underline;}
+
+.site-banner-other{position: absolute; left: 0; bottom: 35px; width: 100%; text-align: center; font-size: 0;}
+.site-banner-other iframe{border: none;}
+.site-banner-other a{display: inline-block; vertical-align: middle; height: 28px; line-height: 28px; margin: 0 5px; padding: 0 8px; border-radius: 2px; color: #c2c2c2; color: rgba(255,255,255,.8); border: 1px solid #c2c2c2; border-color: rgba(255,255,255,.2); font-size: 14px; transition: all .5s; -webkit-transition: all .5s;}
+.site-banner-other a:hover{color: #fff; background-color: rgba(255,255,255,.1);}
+
+
+.site-idea{margin: 50px 0; font-size: 0; text-align: center; font-weight: 300;}
+.site-idea li{display: inline-block; vertical-align: top; *display: inline; *zoom:1; font-size: 14px; }
+.site-idea li{width: 298px; height: 150px; padding: 30px; line-height: 24px; margin-left: 30px; border: 1px solid #d2d2d2; text-align: left;}
+.site-idea li:first-child{margin-left: 0}
+.site-idea .layui-field-title{border-color: #d2d2d2}
+.site-idea .layui-field-title legend{margin: 0 20px 20px 0; padding: 0 20px; text-align: center;}
+
+/* 赞助商 */
+.site-sponsor-home{margin-top: 40px; text-align: center;}
+.site-sponsor-home .layui-btn{position: relative; width: 233px; height: 65px; line-height: 65px; background: none; border-color: #212121; font-size: 26px; border-radius: 6px; /*padding-left: 55px;*/}
+.site-sponsor-home .layui-btn:hover{background: #4A4855; color: #BAB8C3;}
+.site-sponsor-home .layui-btn:before{/*position: absolute; left: 15px; top: 15px; content: ''; width: 30px; height: 30px; background: url(http://cdn.layui.com/upload/2018_1/168_1514869467160_26113.png) center; background-repeat: no-repeat; background-size: contain;*/}
+.site-sponsor-home p{position: relative; padding-top: 15px; font-size: 22px; color: #212121;}
+.site-sponsor-home p:before{content: ''; position: relative; top: -2px; display: inline-block; vertical-align: middle; width: 30px; height: 30px; margin-right: 10px; background: url(http://cdn.layui.com/upload/2018_1/168_1514869467160_26113.png) center; background-repeat: no-repeat; background-size: contain;}
+@media screen and (max-width: 750px) {
+ .site-sponsor-home .layui-btn{width: 180px; height: 45px; line-height: 45px; font-size: 20px;}
+ .site-sponsor-home p{font-size: 16px;}
+ .site-sponsor-home p:before{width: 20px; height: 20px;}
+}
+
+
+
+/* 辅助 */
+.site-tips{margin-bottom: 10px; padding: 15px; line-height: 22px; border-left: 5px solid #0078AD; background-color: #f2f2f2;}
+body .site-tips p{margin: 0;}
+body .layui-layer-notice .layui-layer-content{padding: 20px; line-height: 26px; background-color: #393D49; color: #fff; font-weight: 300;}
+.layui-layer-notice .layui-text{color: #f8f8f8;}
+.layui-layer-notice .layui-text a{color: #009688;}
+
+/* 目录 */
+.site-dir{display: none;}
+.site-dir li{line-height: 26px; margin-left: 20px; overflow: visible; list-style-type: disc;}
+.site-dir li a{display: block;}
+.site-dir li a:active{color: #01AAED;}
+.site-dir li a.layui-this{color: #01AAED;}
+body .layui-layer-dir{box-shadow: none; border: 1px solid #d2d2d2;}
+body .layui-layer-dir .layui-layer-content{padding: 10px;}
+.site-dir a em{padding-left: 5px; font-size: 12px; color: #c2c2c2; font-style: normal;}
+
+/* 文档 */
+.site-tree{border-right: 1px solid #eee; }
+.site-tree .layui-tree{line-height: 32px;}
+.site-tree .layui-tree li i{position: relative; font-size: 22px; color: #000}
+.site-tree .layui-tree li a cite{padding: 0 8px;}
+.site-tree .layui-tree .site-tree-noicon a cite{padding-left: 15px;}
+.site-tree .layui-tree li a em{font-size: 12px; color: #bbb; padding-right: 5px; font-style: normal;}
+.site-tree .layui-tree li h2{line-height: 36px; border-left: 5px solid #009E94; margin: 15px 0 5px; padding: 0 10px; background-color: #f2f2f2;}
+.site-tree .layui-tree li ul{margin-left: 27px; line-height: 28px;}
+.site-tree .layui-tree li ul a,
+.site-tree .layui-tree li ul a i{color: #777;}
+.site-tree .layui-tree li ul a:hover{color: #333;}
+.site-tree .layui-tree li ul li{margin-left: 25px; overflow: visible; list-style-type: disc; /*list-style-position: inside;*/}
+.site-tree .layui-tree li ul li cite,
+.site-tree .layui-tree .site-tree-noicon ul li cite{padding-left: 0;}
+
+.site-tree .layui-tree .layui-this a{color: #01AAED;}
+.site-tree .layui-tree .layui-this .layui-icon{color: #01AAED;}
+
+.site-fix .site-tree{position: fixed; top: 0; bottom: 0; z-index: 666; min-height: 0; overflow: auto; background-color: #fff;}
+.site-fix .site-content{margin-left: 220px;}
+.site-fix-footer .site-tree{/*margin-bottom: 120px;*/}
+
+
+.site-title{ margin: 30px 0 20px;}
+.site-title fieldset{border: none; padding: 0; border-top: 1px solid #eee;}
+.site-title fieldset legend{margin-left: 20px; padding: 0 10px; font-size: 22px; font-weight: 300;}
+
+.site-text a{color: #01AAED;}
+.site-h1{margin-bottom: 20px; line-height: 60px; padding-bottom: 10px; color: #393D49; border-bottom: 1px solid #eee; font-size: 28px; font-weight: 300;}
+.site-h1 .layui-icon{position: relative; top: 5px; font-size: 35px; margin-right: 10px;}
+.site-text{position:relative;}
+.site-text p{margin-bottom: 10px; line-height:22px;}
+.site-text em{padding: 0 3px; font-weight: 500; font-style: italic; color: #666;}
+.site-text code{margin:0 5px; padding: 3px 10px; border: 1px solid #e2e2e2; background-color: #fbfbfb; color: #666; border-radius: 2px;}
+
+.site-table{width: 100%; margin: 10px 0;}
+.site-table thead{background-color:#f2f2f2; }
+.site-table th,
+.site-table td{padding: 6px 15px; min-height: 20px; line-height: 20px; border:1px solid #ddd; font-size: 14px; font-weight: 400;}
+.site-table tr:nth-child(even){background: #fbfbfb;}
+
+.site-block{padding: 20px; border: 1px solid #eee;}
+.site-block .layui-form{margin-right: 200px;}
+
+/* 更新日志 */
+.site-changelog .layui-timeline-title h2{display: inline-block;}
+.site-changelog .layui-timeline-title .layui-badge-rim{top: -2px; left: 10px;}
+
+/* 颜色 */
+.site-doc-color{font-size: 0;}
+.site-doc-color li{display: inline-block; vertical-align: middle; width: 180px; margin-left: 20px; margin-bottom: 20px; padding: 20px 10px; color: #fff; text-align: center; border-radius: 2px; line-height: 22px; font-size: 14px;}
+.site-doc-color li p[tips]{opacity: 0.8; font-size: 12px;}
+
+.site-doc-necolor li{width: 108px; margin-top: 15px; margin-left: 0; border-radius: 0;}
+
+.site-doc-bgcolor li{padding: 10px;}
+
+/* 宫格 */
+.site-doc-icon{margin-bottom: 50px; font-size: 0;}
+.site-doc-icon li{display: inline-block; vertical-align: middle; width: 127px; height: 105px; line-height: 25px; padding: 20px 0; margin-right: -1px; margin-bottom: -1px; border: 1px solid #e2e2e2; font-size: 14px; text-align: center; color: #666; transition: all .3s; -webkit-transition: all .3s;}
+.site-doc-anim li{height: auto;}
+.site-doc-icon li .layui-icon{display: inline-block; font-size: 36px;}
+
+.site-doc-icon li .doc-icon-name,
+.site-doc-icon li .doc-icon-code{color: #c2c2c2;}
+.site-doc-icon li .doc-icon-fontclass{height: 40px; line-height: 20px; padding: 0 5px; font-size: 13px; color: #333; }
+.site-doc-icon li:hover{background-color: #f2f2f2; color: #000;}
+
+/* 栅格示例 */
+.grid-demo{padding: 10px; line-height: 50px; text-align: center; background-color: #79C48C; color: #fff;}
+.grid-demo-bg1{background-color: #63BA79;}
+.grid-demo-bg2{background-color: #49A761;}
+.grid-demo-bg3{background-color: #38814A;}
+
+
+/* 演示 */
+body .layui-layout-admin .site-demo{bottom: 60px; padding: 0;}
+body .site-demo-nav .layui-nav-item{line-height: 40px}
+.layui-nav-item .layui-icon{position: relative; font-size: 20px;}
+.layui-nav-item a cite{padding: 0 10px;}
+.site-demo .layui-main{margin: 15px; line-height: 22px;}
+.site-demo-editor{position: absolute; top: 0; bottom: 0; left: 0; width: 50%; }
+.site-demo-area{position: absolute; top: 0; bottom: 0; width: 100%;}
+.site-demo-editor textarea{position: absolute; width: 100%; height: 100%; padding: 10px; border: none; resize: none; background-color: #F7FBFF; background-color: #13151A; color: #999; font-family: Courier New; font-size: 12px; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}
+.site-demo-btn{position: absolute; bottom: 15px; right: 20px;}
+.site-demo-zanzhu{position: absolute; bottom: 0; left: 0; width: 100%; height: 90px; text-align: center; background-color: #e2e2e2; overflow: hidden;}
+.site-demo-zanzhu>*{position: relative; z-index: 1;}
+.site-demo-zanzhu:before{content: ""; position: absolute; z-index: 0; top: 50%; left: 50%; width: 120px; margin: -10px 0px 0px -60px; text-align: center; color: rgb(170, 170, 170); font-size: 18px; font-weight: 300; }
+
+.site-demo-result{position: absolute; right: 0; top: 0; bottom: 0; width: 50%;}
+.site-demo-result iframe{position: absolute; width: 100%; height: 100%;}
+
+.site-demo-button{margin-bottom: 30px;}
+.site-demo-button div{margin: 20px 30px 10px;}
+.site-demo-button .layui-btn+.layui-btn{margin-left: 0;}
+.site-demo-button .layui-btn{margin: 0 7px 10px 0; }
+
+.site-demo-text a{color: #01AAED;}
+
+.site-demo-laytpl{text-align: center;}
+.site-demo-laytpl textarea,
+.site-demo-laytpl div span{width: 40%; padding: 15px; margin: 0 15px;}
+.site-demo-laytpl textarea{height: 300px; border: none; background-color: #3F3F3F; color: #E3CEAB; font-family: Courier New; resize: none;}
+.site-demo-laytpl div span{display: inline-block; text-align: center; background: #101010; color: #fff;}
+.site-demo-tplres{margin: 10px 0; text-align: center}
+.site-demo-tplres .site-demo-tplh2,
+.site-demo-tplres .site-demo-tplview{display: inline-block; width: 50%;}
+.site-demo-tplres h2{padding: 15px; background: #e2e2e2;}
+.site-demo-tplres h3{font-weight: 700;}
+.site-demo-tplres div{padding: 14px; border: 1px solid #e2e2e2; text-align: left;}
+
+.site-demo-upload,
+.site-demo-upload img{width: 200px; height: 200px; border-radius: 100%;}
+.site-demo-upload{position: relative; background: #e2e2e2;}
+.site-demo-upload .site-demo-upbar{position: absolute; top: 50%; left: 50%; margin: -18px 0 0 -56px;}
+.site-demo-upload .layui-upload-button{background-color: rgba(0,0,0,.2); color: rgba(255,255,255,1);}
+
+.site-demo-util{position: relative; width: 300px;}
+.site-demo-util img{width: 300px; border-radius: 100%;}
+.site-demo-util span{position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: #333; cursor: pointer;}
+@-webkit-keyframes demo-fengjie {
+ 0% {-webkit-filter: blur(0); opacity: 1; background: #fff; height: 300px; border-radius: 100%;}
+ 80% {-webkit-filter: blur(50px); opacity: 0.95;}
+ 100% {-webkit-filter: blur(20px); opacity: 0; background: #fff;}
+}
+@keyframes demo-fengjie {
+ 0% {filter: blur(0); opacity: 1; background: #fff; height: 300px; border-radius: 100%;}
+ 80% {filter: blur(50px); opacity: 0.95;}
+ 100% {filter: blur(20px); opacity: 0; background: #fff;}
+}
+.site-demo-fengjie{-webkit-animation-name: demo-fengjie; animation-name: demo-fengjie; -webkit-animation-duration: 5s; animation-duration: 5s;}
+
+.layui-layout-admin .site-demo-body{top: 106px;}
+.site-demo-title{position: fixed; left: 200px; right: 0; top: 65px;}
+.site-demo-code{position: absolute; left: 0; top: 0; width: 100%; height: 100%; border: none; padding: 10px; resize: none; font-size: 12px; background-color: #F7FBFF; color: #881280; font-family: Courier New;}
+
+.site-demo-overflow{overflow: hidden;}
+
+/* 其它 */
+#trans-tooltip,
+#tip-arrow-bottom,
+#tip-arrow-top{display: none !important;}
+
+
+/* 独立组件 与 主页 */
+.alone{text-align: center; background-color: #009688; color: #fff; font-weight: 300; transition: all .3s; -webkit-transition: all .3s;}
+.alone:hover{background-color: #5FB878;}
+.alone a{display: block; padding: 50px 20px; color: #fff; font-size: 30px;}
+.alone a cite{display: block; padding-top: 10px; font-size: 14px;}
+
+
+.alone-banner{height: 190px; text-align: center; font-weight: 300; background-color: #009688; color:#fff;}
+.alone-banner h1{padding-top: 60px; line-height: 32px; font-size: 30px; font-weight: 300;}
+.alone-banner p{padding-top: 20px; color: #e2e2e2; color: rgba(255,255,255,.8);}
+
+.alone-nav .layui-tab-title li{margin-right: 30px; padding: 0; color: #666;}
+.alone-nav .layui-tab-title li a{ padding: 0 20px;}
+
+.alone-download{margin: 30px 0;}
+.alone-download .layui-btn{margin-right: 10px;}
+.alone-download span{display: inline-block; line-height: 44px; padding-right: 20px;}
+.alone-download span em{color: #999;}
+
+.alone-title{margin-top: 20px;}
+
+.alone-download-btn{text-align: center; margin-top: 50px; font-size: 0;}
+.alone-download-btn .layui-btn{position: relative; width: 206px; height: 60px; line-height: 60px; font-size: 26px; font-weight: 300;}
+.alone-download-btn .layui-btn+.layui-btn{margin: 0;}
+.alone-download-btn .alone-download-right{margin-left: 20px !important; border-color: #009688; background: none; color: #009688;}
+.alone-download-btn .layui-btn img{position: relative; top: -3px; width: 118px;}
+
+
+
+/* 适配多设备 */
+@media screen and (max-width: 750px) {
+ .layui-main{width: auto; margin: 0 10px;}
+ .logo,
+ .header-demo .logo{left: 10px;}
+ .component{display: none}
+
+ .header .layui-nav-child{left: auto; right: 0;}
+ .site-demo-overflow{overflow: auto;}
+
+ .site-nav-layim{display: none !important;}
+ .header .layui-nav .layui-nav-item{margin: 0;}
+ .header .layui-nav .layui-nav-item a{padding: 0 20px;}
+ .header .layui-nav .layui-nav-item[pc]{display: none;}
+ .header .layui-nav .layui-nav-item[mobile]{display: inline-block;}
+ .site-banner{height: 300px;}
+ .site-banner-bg{background-size: cover;}
+ .site-zfj{height: 100px; padding-top: 5px;}
+ .site-zfj i{top: 10px; width: 100px; height: 100px; margin-left: -50px; font-size: 100px;}
+ .site-desc{background-size: 70%; margin: 0;}
+ .site-desc .web-font-desc{padding-top: 20px; font-size: 30px;}
+ .site-desc cite{display: none;}
+ .site-download{margin-top: 0; }
+ .site-download a{height: 40px; line-height: 40px; padding: 0 25px 0 60px; border-radius: 30px; color: #fff; font-size: 16px;}
+ .site-download a cite{left: 20px;}
+ .site-banner-other{bottom: 10px;}
+
+ .site-idea{margin: 20px 0;}
+ .site-idea li{margin: 0 0 20px 0; width: 100%; height: auto; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}
+ .site-hengfu img{max-width: 100%}
+
+ .site-block .layui-form{margin-right: 0;}
+
+ .layui-layer-dir{display: none;}
+ .site-tree{position: fixed; top: 0; bottom: 0; min-height: 0; overflow: auto; z-index: 1000; left: -260px; background-color: #fff; transition: all .3s; -webkit-transition: all .3s;}
+ .site-content{width: 100%; padding: 0; overflow: auto;}
+ .site-content img{max-width: 100%;}
+ .site-tree-mobile{display: block!important; position: fixed; z-index: 100000; bottom: 15px; left: 15px; width: 50px; height: 50px; line-height: 50px; border-radius: 2px; text-align: center; background-color: rgba(0,0,0,.7); color: #fff;}
+ .site-home .site-tree-mobile{display: none!important;}
+ .site-mobile .site-tree-mobile{display: none !important;}
+ .site-mobile .site-tree{left: 0;}
+ .site-mobile .site-mobile-shade{content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.8); z-index: 999;}
+ .site-tree-mobile i{font-size: 20px;}
+ .layui-code-view{-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;}
+
+ .layui-layout-admin .layui-side{position: fixed; top: 0; left: -260px; transition: all .3s; -webkit-transition: all .3s; z-index: 10000;}
+ .layui-body{position: static; bottom: 0; left: 0;}
+ .site-mobile .layui-side{left: 0;}
+ .site-mobile .layui-side-child{top: 50%; left: 200px; height: 300px; margin-top: -100px;}
+
+ body .layui-layout-admin .footer-demo{position: static; height: auto; line-height: 30px;}
+ .footer-demo p{height: auto;}
+
+ .site-demo-area,
+ .site-demo-editor,
+ .site-demo-result,
+ .site-demo-editor textarea,
+ .site-demo-result iframe{position: static; width: 100%;}
+ .site-demo-editor textarea{height: 350px;}
+ .site-demo-zanzhu{display: none;}
+ .site-demo-btn{bottom: auto; top: 370px;}
+ .site-demo-result iframe{height: 500px;}
+
+ .site-demo-laytpl textarea, .site-demo-laytpl div span{margin: 0;}
+ .site-demo-tplres .site-demo-tplh2, .site-demo-tplres .site-demo-tplview{width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;}
+
+ .site-demo-title{position: static; left: 0;}
+ body .layui-layout-admin .site-demo{position: static;}
+ .site-demo-code{position: static; height: 350px;}
+}
+
+
+
+@-webkit-keyframes site-anim-closeup{ /* 特写 */
+ from {-webkit-transform: translate3d(0, 0, 0) scale(1); opacity: 1;}
+ to { -webkit-transform: translate3d(0, 400px, 0) scale(2); opacity: 0.5;}
+}
+@keyframes site-anim-closeup{
+ from {transform: translate3d(0, 0, 0) scale(1); opacity: 1;}
+ to {transform: translate3d(0, 400px, 0) scale(2); opacity: 0.5;}
+}
+.site-out-up{-webkit-animation-duration: 3s; animation-duration: 3s; -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-name: site-anim-closeup; animation-name: site-anim-closeup; overflow: hidden;}
+
+
diff --git a/public/static/res/home/images/Thumbs.db b/public/static/res/home/images/Thumbs.db
new file mode 100644
index 0000000..7934e58
Binary files /dev/null and b/public/static/res/home/images/Thumbs.db differ
diff --git a/public/static/res/home/images/logo - 鍓湰.png b/public/static/res/home/images/logo - 鍓湰.png
new file mode 100644
index 0000000..3791d2f
Binary files /dev/null and b/public/static/res/home/images/logo - 鍓湰.png differ
diff --git a/public/static/res/home/images/logo-1.png b/public/static/res/home/images/logo-1.png
new file mode 100644
index 0000000..3791d2f
Binary files /dev/null and b/public/static/res/home/images/logo-1.png differ
diff --git a/public/static/res/home/images/logo.png b/public/static/res/home/images/logo.png
new file mode 100644
index 0000000..bb2d0c4
Binary files /dev/null and b/public/static/res/home/images/logo.png differ
diff --git a/public/static/res/home/images/spring.jpg b/public/static/res/home/images/spring.jpg
new file mode 100644
index 0000000..7f25cd0
Binary files /dev/null and b/public/static/res/home/images/spring.jpg differ
diff --git a/public/static/res/home/images/upyun.png b/public/static/res/home/images/upyun.png
new file mode 100644
index 0000000..7588f35
Binary files /dev/null and b/public/static/res/home/images/upyun.png differ
diff --git a/public/static/res/home/js/global.js b/public/static/res/home/js/global.js
new file mode 100644
index 0000000..a4237d8
--- /dev/null
+++ b/public/static/res/home/js/global.js
@@ -0,0 +1,484 @@
+/**
+
+ layui官网
+
+*/
+
+layui.define(['code', 'element', 'table', 'util'], function(exports){
+ var $ = layui.jquery
+ ,element = layui.element
+ ,layer = layui.layer
+ ,form = layui.form
+ ,util = layui.util
+ ,device = layui.device()
+
+ ,$win = $(window), $body = $('body');
+
+
+ //阻止IE7以下访问
+ if(device.ie && device.ie < 8){
+ layer.alert('Layui最低支持ie8,您当前使用的是古老的 IE'+ device.ie + ',你丫的肯定不是程序猿!');
+ }
+
+ var home = $('#LAY_home');
+
+
+ layer.ready(function(){
+ var local = layui.data('layui');
+
+ //升级提示
+ if(local.version && local.version !== layui.v){
+ layer.open({
+ type: 1
+ ,title: '更新提示' //不显示标题栏
+ ,closeBtn: false
+ ,area: '300px;'
+ ,shade: false
+ ,offset: 'b'
+ ,id: 'LAY_updateNotice' //设定一个id,防止重复弹出
+ ,btn: ['更新日志', '朕不想升']
+ ,btnAlign: 'c'
+ ,moveType: 1 //拖拽模式,0或者1
+ ,content: [''
+ ,'layui 已更新到:v'+ layui.v + '
请注意升级!'
+ ,'
'].join('')
+ ,skin: 'layui-layer-notice'
+ ,yes: function(index){
+ layer.close(index);
+ setTimeout(function(){
+ location.href = '/doc/base/changelog.html';
+ }, 500);
+ }
+ ,end: function(){
+ layui.data('layui', {
+ key: 'version'
+ ,value: layui.v
+ });
+ }
+ });
+ }
+ layui.data('layui', {
+ key: 'version'
+ ,value: layui.v
+ });
+
+
+ //公告
+ ;!function(){
+ return layui.data('layui', {
+ key: 'notice_20180530'
+ ,remove: true
+ });
+
+ if(local.notice_20180530 && new Date().getTime() - local.notice_20180530 < 1000*60*60*24*5){
+ return;
+ };
+
+ layer.open({
+ type: 1
+ ,title: 'layui 官方通用后台管理模板'
+ ,closeBtn: false
+ ,area: ['300px', '280px']
+ ,shade: false
+ //,offset: 'c'
+ ,id: 'LAY_Notice' //设定一个id,防止重复弹出
+ ,btn: ['前往围观', '朕不想看']
+ ,btnAlign: 'b'
+ ,moveType: 1 //拖拽模式,0或者1
+ ,resize: false
+ ,content: [''
+ ,'
'
+ ,'
'].join('')
+ ,success: function(layero, index){
+ var btn = layero.find('.layui-layer-btn');
+ btn.find('.layui-layer-btn0').attr({
+ href: '/admin/std/dist/views/'
+ ,target: '_blank'
+ });
+
+ layero.find('a').on('click', function(){
+ layer.close(index);
+ });
+ }
+ ,end: function(){
+ layui.data('layui', {
+ key: 'notice_20180530'
+ ,value: new Date().getTime()
+ });
+ }
+ });
+ }();
+
+ });
+
+ ;!function(){
+ var elemComponentSelect = $([''].join(''));
+
+ $('.component').append(elemComponentSelect);
+ form.render('select', 'LAY-site-header-component');
+
+ //搜索组件
+ form.on('select(component)', function(data){
+ var value = data.value;
+ location.href = '/doc/'+ value;
+ });
+ }();
+
+
+ //点击事件
+ var events = {
+ //联系方式
+ contactInfo: function(){
+ layer.alert('如有合作意向,可联系:
邮箱:xxx@xxx.com
', {
+ title:'联系'
+ ,btn: false
+ ,shadeClose: true
+ });
+ }
+ }
+
+ $body.on('click', '*[site-event]', function(){
+ var othis = $(this)
+ ,attrEvent = othis.attr('site-event');
+ events[attrEvent] && events[attrEvent].call(this, othis);
+ });
+
+ //切换版本
+ form.on('select(tabVersion)', function(data){
+ var value = data.value;
+ location.href = value === 'new' ? '/' : ('/' + value + '/doc/');
+ });
+
+
+ //首页banner
+ setTimeout(function(){
+ $('.site-zfj').addClass('site-zfj-anim');
+ setTimeout(function(){
+ $('.site-desc').addClass('site-desc-anim')
+ }, 5000)
+ }, 100);
+
+
+ //数字前置补零
+ var digit = function(num, length, end){
+ var str = '';
+ num = String(num);
+ length = length || 2;
+ for(var i = num.length; i < length; i++){
+ str += '0';
+ }
+ return num < Math.pow(10, length) ? str + (num|0) : num;
+ };
+
+
+ //下载倒计时
+ var setCountdown = $('#setCountdown');
+ if($('#setCountdown')[0]){
+ $.get('/api/getTime', function(res){
+ util.countdown(new Date(2017,7,21,8,30,0), new Date(res.time), function(date, serverTime, timer){
+ var str = digit(date[1]) + ':' + digit(date[2]) + ':' + digit(date[3]);
+ setCountdown.children('span').html(str);
+ });
+ },'jsonp');
+ }
+
+
+
+ for(var i = 0; i < $('.adsbygoogle').length; i++){
+ (adsbygoogle = window.adsbygoogle || []).push({});
+ }
+
+
+ //展示当前版本
+ $('.site-showv').html(layui.v1);
+
+ //获取下载数
+ $.get('//xxx.com/api/handle?id=10&type=find', function(res){
+ $('.site-showdowns').html(res.number);
+ }, 'jsonp');
+
+ //记录下载
+ $('.site-down').on('click',function(){
+ $.get('//xxx.com/api/handle?id=10', function(){}, 'jsonp');
+ });
+
+ //获取Github数据
+ var getStars = $('#getStars');
+ if(getStars[0]){
+ $.get('api.github.com/repos/sentsin/layui', function(res){
+ getStars.html(res.stargazers_count);
+ }, 'json');
+ }
+
+ //固定Bar
+ if(global.pageType !== 'demo'){
+ util.fixbar({
+ bar1: true
+ ,click: function(type){
+ if(type === 'bar1'){
+ location.href = '//fly.layui.com/';
+ }
+ }
+ });
+ }
+
+ //窗口scroll
+ ;!function(){
+ var main = $('.site-tree').parent(), scroll = function(){
+ var stop = $(window).scrollTop();
+
+ if($(window).width() <= 750) return;
+ var bottom = $('.footer').offset().top - $(window).height();
+ if(stop > 211 && stop < bottom){
+ if(!main.hasClass('site-fix')){
+ main.addClass('site-fix');
+ }
+ if(main.hasClass('site-fix-footer')){
+ main.removeClass('site-fix-footer');
+ }
+ } else if(stop >= bottom) {
+ if(!main.hasClass('site-fix-footer')){
+ main.addClass('site-fix site-fix-footer');
+ }
+ } else {
+ if(main.hasClass('site-fix')){
+ main.removeClass('site-fix').removeClass('site-fix-footer');
+ }
+ }
+ stop = null;
+ };
+ scroll();
+ $(window).on('scroll', scroll);
+ }();
+
+ //示例页面滚动
+ $('.site-demo-body').on('scroll', function(){
+ var elemDate = $('.layui-laydate,.layui-colorpicker-main')
+ ,elemTips = $('.layui-table-tips');
+ if(elemDate[0]){
+ elemDate.each(function(){
+ var othis = $(this);
+ if(!othis.hasClass('layui-laydate-static')){
+ othis.remove();
+ }
+ });
+ $('input').blur();
+ }
+ if(elemTips[0]) elemTips.remove();
+
+ if($('.layui-layer')[0]){
+ layer.closeAll('tips');
+ }
+ });
+
+ //代码修饰
+ layui.code({
+ elem: 'pre'
+ });
+
+ //目录
+ var siteDir = $('.site-dir');
+ if(siteDir[0] && $(window).width() > 750){
+ layer.ready(function(){
+ layer.open({
+ type: 1
+ ,content: siteDir
+ ,skin: 'layui-layer-dir'
+ ,area: 'auto'
+ ,maxHeight: $(window).height() - 300
+ ,title: '目录'
+ //,closeBtn: false
+ ,offset: 'r'
+ ,shade: false
+ ,success: function(layero, index){
+ layer.style(index, {
+ marginLeft: -15
+ });
+ }
+ });
+ });
+ siteDir.find('li').on('click', function(){
+ var othis = $(this);
+ othis.find('a').addClass('layui-this');
+ othis.siblings().find('a').removeClass('layui-this');
+ });
+ }
+
+ //在textarea焦点处插入字符
+ var focusInsert = function(str){
+ var start = this.selectionStart
+ ,end = this.selectionEnd
+ ,offset = start + str.length
+
+ this.value = this.value.substring(0, start) + str + this.value.substring(end);
+ this.setSelectionRange(offset, offset);
+ };
+
+ //演示页面
+ $('body').on('keydown', '#LAY_editor, .site-demo-text', function(e){
+ var key = e.keyCode;
+ if(key === 9 && window.getSelection){
+ e.preventDefault();
+ focusInsert.call(this, ' ');
+ }
+ });
+
+ var editor = $('#LAY_editor')
+ ,iframeElem = $('#LAY_demo')
+ ,demoForm = $('#LAY_demoForm')[0]
+ ,demoCodes = $('#LAY_demoCodes')[0]
+ ,runCodes = function(){
+ if(!iframeElem[0]) return;
+ var html = editor.val();
+
+ html = html.replace(/=/gi,"layequalsign");
+ html = html.replace(/script/gi,"layscrlayipttag");
+ demoCodes.value = html.length > 100*1000 ? '卧槽,你的代码过长
' : html;
+
+ demoForm.action = '/api/runHtml/';
+ demoForm.submit();
+
+ };
+ $('#LAY_demo_run').on('click', runCodes), runCodes();
+
+ //让导航在最佳位置
+ var setScrollTop = function(thisItem, elemScroll){
+ if(thisItem[0]){
+ var itemTop = thisItem.offset().top
+ ,winHeight = $(window).height();
+ if(itemTop > winHeight - 120){
+ elemScroll.animate({'scrollTop': itemTop/2}, 200)
+ }
+ }
+ }
+ setScrollTop($('.site-demo-nav').find('dd.layui-this'), $('.layui-side-scroll').eq(0));
+ setScrollTop($('.site-demo-table-nav').find('li.layui-this'), $('.layui-side-scroll').eq(1));
+
+
+
+ //查看代码
+ $(function(){
+ var DemoCode = $('#LAY_democode');
+ DemoCode.val([
+ DemoCode.val()
+ ,''
+ ,global.preview
+ ,'\n'
+ ,'\n'
+ ,$('#LAY_democodejs').html()
+ ,'\n\n