Compare commits
99 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
78a9655d10 | ||
![]() |
0c2f0154a8 | ||
![]() |
74ab2ac512 | ||
![]() |
868797f0bb | ||
![]() |
ac854d627d | ||
![]() |
6a735f6fc8 | ||
![]() |
d3bfb9b3c3 | ||
![]() |
0c8ebe8290 | ||
![]() |
0dc8798850 | ||
![]() |
300c9e6a72 | ||
![]() |
3dbc77904e | ||
![]() |
a825153e2e | ||
![]() |
599adb73d2 | ||
![]() |
06b783c1e7 | ||
![]() |
149d89e9db | ||
![]() |
2047a80ceb | ||
![]() |
53303f2650 | ||
![]() |
12ad13a7f8 | ||
![]() |
94bf95951e | ||
![]() |
8546f94d3c | ||
![]() |
e2096d3c22 | ||
![]() |
9e3a41899f | ||
![]() |
2f9bfdffdb | ||
![]() |
88275662c3 | ||
![]() |
9c83c4d0cd | ||
![]() |
d6d512f54e | ||
![]() |
a86a2142bf | ||
![]() |
eac02b95d3 | ||
![]() |
a420104b03 | ||
![]() |
a056a37573 | ||
![]() |
108083fca2 | ||
![]() |
a54e206e00 | ||
![]() |
b147198b0c | ||
![]() |
6cf239b1cf | ||
![]() |
8ddee45e5f | ||
![]() |
4ae7a3ea51 | ||
![]() |
e81de0d307 | ||
![]() |
ac251681e2 | ||
![]() |
6d59293477 | ||
![]() |
e37fc82280 | ||
![]() |
11eea83c78 | ||
![]() |
38d6f26b5a | ||
![]() |
a3b4b8e16c | ||
![]() |
89ece07993 | ||
![]() |
43013c2e39 | ||
![]() |
ad7510a7bb | ||
![]() |
6cf7c3c589 | ||
![]() |
7b24ce1097 | ||
![]() |
608211d178 | ||
![]() |
f17b24122f | ||
![]() |
cea9984bfc | ||
![]() |
0a958f2b1a | ||
![]() |
c528ef2e16 | ||
![]() |
bdf3421b9d | ||
![]() |
563a01e3fa | ||
![]() |
5a6a54c887 | ||
![]() |
7eb272c437 | ||
![]() |
36bdf774ba | ||
![]() |
97f2b926ac | ||
![]() |
9a3faa0bd3 | ||
![]() |
76b90ab8b0 | ||
![]() |
7f6ac7af08 | ||
![]() |
160dc08cc0 | ||
![]() |
4042239db9 | ||
![]() |
83ca563d1c | ||
![]() |
cd50418e62 | ||
![]() |
13037f7440 | ||
![]() |
b9766d0c7b | ||
![]() |
1bb5c995cf | ||
![]() |
78b3697dea | ||
![]() |
2c87e42dff | ||
![]() |
641e2400e6 | ||
![]() |
002d647e04 | ||
![]() |
546f293aa7 | ||
![]() |
b6eb893a4c | ||
![]() |
5f43c95f69 | ||
![]() |
703058a13b | ||
![]() |
aef2058421 | ||
![]() |
9d64d858ee | ||
![]() |
12d95ad29f | ||
![]() |
f0dcaf98fc | ||
![]() |
184eb4ce30 | ||
![]() |
afada3a373 | ||
![]() |
fa679d3359 | ||
![]() |
53939e8fed | ||
![]() |
6740f501d1 | ||
![]() |
82985869c8 | ||
![]() |
de91c8b1dd | ||
![]() |
087a731c8f | ||
![]() |
ed2448a15e | ||
![]() |
230b696cb7 | ||
![]() |
f12a531500 | ||
![]() |
10a3660d33 | ||
![]() |
fa00358e0f | ||
![]() |
0b79c6d52c | ||
![]() |
040f6eece8 | ||
![]() |
ccedaa685c | ||
![]() |
f741c241c0 | ||
![]() |
9627e80512 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
/.idea
|
||||
/.vscode
|
||||
pay_order.php
|
||||
*.log
|
||||
.env
|
126
README.md
126
README.md
@ -1,14 +1,13 @@
|
||||
# TaoLer
|
||||
|
||||
> TaoLer是一个简单迅捷的轻论坛系统,适用于个人或组织区域型信息交流发布平台。
|
||||
> TaoLer是一个简单迅捷的管理系统,支持插件化开发,适用于企业、个人或组织建站需求。
|
||||
|
||||
* 官网:https://www.aieok.com:8443
|
||||
* 前台:http://bbs.aieok.com:888
|
||||
* 后台:http://adm.aieok.com:888
|
||||
* 账号:test
|
||||
* 密码:test123
|
||||
* 版本:TaoLer 1.7.24
|
||||
* 日期:2021.7.22
|
||||
支持多模板、多单页自由切换,网站风格可定制性强,支持插件化开发,方便二开。可做为企业门户网站,生活服务,学习问答笔记,文章分享等。
|
||||
默认内置一套完整的**问答+博客+论坛+新闻+轻社区化**的模板系统,还可持续增加模块,一个系统拥有多个版式的网站风格。
|
||||
|
||||
* 官网:https://www.aieok.com
|
||||
* 文档:http://wiki.aieok.com
|
||||
* 演示后台:https://www.aieok.com/adminff
|
||||
|
||||
#### 项目地址
|
||||
|
||||
@ -16,37 +15,116 @@
|
||||
2. github https://www.github.com/taoser/TaoLer
|
||||
3. composer create-project taoser/taoler
|
||||
|
||||

|
||||
|
||||
#### 介绍
|
||||
|
||||
1. 采用动态密码加密,相同密码在入库时具有唯一性,即使管理员也无法破解,用户信息安全牢固。
|
||||
2. 系统采用最新版TinkPHP6框架开发,底层安全可靠,数据查询更快,运行效率更高,网站速度更快。
|
||||
3. 自适应前端,桌面和移动端访问界面友好简洁,模块清晰。
|
||||
4. 完善的后台系统,管理便捷,动态菜单和权限角色分配系统。支持3级菜单和无限极分类。
|
||||
5. 双升级系统,可支持自动和手动升级。可在线检测并升级系统,保持网站的更新和安全。
|
||||
6. 代码开源,不设暗门操作,更安全。
|
||||
7. 项目会长期维护,优化更新。
|
||||
4. 后续主要多合一单页模板开发,可自由切换单页显示,可以设置不同分类模块,不同模板单页,论坛模块,问答模板,企业站模板,产品模块等自由开发。
|
||||
5. 完善的后台系统,管理便捷,动态菜单和权限角色分配系统。支持3级菜单和无限极分类。
|
||||
6. 双升级系统,可支持自动和手动升级。可在线检测并升级系统,保持网站的更新和安全。
|
||||
7. 代码开源,不设暗门操作,更安全。
|
||||
8. 项目会长期维护,优化更新。
|
||||
9. 预增加插件管理机制1.x(2.x版本正式上线)
|
||||
|
||||

|
||||
|
||||
#### 构架组成
|
||||
- 1.x版本构架:
|
||||
- 构架:Tinkphp6 + layui2.6
|
||||
- 环境:php7 + mysql
|
||||
- 前端:Fly template V3.0
|
||||
- 构架:Tinkphp6 + layui2.7
|
||||
- 环境:php7/8.1 + mysql5.7/8.0
|
||||
|
||||
#### 构架介绍
|
||||
thinkphp:
|
||||
快速、简单的面向对象的轻量级PHP开发框架,出色的性能和至简代码的,更注重易用性。代码维护方便。
|
||||
layui前端
|
||||
layui前端:
|
||||
极简、丰盈,简单高效,模块化UI框架,体积轻盈,组件丰盈。
|
||||
Fly模板:
|
||||
一款至简的社区模板,适合政府机构、教育机构、事业单位、商业企业、个人站长等众多行业领域。
|
||||
一款至简的社区模板。
|
||||
|
||||

|
||||
|
||||
#### 重点
|
||||
* 长期维护,对抗消亡
|
||||
* 迭代及时,查漏补缺
|
||||
* 多模板多模块,一站顶多站
|
||||
|
||||
#### 安装教程
|
||||
|
||||
1. git下载:https://gitee.com/toogee/TaoLer
|
||||
2. 官网下载:https://www.aieok.com
|
||||
3. 解压后,项目绑定域名为public目录对外访问,首次安装,访问域名http://www.youdomain.com可自动跳转到/install/index进行引导安装,重新安装需删除根目录下install.lock。
|
||||
4. 安装前需要先创建mysql数据库(准备:数据库连接地址,数据库用户名,数据库密码,数据库端口,建好在数据库名)
|
||||
5. 请牢记安装设置的管理员用户名和密码,默认admin/123456。前后台的管理员密码一致。前后端管理员账户是独立的,前端主要对文章内容的审查管理等操作。
|
||||
1. 首选确保满目使用环境要求,php > 7.2, mysql > 5.7.3
|
||||
2. https://github.com/taoser/TaoLer/archive/refs/heads/master.zip
|
||||
git下载:https://gitee.com/toogee/TaoLer
|
||||
官网下载:https://www.aieok.com
|
||||
|
||||
#### 引导安装
|
||||
|
||||
1. 绑定域名
|
||||
|
||||
!> 先绑定域名,然后把域名指向解析到`public`目录下
|
||||
|
||||
2. 伪静态
|
||||
* apache:
|
||||
> 在apache服务器,一般不用手动设置、`public`文件加已经设置了`.htaccess`文件
|
||||
```bash
|
||||
<IfModule mod_rewrite.c>
|
||||
Options +FollowSymlinks -Multiviews
|
||||
RewriteEngine On
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
|
||||
</IfModule>
|
||||
```
|
||||
!> 但在有的集成包的apache环境下`访问域名无法安装或者No input file specified`,如phpstudy,伪静态要设置为如下:
|
||||
```bash
|
||||
<IfModule mod_rewrite.c>
|
||||
Options +FollowSymlinks -Multiviews
|
||||
RewriteEngine On
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
|
||||
</IfModule>
|
||||
```
|
||||
|
||||
* nginx
|
||||
> 在`Nginx`低版本中,是不支持`PATHINFO`的,但是可以通过在`Nginx.conf`中配置转发规则实现:遇到`404`错误一般是nginx的伪静态错误
|
||||
```bash
|
||||
location / {
|
||||
if (!-e $request_filename) {
|
||||
rewrite ^(.*)$ /index.php?s=/$1 last; break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> 如果是宝塔集成环境,网站目录部署如下示例:
|
||||
网站目录:D:/www/TaoLer
|
||||
运行目录:/public
|
||||
|
||||

|
||||
|
||||
|
||||
3. 首次安装,访问域名http://www.youdomain.com可自动跳转到/install/index进行引导安装,重新安装需删除public目录下install.lock。
|
||||
4. 安装前需要先创建mysql数据库(准备:数据库连接地址,数据库用户名,密码,端口)
|
||||
5. 如果手动导入数据库,管理员用户名和密码,默认admin/123456,前后台的管理员密码一致。前后端管理员账户是独立的,前端主要对文章内容的审查管理等操作。
|
||||
|
||||
|
||||

|
||||
|
||||
#### 前后台独立域名的绑定
|
||||
|
||||
1. 支持设置绑定域名
|
||||
|
||||
> 如果绑定`index`应用对应的域名,后台`admin`应用也必须独立绑定域名,否则原`xxx.com/admin`访问路径就无法再访问。
|
||||
|
||||
2. 支持应用设置映射
|
||||
|
||||
> 域名绑定的优先级高于应用映射,若绑定过域名,直接访问域名,如果没有绑定过域名,访问路径为xxx.com/youbind.
|
||||
如后台的映射地址 www.xxx.com/youadmin
|
||||
|
||||
|
||||
|
||||
#### 使用说明
|
||||
|
||||
@ -63,7 +141,7 @@
|
||||
#### 参与贡献
|
||||
|
||||
1. Fork 本仓库
|
||||
2. 新建 Feat_xxx 分支
|
||||
2. 网站提交BUG
|
||||
3. 提交代码
|
||||
4. 新建 Pull Request
|
||||
|
||||
@ -73,6 +151,6 @@
|
||||
|
||||
本项目包含的第三方源码和二进制文件之版权信息另行标注。
|
||||
|
||||
版权所有Copyright © 2020-2021 by aieok.com (https://www.aieok.com)
|
||||
版权所有Copyright © 2020-2022 by aieok.com (https://www.aieok.com)
|
||||
|
||||
All rights reserved。
|
||||
|
57
app/404.html
Normal file
57
app/404.html
Normal file
@ -0,0 +1,57 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>404 - TaoLer社区</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="keywords" content="fly,layui,前端社区">
|
||||
<meta name="description" content="Fly社区是模块化前端UI框架Layui的官网社区,致力于为web开发提供强劲动力">
|
||||
<link rel="stylesheet" href="/layui-1/css/layui.css">
|
||||
<link rel="stylesheet" href="/static/res/css/global.css" charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<include file="/view/taoler/index/public/header" />
|
||||
<include file="./taoler/index/public/column" />
|
||||
<div class="layui-container fly-marginTop">
|
||||
<div class="fly-panel">
|
||||
<div class="fly-none">
|
||||
<h2><i class="iconfont icon-404"></i></h2>
|
||||
<p>页面或者数据被<a href="/" target="_blank"> 纸飞机app </a>运到火星了,啥都看不到了…<a href="/">请返回首页</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<include file="./footer" />
|
||||
<script src="/layui-1/jquery.min.js" charset="utf-8"></script>
|
||||
<script src="/layui-1/layui.js" charset="utf-8"></script>
|
||||
|
||||
<script>
|
||||
layui.cache.user = {
|
||||
username: '{$user.name??'游客'}'
|
||||
,uid: {$user.id ? 168*$user.id : -1}
|
||||
,avatar: '{if condition="$user['user_img'] neq ''"}/uploads/{$user['user_img']}{else /}/static/res/images/avatar/00.jpg{/if}'
|
||||
,experience: 83
|
||||
,sex: '{if condition="$user['sex'] eq 0"}男{else/}女{/if}'
|
||||
};
|
||||
layui.config({
|
||||
version: "3.0.0"
|
||||
,base: '/static/res/mods/'
|
||||
}).extend({
|
||||
fly: 'index'
|
||||
}).use('fly');
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -5,7 +5,16 @@ namespace app;
|
||||
|
||||
use think\App;
|
||||
use think\exception\ValidateException;
|
||||
use think\response\Json;
|
||||
use think\Validate;
|
||||
use think\Response;
|
||||
use think\exception\HttpResponseException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Request;
|
||||
use think\facade\Lang;
|
||||
use think\facade\View;
|
||||
use taoser\SetArr;
|
||||
use app\common\lib\Uploads;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
@ -91,100 +100,245 @@ abstract class BaseController
|
||||
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
|
||||
//显示网站设置
|
||||
protected function getSystem()
|
||||
{
|
||||
if (is_null($url)) {
|
||||
$url = request()->isAjax() ? '' : 'javascript:history.back(-1);';
|
||||
} elseif ($url) {
|
||||
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : app('route')->buildUrl($url);
|
||||
}
|
||||
//1.系统配置信息
|
||||
return Db::name('system')->cache('system',3600)->find(1);
|
||||
|
||||
}
|
||||
|
||||
//域名协议转换 把数据库中的带HTTP或不带协议的域名转换为当前协议的域名前缀
|
||||
protected function getHttpUrl($url)
|
||||
{
|
||||
//域名转换为无http协议
|
||||
$www = stripos($url,'://') ? substr(stristr($url,'://'),3) : $url;
|
||||
$htpw = Request::scheme().'://'. $www;
|
||||
return $htpw;
|
||||
}
|
||||
|
||||
$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);
|
||||
protected function getDomain()
|
||||
{
|
||||
return $this->getHttpUrl($this->getSystem()['domain']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回封装后的API数据到客户端
|
||||
* @param mixed $data 要返回的数据
|
||||
* @param integer $code 返回的code
|
||||
* @param mixed $msg 提示信息
|
||||
* @param string $type 返回数据格式
|
||||
* @param array $header 发送的Header信息
|
||||
* @return Response
|
||||
* 运行时间计算
|
||||
* @return string
|
||||
*/
|
||||
protected function result($data, int $code = 0, $msg = '', string $type = '', array $header = []): Response
|
||||
protected function getRunTime()
|
||||
{
|
||||
$result = [
|
||||
'code' => $code,
|
||||
'msg' => $msg,
|
||||
'time' => time(),
|
||||
'data' => $data,
|
||||
];
|
||||
|
||||
$type = $type ?: 'json';
|
||||
$response = Response::create($result, $type)->header($header);
|
||||
|
||||
throw new HttpResponseException($response);
|
||||
//运行时间
|
||||
$now = time();
|
||||
$sys = $this->getSystem();
|
||||
$count = $now-$sys['create_time'];
|
||||
$days = floor($count/86400);
|
||||
$hos = floor(($count%86400)/3600);
|
||||
$mins = floor(($count%3600)/60);
|
||||
$years = floor($days/365);
|
||||
if($years >= 1){
|
||||
$days = floor($days%365);
|
||||
}
|
||||
$runTime = $years ? "{$years}年{$days}天{$hos}时{$mins}分" : "{$days}天{$hos}时{$mins}分";
|
||||
return $runTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作成功跳转
|
||||
* @param mixed $msg 提示信息
|
||||
* @param string $url 跳转的URL地址
|
||||
* @param mixed $data 返回的数据
|
||||
* @param integer $wait 跳转等待时间
|
||||
* @param array $header 发送的Header信息
|
||||
* @return void
|
||||
* 非admin应用的文章url路由地址
|
||||
* @param int $aid
|
||||
* @param $ename
|
||||
* @return string
|
||||
*/
|
||||
protected function success($msg = '', string $url = null, $data = '', int $wait = 3, array $header = []): Response
|
||||
protected function getRouteUrl(int $aid, $ename = '')
|
||||
{
|
||||
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);
|
||||
$domain = $this->getDomain();
|
||||
$appName = app('http')->getName();
|
||||
$articleUrl = (string) url('article_detail', ['id' => $aid]);
|
||||
// 详情动态路由,$aid, $ename
|
||||
if(config('taoler.url_rewrite.article_as') == '<ename>/'){
|
||||
$articleUrl = (string) url('article_detail', ['id' => (int) $aid, 'ename'=> $ename]);
|
||||
}
|
||||
|
||||
$result = [
|
||||
'code' => 1,
|
||||
'msg' => $msg,
|
||||
'data' => $data,
|
||||
'url' => $url,
|
||||
'wait' => $wait,
|
||||
];
|
||||
// // 判断应用是否绑定域名
|
||||
// $app_bind = array_search($appName, config('app.domain_bind'));
|
||||
// // 判断应用是否域名映射
|
||||
// $app_map = array_search($appName, config('app.app_map'));
|
||||
|
||||
$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);
|
||||
//a.appName不是admin
|
||||
return $domain . $articleUrl;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 上传接口
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function uploadFiles($type)
|
||||
{
|
||||
$max_file_seze = $this->getSystem()['upsize'];
|
||||
$uploads = new Uploads();
|
||||
switch ($type){
|
||||
case 'image':
|
||||
$upRes = $uploads->put('file','article_pic',$max_file_seze,'image');
|
||||
break;
|
||||
case 'zip':
|
||||
$upRes = $uploads->put('file','article_zip',$max_file_seze,'application|image');
|
||||
break;
|
||||
case 'video':
|
||||
$upRes = $uploads->put('file','article_video',$max_file_seze,'video|audio');
|
||||
break;
|
||||
case 'audio':
|
||||
$upRes = $uploads->put('file','article_audio',$max_file_seze,'audio');
|
||||
break;
|
||||
default:
|
||||
$upRes = $uploads->put('file','article_file',$max_file_seze,'image');
|
||||
break;
|
||||
}
|
||||
return $upRes;
|
||||
}
|
||||
|
||||
//获取artcile内容所有图片,返回数组
|
||||
protected function getArticleAllpic($str)
|
||||
{
|
||||
//正则匹配<img src="http://img.com" />
|
||||
$pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";
|
||||
preg_match_all($pattern,$str,$matchContent);
|
||||
if(isset($matchContent[1])){
|
||||
$img = $matchContent[1];
|
||||
}else{
|
||||
$temp = "./images/no-image.jpg";//在相应位置放置一张命名为no-image的jpg图片
|
||||
}
|
||||
|
||||
return $img;
|
||||
|
||||
}
|
||||
|
||||
//下载远程图片
|
||||
private function downloadImage($url)
|
||||
{
|
||||
$ch = curl_init();
|
||||
curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, 'GET' );
|
||||
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false );
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
|
||||
$file = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
return $this->saveAsImage($url, $file);
|
||||
|
||||
}
|
||||
|
||||
//把图片保存到本地
|
||||
private function saveAsImage($url, $file)
|
||||
{
|
||||
$filename = pathinfo($url, PATHINFO_BASENAME);
|
||||
//$dirname = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_DIRNAME);
|
||||
$dirname = date('Ymd',time());
|
||||
//路径
|
||||
$path = 'storage/download/article_pic/' . $dirname . '/';
|
||||
//绝对文件夹
|
||||
$fileDir = public_path() . $path;
|
||||
//文件绝对路径
|
||||
$filePath = $fileDir . $filename;
|
||||
//相对路径文件名
|
||||
$realFile = '/' . $path . $filename;
|
||||
// 如果目录不存在,则创建
|
||||
|
||||
if(!is_dir($fileDir)) {
|
||||
mkdir($fileDir, 0777, true);
|
||||
}
|
||||
|
||||
if(file_exists($filePath)) {
|
||||
//$this->output->writeln("【已存在】输出路径" . $fullpath);
|
||||
return $realFile;
|
||||
|
||||
} else {
|
||||
$resource = fopen($filePath, 'a');
|
||||
$res = fwrite($resource, $file);
|
||||
fclose($resource);
|
||||
if($res !== false) {
|
||||
return $realFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//下载网络图片到本地并替换
|
||||
public function downUrlPicsReaplace($content)
|
||||
{
|
||||
// 批量下载网络图片并替换
|
||||
$images = $this->getArticleAllpic($content);
|
||||
if(count($images)) {
|
||||
foreach($images as $image){
|
||||
//1.带http地址的图片,2.非本站的网络图片 3.非带有?号等参数的图片
|
||||
if((stripos($image,'http') !== false) && (stripos($image, Request::domain()) === false) && (stripos($image, '?') === false)) {
|
||||
// 如果图片中没有带参数或者加密可下载
|
||||
//下载远程图片(可下载)
|
||||
$newImageUrl = $this->downloadImage($image);
|
||||
//替换图片链接
|
||||
$content = str_replace($image,Request::domain().$newImageUrl,$content);
|
||||
}
|
||||
}
|
||||
//不可下载的图片,如加密或者带有参数的图片如?type=jpeg,直接返回content
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* array_filter过滤返回函数
|
||||
* @param $arr
|
||||
* @return bool
|
||||
*/
|
||||
protected function filter($arr) :bool
|
||||
{
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 过滤为空null等筛选参数
|
||||
* @param array $array
|
||||
* @return array
|
||||
*/
|
||||
public function getParamFilter(array $array) :array
|
||||
{
|
||||
return array_filter($array, function($arr){
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 数组根据sort字段数值进行排序
|
||||
* @param array $array 数组
|
||||
* @param string $sort 排序字段
|
||||
* @return array 返回数组
|
||||
*/
|
||||
public function getArrSort(array $array, string $sort = 'sort') :array
|
||||
{
|
||||
// 排序
|
||||
$cmf_arr = array_column($array, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $array);
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* 过滤字符串中表情
|
||||
* @param $str string 字符串内容
|
||||
* @return string
|
||||
*/
|
||||
public function filterEmoji(string $str): string
|
||||
{
|
||||
$str = preg_replace_callback('/./u', function (array $match) {
|
||||
return strlen($match[0]) >= 4 ? '' : $match[0];
|
||||
}, $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,13 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <317927823@qq.com>
|
||||
* @Date: 2021-12-06 16:04:50
|
||||
* @LastEditTime: 2022-07-28 11:44:38
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 优化版
|
||||
* @FilePath: \github\TaoLer\app\Request.php
|
||||
* Copyright (c) 2020~2022 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
namespace app;
|
||||
|
||||
// 应用请求对象类
|
||||
@ -6,6 +15,9 @@ class Request extends \think\Request
|
||||
{
|
||||
//过滤空格
|
||||
//protected $filter = ['trim','htmlspecialchars','strip_tags'];
|
||||
//protected $filter = ['trim','htmlspecialchars'];
|
||||
//protected $filter = ['trim','strip_tags'];
|
||||
//protected $filter = ['htmlspecialchars'];
|
||||
protected $filter = ['trim'];
|
||||
|
||||
|
||||
}
|
||||
|
13
app/admin/controller/.gitignore
vendored
13
app/admin/controller/.gitignore
vendored
@ -1,5 +1,10 @@
|
||||
KeyAuth.php
|
||||
Version.php
|
||||
TimeLine.php
|
||||
Plugins.php
|
||||
/addonfactory
|
||||
/addons
|
||||
/apps
|
||||
/server
|
||||
/taocai
|
||||
Apps.php
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,122 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Db;
|
||||
use think\facade\Request;
|
||||
use think\facade\Config;
|
||||
use think\exception\ValidateException;
|
||||
use app\admin\model\Addons as AddonsModel;
|
||||
use taoler\com\Files;
|
||||
|
||||
class Addons extends AdminController
|
||||
{
|
||||
/**
|
||||
* 显示资源列表
|
||||
*
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
|
||||
var_dump(Files::getDirName('../addons/'));
|
||||
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示创建资源表单页.
|
||||
*
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
//添加版本
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = AddonsModel::create($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 编辑版本
|
||||
*
|
||||
* @param int $id
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$addons = AddonsModel::find($id);
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','addons_name','addons_version','addons_auther','addons_resume','addons_price','addons_src']);
|
||||
$result = $addons->where('id',$id)->save($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
View::assign('addons',$addons);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传版本的zip资源
|
||||
*
|
||||
* @param
|
||||
* @param int $id
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function uploadZip()
|
||||
{
|
||||
$id = Request::param();
|
||||
$file = request()->file('file');
|
||||
try {
|
||||
validate(['file'=>'filesize:2048|fileExt:zip,rar,7z'])
|
||||
->check(array($file));
|
||||
$savename = \think\facade\Filesystem::disk('public')->putFile('addons',$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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除指定资源
|
||||
*
|
||||
* @param int $id
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
$version = AddonsModel::find($id);
|
||||
$res = $version->delete();
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,146 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\exception\ValidateException;
|
||||
use app\admin\model\AuthGroupAccess;
|
||||
|
||||
class AuthAccess extends AdminController
|
||||
{
|
||||
/**
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
}
|
||||
*/
|
||||
//用户组明细
|
||||
public function index()
|
||||
{
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['uid']);
|
||||
$map = array_filter($data);
|
||||
//var_dump($map);
|
||||
$groups = Db::name('auth_group_access')
|
||||
->alias('c')
|
||||
->join('admin a','c.uid = a.id')
|
||||
->join('auth_group g','c.group_id = g.id')
|
||||
->field('c.id as id,username,title,c.status as status')
|
||||
->where(['c.status'=>1,'c.delete_time'=>0])
|
||||
->where($map)
|
||||
->select();
|
||||
$count = $groups->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($groups as $k => $v){
|
||||
$data = ['id'=>$v['id'],'username'=>$v['username'],'title'=>$v['title'],'check'=>$v['status']];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$admins = Db::name('admin')->field('id,username')->select();
|
||||
|
||||
View::assign('admins',$admins);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色添加
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['uid','group_id']);
|
||||
//检测重复权限
|
||||
$groups = Db::name('auth_group_access')->where('uid',$data['uid'])->column('group_id');
|
||||
if(in_array($data['group_id'],$groups)){
|
||||
$res = ['code'=>-1,'msg'=>'不能重复添加已存在权限'];
|
||||
} else {
|
||||
$result = AuthGroupAccess::create($data);
|
||||
if($result) {
|
||||
$res = ['code'=>0,'msg'=>'添加权限成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'添加权限失败'];
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
$admins = Db::name('admin')->field('id,username')->where('delete_time',0)->select();
|
||||
$auth_groups = Db::name('auth_group')->field('id,title')->select();
|
||||
View::assign(['admins'=>$admins,'auth_groups'=>$auth_groups]);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//管理员权限编辑
|
||||
public function edit($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','uid','group_id']);
|
||||
//检测重复权限
|
||||
$groups = Db::name('auth_group_access')->where('uid',$data['uid'])->column('group_id');
|
||||
if(in_array($data['group_id'],$groups)){
|
||||
$res = ['code'=>-1,'msg'=>'不能重复添加已存在权限'];
|
||||
} else {
|
||||
$result = AuthGroupAccess::where('id',$data['id'])->update(['uid'=>$data['uid'],'group_id'=>$data['group_id']]);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
$access = Db::name('auth_group_access')->group('uid')->find($id);
|
||||
$admins = Db::name('admin')->field('id,username')->where('delete_time',0)->select();
|
||||
$auth_groups = Db::name('auth_group')->field('id,title')->select();
|
||||
|
||||
View::assign(['admins'=>$admins,'auth_groups'=>$auth_groups,'access'=>$access]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色删除
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$access = AuthGroupAccess::find($id);
|
||||
$result = $access->delete();
|
||||
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
//角色审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
|
||||
//获取状态
|
||||
$result = AuthGroupAccess::update($data);
|
||||
if($result){
|
||||
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'=>'权限执行出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,139 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\validate\Admin;
|
||||
use app\admin\model\Admin as adminModel;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\exception\ValidateException;
|
||||
use app\admin\model\AuthGroup as AuthGroupModel;
|
||||
use app\admin\model\AuthRule as AuthRuleModel;
|
||||
|
||||
class AuthGroup extends AdminController
|
||||
{
|
||||
/**
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
|
||||
}
|
||||
*/
|
||||
//角色
|
||||
public function list()
|
||||
{
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id']);
|
||||
$map = array_filter($data);
|
||||
$role = Db::name('auth_group')->field('id,title,limits,descr,status')->where('status',1)->where($map)->select();
|
||||
$count = $role->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$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;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$roles = Db::name('auth_group')->field('id,title')->where('status',1)->select();
|
||||
View::assign('roles',$roles);
|
||||
return View::fetch('role');
|
||||
}
|
||||
|
||||
//角色添加
|
||||
public function roleAdd()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = AuthGroupModel::create($data);
|
||||
if($result) {
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'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'=>0,'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');
|
||||
}
|
||||
|
||||
//角色删除
|
||||
public function roleDel($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$role =AuthGroupModel::find($id);
|
||||
$result = $role->delete();
|
||||
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
//角色审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::param();
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('auth_group')->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'=>'审核出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,221 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
use app\admin\model\AuthRule as AuthRuleModel;
|
||||
|
||||
class AuthRule extends AdminController
|
||||
{
|
||||
//权限列表
|
||||
public function index()
|
||||
{
|
||||
//获取权限列表
|
||||
if(Request::isAjax()){
|
||||
|
||||
$rule = new AuthRuleModel();
|
||||
$auth_rules = $rule->authRuleTree();
|
||||
$count = count($auth_rules);
|
||||
$res = [];
|
||||
if($auth_rules){
|
||||
$res = ['code'=>0,'msg'=>'ok','count'=>$count];
|
||||
|
||||
foreach($auth_rules as $k => $v){
|
||||
//$data = $v->getData();
|
||||
$data = ['id'=>$v['id'],'pid'=>$v['pid'],'title'=>$v['title'],'url'=>$v['name'],'icon'=>$v['icon'],'status'=>$v['status'],'isMenu'=>$v['ishidden'],'sort'=>$v['sort'],'ctime'=>$v['create_time']];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
|
||||
}
|
||||
|
||||
//权限树
|
||||
public function tree()
|
||||
{
|
||||
|
||||
//$res = $this->treeTr($this->getMenus());
|
||||
//var_dump($res);
|
||||
/*
|
||||
支持获取三级菜单
|
||||
*/
|
||||
$result = $this->getMenus();
|
||||
|
||||
$count = count($result);
|
||||
$tree = [];
|
||||
if($result){
|
||||
$tree = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
|
||||
$res = []; //auth_rule储存数据表中的表结构
|
||||
foreach($result as $k => $v){
|
||||
//第一层子权限
|
||||
$children = [];
|
||||
if(isset($v['children'])){
|
||||
|
||||
foreach($v['children'] as $m => $j){
|
||||
//第二层子权限
|
||||
$chichi = [];
|
||||
if(isset($j['children'])){
|
||||
//第三层子权限
|
||||
foreach($j as $s){
|
||||
if(isset($s['children'])){
|
||||
$chichi[] = ['id'=>$s['id'],'title'=>$s['title'],'pid'=>$s['pid']]; //子数据的子数据
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//if($j['level'] < 3){}
|
||||
$children[] = ['id'=>$j['id'],'title'=>$j['title'],'pid'=>$j['pid'],'children'=>$chichi]; //子数据
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$data[] = ['id'=>$v['id'],'title'=>$v['title'],'pid'=>$v['pid'],'children'=>$children];
|
||||
|
||||
}
|
||||
|
||||
//构造一个顶级菜单pid=0的数组。把权限放入顶级菜单下子权限中
|
||||
$tree['data'][] = ['id'=>0,'title'=>'顶级','pid'=>0,'children'=>$data];
|
||||
}
|
||||
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
//添加权限
|
||||
public function add()
|
||||
{
|
||||
//
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$plevel = Db::name('auth_rule')->field('level')->find($data['pid']);
|
||||
if($plevel){
|
||||
$data['level'] = $plevel['level']+1;
|
||||
} else {
|
||||
$data['level'] = 0;
|
||||
}
|
||||
$data['create_time'] = time();
|
||||
$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(['id','pid','title','name','icon','sort','ishidden']);
|
||||
$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();
|
||||
$rules = Db::name('auth_rule')->save($data);
|
||||
if($rules){
|
||||
if($data['ishidden'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置菜单显示','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'取消菜单显示','icon'=>5]);
|
||||
}
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'设置失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
$data = Request::param();
|
||||
$rules = Db::name('auth_rule')->save($data);
|
||||
if($rules){
|
||||
$res = ['code'=>0,'msg'=>'排序成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'排序失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
public function delete($id)
|
||||
{
|
||||
$pids = AuthRuleModel::where('pid',$id)->select();
|
||||
if($pids)
|
||||
{
|
||||
$result = $pids->delete();
|
||||
}
|
||||
|
||||
$rule = AuthRuleModel::find($id);
|
||||
$result = $rule->delete();
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
@ -1,102 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\Request;
|
||||
use think\facade\View;
|
||||
use think\facade\Config;
|
||||
use phpspirit\databackup\BackupFactory;
|
||||
use taoler\com\Files;
|
||||
|
||||
class Database extends AdminController
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->hostname = Config::get('database.connections.mysql.hostname');
|
||||
$this->hostport = Config::get('database.connections.mysql.hostport');
|
||||
$this->database = Config::get('database.connections.mysql.database');
|
||||
$this->username = Config::get('database.connections.mysql.username');
|
||||
$this->password = Config::get('database.connections.mysql.password');
|
||||
$this->backdir = Config::get('taoler.databasebackdir');
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$backName = Files::getDirName($this->backdir);
|
||||
|
||||
if(empty($backName)){
|
||||
return json(['code'=>-1,'msg'=>'还没有数据']);
|
||||
}
|
||||
|
||||
$res['count'] = count($backName);
|
||||
if($res['count']){
|
||||
$res['code'] = 0;
|
||||
$res['msg'] = '';
|
||||
$res['data'] = [];
|
||||
foreach($backName as $k=>$v){
|
||||
$res['data'][] = ['id' => $k,
|
||||
'time' => $v,
|
||||
'name' => $v,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
public function backup()
|
||||
{
|
||||
//自行判断文件夹
|
||||
if (isset($_POST['backdir']) && $_POST['backdir'] != '') {
|
||||
$backupdir = $_POST['backdir'];
|
||||
} else {
|
||||
$backupdir = $this->backdir . date('Ymdhis');
|
||||
}
|
||||
|
||||
if (!is_dir($backupdir)) {
|
||||
mkdir($backupdir, 0777, true);
|
||||
}
|
||||
|
||||
$backup = BackupFactory::instance('mysql', "$this->hostname:$this->hostport", $this->database, $this->username, $this->password);
|
||||
$result = $backup->setbackdir($backupdir)
|
||||
->setvolsize(0.2)
|
||||
->setonlystructure(false) //设置是否只备份目录结构
|
||||
->settablelist() //设置要备份的表, 默认全部表
|
||||
->setstructuretable()
|
||||
->ajaxbackup($_POST);
|
||||
|
||||
echo json_encode($result);
|
||||
}
|
||||
|
||||
|
||||
//下载
|
||||
public function down()
|
||||
{
|
||||
$id = input('id');
|
||||
var_dump($id);
|
||||
}
|
||||
|
||||
//删除备份文件夹
|
||||
public function delete()
|
||||
{
|
||||
$name = input('name');
|
||||
//var_dump($name);
|
||||
$dir = $this->backdir . $name;
|
||||
|
||||
$res = Files::delDir($dir);
|
||||
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,124 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
header('Content-Type:application/json; charset=utf-8');
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use AngularFilemanager\LocalBridge\FileManagerApi;
|
||||
use AngularFilemanager\LocalBridge\Rest;
|
||||
use taoler\com\Api;
|
||||
|
||||
|
||||
|
||||
include '../extend/AngularFilemanager/LocalBridge/Response.php';
|
||||
include '../extend/AngularFilemanager/LocalBridge/Rest.php';
|
||||
include '../extend/AngularFilemanager/LocalBridge/Translate.php';
|
||||
include '../extend/AngularFilemanager/LocalBridge/FileManagerApi.php';
|
||||
|
||||
|
||||
class FileManager extends AdminController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
public function handler()
|
||||
{
|
||||
$fileManagerApi = new FileManagerApi();
|
||||
|
||||
$rest = new Rest();
|
||||
$rest->post([$fileManagerApi, 'postHandler'])
|
||||
->get([$fileManagerApi, 'getHandler'])
|
||||
->handle();
|
||||
}
|
||||
|
||||
public function data()
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
$url = 'http://api.aieok.com/v1/handler';
|
||||
/*
|
||||
$data = json([
|
||||
'action'=>'list',
|
||||
'path'=> '/'
|
||||
])->header([
|
||||
'Cache-control' => 'no-cache,must-revalidate',
|
||||
'Content-Type' => 'application/json'
|
||||
]);
|
||||
|
||||
*/
|
||||
$datas = [
|
||||
'action'=>'list',
|
||||
'path'=> '/'
|
||||
];
|
||||
$jsonStr = json_encode($datas);
|
||||
list($returnCode, $returnContent) = $this->http_post_json($url, $jsonStr);
|
||||
|
||||
if($returnCode == 200){
|
||||
$res = trim($returnContent,'"');
|
||||
return json_decode($res);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//var_dump($data);
|
||||
//$apiRes = Api::urlPost($url,$data);
|
||||
//var_dump($apiRes);
|
||||
|
||||
//return $apiRes;
|
||||
|
||||
|
||||
//$path = app()->getRootPath();
|
||||
// var_dump($path);
|
||||
//Listing (URL: fileManagerConfig.listUrl, Method: POST)
|
||||
|
||||
/*
|
||||
$fileManagerApi = new FileManagerApi();
|
||||
$file = $fileManagerApi->listActionData('/');
|
||||
|
||||
$data['result'] = $file;
|
||||
|
||||
|
||||
*/
|
||||
//$rest = new Rest('post');
|
||||
//$rest->post([$fileManagerApi, 'postHandler'])
|
||||
// ->get([$fileManagerApi, 'getHandler'])
|
||||
// ->handle();
|
||||
|
||||
//$res = $fileManagerApi->postHandler([],['action'=>'list', 'path'=>'../'],'');
|
||||
//$rest = new Rest();
|
||||
//$rest->post([$fileManagerApi, 'postHandler'])
|
||||
//->handle();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function http_post_json($url, $jsonStr)
|
||||
{
|
||||
$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);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
|
||||
'Content-Type: application/json; charset=utf-8',
|
||||
|
||||
)
|
||||
);
|
||||
curl_setopt($ch, CURLOPT_HEADER, 0); // ÏÔʾ·µ»ØµÄHeaderÇøÓòÄÚÈÝ
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
|
||||
$response = curl_exec($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
return array($httpCode,$response);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,330 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\validate\Admin;
|
||||
use app\admin\model\Admin as adminModel;
|
||||
use app\common\model\Cate;
|
||||
use app\common\model\Comment;
|
||||
use app\common\model\Article;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
class Forum extends AdminController
|
||||
{
|
||||
//帖子列表
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','name','title','sec']);
|
||||
$where =array();
|
||||
if (!empty($data['sec'])) {
|
||||
switch ($data['sec']) {
|
||||
case '1':
|
||||
$data['a.status'] = 1;
|
||||
break;
|
||||
case '2':
|
||||
$data['is_top'] = 1;
|
||||
break;
|
||||
case '3':
|
||||
$data['is_hot'] = 1;
|
||||
break;
|
||||
case '4':
|
||||
$data['is_reply'] = 0;
|
||||
break;
|
||||
case '5':
|
||||
$data['a.status'] = -1;
|
||||
break;
|
||||
case '6':
|
||||
$data['a.status'] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
unset($data['sec']);
|
||||
unset($data['status']);
|
||||
|
||||
if(!empty($data['id'])){
|
||||
$data['a.id'] = $data['id'];
|
||||
unset($data['id']);
|
||||
}
|
||||
|
||||
if(!empty($data['title'])){
|
||||
$where[] = ['title', 'like', '%'.$data['title'].'%'];
|
||||
unset($data['title']);
|
||||
}
|
||||
|
||||
$map = array_filter($data,[$this,"filtr"]);
|
||||
|
||||
$forumList = Db::name('article')
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->field('a.id as aid,name,user_img,title,a.update_time as update_time,is_top,is_hot,is_reply,a.status as status')
|
||||
->where('a.delete_time',0)
|
||||
->where($map)
|
||||
->where($where)
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate(15);
|
||||
$res = [];
|
||||
$count = $forumList->total();
|
||||
if($count){
|
||||
$res['code'] = 0;
|
||||
$res['msg'] = '';
|
||||
$res['count'] = $count;
|
||||
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'],'hot'=>$v['is_hot'],'reply'=>$v['is_reply'],'check'=>$v['status']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
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 listdel($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$article =Article::find($id);
|
||||
$result = $article->together(['comments'])->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
//置顶帖子
|
||||
public function top()
|
||||
{
|
||||
//
|
||||
}
|
||||
//加精帖子
|
||||
public function hot()
|
||||
{
|
||||
//
|
||||
}
|
||||
//审核帖子
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('article')->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 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'][] = ['sort'=>$v['sort'],'id' => $v['id'],'tags'=>$v['catename'],'ename'=>$v['ename'],'icon'=>$v['icon'],'is_hot'=>$v['is_hot'],'desc'=>$v['desc']];
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//添加帖子分类
|
||||
public function addtags()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$list = Db::name('cate')->cache('catename')->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();
|
||||
$list = Db::name('cate')->cache('catename')->update($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){
|
||||
Cache::tag('catename')->clear();
|
||||
return json(['code'=>0,'msg'=>'删除分类成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除分类失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//帖子评论
|
||||
public function replys()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['name','content','status']);
|
||||
$map = array_filter($data);
|
||||
$where = array();
|
||||
if(!empty($map['content'])){
|
||||
$where[] = ['a.content','like','%'.$map['content'].'%'];
|
||||
unset($map['content']);
|
||||
}
|
||||
if(isset($data['status']) && $data['status'] !== '' ){
|
||||
$where[] = ['a.status','=',(int)$data['status']];
|
||||
unset($map['status']);
|
||||
}
|
||||
|
||||
/*
|
||||
$replys = Comment::field('id,article_id,user_id,content,create_time')->with([
|
||||
'user' => function($query){
|
||||
$query->field('id,name,user_img');
|
||||
},
|
||||
'article' => function($query){
|
||||
$query->field('id,title');
|
||||
}
|
||||
])->paginate(15);
|
||||
*/
|
||||
$replys = Db::name('comment')
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->join('article c','a.article_id = c.id')
|
||||
->field('a.id as aid,name,title,user_img,a.content as content,a.create_time as create_time,a.status as astatus,c.id as cid')
|
||||
->where('a.delete_time',0)
|
||||
->where($map)
|
||||
->where($where)
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate(15);
|
||||
|
||||
$count = $replys->total();
|
||||
$res = [];
|
||||
if ($count) {
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($replys as $k => $v){
|
||||
//$res['data'][] = ['id'=>$v['id'],'replyer'=>$v->user->name,'cardid'=>$v->article->title,'avatar'=>$v->user->user_img,'content'=>$v['content'],'replytime'=>$v['create_time']];
|
||||
$res['data'][] = ['id'=>$v['aid'],'replyer'=>$v['name'],'cardid'=>$v['title'],'avatar'=>$v['user_img'],'content'=>$v['content'],'replytime'=>date("Y-m-d",$v['create_time']),'check'=>$v['astatus'],'cid'=>$v['cid']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//评论编辑
|
||||
public function replysform()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
//评论删除
|
||||
public function redel($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$comm =Comment::find($id);
|
||||
$result = $comm->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
//评论审核
|
||||
public function recheck()
|
||||
{
|
||||
$data = Request::param();
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('comment')->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 tagshot()
|
||||
{
|
||||
$data = Request::only(['id','is_hot']);
|
||||
$cate = Db::name('cate')->save($data);
|
||||
if($cate){
|
||||
if($data['is_hot'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置热点成功','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'取消热点显示','icon'=>5]);
|
||||
}
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'热点设置失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//array_filter过滤函数
|
||||
public function filtr($arr){
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,4 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/11
|
||||
* @FilePath: app\admin\controller\index.php
|
||||
* @Description: Index.php 管理后台首页
|
||||
* @LastEditTime: 2023-03-11 10:15:35
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
@ -8,20 +17,20 @@ use think\facade\Session;
|
||||
use think\facade\Request;
|
||||
use think\facade\Cache;
|
||||
use think\facade\Lang;
|
||||
use app\admin\model\Admin;
|
||||
use app\admin\model\Article;
|
||||
use app\admin\model\Cunsult;
|
||||
use think\facade\Config;
|
||||
use taoler\com\Api;
|
||||
use app\common\lib\facade\HttpHelper;
|
||||
|
||||
class Index extends AdminController
|
||||
{
|
||||
/*
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
}
|
||||
*/
|
||||
|
||||
protected $sys_version;
|
||||
protected $pn;
|
||||
protected $sys;
|
||||
protected $domain;
|
||||
protected $api;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
//控制器初始化显示左侧导航菜单
|
||||
@ -39,12 +48,30 @@ class Index extends AdminController
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch('index');
|
||||
}
|
||||
|
||||
public function console1()
|
||||
{
|
||||
return View::fetch('console1');
|
||||
}
|
||||
|
||||
public function console2()
|
||||
{
|
||||
// 评论、帖子状态
|
||||
$comm = Db::name('comment')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
$forum = Db::name('article')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
$user = Db::name('user')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
|
||||
View::assign([
|
||||
'pendComms' => count($comm),
|
||||
'pendForums' => count($forum),
|
||||
'pendUser' => count($user),
|
||||
]);
|
||||
return View::fetch('console2');
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
@ -58,22 +85,13 @@ class Index extends AdminController
|
||||
|
||||
public function home()
|
||||
{
|
||||
//版本检测
|
||||
$verCheck = Api::urlPost($this->sys['upcheck_url'],['pn'=>$this->pn,'ver'=>$this->sys_version]);
|
||||
if($verCheck->code !== -1){
|
||||
$versions = $verCheck->code ? "有{$verCheck->up_num}个版本需更新,当前可更新至{$verCheck->version}" : $verCheck->msg;
|
||||
View::assign('versions',$versions);
|
||||
}else{
|
||||
View::assign('versions','版本检测暂时不可服务');
|
||||
}
|
||||
|
||||
//评论、帖子状态
|
||||
// 评论、帖子状态
|
||||
$comm = Db::name('comment')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
$forum = Db::name('article')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
$comms = count($comm);
|
||||
$forums = count($forum);
|
||||
|
||||
//用户注册数据
|
||||
// 用户注册数据
|
||||
$monthTime = Cache::get('monthTime');
|
||||
if(!$monthTime){
|
||||
$time = Db::name('user')->where('delete_time',0)->whereMonth('create_time')->order('create_time','asc')->column('create_time');
|
||||
@ -100,6 +118,39 @@ class Index extends AdminController
|
||||
View::assign(['comms'=>$comms,'forums'=>$forums,'monthTime'=>$monthTime,'monthUserCount'=>Cache::get('monthUserCount')]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统升级检测
|
||||
* @return mixed|string
|
||||
*/
|
||||
public function sysUpgradeCheck()
|
||||
{
|
||||
$data = ['pn'=>$this->pn,'ver'=>$this->sys_version];
|
||||
$response = HttpHelper::withHost()->get('/v1/upload/check', $data)->toJson();
|
||||
if($response->code !== -1){
|
||||
return $response->code ? "<span style='color:#b2aeae'>有{$response->up_num}个版本需更新,当前可更新至{$response->version}</span>" : $response->msg;
|
||||
} else {
|
||||
return lang('No new messages');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测
|
||||
* @return mixed|string
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
if(empty($this->sys['key'])) return json(['code' => -1, 'msg' => '请配置网站KEY']);
|
||||
$data = ['u'=>$this->sys['domain'],'key'=>$this->sys['key']];
|
||||
$response = HttpHelper::withHost()->get('/v1/cy', $data)->toJson();
|
||||
|
||||
if($response->code == 0){
|
||||
Db::name('system')->save(['id' => 1, 'clevel' => $response->data->level]);
|
||||
return json(['code' => 0, 'msg' => $response->data->info, 'data' => $response->data]);
|
||||
} else {
|
||||
return json(['code' => -1, 'msg' => $response->msg]);
|
||||
}
|
||||
}
|
||||
|
||||
//本周发帖
|
||||
public function forums()
|
||||
@ -108,7 +159,8 @@ class Index extends AdminController
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->join('cate c','a.cate_id = c.id')
|
||||
->field('a.id as aid,title,name,catename,pv')
|
||||
->field('a.id as aid,title,name,ename,catename,pv')
|
||||
->where('a.delete_time',0)
|
||||
->whereWeek('a.create_time')
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate(10);
|
||||
@ -119,8 +171,9 @@ class Index extends AdminController
|
||||
$res['msg'] = '';
|
||||
$res['count'] = $count;
|
||||
foreach($forumList as $k=>$v){
|
||||
$url = (string) str_replace("admin","index",$this->domain.url('article/detail',['id'=>$v['aid']]));
|
||||
$res['data'][]= ['id'=>$url,'title'=>$v['title'],'name'=>$v['name'],'catename'=>$v['catename'],'pv'=>$v['pv']];
|
||||
//$url = (string) str_replace("admin","index",$this->domain.url('article/detail',['id'=>$v['aid']]));
|
||||
$url = $this->getRouteUrl($v['aid'],$v['ename']);
|
||||
$res['data'][]= ['id'=>$url,'title'=>htmlspecialchars($v['title']),'name'=>$v['name'],'catename'=>$v['catename'],'pv'=>$v['pv']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'本周还没有发帖!'];
|
||||
@ -131,13 +184,15 @@ class Index extends AdminController
|
||||
//本周评论
|
||||
public function replys()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
if(Request::isAjax()){
|
||||
|
||||
$replys = Db::name('comment')
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->join('article c','a.article_id = c.id')
|
||||
->field('a.content as content,title,c.id as cid,name')
|
||||
->join('cate ca','c.cate_id = ca.id')
|
||||
->field('a.content as content,title,c.id as cid,name,ename')
|
||||
->where('c.delete_time',0)
|
||||
->whereWeek('a.create_time')
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate(10);
|
||||
@ -147,42 +202,36 @@ class Index extends AdminController
|
||||
if ($count) {
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($replys as $k => $v){
|
||||
$res['data'][] = ['content'=>$v['content'],'title'=>$v['title'],'cid'=>str_replace("admin","index",$this->domain.(string) url('article/detail',['id'=>$v['cid']])),'name'=>$v['name']];
|
||||
$res['data'][] = ['content'=>htmlspecialchars($v['content']),'title'=>htmlspecialchars($v['title']),'cid'=>$this->getRouteUrl($v['cid'],$v['ename']),'name'=>$v['name']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'本周还没评论'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//动态信息
|
||||
public function news()
|
||||
{
|
||||
$page = Request::param('page');
|
||||
$url = $this->api.'/v1/news?'.Request::query();
|
||||
$news = Cache::get('news'.$page);
|
||||
if(is_null($news)){
|
||||
$data = Request::only(['page', 'limit']);
|
||||
$url = $this->api.'/v1/news?'.'page='.$data['page'].'&'.'limit='.$data['limit'];
|
||||
$news = Cache::get('news'.$data['page'].'_'.$data['limit']);
|
||||
if(empty($news)){
|
||||
$news = Api::urlGet($url);
|
||||
Cache::set('news'.$page,$news,600);
|
||||
if($news->code == 0){
|
||||
Cache::set('news'.$data['page'].'_'.$data['limit'],$news,600);
|
||||
}
|
||||
}
|
||||
|
||||
if($news){
|
||||
return $news;
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'稍后获取内容...']);
|
||||
}
|
||||
|
||||
return $news;
|
||||
}
|
||||
|
||||
//提交反馈
|
||||
public function cunsult()
|
||||
{
|
||||
$url = $this->api.'/v1/reply';
|
||||
//$mail = Db::name('system')->where('id',1)->value('auth_mail'); // bug邮件发送
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['type','title','content','post']);
|
||||
//halt($data);
|
||||
$data = Request::only(['type','title','content','post','uid']);
|
||||
$apiRes = Api::urlPost($url,$data);
|
||||
$data['poster'] = Session::get('admin_id');
|
||||
unset($data['post']);
|
||||
@ -241,10 +290,42 @@ class Index extends AdminController
|
||||
}
|
||||
}
|
||||
|
||||
// 系统调试
|
||||
public function sysSys()
|
||||
{
|
||||
$status = input('status');
|
||||
|
||||
|
||||
public function layout(){
|
||||
//打开调试
|
||||
$env = root_path().'.env';
|
||||
$app = config_path().'app.php';
|
||||
|
||||
if(file_exists($env)){
|
||||
$str = file_get_contents($env);
|
||||
$appStr = file_get_contents($app);
|
||||
$patk = '/APP_DEBUG[^\r?\n]*/';
|
||||
$appPatk = '/'.'exception_tmpl'.'[^\r?\n]*/';
|
||||
if($status == 'true'){
|
||||
$reps = 'APP_DEBUG = true';
|
||||
$appArr = "exception_tmpl' => app()->getThinkPath() . 'tpl/think_exception.tpl',";
|
||||
} else {
|
||||
$reps = 'APP_DEBUG = false';
|
||||
$appArr = "exception_tmpl' => app()->getAppPath() . '404.html',";
|
||||
}
|
||||
$str = preg_replace($patk, $reps, $str);
|
||||
file_put_contents($env, $str);
|
||||
|
||||
$appStr = preg_replace($appPatk, $appArr, $appStr);
|
||||
$res = file_put_contents($app, $appStr) ? true : false;
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'设置成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'开启失败']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function layout(){
|
||||
return view();
|
||||
}
|
||||
}
|
@ -1,4 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/11
|
||||
* @FilePath: app\admin\controller\login.php
|
||||
* @Description: 管理后台登录页
|
||||
* @LastEditTime: 2023-03-11 10:16:42
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use think\facade\View;
|
||||
@ -8,10 +17,9 @@ use app\admin\validate\Admin;
|
||||
use think\exception\ValidateException;
|
||||
use app\common\controller\AdminController;
|
||||
|
||||
|
||||
class Login extends AdminController
|
||||
{
|
||||
//登录
|
||||
// 登录
|
||||
public function index()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
@ -26,15 +34,9 @@ class Login extends AdminController
|
||||
}
|
||||
|
||||
$user = new \app\admin\model\Admin();
|
||||
$res = $user->login($data);
|
||||
$result = $user->login($data);
|
||||
|
||||
if ($res == 1) {
|
||||
$res = ['code'=>0,'msg'=>'登陆成功', 'url'=>(string) url('index/index')];
|
||||
//$res['data']['access_token'] = $data['__token__'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>$res,'url'=>'admin/login'];
|
||||
}
|
||||
return json($res);
|
||||
return $result;
|
||||
}
|
||||
return View::fetch('login');
|
||||
}
|
||||
@ -43,7 +45,7 @@ class Login extends AdminController
|
||||
public function reg()
|
||||
{
|
||||
if(Session::has('admin_id')){
|
||||
return redirect('/admin/index/index');
|
||||
return redirect('index/index');
|
||||
}
|
||||
|
||||
return View::fetch('reg');
|
||||
@ -53,7 +55,7 @@ class Login extends AdminController
|
||||
public function forget()
|
||||
{
|
||||
if(Session::has('admin_id')){
|
||||
return redirect('/admin/index/index');
|
||||
return redirect('index/index');
|
||||
}
|
||||
|
||||
return View::fetch('forget');
|
||||
|
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
|
||||
class Menu extends AdminController
|
||||
{
|
||||
public function index(){
|
||||
return view();
|
||||
}
|
||||
}
|
@ -1,96 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Session;
|
||||
use think\facade\Db;
|
||||
use app\common\model\Message as MessageModel;
|
||||
use taoler\com\Message;
|
||||
|
||||
|
||||
class Notice extends AdminController
|
||||
{
|
||||
//显示消息
|
||||
public function index()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$notices = MessageModel::where(['type'=>0,'delete_time'=>0])->paginate(15);
|
||||
$count = $notices->total();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($notices as $msg){
|
||||
$res['data'][] = ['id'=>$msg['id'],'type'=>$msg['type'] == 0 ? '系统消息': '个人消息','title'=>$msg['title'],'user_id'=>$msg['user_id'],'content'=>$msg['content'],'ctime'=>$msg['create_time']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'还没有发布任何通知'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//添加消息
|
||||
public function add()
|
||||
{
|
||||
$sendId = Session::get('admin_id');
|
||||
|
||||
$data = Request::only(['type','title','receve_id','content']);
|
||||
if($data['type'] == 1){
|
||||
$receveId = $data['receve_id']; //个人通知
|
||||
} else {
|
||||
$receveId = 0; //系统通知
|
||||
}
|
||||
unset($data['receve_id']); //收信人移除
|
||||
$data['user_id'] = $sendId; //发信人入信息库
|
||||
//写入信息库
|
||||
$result = Message::sendMsg($sendId,$receveId,$data);
|
||||
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'发布成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'发布失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//编辑VIP积分规则
|
||||
public function edit()
|
||||
{
|
||||
$id = input('id');
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','title','type','content']);
|
||||
$result = MessageModel::update($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$msg = Db::name('message')->find($id);
|
||||
View::assign(['msg'=>$msg]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除消息
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$msg = MessageModel::with('messageto')->find($id);
|
||||
$result = $msg->together(['messageto'])->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\admin\model\System;
|
||||
use app\admin\model\MailServer;
|
||||
use think\facade\Config;
|
||||
use think\exception\ValidateException;
|
||||
use taoler\com\Files;
|
||||
use taoler\com\Api;
|
||||
use app\common\lib\SetConf;
|
||||
|
||||
class Set extends AdminController
|
||||
{
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->sysInfo = $this->getSystem();
|
||||
}
|
||||
//网站设置显示
|
||||
public function index()
|
||||
{
|
||||
$mailserver = MailServer::find(1);
|
||||
$template = Files::getDirName('../view');
|
||||
View::assign(['sysInfo'=>$this->sysInfo,'mailserver'=>$mailserver,'template'=>$template]);
|
||||
return View::fetch('set/system/website');
|
||||
}
|
||||
|
||||
//网站设置
|
||||
public function website()
|
||||
{
|
||||
if(Request::isPost()){
|
||||
$data = Request::only(['webname','domain','template','cache','upsize','uptype','blackname','webtitle','keywords','descript','icp','showlist','copyright']);
|
||||
$system = new System();
|
||||
$result = $system->sets($data,$this->sysInfo['clevel']);
|
||||
if($result == 1){
|
||||
return json(['code'=>0,'msg'=>'更新成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>$result]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//综合设置
|
||||
public function server()
|
||||
{
|
||||
return View::fetch('set/system/server');
|
||||
}
|
||||
|
||||
/**邮箱设置
|
||||
* parem $id
|
||||
*/
|
||||
public function email()
|
||||
{
|
||||
$mailserver = MailServer::find(1);
|
||||
//邮箱配置
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['host','port','mail','nickname','password']);
|
||||
$res = $mailserver->save($data);
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'更新成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'更新失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**配置设置
|
||||
* parem $id
|
||||
*/
|
||||
public function config()
|
||||
{
|
||||
$conf = Config::get('taoler.config');
|
||||
if(Request::isPost()){
|
||||
$data = Request::param();
|
||||
foreach($conf as $c=>$f){
|
||||
|
||||
if(array_key_exists($c,$data)){
|
||||
$conf[$c] = (int) $data[$c];
|
||||
}else{
|
||||
$conf[$c] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$setConf = new SetConf;
|
||||
$value = [
|
||||
'config'=>$conf
|
||||
];
|
||||
$upRes = $setConf->setConfig('taoler',$value);
|
||||
return $upRes;
|
||||
}
|
||||
}
|
||||
|
||||
//上传logo
|
||||
public function upload()
|
||||
{
|
||||
$uploads = new \app\common\lib\Uploads();
|
||||
$upRes = $uploads->put('file','logo',2000,'image','uniqid');
|
||||
$logoJson = $upRes->getData();
|
||||
if($logoJson['status'] == 0){
|
||||
$result = Db::name('system')->where('id', 1)->update(['logo'=>$logoJson['url']]);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'上传logo成功'];
|
||||
} else {
|
||||
$res = ['code'=>1,'msg'=>'上传错误'];
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\BaseController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\UserSignrule;
|
||||
|
||||
class Sign extends BaseController
|
||||
{
|
||||
//添加签到积分规则
|
||||
public function add()
|
||||
{
|
||||
$data = Request::only(['days','score']);
|
||||
$day = UserSignrule::where('days',$data['days'])->find();
|
||||
//$day = Db::name('user_signrule')->where('days',$data['days'])->find();
|
||||
if($day){
|
||||
$res = ['code'=>-1,'msg'=>'不能重复设置'];
|
||||
} else {
|
||||
$result = UserSignrule::create($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'设置积分成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'保存失败'];
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//删除签到积分规则
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$user =UserSignrule::find($id);
|
||||
$result = $user->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//编辑签到积分规则
|
||||
public function signEdit()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = UserSignrule::update($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$sign = Db::name('user_signrule')->find(input('id'));
|
||||
View::assign('sign',$sign);
|
||||
return View::fetch('set/system/signedit');
|
||||
}
|
||||
|
||||
//显示签到积分规则
|
||||
public function signRule()
|
||||
{
|
||||
$keys = UserSignrule::select();
|
||||
$count = $keys->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($keys as $k=>$v){
|
||||
$res['data'][] = ['id'=>$v['id'],'days'=>$v['days'],'score'=>$v['score'],'ctime'=>$v['create_time']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'还没有任何积分设置!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
@ -1,118 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Db;
|
||||
use think\facade\Request;
|
||||
use think\facade\Config;
|
||||
use think\exception\ValidateException;
|
||||
use app\common\model\Slider as SliderModel;
|
||||
|
||||
class Slider extends AdminController
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//幻灯列表
|
||||
$sliders = SliderModel::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'=>0,'msg'=>'添加成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
* @return string|\think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
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'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
View::assign('slider',$slider);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function uploadImg()
|
||||
{
|
||||
$uploads = new \app\common\lib\Uploads();
|
||||
$upRes = $uploads->put('file','slider',1024,'image');
|
||||
$slires = $upRes->getData();
|
||||
|
||||
if($slires['status'] == 0){
|
||||
$name_path = $slires['url'];
|
||||
$res = ['code'=>0,'msg'=>'上传flash成功','src'=>$name_path];
|
||||
} else {
|
||||
$res = ['code'=>1,'msg'=>'上传错误'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
* @return \think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
//
|
||||
$slider = SliderModel::find($id);
|
||||
$res = $slider->delete();
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,157 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\validate\Admin;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\User as UserModel;
|
||||
use app\common\lib\Uploads;
|
||||
|
||||
class User extends AdminController
|
||||
{
|
||||
/**
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
|
||||
}
|
||||
*/
|
||||
//用户表
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$datas = Request::only(['id','name','email','sex','status']);
|
||||
$map = array_filter($datas,[$this,'filtrArr']);
|
||||
$user = Db::name('user')->where(['delete_time'=>0])->where($map)->order('id desc')->paginate(30);
|
||||
$count = $user->total();
|
||||
$res = [];
|
||||
if($count){
|
||||
$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'],'city'=>$v['city'],'logintime'=>date("Y-m-d H:i",$v['last_login_time']),'jointime'=>date("Y-m-d",$v['create_time']),'check'=>$v['status'],'auth'=>$v['auth']];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
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'=>0,'msg'=>'添加成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'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'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'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'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//上传头像
|
||||
public function uploadImg()
|
||||
{
|
||||
$uploads = new Uploads();
|
||||
$upRes = $uploads->put('file','head_pic',2000,'image');
|
||||
$userJson = $upRes->getData();
|
||||
if($userJson['status'] == 0){
|
||||
$res = ['code'=>0,'msg'=>'上传头像成功','src'=>$userJson['url']];
|
||||
} else {
|
||||
$res = ['code'=>1,'msg'=>'上传错误'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
//审核用户
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
//获取状态
|
||||
$res = Db::name('user')->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 auth()
|
||||
{
|
||||
$data = Request::param();
|
||||
$user = Db::name('user')->save($data);
|
||||
if($user){
|
||||
if($data['auth'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置为超级管理员','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'取消超级管理员','icon'=>5]);
|
||||
}
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'前台管理员设置失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//过滤数组中为空和null的值
|
||||
public function filtrArr($arr)
|
||||
{
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@ -1,96 +0,0 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
|
||||
//use app\common\controller\AdminController;
|
||||
|
||||
class Uzip
|
||||
{
|
||||
/**
|
||||
*header('Content-type:text/html;charset=utf-8');
|
||||
*@param $filename 解压文件
|
||||
*@param $dir 解压到路径
|
||||
*@param $overwrite 是否覆盖文件 true false
|
||||
*/
|
||||
public function uzip($filename, $dir ,$overwrite=true)
|
||||
{
|
||||
if(!is_dir($dir)) {
|
||||
//mkdir($dir, 0777, true);//创建目录保存解压内容
|
||||
$this->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 . '<pre />';
|
||||
$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 . '" <pre />';
|
||||
return json(['code'=>0,'msg'=>'文件夹内已存在文件']);
|
||||
}
|
||||
|
||||
}else {
|
||||
//echo $file_name . '<pre />';
|
||||
$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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
565
app/admin/controller/addon/Addons.php
Normal file
565
app/admin/controller/addon/Addons.php
Normal file
@ -0,0 +1,565 @@
|
||||
<?php
|
||||
/*
|
||||
* @Program: TaoLer 2023/3/15
|
||||
* @FilePath: app\admin\controller\addon\Addons.php
|
||||
* @Description: Addons
|
||||
* @LastEditTime: 2023-03-15 22:40:04
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\addon;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\common\lib\SqlFile;
|
||||
use app\common\lib\Zip;
|
||||
use think\Exception;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Config;
|
||||
use app\admin\model\AuthRule;
|
||||
use app\admin\model\Addons as AddonsModel;
|
||||
use think\response\Json;
|
||||
use Symfony\Component\VarExporter\VarExporter;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\facade\HttpHelper;
|
||||
use app\common\lib\FileHelper;
|
||||
|
||||
|
||||
class Addons extends AdminController
|
||||
{
|
||||
/**
|
||||
* 浏览插件
|
||||
*
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件动态列表
|
||||
* @param $data
|
||||
* @return Json
|
||||
*/
|
||||
public function list()
|
||||
{
|
||||
$param = Request::param();
|
||||
$data = ['page' => $param['page'] ?? 1, 'limit' => $param['limit'] ?? 10, 'type' => $param['type'] ?? 'all'];
|
||||
$res = [];
|
||||
//本地插件列表
|
||||
$localAddons = Files::getDirName('../addons/');
|
||||
|
||||
if($data['type'] == 'installed') {
|
||||
$count = count($localAddons); // 安装总数
|
||||
// 已安装
|
||||
if ($count) {
|
||||
$res = ['code' => 0, 'msg' => 'ok', 'count' => $count];
|
||||
// 数组分组
|
||||
$arr = array_chunk($localAddons, $data['limit']);
|
||||
// 选中的页码数组
|
||||
$arrAddon = $arr[$data['page'] - 1];
|
||||
// $data数据
|
||||
foreach ($arrAddon as $k => $v) {
|
||||
$info_file = '../addons/' . $v . '/info.ini';
|
||||
$info = parse_ini_file($info_file);
|
||||
$info['show'] = $info['status'] ? '启用' : '禁用';
|
||||
$info['install'] = $info['status'] ? '是' : '否';
|
||||
$res['data'][] = $info;
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return json(['code' => -1, 'msg' => '没有安装任何插件']);
|
||||
}
|
||||
|
||||
// 在线插件
|
||||
$response = HttpHelper::withHost()->get('/v1/addonlist', $data);
|
||||
$addons = $response->toJson();
|
||||
|
||||
if($response->ok()) {
|
||||
$res = ['code' => 0, 'msg' => 'ok', 'count' => $addons->count];
|
||||
// $data数据 与本地文件对比
|
||||
foreach($addons->data as $v){
|
||||
if(in_array($v->name, $localAddons)) {
|
||||
$info = get_addons_info($v->name);
|
||||
//已安装
|
||||
$v->isInstall = 1;
|
||||
//判断是否有新版本
|
||||
if($v->version > $info['version']) $v->have_newversion = 1;
|
||||
$v->price = $v->price ? $v->price : '免费';
|
||||
}
|
||||
$res['data'][] = $v;
|
||||
};
|
||||
return json($res);
|
||||
}
|
||||
return json(['code' => -1, 'msg' => '未获取到服务器信息']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 安装&升级,
|
||||
* @param array $data
|
||||
* @param bool $type true执行sql,false升级不执行sql
|
||||
* @return Json
|
||||
*/
|
||||
public function install(array $data = [], bool $type = true)
|
||||
{
|
||||
$data = Request::only(['name','version','uid','token']) ?? $data;
|
||||
// 接口
|
||||
$response = HttpHelper::withHost()->post('/v1/getaddons',$data)->toJson();
|
||||
if($response->code < 0) return json($response);
|
||||
|
||||
//版本判断,是否能够安装?
|
||||
$addInstalledVersion = get_addons_info($data['name']);
|
||||
if(!empty($addInstalledVersion)){
|
||||
$verRes = version_compare($data['version'],$addInstalledVersion['version'],'>');
|
||||
if(!$verRes){
|
||||
return json(['code'=>-1,'msg'=>'不能降级,请选择正确版本']);
|
||||
}
|
||||
//$tpl_ver_res = version_compare($addInstalledVersion['template_version'], config('taoler.template_version'),'<');
|
||||
}
|
||||
|
||||
$file_url = $response->addons_src;
|
||||
//判断远程文件是否可用存在
|
||||
$header = get_headers($file_url, true);
|
||||
if(!isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'))){
|
||||
return json(['code'=>-1,'msg'=>'获取远程文件失败']);
|
||||
}
|
||||
//把远程文件放入本地
|
||||
|
||||
//拼接路径
|
||||
$addons_dir = FileHelper::getDirPath(root_path() . 'runtime' . DS . 'addons');
|
||||
if(!is_dir($addons_dir)) Files::mkdirs($addons_dir);
|
||||
|
||||
$package_file = $addons_dir . $data['name'] . '.zip'; //升级的压缩包文件路径
|
||||
$cpfile = copy($file_url, $package_file);
|
||||
if(!$cpfile) return json(['code'=>-1,'msg'=>'下载升级文件失败']);
|
||||
|
||||
$uzip = new Zip();
|
||||
$zipDir = strstr($package_file, '.zip',true); //返回文件名后缀前的字符串
|
||||
$zipPath = FileHelper::getDirPath($zipDir); //转换为带/的路径 压缩文件解压到的路径
|
||||
$unzip_res = $uzip->unzip($package_file, $zipPath, true);
|
||||
if(!$unzip_res) return json(['code'=>-1,'msg'=>'解压失败']);
|
||||
unlink($package_file);
|
||||
//升级插件
|
||||
|
||||
//升级前的写入文件权限检查
|
||||
$allUpdateFiles = Files::getAllFile($zipPath);
|
||||
|
||||
if (empty($allUpdateFiles)) return json(['code' => -1, 'msg' => '无可更新文件。']);
|
||||
$checkString = '';
|
||||
foreach ($allUpdateFiles as $updateFile) {
|
||||
$coverFile = ltrim(str_replace($zipPath, '', $updateFile), DIRECTORY_SEPARATOR);
|
||||
$dirPath = dirname('../'.$coverFile);
|
||||
if (file_exists('../'.$coverFile)) {
|
||||
if (!is_writable('../'.$coverFile)) $checkString .= $coverFile . ' [<span class="text-red">' . '无写入权限' . '</span>]<br>';
|
||||
} else {
|
||||
if (!is_dir($dirPath)) @mkdir($dirPath, 0777, true);
|
||||
if (!is_writable($dirPath)) $checkString .= $dirPath . ' [<span class="text-red">' . '无写入权限' . '</span>]<br>';
|
||||
}
|
||||
}
|
||||
if (!empty($checkString)) return json(['code' => -1, 'msg' => $checkString]);
|
||||
|
||||
try {
|
||||
// 拷贝文件
|
||||
FileHelper::copyDir(root_path() . 'runtime' . DS . 'addons' . DS . $data['name'] . DS, root_path());
|
||||
// $type判断是安装还是升级
|
||||
if($type) {
|
||||
// 执行数据库
|
||||
$sqlInstallFile = root_path(). 'addons' . DS . $data['name'] . DS . 'install.sql';
|
||||
if(file_exists($sqlInstallFile)) {
|
||||
SqlFile::dbExecute($sqlInstallFile);
|
||||
}
|
||||
|
||||
}
|
||||
//安装菜单
|
||||
//$menu = get_addons_menu($data['name']);
|
||||
$menuFile = app()->getRootPath() . 'addons' . DS . $data['name'] . DS . 'menu.php';
|
||||
if(file_exists($menuFile)){
|
||||
$menu = include $menuFile;
|
||||
} else {
|
||||
$menu = [];
|
||||
}
|
||||
if(!empty($menu)){
|
||||
if(isset($menu['is_nav']) && $menu['is_nav'] < 8){
|
||||
$pid = $menu['is_nav'];
|
||||
} else {
|
||||
//$pid = AuthRule::where('name','addons')->value('id');
|
||||
return json(['code'=>-1,'msg'=> 'is_nav菜单项目设置错误']);
|
||||
}
|
||||
// 父ID状态为0时打开
|
||||
$pidStatus = AuthRule::where('id', $pid)->value('status');
|
||||
if($pidStatus < 1) {
|
||||
AuthRule::update(['status' => 1, 'id' => $pid]);
|
||||
}
|
||||
// 安装菜单
|
||||
$menu_arr[] = $menu['menu'];
|
||||
$this->addAddonMenu($menu_arr, (int)$pid,1);
|
||||
}
|
||||
$class = get_addons_instance($data['name']);
|
||||
//执行插件安装
|
||||
$class->install();
|
||||
set_addons_info($data['name'],['status' => 1,'install' => 1]);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code'=>-1,'msg'=> $e->getMessage()]);
|
||||
}
|
||||
|
||||
Files::delDirAndFile('../runtime/addons/'.$data['name'] . DS);
|
||||
$msg = $type ? '插件安装成功!' : '插件升级成功!';
|
||||
return json(['code' => 0, 'msg' => $msg]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 卸载插件
|
||||
* @param string $name
|
||||
* @return Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function uninstall(string $name = '')
|
||||
{
|
||||
$name = input('name') ?? $name;
|
||||
// 执行插件卸载
|
||||
$class = get_addons_instance($name);
|
||||
$class->uninstall();
|
||||
// 卸载菜单
|
||||
$menu = get_addons_menu($name);
|
||||
if(!empty($menu)){
|
||||
$menu_arr[] = $menu['menu'];
|
||||
$this->delAddonMenu($menu_arr);
|
||||
}
|
||||
|
||||
try {
|
||||
//卸载插件数据库
|
||||
$sqlUninstallFile = root_path().'addons/'.$name.'/uninstall.sql';
|
||||
if(file_exists($sqlUninstallFile)) {
|
||||
SqlFile::dbExecute($sqlUninstallFile);
|
||||
}
|
||||
|
||||
// 插件addons下目录
|
||||
$addonsDir = root_path() . 'addons' . DS . $name . DS;
|
||||
// 插件管理后台目录
|
||||
$admin_controller = app_path() . 'controller' . DS . $name . DS;
|
||||
$admin_model = app_path() . 'model' . DS . $name . DS;
|
||||
$admin_view = app_path() . 'view' . DS . $name . DS;
|
||||
$admin_validate = app_path() . 'validate' . DS . $name . DS;
|
||||
// 插件静态资源目录
|
||||
$addon_public = public_path() . 'addons' . DS . $name . DS;
|
||||
|
||||
if(file_exists($addonsDir)) Files::delDir($addonsDir);
|
||||
if(file_exists($admin_controller)) Files::delDir($admin_controller);
|
||||
if(file_exists($admin_model)) Files::delDir($admin_model);
|
||||
if(file_exists($admin_view)) Files::delDir($admin_view);
|
||||
if(file_exists($admin_validate)) Files::delDir($admin_validate);
|
||||
if(file_exists($addon_public)) Files::delDir($addon_public);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return json(['code' => -1, 'msg' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
return json(['code' => 0, 'msg' => '插件卸载成功']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 升级插件
|
||||
* @return Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function upgrade()
|
||||
{
|
||||
$data = Request::only(['name','version','uid','token']);
|
||||
// 接口
|
||||
$response = HttpHelper::withHost()->post('/v1/getaddons',$data)->toJson();
|
||||
if($response->code < 0) return json($response);
|
||||
// 获取配置信息
|
||||
$config = get_addons_config($data['name']);
|
||||
// 卸载插件
|
||||
$class = get_addons_instance($data['name']);
|
||||
$class->uninstall();
|
||||
//$this->uninstall($data['name']);
|
||||
|
||||
// 卸载菜单
|
||||
$menu = get_addons_menu($data['name']);
|
||||
if(!empty($menu)){
|
||||
$menu_arr[] = $menu['menu'];
|
||||
$this->delAddonMenu($menu_arr);
|
||||
}
|
||||
|
||||
try {
|
||||
// 升级安装,第二个type参数false为升级,true安装
|
||||
$installRes = $this->install($data,false);
|
||||
$res = $installRes->getData();
|
||||
if($res['code'] == -1) return json(['code' => -1, 'msg' => $res['msg']]);
|
||||
// 升级sql
|
||||
$sqlUpdateFile = root_path().'addons/'.$data['name'].'/update.sql';
|
||||
if(file_exists($sqlUpdateFile)) {
|
||||
SqlFile::dbExecute($sqlUpdateFile);
|
||||
}
|
||||
// 恢复配置
|
||||
if(!empty($config)) {
|
||||
set_addons_config($data['name'], $config);
|
||||
}
|
||||
// 写入版本号
|
||||
set_addons_info($data['name'],['version' =>$data['version']]);
|
||||
return $installRes;
|
||||
} catch (\Exception $e) {
|
||||
return json(['code' => -1, 'msg' => $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用禁用插件
|
||||
* @return Json
|
||||
* @throws Exception
|
||||
*/
|
||||
public function check(){
|
||||
$name = input('name');
|
||||
$info = get_addons_info($name);
|
||||
try{
|
||||
$arr = ['status' => $info['status'] ? 0 :1];
|
||||
set_addons_info($name,$arr);
|
||||
$class = get_addons_instance($name);
|
||||
if($arr['status']) {
|
||||
$res = ['code'=>0,'msg'=>'启用成功'];
|
||||
} else {
|
||||
$res = ['code'=>0,'msg'=>'已被禁用'];
|
||||
}
|
||||
$info['status']==1 ?$class->enabled():$class->disabled();
|
||||
} catch (\Exception $e) {
|
||||
throw new Exception($e->getMessage());
|
||||
}
|
||||
|
||||
return json($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置插件
|
||||
* @param $name
|
||||
* @return string|Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function config()
|
||||
{
|
||||
$name = input('name');
|
||||
$config = get_addons_config($name);
|
||||
// halt($config);
|
||||
if(empty($config)) return json(['code'=>-1,'msg'=>'无配置项!无需操作']);
|
||||
if(Request::isAjax()){
|
||||
$params = Request::param('params/a',[],'trim');
|
||||
// halt($params);
|
||||
if ($params) {
|
||||
foreach ($config as $k => &$v) {
|
||||
if (isset($params[$k])) {
|
||||
if ($v['type'] == 'array') {
|
||||
$arr = [];
|
||||
$params[$k] = is_array($params[$k]) ? $params[$k] :[];
|
||||
foreach ($params[$k]['key'] as $kk=>$vv){
|
||||
$arr[$vv] = $params[$k]['value'][$kk];
|
||||
}
|
||||
$params[$k] = $arr;
|
||||
$value = $params[$k];
|
||||
$v['content'] = $value;
|
||||
$v['value'] = $value;
|
||||
} else {
|
||||
$value = $params[$k];
|
||||
}
|
||||
$v['value'] = $value;
|
||||
}
|
||||
}
|
||||
unset($v);
|
||||
set_addons_config($name,$config);
|
||||
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'配置成功!']);
|
||||
}
|
||||
//halt($config);
|
||||
//模板引擎初始化
|
||||
$view = ['formData'=>$config,'title'=>'title'];
|
||||
View::assign($view);
|
||||
$configFile = root_path() . 'addons' . DS . $name . DS . 'config.html';
|
||||
$viewFile = is_file($configFile) ? $configFile : '';
|
||||
|
||||
return View::fetch($viewFile);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加菜单
|
||||
* @param array $menu
|
||||
* @param int $pid
|
||||
* @param int $type
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function addAddonMenu(array $menu,int $pid = 0, int $type = 1)
|
||||
{
|
||||
foreach ($menu as $v){
|
||||
$hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
|
||||
try {
|
||||
$v['pid'] = $pid;
|
||||
$v['name'] = trim($v['name'],'/');
|
||||
$v['type'] = $type;
|
||||
$menu = AuthRule::withTrashed()->where('name',$v['name'])->find();
|
||||
if($menu){
|
||||
$menu->restore();
|
||||
} else {
|
||||
$menu = AuthRule::create($v);
|
||||
}
|
||||
|
||||
if ($hasChild) {
|
||||
$this->addAddonMenu($v['sublist'], $menu->id,$type);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
throw new \Exception($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 循环删除菜单
|
||||
* @param array $menu
|
||||
* @param string $module
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function delAddonMenu(array $menu,string $module = 'addon')
|
||||
{
|
||||
foreach ($menu as $k=>$v){
|
||||
$hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
|
||||
try {
|
||||
$v['name'] = trim($v['name'],'/');
|
||||
$menu_rule = AuthRule::withTrashed()->where('name',$v['name'])->find();
|
||||
if(!is_null($menu_rule)){
|
||||
$menu_rule->delete(true);
|
||||
if ($hasChild) {
|
||||
$this->delAddonMenu($v['sublist']);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
throw new \Exception($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
* @return mixed|Json
|
||||
*/
|
||||
public function userLogin()
|
||||
{
|
||||
$response = HttpHelper::withHost()->post('/v1/user/login', Request::param())->toJson();
|
||||
return json($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单
|
||||
* @return string|Json
|
||||
*/
|
||||
public function pay()
|
||||
{
|
||||
$data = Request::only(['id','name','version','uid','price']);
|
||||
// $url = $this->getSystem()['api_url'].'/v1/createOrder';
|
||||
// $order = Api::urlPost($url,$data);
|
||||
$response = HttpHelper::withHost()->post('/v1/createOrder', $data);
|
||||
if ($response->ok()) {
|
||||
// $orderData = json_decode(json_encode($response->toJson()->data),TRUE);
|
||||
View::assign('orderData',$response->toArray()['data']);
|
||||
return View::fetch();
|
||||
} else {
|
||||
return json($response->toJson());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付查询
|
||||
* @return Json
|
||||
*/
|
||||
public function isPay()
|
||||
{
|
||||
$param = Request::only(['name','userinfo']);
|
||||
$data = [
|
||||
'name'=>$param['name'],
|
||||
'uid'=> $param['userinfo']['uid'],
|
||||
];
|
||||
$response = HttpHelper::withHost()->post('/v1/ispay', $data)->toJson();
|
||||
return json($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示创建资源表单页.
|
||||
*
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
//添加版本
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = AddonsModel::create($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传插件文件zip
|
||||
* @return Json
|
||||
*/
|
||||
public function uploadZip()
|
||||
{
|
||||
$id = Request::param();
|
||||
$file = request()->file('file');
|
||||
try {
|
||||
validate(['file'=>'filesize:2048|fileExt:zip,rar,7z'])
|
||||
->check(array($file));
|
||||
$saveName = \think\facade\Filesystem::disk('public')->putFile('addons',$file);
|
||||
} catch (\think\exception\ValidateException $e) {
|
||||
return json(['code' => -1,'msg' => $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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传接口
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function uploads()
|
||||
{
|
||||
$type = Request::param('type');
|
||||
return $this->uploadFiles($type);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检测已安装插件是否有新的插件版本
|
||||
* @param string $addons_name
|
||||
* @param string $local_version
|
||||
* @return bool
|
||||
*/
|
||||
public function checkHasNewVer(string $addons_name, string $local_version) :bool
|
||||
{
|
||||
// 在线插件
|
||||
$response = HttpHelper::withHost()->get('/v1/checkNewVersion', ['name' => $addons_name, 'version' => $local_version]);
|
||||
$addons = $response->toJson();
|
||||
if($addons->code === 0) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
23
app/admin/controller/addon/Template.php
Normal file
23
app/admin/controller/addon/Template.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\addon\Template.php
|
||||
* @Description: Template
|
||||
* @LastEditTime: 2023-03-14 16:52:56
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\addon;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
|
||||
class Template extends AdminController
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
}
|
110
app/admin/controller/content/Cate.php
Normal file
110
app/admin/controller/content/Cate.php
Normal file
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
/*
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\content\Cate.php
|
||||
* @Description: Cate 分类菜单
|
||||
* @LastEditTime: 2023-03-14 15:40:53
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\App;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\Msgres;
|
||||
use app\common\model\Cate as CateModel;
|
||||
|
||||
|
||||
|
||||
class Cate extends AdminController
|
||||
{
|
||||
protected $model;
|
||||
|
||||
public function __construct(App $app)
|
||||
{
|
||||
parent::__construct($app);
|
||||
$this->model = new CateModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//帖子分类
|
||||
public function list()
|
||||
{
|
||||
return $this->model->getList();
|
||||
}
|
||||
|
||||
//添加和编辑帖子分类 废弃
|
||||
public function addEdit()
|
||||
{
|
||||
$addOrEdit = !is_null(input('id'));//true是编辑false新增
|
||||
$msg = $addOrEdit ? lang('edit') : lang('add');
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::param();
|
||||
if(isset($data['id']) && $data['pid'] == $data['id']) return json(['code'=>-1,'msg'=> $msg.'不能作为自己的子类']);
|
||||
$list = Db::name('cate')->cache('catename')->save($data);
|
||||
if($list){
|
||||
return json(['code'=>0,'msg'=> $msg.'成功']);
|
||||
}
|
||||
return json(['code'=>-1,'msg'=> $msg.'失败']);
|
||||
}
|
||||
//详情模板
|
||||
$template = $this->getIndexTpl();
|
||||
// 如果是新增,pid=0,detpl默认第一个子模块,如果是编辑,查询出cate
|
||||
$cate = $addOrEdit ? $this->model->getCateInfoById((int) input('id')) : '';
|
||||
$view = $addOrEdit ? 'edit' : 'add';
|
||||
|
||||
View::assign([
|
||||
'template' => $template,
|
||||
'cate' => $cate
|
||||
]);
|
||||
return View::fetch($view);
|
||||
}
|
||||
|
||||
//删除帖子分类
|
||||
public function delete()
|
||||
{
|
||||
$result = $this->model->del(input('id'));
|
||||
if($result == 1){
|
||||
return json(['code'=>0,'msg'=>'删除分类成功']);
|
||||
}
|
||||
return json(['code'=>-1,'msg' => $result]);
|
||||
}
|
||||
|
||||
// 动态审核
|
||||
public function check()
|
||||
{
|
||||
$param = Request::only(['id','name','value']);
|
||||
$data = ['id'=>$param['id'],$param['name']=>$param['value']];
|
||||
//获取状态
|
||||
$res = Db::name('cate')->save($data);
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'设置成功','icon'=>6]);
|
||||
}
|
||||
return json(['code'=>-1,'msg'=>'设置失败']);
|
||||
}
|
||||
|
||||
/**
|
||||
* index/view/article下模板文件
|
||||
* @return array
|
||||
*/
|
||||
protected function getIndexTpl() :array
|
||||
{
|
||||
$sys = $this->getSystem();
|
||||
return Files::getDirName('../view/'.$sys['template'].'/index/article/');
|
||||
}
|
||||
|
||||
|
||||
}
|
181
app/admin/controller/content/Comment.php
Normal file
181
app/admin/controller/content/Comment.php
Normal file
@ -0,0 +1,181 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\content\Comment.php
|
||||
* @Description: Comment
|
||||
* @LastEditTime: 2023-03-14 15:38:55
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\App;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\Comment as CommentModel;
|
||||
|
||||
|
||||
|
||||
class Comment extends AdminController
|
||||
{
|
||||
|
||||
protected $model;
|
||||
|
||||
public function __construct(App $app)
|
||||
{
|
||||
parent::__construct($app);
|
||||
$this->model = new \app\common\model\Comment();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
public function list1()
|
||||
{
|
||||
$data = Request::only(['name','content','status']);
|
||||
$map = $this->getParamFilter($data);
|
||||
$where = [];
|
||||
if(!empty($map['content'])){
|
||||
$where[] = ['content', 'like', $map['content'].'%'];
|
||||
}
|
||||
if(isset($data['status'])){
|
||||
$where[] = ['status', '=', (int) $data['status']];
|
||||
}
|
||||
|
||||
if(isset($data['name'])){
|
||||
$userId = Db::name('user')->where('name',$data['name'])->value('id');
|
||||
$where[] = ['user_id', '=', $userId];
|
||||
}
|
||||
unset($map);
|
||||
|
||||
$list = $this->model->getCommentList($where, input('page'), input('limit'));
|
||||
$res = [];
|
||||
if($list['total']) {
|
||||
$res = ['code' =>0, 'msg' => 'ok', 'count' => $list['total']];
|
||||
foreach($list['data'] as $k => $v){
|
||||
$res['data'][] = [
|
||||
'id' => $v['id'],
|
||||
'replyer' => $v['user']['name'],
|
||||
'title' => $v['article']['title'],
|
||||
'avatar' => $v['user']['user_img'],
|
||||
'content' => strip_tags($v['content']),
|
||||
'replytime' => $v['create_time'],
|
||||
'check' => $v['status'],
|
||||
//'url' => $this->getArticleUrl($v['article_id'], 'index', $v->article->cate->ename),
|
||||
];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return json(['code' => 0, 'msg' => 'no data']);
|
||||
}
|
||||
|
||||
//帖子评论
|
||||
public function list()
|
||||
{
|
||||
$data = Request::only(['name','content','status']);
|
||||
$map = array_filter($data);
|
||||
$where = array();
|
||||
if(!empty($map['content'])){
|
||||
$where[] = ['a.content','like', $map['content'].'%'];
|
||||
unset($map['content']);
|
||||
}
|
||||
if(isset($data['status']) && $data['status'] !== '' ){
|
||||
$where[] = ['a.status','=',(int)$data['status']];
|
||||
unset($map['status']);
|
||||
}
|
||||
$replys = Db::name('comment')
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->join('article c','a.article_id = c.id')
|
||||
->join('cate ca','c.cate_id = ca.id')
|
||||
->field('a.id as aid,name,ename,appname,title,user_img,a.content as content,a.create_time as create_time,a.status as astatus,c.id as cid')
|
||||
->where('a.delete_time',0)
|
||||
->where($map)
|
||||
->where($where)
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate([
|
||||
'list_rows' => input('limit'),
|
||||
'page' => input('page')
|
||||
]);
|
||||
$count = $replys->total();
|
||||
if ($count) {
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($replys as $k => $v){
|
||||
$res['data'][] = [
|
||||
'id' => $v['aid'],
|
||||
'replyer' => $v['name'],
|
||||
'title' => htmlspecialchars($v['title']),
|
||||
'avatar' => $v['user_img'],
|
||||
'content' => strip_tags($v['content']),
|
||||
'replytime' => date("Y-m-d",$v['create_time']),
|
||||
'check' => $v['astatus'],
|
||||
'url' => $this->getArticleUrl($v['cid'],'index',$v['ename'])
|
||||
];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
|
||||
}
|
||||
|
||||
//评论编辑
|
||||
public function edit()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//评论删除
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
try {
|
||||
$arr = explode(",",$id);
|
||||
foreach($arr as $v){
|
||||
$comm = CommentModel::find($v);
|
||||
$comm->delete();
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//评论审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::param();
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('comment')->where('id',$data['id'])->save(['status' => $data['status']]);
|
||||
if($res){
|
||||
if($data['status'] == 1) return json(['code'=>0,'msg'=>'评论审核通过','icon'=>6]);
|
||||
return json(['code'=>0,'msg'=>'评论被禁止','icon'=>5]);
|
||||
}
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//array_filter过滤函数
|
||||
public function filtr($arr)
|
||||
{
|
||||
if($arr === '' || $arr === null) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
366
app/admin/controller/content/Forum.php
Normal file
366
app/admin/controller/content/Forum.php
Normal file
@ -0,0 +1,366 @@
|
||||
<?php
|
||||
/*
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\content\Forum.php
|
||||
* @Description: Forum
|
||||
* @LastEditTime: 2023-03-14 15:42:00
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\common\model\Article;
|
||||
use app\facade\Cate;
|
||||
use think\App;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Cache;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\Msgres;
|
||||
use think\response\Json;
|
||||
|
||||
|
||||
class Forum extends AdminController
|
||||
{
|
||||
protected $model;
|
||||
|
||||
public function __construct(App $app)
|
||||
{
|
||||
parent::__construct($app);
|
||||
$this->model = new Article();
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
public function list()
|
||||
{
|
||||
$data = Request::only(['id','name','title','sec','cate_id']);
|
||||
$where = [];
|
||||
if (!empty($data['sec'])) {
|
||||
switch ($data['sec']) {
|
||||
case '1':
|
||||
$where[] = ['status', '=', 1];
|
||||
break;
|
||||
case '2':
|
||||
$where[] = ['is_top', '=', 1];
|
||||
break;
|
||||
case '3':
|
||||
$where[] = ['is_hot', '=', 1];
|
||||
break;
|
||||
case '4':
|
||||
$where[] = ['is_reply', '=', 1];
|
||||
break;
|
||||
case '5':
|
||||
$where[] = ['status', '=', -1];
|
||||
break;
|
||||
case '6':
|
||||
$where[] = ['status', '=', 0];
|
||||
break;
|
||||
}
|
||||
}
|
||||
unset($data['sec']);
|
||||
|
||||
if(!empty($data['id'])){
|
||||
$where[] = ['id', '=', $data['id']];
|
||||
}
|
||||
|
||||
if(!empty($data['cate_id'])){
|
||||
$where[] = ['cate_id', '=', $data['cate_id']];
|
||||
}
|
||||
|
||||
if(!empty($data['name'])){
|
||||
$userId = Db::name('user')->where('name',$data['name'])->value('id');
|
||||
$where[] = ['user_id', '=', $userId];
|
||||
}
|
||||
|
||||
if(!empty($data['title'])){
|
||||
$where[] = ['title', 'like', '%'.$data['title'].'%'];
|
||||
}
|
||||
|
||||
$list = $this->model->getList($where, input('limit'), input('page'));
|
||||
$res = [];
|
||||
if($list['total']){
|
||||
foreach($list['data'] as $v) {
|
||||
$res['data'][] = [
|
||||
'id' => $v['id'],
|
||||
'poster' => $v['user']['name'],
|
||||
'avatar' => $v['user']['user_img'],
|
||||
'title' => htmlspecialchars($v['title']),
|
||||
'cate' => $v['cate']['catename'],
|
||||
'url' => $this->getArticleUrl($v['id'], 'index', $v['cate']['ename']),
|
||||
'content' => strip_tags($v['content']),
|
||||
'posttime' => $v['update_time'],
|
||||
'top' => $v['is_top'],
|
||||
'hot' => $v['is_hot'],
|
||||
'reply' => $v['is_reply'],
|
||||
'check' => $v['status']
|
||||
];
|
||||
}
|
||||
return json(['code' =>0, 'msg' => 'ok', 'count' => $list['total'], 'data' => $res['data']]);
|
||||
}
|
||||
return json(['code' =>-1, 'msg' => 'no data']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加帖子文章
|
||||
* @return string|\think\Response|\think\response\Json|void
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if (Request::isAjax()) {
|
||||
|
||||
$data = Request::only(['cate_id', 'title', 'title_color', 'tiny_content', 'content', 'upzip', 'keywords', 'description', 'captcha']);
|
||||
$tagId = input('tagid');
|
||||
$data['user_id'] = 1; //管理员ID
|
||||
// 调用验证器
|
||||
$validate = new \app\common\validate\Article;
|
||||
$result = $validate->scene('Artadd')->check($data);
|
||||
if (true !== $result) {
|
||||
return Msgres::error($validate->getError());
|
||||
}
|
||||
|
||||
// 获取内容图片音视频标识
|
||||
$iva= $this->hasIva($data['content']);
|
||||
$data = array_merge($data,$iva);
|
||||
|
||||
// 处理内容
|
||||
$data['content'] = $this->downUrlPicsReaplace($data['content']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
$data['description'] = strip_tags($this->filterEmoji($data['description']));
|
||||
// 获取分类ename,appname
|
||||
$cateEname = Db::name('cate')->where('id',$data['cate_id'])->value('ename');
|
||||
|
||||
$result = $this->model->add($data);
|
||||
if ($result['code'] == 1) {
|
||||
// 获取到的最新ID
|
||||
$aid = $result['data']['id'];
|
||||
//写入taglist表
|
||||
$tagArr = [];
|
||||
if(isset($tagId)) {
|
||||
$tagIdArr = explode(',',$tagId);
|
||||
foreach($tagIdArr as $tid) {
|
||||
$tagArr[] = ['article_id'=>$aid,'tag_id'=>$tid,'create_time'=>time()];
|
||||
}
|
||||
}
|
||||
Db::name('taglist')->insertAll($tagArr);
|
||||
|
||||
// 清除文章tag缓存
|
||||
Cache::tag('tagArtDetail')->clear();
|
||||
|
||||
$link = $this->getArticleUrl((int)$aid, 'index', $cateEname);
|
||||
|
||||
hook('SeoBaiduPush', ['link'=>$link]); // 推送给百度收录接口
|
||||
|
||||
$url = $result['data']['status'] ? $link : (string)url('index/');
|
||||
$res = Msgres::success($result['msg'], $url);
|
||||
} else {
|
||||
$res = Msgres::error('add_error');
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
return View::fetch('add');
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑文章
|
||||
* @param $id
|
||||
* @return string|\think\Response|\think\response\Json|void
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$article = Article::find($id);
|
||||
if(Request::isAjax()){
|
||||
|
||||
$data = Request::only(['id','cate_id','title','title_color','content','upzip','keywords','description','captcha']);
|
||||
$tagId = input('tagid');
|
||||
|
||||
//调用验证器
|
||||
$validate = new \app\common\validate\Article();
|
||||
$res = $validate->scene('Artadd')->check($data);
|
||||
|
||||
if(!$res) return Msgres::error($validate->getError());
|
||||
//获取内容图片音视频标识
|
||||
$iva= $this->hasIva($data['content']);
|
||||
$data = array_merge($data,$iva);
|
||||
|
||||
// 处理内容
|
||||
$data['content'] = $this->downUrlPicsReaplace($data['content']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
$data['description'] = strip_tags($this->filterEmoji($data['description']));
|
||||
$result = $article->edit($data);
|
||||
if($result == 1) {
|
||||
//处理标签
|
||||
$artTags = Db::name('taglist')->where('article_id',$id)->column('tag_id','id');
|
||||
if(isset($tagId)) {
|
||||
$tagIdArr = explode(',',$tagId);
|
||||
foreach($artTags as $aid => $tid) {
|
||||
if(!in_array($tid,$tagIdArr)){
|
||||
//删除被取消的tag
|
||||
Db::name('taglist')->delete($aid);
|
||||
}
|
||||
}
|
||||
//查询保留的标签
|
||||
$artTags = Db::name('taglist')->where('article_id',$id)->column('tag_id');
|
||||
$tagArr = [];
|
||||
foreach($tagIdArr as $tid) {
|
||||
if(!in_array($tid, $artTags)){
|
||||
//新标签
|
||||
$tagArr[] = ['article_id'=>$data['id'],'tag_id'=>$tid,'create_time'=>time()];
|
||||
}
|
||||
}
|
||||
//更新新标签
|
||||
Db::name('taglist')->insertAll($tagArr);
|
||||
}
|
||||
//删除原有缓存显示编辑后内容
|
||||
Cache::delete('article_'.$id);
|
||||
$link = $this->getArticleUrl((int) $id, 'index', $article->cate->ename);
|
||||
hook('SeoBaiduPush', ['link'=>$link]); // 推送给百度收录接口
|
||||
return Msgres::success('edit_success',$link);
|
||||
}
|
||||
return Msgres::error($result);
|
||||
}
|
||||
|
||||
View::assign(['article'=>$article]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
//删除帖子 多选和单独
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
try {
|
||||
$arr = explode(",",$id);
|
||||
foreach($arr as $v){
|
||||
$article = Article::find($v);
|
||||
$article->together(['comments'])->delete();
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 置顶、加精、评论开关,审核等状态管理
|
||||
*
|
||||
* @return Json
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
$param = Request::only(['id','name','value']);
|
||||
$data = ['id'=>$param['id'],$param['name']=>$param['value']];
|
||||
//获取状态
|
||||
$res = Db::name('article')->save($data);
|
||||
Cache::delete('article_'.$data['id']);
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'设置成功','icon'=>6]);
|
||||
}else {
|
||||
return json(['code'=>-1,'msg'=>'失败啦','icon'=>6]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传接口
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function uploads()
|
||||
{
|
||||
$type = Request::param('type');
|
||||
return $this->uploadFiles($type);
|
||||
}
|
||||
|
||||
/**
|
||||
* 内容中是否有图片视频音频插入
|
||||
*
|
||||
* @param [type] $content
|
||||
* @return array
|
||||
*
|
||||
*/
|
||||
public function hasIva($content)
|
||||
{
|
||||
//判断是否插入图片
|
||||
$isHasImg = strpos($content,'img[');
|
||||
$data['has_img'] = is_int($isHasImg) ? 1 : 0;
|
||||
//判断是否插入视频
|
||||
$isHasVideo = strpos($content,'video(');
|
||||
$data['has_video'] = is_int($isHasVideo) ? 1 : 0;
|
||||
//判断是否插入音频
|
||||
$isHasAudio = strpos($content,'audio[');
|
||||
$data['has_audio'] = is_int($isHasAudio) ? 1 : 0;
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分类树
|
||||
* @return Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getCateTree()
|
||||
{
|
||||
//
|
||||
$cate = Db::name('cate')->field('id,pid,catename,ename,sort')->order(['id' => 'ASC','sort' => 'ASC'])->where(['delete_time'=>0])->select()->toArray();
|
||||
$data = getTree($cate);
|
||||
$count = count($cate);
|
||||
$tree = [];
|
||||
if($count){
|
||||
$tree = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
|
||||
//构造一个顶级菜单pid=0的数组。把权限放入顶级菜单下子权限中
|
||||
$tree['data'][] = ['id'=>0,'catename'=>'顶级','pid'=>0,'children'=>$data];
|
||||
}
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分类
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function getCateList()
|
||||
{
|
||||
$cateList = Cate::field('id,pid,catename,sort')->where(['status' => 1])->select()->toArray();
|
||||
// 排序
|
||||
$cmf_arr = array_column($cateList, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $cateList);
|
||||
|
||||
$list = getTree($cateList);
|
||||
$count = count($list);
|
||||
$tree = [];
|
||||
if($count){
|
||||
$tree = ['code'=>0, 'msg'=>'ok','count'=>$count];
|
||||
$tree['data'] = $list;
|
||||
}
|
||||
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
//array_filter过滤函数
|
||||
protected function filtr($arr){
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
136
app/admin/controller/content/Tag.php
Normal file
136
app/admin/controller/content/Tag.php
Normal file
@ -0,0 +1,136 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <317927823@qq.com>
|
||||
* @Date: 2022-08-14 09:39:01
|
||||
* @LastEditTime: 2022-08-15 16:12:13
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 优化版
|
||||
* @FilePath: \TaoLer\app\admin\controller\Tag.php
|
||||
* Copyright (c) 2020~2022 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\Tag as TagModel;
|
||||
|
||||
class Tag extends AdminController
|
||||
{
|
||||
|
||||
|
||||
// public function __construct(TagModel $tagModel)
|
||||
// {
|
||||
|
||||
// $this->tagModel = new TagModel;
|
||||
// }
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch('index');
|
||||
}
|
||||
|
||||
public function list()
|
||||
{
|
||||
$arr = [];
|
||||
$tag = new TagModel;
|
||||
$tags = $tag->getTagList();
|
||||
// dump($tags);
|
||||
if(count($tags)) {
|
||||
$arr = ['code'=>0, 'msg'=>'', 'count' => count($tags)];
|
||||
foreach($tags as $k=>$v) {
|
||||
$arr['data'][] = ['id'=>$v['id'],'name'=>$v['name'], 'ename'=>$v['ename'], 'keywords'=>$v['keywords'], 'description'=>$v['description'], 'title'=>$v['title'],'time'=>$v['create_time']];
|
||||
}
|
||||
} else {
|
||||
$arr = ['code'=>-1, 'msg'=>'没有数据'];
|
||||
}
|
||||
return json($arr);
|
||||
}
|
||||
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['name','ename','keywords','description','title']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
|
||||
$tagModel = new TagModel;
|
||||
$res = $tagModel->saveTag($data);
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'设置成功']);
|
||||
}
|
||||
}
|
||||
return view();
|
||||
}
|
||||
|
||||
public function edit()
|
||||
{
|
||||
$tagModel = new TagModel;
|
||||
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['name','ename','id','keywords','description','title']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
try{
|
||||
$tagModel::update($data);
|
||||
return json(['code'=>0,'msg'=>'设置成功']);
|
||||
} catch(\Exception $e) {
|
||||
return json(['code'=>-1,'msg'=>$e->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
$tag = $tagModel->getTag(input('id'));
|
||||
|
||||
View::assign('tag',$tag);
|
||||
return view();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
$tagModel = new TagModel;
|
||||
$res = $tagModel->delTag(input('id'));
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有tag标签
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getAllTag()
|
||||
{
|
||||
$data = [];
|
||||
$tagModel = new TagModel;
|
||||
$tags = $tagModel->getTagList();
|
||||
foreach($tags as $tag) {
|
||||
$data[] = ['name'=> $tag['name'], 'value'=> $tag['id']];
|
||||
}
|
||||
return json(['code'=>0,'data'=>$data]);
|
||||
}
|
||||
|
||||
public function getArticleTag($id)
|
||||
{
|
||||
//
|
||||
$data = [];
|
||||
$artTags = Db::name('taglist')->where('article_id',$id)->select();
|
||||
// halt($artTags);
|
||||
foreach($artTags as $v) {
|
||||
$tag = Db::name('tag')->find($v['tag_id']);
|
||||
if(!is_null($tag))
|
||||
$data[] = ['name'=>$tag['name'],'value'=>$tag['id']];
|
||||
}
|
||||
|
||||
return json(['code'=>0,'data'=>$data]);
|
||||
}
|
||||
|
||||
}
|
@ -6,57 +6,90 @@
|
||||
* Time: 15:40
|
||||
*/
|
||||
|
||||
namespace app\admin\controller;
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\validate\Admin as AdminValidate;
|
||||
use app\admin\model\Admin as AdminModel;
|
||||
use think\App;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\facade\Cookie;
|
||||
use think\exception\ValidateException;
|
||||
use app\common\model\User as UserModel;
|
||||
use taoler\com\Files;
|
||||
|
||||
|
||||
class Admin extends AdminController
|
||||
{
|
||||
//管理员
|
||||
protected $model = null;
|
||||
|
||||
public function __construct(App $app)
|
||||
{
|
||||
parent::__construct($app);
|
||||
$this->model = new AdminModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览管理员
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','username','mobile','email']);
|
||||
$map = array_filter($data);
|
||||
$admins = Db::name('admin')
|
||||
->field('id,username,mobile,email,last_login_ip,status,last_login_time')
|
||||
->where('delete_time',0)
|
||||
->where($map)
|
||||
->select();
|
||||
|
||||
$count = $admins->count();
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($admins as $k => $v){
|
||||
$data = ['id'=>$v['id'],'loginname'=>$v['username'],'telphone'=>$v['mobile'],'email'=>$v['email'],'ip'=>$v['last_login_ip'],'check'=>$v['status'],'logintime'=>date("Y-m-d",$v['last_login_time'])];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员列表
|
||||
* @return \think\response\Json|void
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','username','mobile','email']);
|
||||
$map = array_filter($data);
|
||||
$admins = Db::name('admin')
|
||||
->field('id,avatar,username,mobile,email,last_login_ip,status,last_login_time')
|
||||
->where('delete_time',0)
|
||||
->where($map)
|
||||
->select();
|
||||
|
||||
$count = $admins->count();
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($admins as $k => $v){
|
||||
$data = [
|
||||
'id' => $v['id'],
|
||||
'avatar' => $v['avatar'],
|
||||
'username' => $v['username'],
|
||||
'phone' => $v['mobile'],
|
||||
'email' => $v['email'],
|
||||
'ip' => $v['last_login_ip'],
|
||||
'check' => $v['status'],
|
||||
'logintime' => date("Y-m-d", $v['last_login_time'])
|
||||
];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//管理员审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::param();
|
||||
$data = Request::only(['id', 'status']);
|
||||
if($data['id'] == 1 && $data['status'] == -1) {
|
||||
return json(['code'=>-1,'msg'=>'无法禁用超级管理员']);
|
||||
}
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('admin')->where('id',$data['id'])->save(['status' => $data['status']]);
|
||||
$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]);
|
||||
@ -64,7 +97,7 @@ class Admin extends AdminController
|
||||
return json(['code'=>0,'msg'=>'管理员已取消','icon'=>5]);
|
||||
}
|
||||
|
||||
}else {
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
}
|
||||
|
||||
@ -74,7 +107,8 @@ class Admin extends AdminController
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$data = Request::only(['username','email','password','mobile','sex']);
|
||||
$roleId = request()->get('roleId');
|
||||
$data['create_time'] = time();
|
||||
$salt = substr(md5($data['create_time']),-6);
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
|
||||
@ -100,16 +134,17 @@ class Admin extends AdminController
|
||||
$admin = AdminModel::find($id);
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$data = Request::only(['id','username','email','password','mobile','sex','roleId']);
|
||||
if(empty($data['password'])){
|
||||
unset($data['password']);
|
||||
} else {
|
||||
$t = strtotime($admin['create_time']);
|
||||
$t = $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);
|
||||
|
||||
$result = Db::name('admin')->update($data);
|
||||
//Db::name('auth_group_access')->where('uid',$data['id'])->update(['group_id'=>$data['auth_group_id']]);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
@ -126,10 +161,10 @@ class Admin extends AdminController
|
||||
//删除管理员
|
||||
public function delete($id)
|
||||
{
|
||||
$ids = explode(',',$id);
|
||||
if(Request::isAjax()){
|
||||
$user =AdminModel::find($id);
|
||||
$user = $this->model->select($ids);
|
||||
$result = $user->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
@ -137,24 +172,41 @@ class Admin extends AdminController
|
||||
}
|
||||
}
|
||||
}
|
||||
//基本资料显示
|
||||
|
||||
//基本资料浏览
|
||||
public function info()
|
||||
{
|
||||
$admin = AdminModel::find(Session::get('admin_id'));
|
||||
$admin = $this->model->find($this->aid);
|
||||
$auths = $admin->adminGroup;
|
||||
$authname = [];
|
||||
$authName = [];
|
||||
foreach($auths as $v){
|
||||
$authname[] = $v->title;
|
||||
$authName[] = $v->title;
|
||||
}
|
||||
$authGroupTitle = implode('|', $authname);
|
||||
$authGroupTitle = implode('|', $authName);
|
||||
|
||||
View::assign(['admin'=>$admin,'authGroupTitle'=>$authGroupTitle]);
|
||||
return View::fetch('set/user/info');
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//修改基本资料显示
|
||||
public function infoEdit()
|
||||
{
|
||||
$admin = AdminModel::find($this->aid);
|
||||
$auths = $admin->adminGroup;
|
||||
$authName = [];
|
||||
foreach($auths as $v){
|
||||
$authName[] = $v->title;
|
||||
}
|
||||
$authGroupTitle = implode('|', $authName);
|
||||
|
||||
View::assign(['admin'=>$admin,'authGroupTitle'=>$authGroupTitle]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//管理员资料更新
|
||||
public function infoSet()
|
||||
{
|
||||
$admin = AdminModel::find(Session::get('admin_id'));
|
||||
$admin = AdminModel::find($this->aid);
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['nickname','sex','mobile','email','remarks']);
|
||||
$result = $admin->save($data);
|
||||
@ -167,46 +219,31 @@ class Admin extends AdminController
|
||||
}
|
||||
}
|
||||
|
||||
//显示改密码页面
|
||||
//浏览改密码页面
|
||||
public function repass()
|
||||
{
|
||||
$admin = AdminModel::find(Session::get('admin_id'));
|
||||
|
||||
View::assign('admin',$admin);
|
||||
return View::fetch('set/user/repass');
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//密码重设
|
||||
public function repassSet()
|
||||
{
|
||||
$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']){
|
||||
return json(['code'=>-1,'msg'=>'当前密码错误']);
|
||||
} elseif($data['password'] != $data['repassword']){
|
||||
return json(['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);
|
||||
}
|
||||
//修改密码
|
||||
public function repassSet()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['oldPassword','password','repassword']);
|
||||
$data['admin_id'] = $this->aid;
|
||||
|
||||
$admin = new AdminModel;
|
||||
return $admin->setpass($data);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//清除缓存Cache
|
||||
public function clearCache(){
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存Cache
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function clearCache()
|
||||
{
|
||||
$res = $this->clearSysCache();
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'清除缓存成功']);
|
210
app/admin/controller/system/AuthGroup.php
Normal file
210
app/admin/controller/system/AuthGroup.php
Normal file
@ -0,0 +1,210 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\system\AuthGroup.php
|
||||
* @Description: AuthGroup
|
||||
* @LastEditTime: 2023-03-14 16:43:59
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\exception\ValidateException;
|
||||
use app\admin\model\AuthGroup as AuthGroupModel;
|
||||
use app\admin\model\AuthGroupAccess;
|
||||
use app\admin\model\AuthRule as AuthRuleModel;
|
||||
use app\admin\model\Admin as adminModel;
|
||||
use LDAP\Result;
|
||||
use think\Response;
|
||||
|
||||
|
||||
class AuthGroup extends AdminController
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @var [type]
|
||||
*/
|
||||
protected $model = null;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new AuthGroupModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$roles = Db::name('auth_group')->field('id,title')->where('status',1)->select();
|
||||
View::assign('roles',$roles);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色
|
||||
public function list()
|
||||
{
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id']);
|
||||
$map = array_filter($data);
|
||||
$role = Db::name('auth_group')->field('id,title,limits,descr,status')->where($map)->select();
|
||||
$count = $role->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$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;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$roles = Db::name('auth_group')->field('id,title')->where('status',1)->select();
|
||||
View::assign('roles',$roles);
|
||||
return View::fetch('index');
|
||||
}
|
||||
|
||||
//角色添加
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = AuthGroupModel::create($data);
|
||||
if($result) {
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
$menus = $this->getRoleMenu(1);
|
||||
View::assign('menus',$menus);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色编辑
|
||||
public function edit()
|
||||
{
|
||||
|
||||
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'=>0,'msg'=>'保存成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'保存失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$menus = $this->getRoleMenu(1);
|
||||
$role = AuthGroupModel::find(input('id'));
|
||||
$rus = explode(',',$role->rules);
|
||||
|
||||
View::assign(['role'=>$role,'rus'=>$rus,'menus'=>$menus]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色删除
|
||||
public function delete($id)
|
||||
{
|
||||
$ids = explode(',',$id);
|
||||
if(Request::isAjax()){
|
||||
$role =AuthGroupModel::select($ids);
|
||||
$result = $role->delete();
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
//角色审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::param();
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('auth_group')->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'=>'审核出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function auth()
|
||||
{
|
||||
$roleId = request()->get('id');
|
||||
//
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['group_id', 'uid']);
|
||||
$uidArray = Db::name('auth_group_access')->where('group_id', (int) $data['group_id'])->column('uid');
|
||||
|
||||
$newUids = explode(',', $data['uid']);
|
||||
try {
|
||||
// 1.循环原有的UID跟现在提交过来的UID比较,没有在新uid的,被删除
|
||||
foreach($uidArray as $oldUid) {
|
||||
if(!in_array($oldUid, $newUids)){
|
||||
Db::name('auth_group_access')->where('uid', $oldUid)->delete();
|
||||
}
|
||||
}
|
||||
|
||||
// 2.循环现有的UID再次跟已存在的UID比较,没有的,新增加
|
||||
$uids = Db::name('auth_group_access')->where('group_id', (int) $data['group_id'])->column('uid');
|
||||
foreach($newUids as $newUid){
|
||||
if(!in_array($newUid, $uids)) {
|
||||
Db::name('auth_group_access')->save(['uid' => $newUid, 'group_id' => (int) $data['group_id']]);
|
||||
}
|
||||
}
|
||||
|
||||
return json(['code' => 0, 'msg' => 'ok']);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code' => -1, 'msg' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
// $groupAccess = new AuthGroupAccess();
|
||||
// $groupAccess->saveAll($array);
|
||||
}
|
||||
|
||||
$admin = Db::name('admin')->field('id, username')->select();
|
||||
$role = Db::name('auth_group')->field('id,title')->where('id', (int) $roleId)->find();
|
||||
$uidAccess = Db::name('auth_group_access')->where('group_id', (int) $roleId)->column('uid');
|
||||
|
||||
View::assign(['role'=>$role, 'admin' => $admin, 'uidAccess' => $uidAccess]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
}
|
184
app/admin/controller/system/AuthRule.php
Normal file
184
app/admin/controller/system/AuthRule.php
Normal file
@ -0,0 +1,184 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\system\AuthRule.php
|
||||
* @Description: AuthRule
|
||||
* @LastEditTime: 2023-03-14 16:45:34
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\App;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
use app\admin\model\AuthRule as AuthRuleModel;
|
||||
|
||||
class AuthRule extends AdminController
|
||||
{
|
||||
|
||||
protected $model = '';
|
||||
|
||||
//
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new AuthRuleModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览菜单列表
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
|
||||
return View::fetch();
|
||||
|
||||
}
|
||||
|
||||
public function list()
|
||||
{
|
||||
return $this->model->getAuthRuleArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 无限极权限树
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function ruleTree()
|
||||
{
|
||||
$data = $this->getRoleMenu(1);
|
||||
|
||||
$count = count($data);
|
||||
$tree = [];
|
||||
if($count){
|
||||
$tree = ['code'=>0, 'msg'=>'ok','count'=>$count];
|
||||
|
||||
//构造一个顶级菜单pid=0的数组。把权限放入顶级菜单下子权限中
|
||||
$tree['data'][] = ['id'=>0, 'title'=>'顶级', 'pid'=>0, 'children'=>$data];
|
||||
}
|
||||
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
//添加权限
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
//层级level
|
||||
$plevel = Db::name('auth_rule')->field('level')->find($data['pid']);
|
||||
if($plevel){
|
||||
$data['level'] = $plevel['level']+1;
|
||||
} else {
|
||||
$data['level'] = 0;
|
||||
}
|
||||
|
||||
return $this->model->saveRule($data);
|
||||
}
|
||||
|
||||
$auth_rules = $this->model->getAuthRuleArray();
|
||||
View::assign('AuthRule',$auth_rules);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//权限编辑
|
||||
public function edit()
|
||||
{
|
||||
$rule = new AuthRuleModel();
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param(['id','pid','title','name','icon','sort','ismenu']);
|
||||
//层级level
|
||||
$ruId = $rule->find($data['pid']); //查询出上级ID
|
||||
if($ruId){
|
||||
$plevel = $ruId->level; //上级level等级
|
||||
$data['level'] = $plevel+1;
|
||||
} else {
|
||||
$data['level'] = 0;
|
||||
}
|
||||
$zi = $this->model->where('pid',$data['id'])->select();//查询出下级
|
||||
if(!empty($zi)){
|
||||
$zi->update(['level'=>$data['level']+1]);
|
||||
}
|
||||
|
||||
$rule = $this->model->find($data['id']);
|
||||
return $rule->saveRule($data);
|
||||
}
|
||||
|
||||
$auth_rules = $this->model->getAuthRuleArray();
|
||||
$rules = $this->model->find(input('id'));
|
||||
|
||||
View::assign(['AuthRule'=>$auth_rules,'rules'=>$rules]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除权限
|
||||
*
|
||||
* @param [type] $id
|
||||
* @return void
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
$pids = AuthRuleModel::where('pid',$id)->select();
|
||||
if($pids)
|
||||
{
|
||||
$result = $pids->delete();
|
||||
}
|
||||
|
||||
$rule = AuthRuleModel::find($id);
|
||||
$result = $rule->delete();
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 权限开关
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
if($data['id'] == 1 || $data['id'] == 31) {
|
||||
return json(['code' => -1, 'msg' => '不能关闭重要权限!']);
|
||||
}
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('auth_rule')->save($data);
|
||||
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 sort()
|
||||
{
|
||||
$data = Request::param();
|
||||
$rules = Db::name('auth_rule')->save($data);
|
||||
if($rules){
|
||||
$res = ['code'=>0,'msg'=>'排序成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'排序失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
}
|
192
app/admin/controller/system/Menu.php
Normal file
192
app/admin/controller/system/Menu.php
Normal file
@ -0,0 +1,192 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\system\Menu.php
|
||||
* @Description: Menu
|
||||
* @LastEditTime: 2023-03-14 16:46:37
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\Db;
|
||||
use taoser\think\Auth;
|
||||
use think\facade\Lang;
|
||||
use think\facade\Session;
|
||||
|
||||
class Menu extends AdminController
|
||||
{
|
||||
/**
|
||||
* pearadmin动态菜单栏
|
||||
* @return \think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getnav()
|
||||
{
|
||||
$auth = new Auth();
|
||||
$menu = [];
|
||||
$rule = Session::has('ruleTable') ? Session::get('ruleTable') : 'auth_rule';
|
||||
$auth_rule_list = Db::name($rule)->field('id,pid,title,icon,name,sort,ismenu')->where(['status'=> 1, 'delete_time'=> 0])->select();
|
||||
foreach ($auth_rule_list as $v) {
|
||||
if ($auth->check($v['name'], $this->aid) || $this->aid == 1) {
|
||||
$menu[] = [
|
||||
'id' => $v['id'],
|
||||
'title' => Lang::get($v['title']),
|
||||
'icon' => 'layui-icon ' . $v['icon'],
|
||||
'href' => (string) url($v['name']),
|
||||
'pid' => $v['pid'],
|
||||
'sort' => $v['sort'],
|
||||
'ismenu' => $v['ismenu']
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$nav = $this->getTrees($menu);
|
||||
|
||||
// 初始化控制台
|
||||
$nav[] = [
|
||||
'id' => 500,
|
||||
'title' => '主页',
|
||||
'icon' => 'layui-icon layui-icon-console',
|
||||
'href' => '',
|
||||
'sort' => 1,
|
||||
'type' => 0,
|
||||
'children' => [
|
||||
[
|
||||
'id' => 501,
|
||||
"title" => "控制后台",
|
||||
"icon" => "layui-icon layui-icon-console",
|
||||
"type" => 1,
|
||||
"openType" =>"_iframe",
|
||||
"href" => (string) url("index/console1"),
|
||||
'sort' => 1,
|
||||
],[
|
||||
'id' => 502,
|
||||
"title" => "数据分析",
|
||||
"icon" => "layui-icon layui-icon-console",
|
||||
"type" => 1,
|
||||
"openType" => "_iframe",
|
||||
"href" => (string) url("index/console2"),
|
||||
'sort' => 2,
|
||||
]
|
||||
]
|
||||
|
||||
];
|
||||
$nav[] = [
|
||||
'id' => 1000,
|
||||
'title' => '官网',
|
||||
'icon' => 'layui-icon layui-icon-console',
|
||||
'href' => 'https://www.aieok.com',
|
||||
'sort' => 1000,
|
||||
'type' => 1,
|
||||
"openType" => "_blank",
|
||||
];
|
||||
|
||||
//SORT排序
|
||||
$cmf_arr = array_column($nav, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $nav);
|
||||
|
||||
return json($nav);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 菜单无限极分类
|
||||
*
|
||||
* @param array $data 包含有pid的rule权限数组
|
||||
* @param integer $pId 父ID
|
||||
* @return array
|
||||
*/
|
||||
public function getTrees(array $data, int $pId = 0): array
|
||||
{
|
||||
// 递归
|
||||
$tree = [];
|
||||
foreach ($data as $k => $v) {
|
||||
//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
|
||||
if ($v['pid'] == $pId) {
|
||||
$child = $this->getTrees($data, $v['id']);
|
||||
// 有子类
|
||||
if(!empty($child)) {
|
||||
// foreach($child as $m => $n) {
|
||||
// $v['children'][$m] = $n;
|
||||
// //$v['children'][$m]['type'] = 1;
|
||||
// //$v['children'][$m]['openType'] = '_iframe';
|
||||
// }
|
||||
$v['type'] = $v['ismenu'];
|
||||
$v['children'] = $child;
|
||||
} else {
|
||||
// 没有子菜单type=1
|
||||
$v['type'] = 1;
|
||||
$v['openType'] = '_iframe';
|
||||
}
|
||||
|
||||
//把数组放到$tree中
|
||||
$tree[] = $v;
|
||||
//把这个节点从数组中移除,减少后续递归消耗
|
||||
unset($data[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
return $tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态菜单并排序
|
||||
* @return \think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getMenuNavbar()
|
||||
{
|
||||
// 用户菜单权限
|
||||
$auth = new Auth();
|
||||
|
||||
$pid = empty(input('id')) ? 0 : input('id');
|
||||
$data = Db::name('auth_rule')->field('id,title,icon,name,sort')->where(['pid'=>$pid,'status'=> 1, 'ismenu'=>1, 'delete_time'=> 0])->select();
|
||||
$tree = [];
|
||||
foreach ($data as $k => $v) {
|
||||
$hasChild = $this->hasChildren($v['id']);
|
||||
if($hasChild) {
|
||||
$v['hasChildren'] = 1;
|
||||
} else {
|
||||
$v['hasChildren'] = 0;
|
||||
}
|
||||
if ($auth->check($v['name'], session('admin_id')) || session('admin_id') == 1) {
|
||||
$tree[] = ['id'=>$v['id'],'text'=>$v['title'],'icon'=>$v['icon'],'hasChildren'=>$v['hasChildren'],'href'=>(string) url($v['name']),'sort'=>$v['sort']];
|
||||
}
|
||||
|
||||
}
|
||||
// 排序
|
||||
$cmf_arr = array_column($tree, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $tree);
|
||||
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有子菜单
|
||||
* @param $pid
|
||||
* @return bool
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function hasChildren($pid)
|
||||
{
|
||||
$data = Db::name('auth_rule')->field('pid')->where(['delete_time'=> 0,'status'=> 1,'ismenu'=>1,'pid'=>$pid])->select()->toArray();
|
||||
if(count($data)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
321
app/admin/controller/system/Set.php
Normal file
321
app/admin/controller/system/Set.php
Normal file
@ -0,0 +1,321 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <alipey_tao@qq.com>
|
||||
* @Date: 2021-12-06 16:04:50
|
||||
* @LastEditTime: 2022-07-24 11:06:14
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 设置
|
||||
* @FilePath: \TaoLer\app\admin\controller\Set.php
|
||||
* Copyright (c) 2020~2022 http://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Cache;
|
||||
use think\facade\Config;
|
||||
use app\admin\model\System;
|
||||
use app\admin\model\MailServer;
|
||||
use taoler\com\Files;
|
||||
use think\facade\Session;
|
||||
use think\facade\Cookie;
|
||||
use taoser\SetArr;
|
||||
use app\common\lib\SetArr as SetArrConf;
|
||||
use think\response\Json;
|
||||
|
||||
class Set extends AdminController
|
||||
{
|
||||
|
||||
protected $sysInfo = '';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->sysInfo = $this->getSystem();
|
||||
}
|
||||
|
||||
//网站设置显示
|
||||
public function index()
|
||||
{
|
||||
$template = Files::getDirName('../view');
|
||||
$email = Db::name('admin')->where('id',1)->value('email');
|
||||
|
||||
// 应用映射
|
||||
$index_map = array_search('index',config('app.app_map'));
|
||||
$admin_map = array_search('admin',config('app.app_map'));
|
||||
$index_map = $index_map ? $index_map : '';
|
||||
$admin_map = $admin_map ? $admin_map : '';
|
||||
View::assign(['sysInfo'=>$this->sysInfo,'template'=>$template,'email'=>$email,'index_map'=>$index_map,'admin_map'=>$admin_map]);
|
||||
|
||||
// 域名绑定
|
||||
if(!empty(config('app.domain_bind'))){
|
||||
$data = array_flip(config('app.domain_bind'));
|
||||
$domain_bind = [
|
||||
'index' => isset($data['index']) ? $data['index'] : '',
|
||||
'admin' => isset($data['admin']) ? $data['admin'] : '',
|
||||
];
|
||||
} else {
|
||||
$domain_bind = [
|
||||
'index' => '',
|
||||
'admin' => '',
|
||||
];
|
||||
}
|
||||
View::assign($domain_bind);
|
||||
|
||||
// url美化
|
||||
$urlArr = config('taoler.url_rewrite');
|
||||
$urlRe = [];
|
||||
foreach($urlArr as $k => $v) {
|
||||
if(!empty($v)) {
|
||||
$urlRe[$k] = substr($v, 0, strrpos($v, '/'));
|
||||
} else {
|
||||
$urlRe[$k] = '';
|
||||
}
|
||||
}
|
||||
|
||||
View::assign('url_re',$urlRe);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//网站设置
|
||||
public function website()
|
||||
{
|
||||
if(Request::isPost()){
|
||||
$data = Request::only(['webname','domain','template','cache','upsize','uptype','blackname','webtitle','keywords','descript','state','icp','showlist','copyright']);
|
||||
$system = new System();
|
||||
$result = $system->sets($data,$this->sysInfo['clevel']);
|
||||
if($result == 1){
|
||||
return json(['code'=>0,'msg'=>'更新成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>$result]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//综合设置
|
||||
public function server()
|
||||
{
|
||||
return View::fetch('set/system/server');
|
||||
}
|
||||
|
||||
/**基础服务配置
|
||||
* parem $id
|
||||
*/
|
||||
public function config()
|
||||
{
|
||||
$conf = Config::get('taoler.config');
|
||||
if(Request::isPost()){
|
||||
$data = Request::param();
|
||||
if(!isset($data['regist_check'])) $data['regist_check'] =1;
|
||||
if(!isset($data['posts_check'])) $data['posts_check'] =1;
|
||||
if(!isset($data['commnets_check'])) $data['commnets_check'] =1;
|
||||
foreach($conf as $c=>$f){
|
||||
if(array_key_exists($c,$data)){
|
||||
$conf[$c] = (int) $data[$c];
|
||||
}else{
|
||||
$conf[$c] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$value = [
|
||||
'config'=>$conf
|
||||
];
|
||||
|
||||
$result = SetArr::name('taoler')->edit($value);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'配置成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'配置出错!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
// 域名绑定
|
||||
public function setDomain()
|
||||
{
|
||||
$str = file_get_contents(str_replace('\\', '/', app()->getConfigPath() . 'app.php'));
|
||||
if(Request::isPost()){
|
||||
$data = Request::only(['index','admin','domain_check']);
|
||||
//$data = Request::param();
|
||||
//dump($data);
|
||||
if($data['domain_check'] == 'on') {
|
||||
|
||||
// 过滤空项目
|
||||
$domain_bind = [];
|
||||
if(!empty($data['index'])){
|
||||
$domain_bind[$data['index']] ='index';
|
||||
if(config('app.default_app') == $domain_bind[$data['index']]) {
|
||||
if(empty($data['admin'])) {
|
||||
return json(['code'=>-1, 'msg'=>'默认应用和Index一致时必须绑定Admin域名,否则无法进入后台']);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!empty($data['admin'])){
|
||||
$domain_bind[$data['admin']] ='admin';
|
||||
}
|
||||
|
||||
|
||||
// 匹配整个domain_map数组
|
||||
$pats_domain_bind = '/\'(domain_bind)\'[^\]]*\],/';
|
||||
// 空数组
|
||||
$rep_domain_null = "'domain_bind'\t=> [\n\t],";
|
||||
$str = preg_replace($pats_domain_bind, $rep_domain_null, $str);
|
||||
|
||||
// 匹配'domain_bind' => [
|
||||
$pats = '/\'(domain_bind)\'\s*=>\s*\[\r?\n/';
|
||||
preg_match($pats,$str,$arr);
|
||||
|
||||
// 拼接数组内字符串
|
||||
$domainArr = '';
|
||||
foreach($domain_bind as $k => $v){
|
||||
$domainArr .= "\t\t'". $k. "' => '" . $v . "',\n";
|
||||
}
|
||||
|
||||
// 追加组成新数组写入文件
|
||||
$reps = $arr[0].$domainArr;
|
||||
$str = preg_replace($pats, $reps, $str);
|
||||
|
||||
$res = file_put_contents(app()->getConfigPath() . 'app.php', $str);
|
||||
|
||||
// 如果编辑了后台 ,需要清理退出缓存
|
||||
if(!empty($domain_bind[$data['admin']])) {
|
||||
//清空缓存
|
||||
Cookie::delete('adminAuth');
|
||||
Session::clear();
|
||||
}
|
||||
} else {
|
||||
$res = SetArr::name('app')->delete([
|
||||
'domain_bind'=> config('app.domain_bind'),
|
||||
]);
|
||||
}
|
||||
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'成功']);
|
||||
} else{
|
||||
return json(['code'=>-1,'msg'=>'失败']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定应用映射
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function bindMap()
|
||||
{
|
||||
$data = Request::only(['index_map','admin_map']);
|
||||
$str = file_get_contents(str_replace('\\', '/', app()->getConfigPath() . 'app.php'));
|
||||
|
||||
// 过滤空项目
|
||||
$app_map = [];
|
||||
if(!empty($data['index_map'])){
|
||||
$app_map[$data['index_map']]='index';
|
||||
}
|
||||
if(!empty($data['admin_map'])){
|
||||
$app_map[$data['admin_map']] ='admin';
|
||||
}
|
||||
|
||||
//halt($app_map);
|
||||
// $set = new SetArrConf('app');
|
||||
// $res = $set->delete(['app_map' => config('app.app_map')])->add([
|
||||
// 'app_map' => $app_map,
|
||||
// ])->put();
|
||||
|
||||
// halt($res);
|
||||
|
||||
// 匹配整个app_map数组
|
||||
$pats_app_map = '/\'(app_map)\'[^\]]*\],/';
|
||||
preg_match($pats_app_map,$str,$arr_map);
|
||||
|
||||
// 空数组
|
||||
$rep_map_null = "'app_map'\t=> [\n\t],";
|
||||
$str = preg_replace($pats_app_map, $rep_map_null, $str);
|
||||
|
||||
// 匹配'app_map' => [
|
||||
$pats = '/\'(app_map)\'\s*=>\s*\[\r?\n/';
|
||||
preg_match($pats,$str,$arr);
|
||||
|
||||
// 拼接数组内字符串
|
||||
$appArr = '';
|
||||
foreach($app_map as $k => $v){
|
||||
$appArr .= "\t\t'". $k. "' => '" . $v . "',\n";
|
||||
}
|
||||
|
||||
// 追加组成新数组写入文件
|
||||
$reps = $arr[0].$appArr;
|
||||
$str = preg_replace($pats, $reps, $str);
|
||||
|
||||
$res = file_put_contents(app()->getConfigPath() . 'app.php', $str);
|
||||
|
||||
if(!$res) {
|
||||
return json(['code'=>-1,'msg'=>'绑定失败']);
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'绑定成功']);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* URL美化,设置访问链接
|
||||
* @return Json
|
||||
*/
|
||||
public function setUrl()
|
||||
{
|
||||
$data = Request::only(['article_as','cate_as']);
|
||||
$arr = [];
|
||||
foreach($data as $k => $v) {
|
||||
if(!empty($v)) {
|
||||
$arr['url_rewrite'][$k] = $v . '/';
|
||||
} else {
|
||||
$arr['url_rewrite'][$k] = '';
|
||||
}
|
||||
}
|
||||
// if(empty($arr['url_rewrite']['cate_as'])) return json(['code'=>-1,'msg'=>'分类不能为空']);
|
||||
|
||||
if(!array_key_exists('url_rewrite',config('taoler'))){
|
||||
$result = SetArr::name('taoler')->add($arr);
|
||||
} else {
|
||||
$result = SetArr::name('taoler')->edit($arr);
|
||||
}
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'配置成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'配置出错!'];
|
||||
}
|
||||
return json($res);
|
||||
|
||||
}
|
||||
|
||||
//上传logo
|
||||
public function upload()
|
||||
{
|
||||
$param = Request::param('field');
|
||||
$uploads = new \app\common\lib\Uploads();
|
||||
$upRes = $uploads->put('file','SYS_logo',2000,'image');
|
||||
$logoJson = $upRes->getData();
|
||||
if($logoJson['status'] == 0){
|
||||
if($param == 'logo'){
|
||||
$result = Db::name('system')->where('id', 1)->cache('system')->update(['logo'=>$logoJson['url']]);
|
||||
} else {
|
||||
//移动端logo
|
||||
$result = Db::name('system')->where('id', 1)->cache('system')->update(['m_logo'=>$logoJson['url']]);
|
||||
}
|
||||
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'更新logo成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'上传成功,数据无须更新'];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1, 'msg'=>$logoJson['msg']];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
@ -1,18 +1,24 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\system\Upgrade.php
|
||||
* @Description: Upgrade
|
||||
* @LastEditTime: 2023-03-14 16:47:27
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
* 升级包规定的目录结构
|
||||
* xxx_版本号.zip(如:xxx_1.0.0.zip)
|
||||
* |
|
||||
* |————mysql
|
||||
* |————runtime
|
||||
* | |
|
||||
* | |___mysql_update.sql(更新脚本) //create table test(id init(11)); create table test2(id init(11));
|
||||
*
|
||||
* | |___mysql_rockback.sql(回滚脚本) //drop table test; //drop table test2;
|
||||
* | |___update.sql(更新脚本) //create table test(id init(11)); create table test2(id init(11));
|
||||
* | |___rockback.sql(回滚脚本) //drop table test; //drop table test2;
|
||||
* | |___remove.txt // clear清除目录和文件
|
||||
* |
|
||||
* |____php
|
||||
*
|
||||
*/
|
||||
namespace app\admin\controller;
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
@ -23,9 +29,10 @@ use taoler\com\Str;
|
||||
use taoler\com\Files;
|
||||
use think\facade\Config;
|
||||
use think\facade\Log;
|
||||
use app\common\lib\ZipFile;
|
||||
use app\common\lib\SetConf;
|
||||
use app\common\lib\SqlFile;
|
||||
use app\common\lib\Zip;
|
||||
use taoser\SetArr;
|
||||
|
||||
|
||||
class Upgrade extends AdminController
|
||||
{
|
||||
@ -33,6 +40,9 @@ class Upgrade extends AdminController
|
||||
protected $backup_dir = "../runtime/update/backup_dir/"; //备份目录
|
||||
protected $upload_dir = "../runtime/update/upload_dir/"; //升级包目录
|
||||
protected $sys_version_num; //当前系统的版本
|
||||
protected $sys_version = '';
|
||||
protected $pn = '';
|
||||
protected $sys = '';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
@ -82,7 +92,7 @@ class Upgrade extends AdminController
|
||||
if(empty($data['key'])){
|
||||
return json(['code'=>-1,'msg'=>'请正确填写申请到的key']);
|
||||
}
|
||||
$res = Db::name('system')->update(['key'=>$data['key'],'upcheck_url'=>$data['upcheck_url'],'upgrade_url'=>$data['upgrade_url'],'id'=>1]);
|
||||
$res = Db::name('system')->cache('system')->update(['key'=>$data['key'],'upcheck_url'=>$data['upcheck_url'],'upgrade_url'=>$data['upgrade_url'],'id'=>1]);
|
||||
if($res){
|
||||
$res = ['code'=>0,'msg'=>'修改成功'];
|
||||
} else {
|
||||
@ -102,41 +112,24 @@ class Upgrade extends AdminController
|
||||
Db::name('system')->cache('system')->update(['clevel'=>$cy->level,'id'=>1]);
|
||||
}
|
||||
$versions = Api::urlPost($this->sys['upcheck_url'],['pn'=>$this->pn,'ver'=>$this->sys_version]);
|
||||
//判断服务器状态
|
||||
// 判断服务器状态
|
||||
$version_code = $versions->code;
|
||||
if($version_code == -1){
|
||||
$res = json(['code'=>$version_code,'msg'=>$versions->msg]);
|
||||
}
|
||||
if($version_code == 1){
|
||||
$res = json(['code'=>$versions->code,'msg'=>$versions->msg,'version'=>$versions->version,'upnum'=>$versions->up_num]);
|
||||
$res = json(['code'=>$version_code,'msg'=>$versions->msg,'data'=>['version'=>$versions->version,'upnum'=>$versions->up_num,'info'=>$versions->info]]);
|
||||
}
|
||||
if($version_code == 0){
|
||||
$res = json(['code'=>$versions->code,'msg'=>$versions->msg]);
|
||||
$res = json(['code'=>$version_code,'msg'=>$versions->msg]);
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 备份
|
||||
* @param string $dir
|
||||
* @param string $backDir
|
||||
* @param array $ex
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function backFile(string $dir,string $backDir,array $ex)
|
||||
{
|
||||
$backRes = Files::copydirs($dir, $backDir, $ex);
|
||||
$backData = $backRes->getData();
|
||||
if($backData['code'] == -1){
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'error','progress'=>'25%','msg'=>'备份失败!']);
|
||||
return json(['code'=>-1,'msg'=>$backRes['msg']]);
|
||||
}
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'30%','msg'=>'执行文件备份成功!']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 在线更新
|
||||
* 1.提交接口2.下载数据包3.备份4升级
|
||||
*/
|
||||
public function upload()
|
||||
{
|
||||
@ -158,26 +151,20 @@ class Upgrade extends AdminController
|
||||
if(!isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'))){
|
||||
return json(['code'=>-1,'msg'=>'获取远程文件失败']);
|
||||
}
|
||||
|
||||
//把远程文件放入本地
|
||||
|
||||
//拼接路径
|
||||
//$upload_dir = substr($this->upload_dir,-1) == '/' ? $this->upload_dir : $this->upload_dir.'/';
|
||||
$upload_dir = Files::getDirPath($this->upload_dir);
|
||||
$upload_dir = Files::getDirPath($this->upload_dir); //拼接升级文件暂存路径
|
||||
Files::mkdirs($upload_dir);
|
||||
|
||||
$package_file = $upload_dir.'taoler_'.$version_num.'.zip'; //升级的压缩包文件
|
||||
$cpfile = copy($file_url,$package_file);
|
||||
|
||||
if(!$cpfile)
|
||||
{
|
||||
$package_file = $upload_dir.'taoler_'.$version_num.'.zip'; //本地zip文件
|
||||
$cpfile = copy($file_url,$package_file); //把远程文件放入本地
|
||||
if(!$cpfile) {
|
||||
return json(['code'=>-1,'msg'=>'下载升级文件失败']);
|
||||
}
|
||||
|
||||
//记录下日志
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'20%','msg'=>'上传升级包'.$version_num.'成功!']);
|
||||
|
||||
//升级前备份代码
|
||||
$ex = array('.git','.idea','runtime','data','addons','config','extend','mysql','public','vendor','view'); // 排除备份文件夹
|
||||
$ex = array('.git','.idea','runtime','data','addons','config','extend','mysql','public','vendor','view'); // 排除备份目录
|
||||
$this->backFile($this->root_dir,$this->backup_dir,$ex);
|
||||
|
||||
//执行升级
|
||||
@ -187,39 +174,62 @@ class Upgrade extends AdminController
|
||||
return json(['code'=>-1,'msg'=>$upDate['msg']]);
|
||||
}
|
||||
|
||||
//清理缓存
|
||||
$this->clearSysCache();
|
||||
//清除
|
||||
Files::delDirAndFile($this->upload_dir);
|
||||
Files::delDirAndFile($this->backup_dir);
|
||||
|
||||
//更新版本
|
||||
//Db::name('system')->update(['sys_version_num'=>$version_num,'id'=>1]);
|
||||
$setConf = new SetConf;
|
||||
//清除废弃目录和文件
|
||||
$delFiles = '../runtime/remove.txt';
|
||||
if(file_exists($delFiles)){
|
||||
$str = file_get_contents($delFiles); //将整个文件内容读入到一个字符串中
|
||||
$str = str_replace("\r\n",",",$str);
|
||||
$delArr = explode(',',$str);
|
||||
foreach($delArr as $v){
|
||||
if(is_dir($v)){
|
||||
//删除文件夹
|
||||
Files::delDirAndFile($v.'/',true);
|
||||
} else {
|
||||
//删除文件
|
||||
if(file_exists($v)){
|
||||
unlink($v);
|
||||
}
|
||||
}
|
||||
}
|
||||
unlink($delFiles);
|
||||
}
|
||||
|
||||
//更新系统的版本号了
|
||||
//更新php的版本号了(应该跟svn/git的版本号一致)
|
||||
//更新数据库的版本号了(应该跟svn/git的版本号一致)
|
||||
$value = [
|
||||
'version' => $version_num
|
||||
];
|
||||
|
||||
$upRes = $setConf->setConfig('taoler',$value);
|
||||
$result = $upRes->getData();
|
||||
if($result['code'] == -1){
|
||||
return json(['code'=>-1,'msg'=>'代码写入成功,但'.$result['msg']]);
|
||||
$res = SetArr::name('taoler')->edit($value);
|
||||
if(!$res){
|
||||
return json(['code'=>-1,'msg'=>'代码更新成功,但版本写入失败']);
|
||||
}
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'100%','msg'=>'升级成功!']);
|
||||
//清理缓存
|
||||
$this->clearSysCache();
|
||||
return json(['code'=>0,'msg'=>'升级成功']);
|
||||
|
||||
}
|
||||
|
||||
/**升级执行
|
||||
/**
|
||||
* 升级执行
|
||||
* @param string $package_file
|
||||
* @return \think\response\Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
private function execute_update(string $package_file)
|
||||
{
|
||||
//解压 zip文件有密码的话需要解密
|
||||
$uzip = new ZipFile();
|
||||
// 1.解压 zip文件有密码的话需要解密
|
||||
$zip = new Zip;
|
||||
$zipDir = strstr($package_file, '.zip',true); //返回文件名后缀前的字符串
|
||||
$zipPath = Files::getDirPath($zipDir); //转换为带/的路径 压缩文件解压到的路径
|
||||
$unzip_res = $uzip->unzip($package_file,$zipPath,true);
|
||||
$unzip_res = $zip->unzip($package_file,$zipPath);
|
||||
|
||||
if(!$unzip_res)
|
||||
{
|
||||
if(!$unzip_res) {
|
||||
return json(['code'=>-1,'msg'=>'解压失败']);
|
||||
}
|
||||
//解压成功,得到文件夹
|
||||
@ -227,22 +237,22 @@ class Upgrade extends AdminController
|
||||
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'50%','msg'=>'升级文件解压成功!']);
|
||||
|
||||
//升级sql操作
|
||||
$upSql = $zipPath.'runtime/mysql_update.sql';
|
||||
if(file_exists($upSql))
|
||||
{
|
||||
$sqlRes = $this->db_update($upSql);
|
||||
$upDate = $sqlRes->getData();
|
||||
if($upDate['code'] == -1){
|
||||
return json(['code'=>-1,'msg'=>$upDate['msg']]);
|
||||
}
|
||||
//删除sql语句
|
||||
unlink($upSql);
|
||||
}
|
||||
|
||||
//升级PHP
|
||||
if(is_dir($zipPath))
|
||||
{
|
||||
// 2.升级sql操作
|
||||
$upSql = $zipPath.'runtime/update.sql';
|
||||
if(file_exists($upSql)) {
|
||||
try{
|
||||
SqlFile::dbExecute($upSql);
|
||||
} catch (\Exception $e){
|
||||
return json(['code'=>-1,'msg'=>$e->getMessage()]);
|
||||
}
|
||||
|
||||
//删除sql语句
|
||||
unlink($upSql);
|
||||
}
|
||||
|
||||
|
||||
// 3.升级PHP
|
||||
if(is_dir($zipPath)) {
|
||||
//升级前的写入文件权限检查
|
||||
$allUpdateFiles = Files::getAllFile($zipPath);
|
||||
|
||||
@ -264,8 +274,7 @@ class Upgrade extends AdminController
|
||||
$cpRes = Files::copyDirs($zipPath,$this->root_dir);
|
||||
$cpData = $cpRes->getData();
|
||||
//更新失败
|
||||
if($cpData['code'] == -1)
|
||||
{
|
||||
if($cpData['code'] == -1) {
|
||||
//数据库回滚
|
||||
/*
|
||||
if(file_exists($this->upload_dir.'/'.$package_file.'/mysql/mysql_rockback.sql'))
|
||||
@ -280,21 +289,14 @@ class Upgrade extends AdminController
|
||||
}
|
||||
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'70%','msg'=>'升级文件执行成功!']);
|
||||
//清除
|
||||
Files::delDirAndFile($this->upload_dir);
|
||||
Files::delDirAndFile($this->backup_dir);
|
||||
|
||||
}
|
||||
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'100%','msg'=>'升级成功!']);
|
||||
//更新系统的版本号了
|
||||
//更新php的版本号了(应该跟svn/git的版本号一致)
|
||||
//更新数据库的版本号了(应该跟svn/git的版本号一致)
|
||||
|
||||
return json(['code'=>0,'msg'=>'升级文件执行成功']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理升级包上传
|
||||
* 手动处理升级包上传
|
||||
*/
|
||||
public function uploadZip()
|
||||
{
|
||||
@ -337,49 +339,34 @@ class Upgrade extends AdminController
|
||||
|
||||
//更新版本
|
||||
//Db::name('system')->update(['sys_version_num'=>$version_num,'id'=>1]);
|
||||
$setConf = new SetConf;
|
||||
|
||||
$value = [
|
||||
'version' => $version_num
|
||||
];
|
||||
$res = SetArr::name('taoler')->edit($value);
|
||||
if($res == false){
|
||||
return json(['code'=>-1,'msg'=>'代码更新成功,但版本写入失败']);
|
||||
}
|
||||
|
||||
$upRes = $setConf->setConfig('taoler',$value);
|
||||
$result = $upRes->getData();
|
||||
if($result['code'] == -1){
|
||||
return json(['code'=>-1,'msg'=>$result['msg']]);
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'升级成功']);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 数据库操作
|
||||
* 备份
|
||||
* @param string $dir
|
||||
* @param string $backDir
|
||||
* @param array $ex
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function database_operation($file)
|
||||
public function backFile(string $dir,string $backDir,array $ex)
|
||||
{
|
||||
$mysqli = new mysqli('localhost','root','root','test');
|
||||
if($mysqli->connect_errno)
|
||||
{
|
||||
return json(['code'=>0,'msg'=>'Connect failed:'.$mysqli->connect_error]);
|
||||
$backRes = Files::copydirs($dir, $backDir, $ex);
|
||||
$backData = $backRes->getData();
|
||||
if($backData['code'] == -1){
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'error','progress'=>'25%','msg'=>'备份失败!']);
|
||||
return json(['code'=>-1,'msg'=>$backRes['msg']]);
|
||||
}
|
||||
$sql = file_get_contents($file);
|
||||
$a = $mysqli->multi_query($sql);
|
||||
return ['code'=>1,'msg'=>'数据库操作OK'];
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行数据库操作
|
||||
*/
|
||||
public function db_update($file)
|
||||
{
|
||||
$sqlf = new SqlFile();
|
||||
$sql_array = $sqlf->load_sql_file($file);
|
||||
foreach($sql_array as $v){
|
||||
$sqlRes = Db::execute($v);
|
||||
if ($sqlRes === false) {
|
||||
return json(['code'=>-1,'msg'=>'数据库升级失败']);
|
||||
}
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'数据库升级成功']);
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'30%','msg'=>'执行文件备份成功!']);
|
||||
}
|
||||
|
||||
|
208
app/admin/controller/user/User.php
Normal file
208
app/admin/controller/user/User.php
Normal file
@ -0,0 +1,208 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/11
|
||||
* @FilePath: app\admin\controller\user\User.php
|
||||
* @Description: User用户管理
|
||||
* @LastEditTime: 2023-03-11 10:20:47
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\user;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\User as UserModel;
|
||||
use app\common\lib\Uploads;
|
||||
use app\common\validate\User as userValidate;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
|
||||
class User extends AdminController
|
||||
{
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
//用户表
|
||||
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$datas = Request::only(['id','name','email','sex','status']);
|
||||
$map = array_filter($datas,[$this,'filtrArr']);
|
||||
|
||||
$user = Db::name('user')->where(['delete_time'=>0])->where($map)->order('id desc')->paginate([
|
||||
'list_rows' => input('limit'),
|
||||
'page' => input('page')
|
||||
]);
|
||||
$count = $user->total();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'ok','count'=>$count];
|
||||
foreach($user as $k => $v){
|
||||
$data = [
|
||||
'id' => $v['id'],
|
||||
'username' => $v['name'],
|
||||
'nick' => $v['nickname'],
|
||||
'avatar' => $v['user_img'],
|
||||
'phone' => $v['phone'],
|
||||
'email' => $v['email'],
|
||||
'sex' => $v['sex'],
|
||||
'ip' => $v['last_login_ip'],
|
||||
'city' => $v['city'],
|
||||
'logintime' => date("Y-m-d H:i",$v['last_login_time']),
|
||||
'jointime' => date("Y-m-d",$v['create_time']),
|
||||
'check' => $v['status'],
|
||||
'auth' => $v['auth']
|
||||
];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
//添加用户
|
||||
public function add()
|
||||
{
|
||||
//
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['name','email','user_img','password','phone','sex']);
|
||||
try{
|
||||
validate(userValidate::class)
|
||||
->scene('userReg')
|
||||
->check($data);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return json(['code'=>-1,'msg'=>$e->getError()]);
|
||||
}
|
||||
$data['create_time'] = time();
|
||||
$salt = substr(md5($data['create_time']),-6);
|
||||
// 密码
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
|
||||
try {
|
||||
Db::name('user')->save($data);
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
} catch (\Exception $e) {
|
||||
$res = ['code'=>-1, 'msg'=>$e->getMessage()];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//编辑用户
|
||||
public function edit()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','name','email','user_img','password','phone','sex']);
|
||||
if(empty($data['password'])) {
|
||||
unset($data['password']);
|
||||
} else {
|
||||
$user = Db::name('user')->field('create_time')->find($data['id']);
|
||||
$salt = substr(md5($user['create_time']),-6);
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6)); // 密码
|
||||
}
|
||||
try{
|
||||
Db::name('user')->update($data);
|
||||
return json(['code'=>0,'msg'=>'编辑成功']);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code'=> -1,'msg'=>$e->getMessage()]);
|
||||
}
|
||||
}
|
||||
$user = Db::name('user')->find(input('id'));
|
||||
View::assign('user',$user);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除用户
|
||||
public function delete($id)
|
||||
{
|
||||
$ids = explode(',',$id);
|
||||
if(Request::isAjax()){
|
||||
$user =UserModel::select($ids);
|
||||
$result = $user->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//上传头像
|
||||
public function uploadImg()
|
||||
{
|
||||
$uploads = new Uploads();
|
||||
$upRes = $uploads->put('file','head_pic',2000,'image');
|
||||
$userJson = $upRes->getData();
|
||||
if($userJson['status'] == 0){
|
||||
$res = ['code'=>0,'msg'=>'上传头像成功','src'=>$userJson['url']];
|
||||
} else {
|
||||
$res = ['code'=>1,'msg'=>'上传错误'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
//审核用户
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
//获取状态
|
||||
$res = Db::name('user')->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 auth()
|
||||
{
|
||||
$data = Request::param();
|
||||
$user = Db::name('user')->save($data);
|
||||
if($user){
|
||||
if($data['auth'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置为超级管理员','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'取消超级管理员','icon'=>5]);
|
||||
}
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'前台管理员设置失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//过滤数组中为空和null的值
|
||||
public function filtrArr($arr)
|
||||
{
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@ -1,18 +1,50 @@
|
||||
<?php
|
||||
namespace app\admin\controller;
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\controller\user\Vip.php
|
||||
* @Description: Vip
|
||||
* @LastEditTime: 2023-03-14 16:48:31
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
use app\common\controller\BaseController;
|
||||
namespace app\admin\controller\user;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\UserViprule;
|
||||
|
||||
class Vip extends BaseController
|
||||
class Vip extends AdminController
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
// VIP列表
|
||||
public function list()
|
||||
{
|
||||
$keys = UserViprule::select();
|
||||
$count = $keys->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($keys as $k=>$v){
|
||||
$res['data'][] = ['id'=>$v['id'],'score'=>$v['score'],'nick'=>$v['nick'],'vip'=>$v['vip'],'ctime'=>$v['create_time']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'还没有任何vip等级设置!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//添加VIP积分规则
|
||||
public function add()
|
||||
{
|
||||
$data = Request::only(['score','vip']);
|
||||
$data = Request::only(['score','vip','nick']);
|
||||
$vip = UserViprule::where('vip',$data['vip'])->find();
|
||||
if($vip){
|
||||
$res = ['code'=>-1,'msg'=>'vip等级不能重复设置'];
|
||||
@ -26,6 +58,25 @@ class Vip extends BaseController
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//编辑VIP积分规则
|
||||
public function edit($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = UserViprule::update($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$vip = Db::name('user_viprule')->find($id);
|
||||
$level = UserViprule::column('vip');
|
||||
View::assign(['vip'=>$vip,'level'=>$level]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除VIP积分规则
|
||||
public function delete($id)
|
||||
@ -41,41 +92,5 @@ class Vip extends BaseController
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//编辑VIP积分规则
|
||||
public function vipEdit($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = UserViprule::update($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$vip = Db::name('user_viprule')->find($id);
|
||||
$level = UserViprule::column('vip');
|
||||
View::assign(['vip'=>$vip,'level'=>$level]);
|
||||
return View::fetch('set/system/vipedit');
|
||||
}
|
||||
|
||||
//显示VIP规则
|
||||
public function vipRule()
|
||||
{
|
||||
$keys = UserViprule::select();
|
||||
$count = $keys->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($keys as $k=>$v){
|
||||
$res['data'][] = ['id'=>$v['id'],'score'=>$v['score'],'nick'=>$v['nick'],'vip'=>$v['vip'],'ctime'=>$v['create_time']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'还没有任何vip等级设置!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
@ -122,5 +122,15 @@ return [
|
||||
'in' => 'in',
|
||||
'accumulate points' => 'Accumulate points',
|
||||
'my post' => 'My post',
|
||||
'my auth' => 'My authorize'
|
||||
'my auth' => 'My authorize',
|
||||
'Please log in 10 minutes later' => 'Please log in 10 minutes later',
|
||||
'Login error 3, Please log in 10 minutes later' => 'Login error 3, Please log in 10 minutes later',
|
||||
'Account disabled' => 'Account disabled',
|
||||
'Pending approval' => 'Pending approval',
|
||||
|
||||
'Authorized' => 'Authorized',
|
||||
'Unauthorized' => 'Unauthorized',
|
||||
'Free version'=> 'Free version',
|
||||
'username or email' => 'Username or email',
|
||||
'account or password cannot empty' => 'Account or password cannot empty'
|
||||
];
|
@ -6,6 +6,67 @@ return [
|
||||
'chinese' => '中文简体',
|
||||
'english' => 'english',
|
||||
|
||||
//菜单
|
||||
'System' => '系统',
|
||||
'Account' => '账户',
|
||||
'Apps' => '应用',
|
||||
'Addon' => '插件',
|
||||
'Set' => '设置',
|
||||
'Server' => '服务',
|
||||
'Content' => '内容',
|
||||
'Account management' => '账户管理',
|
||||
'Account list' => '账户列表',
|
||||
'Add account' => '添加账户',
|
||||
'Edit account' => '编辑账户',
|
||||
'Delete account' => '删除账户',
|
||||
'Check account' => '审核账户',
|
||||
'Account info' => '账户信息',
|
||||
'Edit account info' => '修改账户信息',
|
||||
'Set account info' => '保存账户信息',
|
||||
'View admin password' => '改密码页',
|
||||
'Reset admin password' => '重设密码',
|
||||
'Clear cache' => '清理缓存',
|
||||
'Logout' => '退出登录',
|
||||
'Role management' => '角色管理',
|
||||
'Add role' => '添加角色',
|
||||
'Edit role' => '编辑角色',
|
||||
'Delete role' => '删除角色',
|
||||
'Check role' => '审核角色',
|
||||
'Rule management' => '权限管理',
|
||||
'Rule list' => '权限列表',
|
||||
'Add rule' => '添加权限',
|
||||
'Edit rule' => '编辑权限',
|
||||
'Delete rule' => '删除权限',
|
||||
'Check rule' => '审核权限',
|
||||
'Rule tree' => '权限树',
|
||||
'Rule sort' => '权限排序',
|
||||
'Upgrade' => '系统升级',
|
||||
'Upgrade key' => '升级密钥',
|
||||
'Upgrade check' => '升级检查',
|
||||
'Edit key' => '改更密钥',
|
||||
'Upgrade system' => '更新系统',
|
||||
'Upload zip' => '上传zip',
|
||||
'Back file' => '备份文件',
|
||||
'Web' => '网站设置',
|
||||
'Website' => '提交设置',
|
||||
'Web config' => '配置项目',
|
||||
'Set domain' => '设置域名',
|
||||
'Bind map' => '绑定Map',
|
||||
'Set url' => 'URL美化',
|
||||
'web upload' => '上传图片',
|
||||
'User management' => '用户管理',
|
||||
'User list' => '用户列表',
|
||||
'Add user' => '添加用户',
|
||||
'Edit user' => '编辑用户',
|
||||
'Delete user' => '删除用户',
|
||||
'Check user' => '审核用户',
|
||||
'Superuser' => '超级用户',
|
||||
'Upload avatar' => '上传头像',
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//弹窗提示消息
|
||||
'add' => '添加',
|
||||
'delete' => '删除',
|
||||
@ -133,5 +194,7 @@ return [
|
||||
'Authorized' => '已授权',
|
||||
'Unauthorized' => '未授权',
|
||||
'Free version'=> '免费版',
|
||||
'username or email' => '用户名或邮箱',
|
||||
'account or password cannot empty' => '账号和密码不能为空'
|
||||
|
||||
];
|
@ -123,7 +123,17 @@ return [
|
||||
'in' => '在',
|
||||
'accumulate points' => '積分',
|
||||
'my post' => '我的帖子',
|
||||
'my auth' => '我的授权'
|
||||
'my auth' => '我的授权',
|
||||
'Please log in 10 minutes later' => '请10分钟后再登陆',
|
||||
'Login error 3, Please log in 10 minutes later' => '连续登陆错误3次,请10分钟后登录',
|
||||
'Account disabled' => '账号被禁用,请联系管理员',
|
||||
'Pending approval' => '待审核,请联系管理员',
|
||||
|
||||
'Authorized' => '已授权',
|
||||
'Unauthorized' => '未授权',
|
||||
'Free version'=> '免费版',
|
||||
'username or email' => '用户名或邮箱',
|
||||
'account or password cannot empty' => '账号和密码不能为空'
|
||||
|
||||
|
||||
];
|
@ -1,7 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
// 检测安装
|
||||
\app\middleware\Install::class,
|
||||
// 权限检测
|
||||
app\middleware\Auth::class,
|
||||
//'logedcheck' => \app\middleware\logedCheck::class,
|
||||
app\middleware\AdminLoginCookie::class,
|
||||
];
|
3
app/admin/model/.gitignore
vendored
3
app/admin/model/.gitignore
vendored
@ -1,2 +1 @@
|
||||
Version.php
|
||||
Plugins.php
|
||||
/addons
|
25
app/admin/model/Addons.php
Normal file
25
app/admin/model/Addons.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <317927823@qq.com>
|
||||
* @Date: 2022-07-02 10:39:43
|
||||
* @LastEditTime: 2022-07-02 10:42:19
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 优化版
|
||||
* @FilePath: \TaoLer\app\admin\model\Addons.php
|
||||
* Copyright (c) 2020~2022 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
|
||||
class Addons extends Model
|
||||
{
|
||||
//软删除
|
||||
use SoftDelete;
|
||||
protected $deleteTime = 'delete_time';
|
||||
protected $defaultSoftDelete = 0;
|
||||
protected $createTime = 'false';
|
||||
|
||||
}
|
@ -1,4 +1,12 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\model\Admin.php
|
||||
* @Description: Admin
|
||||
* @LastEditTime: 2023-03-14 16:50:41
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
@ -16,6 +24,12 @@ class Admin extends Model
|
||||
use SoftDelete;
|
||||
protected $deleteTime = 'delete_time';
|
||||
protected $defaultSoftDelete = 0;
|
||||
protected $createTime = 'false';
|
||||
|
||||
//自动对password进行md5加密
|
||||
protected function setPasswordAttr($value){
|
||||
return md5($value);
|
||||
}
|
||||
|
||||
//管理员关联角色
|
||||
/*
|
||||
@ -45,17 +59,19 @@ class Admin extends Model
|
||||
public function login($data)
|
||||
{
|
||||
//查询用户
|
||||
$admin = Db::name('admin')->where('username',$data['username'])->where('delete_time',0)->find();
|
||||
$admin = $this->where('username',$data['username'])->where('delete_time',0)->find();
|
||||
|
||||
if(is_null($admin)){
|
||||
return '用户名或密码错误';
|
||||
return json(['code'=>-1,'msg'=>'用户名或密码错误']);
|
||||
}
|
||||
if($admin['status'] !=1){
|
||||
return '用户被禁用或未审核,请联系管理员';
|
||||
return json(['code' => -1,'msg'=> '用户被禁用或未审核,请联系管理员']);
|
||||
}
|
||||
//对输入的密码字段进行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
|
||||
@ -77,7 +93,45 @@ class Admin extends Model
|
||||
);
|
||||
|
||||
//用户名密码正确返回1
|
||||
return 1;
|
||||
}
|
||||
$res = ['code'=>0,'msg'=>'登陆成功', 'url'=>(string) url('index/index')];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'用户名或密码错误','url'=>(string) url('admin/login')];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//修改密码
|
||||
public function setpass($data)
|
||||
{
|
||||
$admin = $this->find($data['admin_id']);
|
||||
$salt = substr(md5($admin['create_time']),-6);
|
||||
$oldPassword = $this->pass($salt,$data['oldPassword']);
|
||||
if($oldPassword != $admin['password']){
|
||||
return json(['code'=>-1,'msg'=>'当前密码错误']);
|
||||
}
|
||||
|
||||
if($data['password'] != $data['repassword']){
|
||||
return json(['code'=>-1,'msg'=>'两次密码不一致']);
|
||||
}
|
||||
|
||||
$data['password'] = substr_replace(md5($data['password']),$salt,0,6);
|
||||
$admin->password = $data['password'];
|
||||
$result = $admin->save();
|
||||
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'修改密码成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'修改密码失败'];
|
||||
}
|
||||
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//加密规则 加密字符串,原始秘密
|
||||
protected function pass($salt, $pass)
|
||||
{
|
||||
$pwd = substr_replace(md5($pass),$salt,0,6);
|
||||
return md5($pwd);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,9 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\model\AuthRule.php
|
||||
* @Description: AuthRule
|
||||
* @LastEditTime: 2023-03-14 16:51:30
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
use think\facade\Lang;
|
||||
|
||||
class AuthRule extends Model
|
||||
{
|
||||
@ -16,22 +25,72 @@ class AuthRule extends Model
|
||||
{
|
||||
$query->where('id', $value );
|
||||
}
|
||||
//登陆校验
|
||||
public function authRuleTree()
|
||||
|
||||
/**
|
||||
* 获取权限列表
|
||||
* @return \think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getAuthRuleTree()
|
||||
{
|
||||
$authRules = $this->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;
|
||||
}
|
||||
$authRules = $this->field('id,pid,title,name,icon,status,ismenu,sort,create_time')->select()->toArray();
|
||||
//数组排序
|
||||
$cmf_arr = array_column($authRules, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $authRules);
|
||||
|
||||
if(count($authRules)) {
|
||||
return json(['code'=>0,'msg'=>'ok','data'=>$authRules]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'no data','data'=>'']);
|
||||
}
|
||||
}
|
||||
|
||||
public function saveRule($data)
|
||||
{
|
||||
$res = $this->save($data);
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'权限成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'权限失败']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限菜单数组
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getAuthRuleArray()
|
||||
{
|
||||
$authRules = $this->field('id,pid,title,name,icon,status,ismenu,sort,create_time')->select()->toArray();
|
||||
$ruls = [];
|
||||
foreach($authRules as $v) {
|
||||
$ruls[] = [
|
||||
'powerId' => $v['id'],
|
||||
'powerName' => Lang::get($v['title']),
|
||||
'powerType' => $v['ismenu'],
|
||||
'powerCode' => '',
|
||||
"powerUrl" => $v['name'],
|
||||
"openType" => null,
|
||||
"parentId" => $v['pid'],
|
||||
"icon" => $v['icon'],
|
||||
"sort" => $v['sort'],
|
||||
"enable" => $v['status'],
|
||||
"checkArr" => "0"
|
||||
|
||||
];
|
||||
}
|
||||
//数组排序
|
||||
$cmf_arr = array_column($ruls, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $ruls);
|
||||
|
||||
if(count($ruls)) {
|
||||
return json(['code' => 0, 'msg' => 'ok', 'count' => count($ruls), 'data'=>$ruls]);
|
||||
} else {
|
||||
return json(['code' => 0, 'msg' => 'no data','count' => null,'data'=>'']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
63
app/admin/model/PushJscode.php
Normal file
63
app/admin/model/PushJscode.php
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <alipey_tao@qq.com>
|
||||
* @Date: 2022-04-20 10:45:41
|
||||
* @LastEditTime: 2022-04-20 12:34:40
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 搜索引擎SEO优化设置
|
||||
* @FilePath: \TaoLer\app\admin\model\PushJscode.php
|
||||
* Copyright (c) 2020~2022 http://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class PushJscode extends Model
|
||||
{
|
||||
/**
|
||||
* 保存代码
|
||||
*
|
||||
* @param [type] $data
|
||||
* @return void
|
||||
*/
|
||||
public function saveCode($data)
|
||||
{
|
||||
$res = $this->save($data);
|
||||
if($res == true) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有数据
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getAllCodes()
|
||||
{
|
||||
//
|
||||
return $this->select();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param [type] $id
|
||||
* @return void
|
||||
*/
|
||||
public function delCode($id)
|
||||
{
|
||||
//
|
||||
$res = $this::destroy($id);
|
||||
|
||||
if($res == true) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,11 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/14
|
||||
* @FilePath: app\admin\model\System.php
|
||||
* @Description: System
|
||||
* @LastEditTime: 2023-03-14 16:52:00
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\facade\Cache;
|
||||
|
||||
|
||||
class System extends Model
|
||||
{
|
||||
|
||||
|
@ -1,15 +1,24 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
/*
|
||||
* @Author: TaoLer <alipay_tao@qq.com>
|
||||
* @Date: 2021-12-06 16:04:50
|
||||
* @LastEditTime: 2022-08-15 16:17:32
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: admin路由配置
|
||||
* @FilePath: \TaoLer\app\admin\route\route.php
|
||||
* Copyright (c) 2020~2022 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
use think\facade\Route;
|
||||
//Route::get('jie/:id','index/article/detail');
|
||||
|
||||
// 动态详情页URL别称
|
||||
$detail_as = config('taoler.url_rewrite.article_as');
|
||||
|
||||
Route::get('captcha/[:config]','\\think\\captcha\\CaptchaController@index');
|
||||
Route::get('jie/:id', 'article/detail');
|
||||
Route::get("$detail_as<id>$", '\app\index\controller\Article@detail')
|
||||
->pattern([
|
||||
//'name' => '\w+',
|
||||
'id' => '\d+',
|
||||
])
|
||||
->name('article_detail');
|
||||
|
||||
|
||||
|
1
app/admin/validate/.gitignore
vendored
Normal file
1
app/admin/validate/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/addons
|
9
app/admin/view/.gitignore
vendored
9
app/admin/view/.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
/key_auth
|
||||
/time_line
|
||||
/version
|
||||
/plugins
|
||||
/addons
|
||||
/apps
|
||||
/server
|
||||
|
||||
|
||||
|
107
app/admin/view/addon/addons/add.html
Normal file
107
app/admin/view/addon/addons/add.html
Normal file
@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">压缩包</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_src" lay-verify="required" placeholder="请上传zip包" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button style="float: left;" type="button" class="layui-btn " id="layuiadmin-upload-addons">上传插件</button>
|
||||
</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="addon-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'upload'], function() {
|
||||
var $ = layui.$, form = layui.form, upload = layui.upload;
|
||||
|
||||
let ADDON_ADD = "{:url('addon.addons/add')}";
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-addons'
|
||||
, url: 'uploadZip'
|
||||
, accept: 'file'
|
||||
, field: 'file'
|
||||
, method: 'get'
|
||||
, exts: 'zip|rar|7z'
|
||||
, done: function (res) {
|
||||
$(this.item).prev("div").children("input").val(res.src)
|
||||
|
||||
if (res.code == 0) {
|
||||
layer.msg(res.msg, {
|
||||
icon: 6,
|
||||
tiye: 2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title: "上传失败",
|
||||
content: res.msg,
|
||||
icon: 5,
|
||||
anim: 6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
form.on('submit(addon-save)', function (data) {
|
||||
$.ajax({
|
||||
url: ADDON_ADD,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function (result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function () {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
//parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
89
app/admin/view/addon/addons/config.html
Normal file
89
app/admin/view/addon/addons/config.html
Normal file
@ -0,0 +1,89 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>表单配置</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 30px 0 0;">
|
||||
{foreach name="formData" item="vo" key="k"}
|
||||
{php}$name = "params[".$k."]";{/php}
|
||||
{switch name="$vo.type"}
|
||||
{case value="text"}
|
||||
{:form_input($name,'text',['label'=>$vo.title,'verify'=>$vo.rule,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="textarea"}
|
||||
{:form_textarea($name,['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="password"}
|
||||
{:form_input($name,'password',['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="radio"}
|
||||
{:form_radio($name,$vo.content,['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="checkbox"}
|
||||
{:form_checkbox($name, $vo.content,['label'=>$vo.title, 'verify' =>$vo.rule,'tips'=>$vo.tips,], $vo['value'])}
|
||||
{/case}
|
||||
{case value="switch"}
|
||||
{:form_switch($name, $vo.content,['label'=>$vo.title, 'verify' =>$vo.rule,'tips'=>$vo.tips,], $vo['value'])}
|
||||
{/case}
|
||||
{case value="select"}
|
||||
{:form_select($name,$vo.content,['label'=>$vo.title,'verify'=>$vo.rule,'tips'=>$vo.tips,'search'=>1] ,[],$vo.value)}
|
||||
{/case}
|
||||
{case value="selects"}
|
||||
{:form_select($name,$vo.content,['label'=>$vo.title,'multipsle'=>1.,'verify'=>$vo.rule,'tips'=>$vo.tips,'search'=>1] ,[],$vo.value)}
|
||||
{/case}
|
||||
{case value="image"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'radio','num'=>'1','mime'=>'images'])}
|
||||
{/case}
|
||||
{case value="images"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'checkbox','num'=>$vo.num,'mime'=>'images'])}
|
||||
{/case}
|
||||
{case value="file"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'radio','num'=>$vo.num,'mime'=>'*'])}
|
||||
{/case}
|
||||
{case value="files"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'checkbox','num'=>$vo.num,'mime'=>'*'])}
|
||||
{/case}
|
||||
{case value="editor"}
|
||||
{:form_editor($name,2,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule])}
|
||||
{/case}
|
||||
{case value="array"}
|
||||
{:form_arrays($name,$vo.value?$vo.value:$vo.content,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule])}
|
||||
{/case}
|
||||
{/switch}
|
||||
{/foreach}
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="hidden" name="name" value="{:input('name')}">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-config-submit" id="LAY-addons-config-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(['upload','toast'], function(){
|
||||
var $ = layui.$,upload = layui.upload,form = layui.form,notify=layui.notify;
|
||||
//上传
|
||||
upload.render({
|
||||
elem: '.upload-select'
|
||||
,url: "{:url('addon.addons/uploads')}"
|
||||
,data: {type:'image'}
|
||||
,accept: 'images'
|
||||
,method: 'get'
|
||||
,acceptMime: 'image/*'
|
||||
,done: function(res){
|
||||
$(this.item).prevAll("input").val(res.url);
|
||||
if(res.status === 0){
|
||||
toast.success({title:"成功",message:res.msg,position: 'topRight'});
|
||||
} else {
|
||||
toast.error({title:"失败",message:res.msg,position: 'topRight'});
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
93
app/admin/view/addon/addons/edit.html
Normal file
93
app/admin/view/addon/addons/edit.html
Normal file
@ -0,0 +1,93 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" value="{$addons.id}">
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{$addons.addons_name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_version" lay-verify="required" placeholder="请输入版本" autocomplete="off" class="layui-input" value="{$addons.addons_version}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">作者</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_auther" lay-verify="required" placeholder="请输入作者名" autocomplete="off" class="layui-input" value="{$addons.addons_auther}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">简介</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea name="addons_resume" placeholder="请输入简介" lay-verify="required" class="layui-textarea">{$addons.addons_resume}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">价格</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_price" lay-verify="required" placeholder="请输入价格" autocomplete="off" class="layui-input" value="{$addons.addons_price}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">压缩包</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_src" lay-verify="required" placeholder="请上传zip包" autocomplete="off" class="layui-input" value="{$addons.addons_src}">
|
||||
</div>
|
||||
<button style="float: left;" type="button" class="layui-btn " id="layuiadmin-upload-addons">上传插件</button>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-submit" id="LAY-addons-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'upload'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,upload = layui.upload ;
|
||||
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-addons'
|
||||
,url: 'uploadZip'
|
||||
,accept: 'file'
|
||||
,field: 'file'
|
||||
,method: 'get'
|
||||
,exts: 'zip|rar|7z'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.src);
|
||||
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
tiye:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:"上传失败",
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
203
app/admin/view/addon/addons/index.html
Normal file
203
app/admin/view/addon/addons/index.html
Normal file
@ -0,0 +1,203 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>插件管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="addons-list" lay-filter="addons-list"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbar">
|
||||
<div class="layui-btn-group">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="allAddons">全部</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="freeAddons">免费</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="payAddons">付费</button>
|
||||
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="installed">已安装</button>
|
||||
<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="add">离线安装</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="addons-bar">
|
||||
{{# if(d.have_newversion === 1){ }}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="install" data-url="{:url('addon.addons/upgrade')}" data-userlogin="{:url('addon.addons/userLogin')}" data-ispay="{:url('addon.addons/isPay')}"><i class="layui-icon layui-icon-upload-circle"></i>升级</a>
|
||||
{{# } else { }}
|
||||
{{# if(d.isInstall === 1) { }}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config" data-url="{:url('addon.addons/config')}"><i class="layui-icon layui-icon-set"></i>设置</a>
|
||||
{{# } else { }}
|
||||
<a class="layui-btn layui-btn-xs" lay-event="install" data-url="{:url('addon.addons/install')}" data-userlogin="{:url('addon.addons/userLogin')}" data-ispay="{:url('addon.addons/isPay')}"><i class="layui-icon layui-icon-edit"></i>安装</a>
|
||||
<select id="vers{{d.name}}" name="sss" class="layui-border" lay-ignore lay-filter="versSelect">
|
||||
{{# d.vers.forEach(function(item, index){ }}
|
||||
<option value="{{ item }}">{{ item }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="buttonStatus">
|
||||
<input type="checkbox" name="{{d.name}}" lay-skin="switch" lay-filter="addonsStatus" lay-text="启动|禁用" {{# if(d.status == 1){ }} checked {{# } }} data-url="{:url('addon.addons/check')}">
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="addons-installed-tool">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config" data-url="{:url('addon.addons/config')}"><i class="layui-icon layui-icon-set"></i>设置</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="uninstall" data-url="{:url('addon.addons/uninstall')}"><i class="layui-icon layui-icon-delete"></i>卸载</a>
|
||||
</script>
|
||||
|
||||
|
||||
{include file="public/user_login" /}
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
var addonList = "{:url('addon.addons/getList')}";
|
||||
|
||||
|
||||
layui.use(['addons','table','form','upload','toast'], function(){
|
||||
var $ = layui.jquery
|
||||
,table = layui.table
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
var toast = layui.toast;
|
||||
|
||||
let LIST_URL = "{:url('addon.addons/list')}";
|
||||
|
||||
let cols = [[
|
||||
{type: 'checkbox'},
|
||||
{title: '序号', type: 'numbers'},
|
||||
{field: 'title', title: '插件', width: 200},
|
||||
{field: 'description', title: '简介', minWidth: 200},
|
||||
{field: 'author', title: '作者', width: 100},
|
||||
{field: 'price', title: '价格(元)', width: 85},
|
||||
{field: 'downloads', title: '下载', width: 70},
|
||||
{field: 'version', title: '版本', templet: '<div>{{d.version}} {{# if(d.have_newversion == 1){ }}<span class="layui-badge-dot"></span>{{# } }}</div>', width: 75},
|
||||
{field: 'status', title: '在线', width: 70},
|
||||
{title: '操作', width: 165, align: 'center', toolbar: '#addons-bar'}
|
||||
]];
|
||||
|
||||
let col = [[
|
||||
{type: 'numbers'},
|
||||
{field: 'name', title: '插件', width: 120},
|
||||
{field: 'title',title: '标题', width: 100},
|
||||
{field: 'version', title: '版本'},
|
||||
{field: 'author', title: '作者', width: 80},
|
||||
{field: 'description', title: '简介', minWidth: 200},
|
||||
{field: 'install', title: '安装', width: 100},
|
||||
{field: 'ctime', title: '到期时间', width: 100},
|
||||
{field: 'status', title: '状态', width: 95, templet: '#buttonStatus'},
|
||||
{title: '操作', width: 160, 'align': 'center', toolbar: '#addons-installed-tool'}
|
||||
]];
|
||||
|
||||
//渲染表格
|
||||
var addonTable = table.render({
|
||||
elem: "#addons-list",
|
||||
toolbar: "#toolbar",
|
||||
defaultToolbar: [],
|
||||
url: LIST_URL,
|
||||
cols: cols,
|
||||
page: true,
|
||||
limit: 15,
|
||||
text: "对不起,加载出现异常!",
|
||||
});
|
||||
|
||||
// table.on('tool(addons-list)',function(obj){
|
||||
// console.log(obj)
|
||||
// if (obj.event === 'remove') {
|
||||
// window.remove(obj);
|
||||
// } else if (obj.event === 'edit') {
|
||||
// window.edit(obj);
|
||||
// }
|
||||
// })
|
||||
|
||||
|
||||
table.on('toolbar(addons-list)', function(obj){
|
||||
if(obj.event === 'installed'){
|
||||
window.installed(obj.event);
|
||||
} else if(obj.event === 'add'){
|
||||
//window.add();
|
||||
} else {
|
||||
// all,free,pay
|
||||
window.all(obj.event);
|
||||
}
|
||||
});
|
||||
|
||||
window.all = function (type) {
|
||||
$.post(LIST_URL,{type: type}, function (res){
|
||||
if(res.code === 0) {
|
||||
// 重新渲染
|
||||
table.reload('addons-list',{
|
||||
url: LIST_URL,
|
||||
where: {
|
||||
type : type
|
||||
},
|
||||
cols: cols,
|
||||
page: {
|
||||
curr: 1 //重新从第 1 页开始
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
window.installed = function (type) {
|
||||
$.get(LIST_URL,{type: type}, function (res){
|
||||
if(res.code === 0) {
|
||||
// 重新渲染
|
||||
table.reload('addons-list',{
|
||||
url: LIST_URL,
|
||||
where: {
|
||||
type : type
|
||||
},
|
||||
cols: col,
|
||||
page: {
|
||||
curr: 1 //重新从第 1 页开始
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
window.add = function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加插件'
|
||||
,content: 'add.html'
|
||||
,area: ['400px', '300px']
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
form.render('select'); // 渲染所在容器内的 select 元素
|
||||
//监听版本选择
|
||||
form.on('select(versSelect)', function(obj){
|
||||
layer.tips(this.value + ' ' + this.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
|
||||
|
||||
// 启动禁用
|
||||
form.on('switch(addonsStatus)', function(data){
|
||||
var data = data.elem;
|
||||
var url = $(this).data('url');
|
||||
//执行帖子审核
|
||||
$.post(url,{ name: data.name },function(res){
|
||||
if(res.code === 0){
|
||||
toast.success({title:"成功消息",message:res.msg,position: 'topRight'});
|
||||
} else {
|
||||
toast.error({title:"失败消息",message:res.msg,position: 'topRight'});
|
||||
}
|
||||
table.reloadData("addons-list",{},'deep');
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
75
app/admin/view/addon/addons/pay.html
Normal file
75
app/admin/view/addon/addons/pay.html
Normal file
@ -0,0 +1,75 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>支付</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<style>
|
||||
.layui-container{background-color: #F9F9F9}
|
||||
.auth-type{margin: 10px 0px;}
|
||||
.order-info{margin:10px 0px; line-height: 30px;}
|
||||
.pay-type{line-height: 50px;}
|
||||
.soft-info{margin: 10px;}
|
||||
.pay-tips{line-height:20px;text-align: center;margin-bottom: 20px;}
|
||||
</style>
|
||||
<body>
|
||||
<div class="layui-container">
|
||||
<div class="layui-row">
|
||||
<div class="auth-type">
|
||||
授权
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="order-info">
|
||||
<p>订单标题:<em>{$orderData.subject}</em></p>
|
||||
<p>订单编号:<em>{$orderData.out_trade_no}</em></p>
|
||||
<p>订单价格:<em class="scanpay-price">¥{$orderData.total_amount}</em> 元</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-sm6">
|
||||
<div class="pay-type">
|
||||
<div style="padding: 5px; text-align: center;"><img src="/static/res/images/alipay.jpg" style="height:80px;"></div>
|
||||
</div>
|
||||
<div class="soft-info">
|
||||
<div>不支持退款</div>
|
||||
<br />
|
||||
<div>软件协议:本软件为原作者拥有版权权限,购买软件可以商用,禁止出售第三方行为。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-sm6">
|
||||
<div class="qrcode" data-text="支付宝当面付" style="padding: 5px; text-align: center;">
|
||||
<img src="{$orderData.qr_code_img}">
|
||||
</div>
|
||||
<div class="pay-tips">
|
||||
<p>请使用支付宝扫一扫<br>扫描二维码进行支付</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script type="text/javascript">
|
||||
layui.use(['jquery'], function() {
|
||||
var $ = layui.jquery;
|
||||
var out_trade_no = "{$orderData.out_trade_no}";
|
||||
let URL = 'https://www.aieok.com/pay/checkstatus.html?out_trade_no=' + out_trade_no;
|
||||
var interval = setInterval(function () {
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: URL,
|
||||
data: {out_trade_no: out_trade_no},
|
||||
dataType: "json",
|
||||
success: function (res) {
|
||||
// 等等支付时,一直轮询
|
||||
if (res.code !== 0) {
|
||||
clearInterval(interval);
|
||||
}
|
||||
}
|
||||
})
|
||||
}, 2500);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
78
app/admin/view/addon/template/index.html
Normal file
78
app/admin/view/addon/template/index.html
Normal file
@ -0,0 +1,78 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>数据卡片</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form layui-form-pane">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡片标题</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="realName" id="realName" placeholder="" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">卡片名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="username" id="username" placeholder="" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i>
|
||||
搜 索</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-btn"><i class="layui-icon"></i>
|
||||
获取数据</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-checked-btn"><i class="layui-icon"></i>
|
||||
获取选中数据</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="currentTableId"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['table', 'layer', 'form', 'jquery', 'card'], function() {
|
||||
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let layer = layui.layer;
|
||||
let card = layui.card;
|
||||
|
||||
card.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/static/admin/data/card.json', // 接口数据
|
||||
data: [], // 静态数据
|
||||
page: true, // 是否分页
|
||||
limit: 8, // 每页数量
|
||||
linenum: 4, // 每行数量
|
||||
clickItem: function(data){ // 单击事件
|
||||
console.log(data)
|
||||
}
|
||||
})
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function(data) {
|
||||
queryJson = data.field;
|
||||
card.reload("currentTableId", {
|
||||
where: queryJson,
|
||||
});
|
||||
return false;
|
||||
});
|
||||
form.on('submit(data-checked-btn)', function() {
|
||||
var data = card.getChecked("currentTableId");
|
||||
layer.msg(JSON.stringify(data));
|
||||
return false;
|
||||
});
|
||||
form.on('submit(data-btn)', function() {
|
||||
var data = card.getAllData("currentTableId");
|
||||
layer.msg(JSON.stringify(data));
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
92
app/admin/view/addons/add.html
Normal file
92
app/admin/view/addons/add.html
Normal file
@ -0,0 +1,92 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 40px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_version" lay-verify="required" placeholder="请输入版本" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">作者</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_auther" lay-verify="required" placeholder="请输入作者名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">简介</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea name="addons_resume" placeholder="请输入简介" lay-verify="required" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">价格</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_price" lay-verify="required" placeholder="请输入价格" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">压缩包</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_src" lay-verify="required" placeholder="请上传zip包" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button style="float: left;" type="button" class="layui-btn " id="layuiadmin-upload-addons">上传插件</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-submit" id="LAY-addons-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'upload'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,upload = layui.upload ;
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-addons'
|
||||
,url: 'uploadZip'
|
||||
,accept: 'file'
|
||||
,field: 'file'
|
||||
,method: 'get'
|
||||
,exts: 'zip|rar|7z'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.src)
|
||||
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
tiye:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:"上传失败",
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
85
app/admin/view/addons/config.html
Normal file
85
app/admin/view/addons/config.html
Normal file
@ -0,0 +1,85 @@
|
||||
{extend name="public/base" /}
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 30px 0 0;">
|
||||
{foreach name="formData" item="vo" key="k"}
|
||||
{php}$name = "params[".$k."]";{/php}
|
||||
{switch name="$vo.type"}
|
||||
{case value="text"}
|
||||
{:form_input($name,'text',['label'=>$vo.title,'verify'=>$vo.rule,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="textarea"}
|
||||
{:form_textarea($name,['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="password"}
|
||||
{:form_input($name,'password',['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="radio"}
|
||||
{:form_radio($name,$vo.content,['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="checkbox"}
|
||||
{:form_checkbox($name, $vo.content,['label'=>$vo.title, 'verify' =>$vo.rule,'tips'=>$vo.tips,], $vo['value'])};
|
||||
{/case}
|
||||
{case value="switch"}
|
||||
{:form_switch($name, $vo.content,['label'=>$vo.title, 'verify' =>$vo.rule,'tips'=>$vo.tips,], $vo['value'])};
|
||||
{/case}
|
||||
{case value="select"}
|
||||
{:form_select($name,$vo.content,['label'=>$vo.title,'verify'=>$vo.rule,'tips'=>$vo.tips,'search'=>1] ,[],$vo.value)}
|
||||
{/case}
|
||||
{case value="selects"}
|
||||
{:form_select($name,$vo.content,['label'=>$vo.title,'multipsle'=>1.,'verify'=>$vo.rule,'tips'=>$vo.tips,'search'=>1] ,[],$vo.value)}
|
||||
{/case}
|
||||
{case value="image"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'radio','num'=>'1','mime'=>'images'])}
|
||||
{/case}
|
||||
{case value="images"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'checkbox','num'=>$vo.num,'mime'=>'images'])}
|
||||
{/case}
|
||||
{case value="file"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'radio','num'=>$vo.num,'mime'=>'*'])}
|
||||
{/case}
|
||||
{case value="files"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'checkbox','num'=>$vo.num,'mime'=>'*'])}
|
||||
{/case}
|
||||
{case value="editor"}
|
||||
{:form_editor($name,2,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule])}
|
||||
{/case}
|
||||
{case value="array"}
|
||||
{:form_arrays($name,$vo.value?$vo.value:$vo.content,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule])}
|
||||
{/case}
|
||||
{/switch}
|
||||
{/foreach}
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="hidden" name="name" value="{:input('name')}">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-config-submit" id="LAY-addons-config-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'upload','notify'], function(){
|
||||
var $ = layui.$,upload = layui.upload,form = layui.form,notify=layui.notify;
|
||||
//上传头像
|
||||
upload.render({
|
||||
elem: '.upload-select'
|
||||
,url: "{:url('Addons/uploads')}"
|
||||
,data: {type:'image'}
|
||||
,accept: 'images'
|
||||
,method: 'get'
|
||||
,acceptMime: 'image/*'
|
||||
,done: function(res){
|
||||
$(this.item).prevAll("input").val(res.url);
|
||||
if(res.status == 0){
|
||||
notify.success(res.msg);
|
||||
} else {
|
||||
notify.error(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
93
app/admin/view/addons/edit.html
Normal file
93
app/admin/view/addons/edit.html
Normal file
@ -0,0 +1,93 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" value="{$addons.id}">
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{$addons.addons_name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_version" lay-verify="required" placeholder="请输入版本" autocomplete="off" class="layui-input" value="{$addons.addons_version}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">作者</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_auther" lay-verify="required" placeholder="请输入作者名" autocomplete="off" class="layui-input" value="{$addons.addons_auther}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">简介</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea name="addons_resume" placeholder="请输入简介" lay-verify="required" class="layui-textarea">{$addons.addons_resume}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">价格</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_price" lay-verify="required" placeholder="请输入价格" autocomplete="off" class="layui-input" value="{$addons.addons_price}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">压缩包</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_src" lay-verify="required" placeholder="请上传zip包" autocomplete="off" class="layui-input" value="{$addons.addons_src}">
|
||||
</div>
|
||||
<button style="float: left;" type="button" class="layui-btn " id="layuiadmin-upload-addons">上传插件</button>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-submit" id="LAY-addons-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'upload'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,upload = layui.upload ;
|
||||
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-addons'
|
||||
,url: 'uploadZip'
|
||||
,accept: 'file'
|
||||
,field: 'file'
|
||||
,method: 'get'
|
||||
,exts: 'zip|rar|7z'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.src);
|
||||
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
tiye:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:"上传失败",
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -3,91 +3,74 @@
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
插件分类
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<select name="id" lay-filter="LAY-user-adminrole-type">
|
||||
<option value="">全部插件</option>
|
||||
<option value="">支付</option>
|
||||
<option value="">第三方登陆</option>
|
||||
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-btn-group" style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layuiadmin-btn-admin" data-type="batchdel">刷新</button>
|
||||
<button class="layui-btn layuiadmin-btn-admin" data-type="add">离线安装</button>
|
||||
</div>
|
||||
<div class="layui-btn-group" style="padding-bottom: 10px;">
|
||||
<button type="button" class="layui-btn">全部</button>
|
||||
<button type="button" class="layui-btn">免费</button>
|
||||
<button type="button" class="layui-btn">付费</button>
|
||||
<button type="button" class="layui-btn">已安装</button>
|
||||
</div>
|
||||
<table id="addons-list" lay-filter="addons-list"></table>
|
||||
<script type="text/html" id="addons-tool">
|
||||
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="install"><i class="layui-icon layui-icon-edit"></i>安装</a>
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>卸载</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<table id="addons-list" lay-filter="addons-list"></table>
|
||||
|
||||
<script type="text/html" id="toolbar">
|
||||
<div class="layui-btn-group" style="padding-bottom: 10px;">
|
||||
<a type="button" class="layui-btn layui-btn-sm" lay-event="allAddons" data-url="{:url('addons/index',['type'=>'onlineAddons','selector'=>'all'])}">全部</a>
|
||||
<a type="button" class="layui-btn layui-btn-sm" lay-event="freeAddons" data-url="{:url('addons/index',['type'=>'onlineAddons','selector'=>'free'])}">免费</a>
|
||||
<a type="button" class="layui-btn layui-btn-sm" lay-event="payAddons" data-url="{:url('addons/index',['type'=>'onlineAddons','selector'=>'pay'])}">付费</a>
|
||||
<a type="button" class="layui-btn layui-btn-normal layui-btn-sm" lay-event="installed" data-url="{:url('addons/index',['type'=>'installed','selector'=>''])}">已安装</a>
|
||||
</div>
|
||||
<div class="layui-btn-group" style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layui-btn-danger layui-btn-sm layuiadmin-btn-admin" data-type="add">离线安装</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="addons-tool">
|
||||
{{# if(d.have_newversion === 1){ }}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="install" data-url="{:url('Addons/upgrade')}" data-userlogin="{:url('Addons/userLogin')}" data-ispay="{:url('Addons/isPay')}"><i class="layui-icon layui-icon-edit"></i>升级</a>
|
||||
{{# } else { }}
|
||||
{{# if(d.isInstall === 1) { }}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config" data-url="{:url('Addons/config')}"><i class="layui-icon layui-icon-set"></i>设置</a>
|
||||
{{# } else { }}
|
||||
<a class="layui-btn layui-btn-xs" lay-event="install" data-url="{:url('Addons/install')}" data-userlogin="{:url('Addons/userLogin')}" data-ispay="{:url('Addons/isPay')}"><i class="layui-icon layui-icon-edit"></i>安装</a>
|
||||
<select id="vers{{d.name}}" name="sss" class="layui-border" lay-ignore lay-filter="versSelect">
|
||||
{{# d.vers.forEach(function(item, index){ }}
|
||||
<option value="{{ item }}">{{ item }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</script>
|
||||
<script type="text/html" id="buttonStatus">
|
||||
<input type="checkbox" name="{{d.name}}" lay-skin="switch" lay-filter="addonsStatus" lay-text="启动|禁用" {{# if(d.status == 1){ }} checked {{# } }} data-url="{:url('Addons/status')}">
|
||||
</script>
|
||||
<script type="text/html" id="addons-installed-tool">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config" data-url="{:url('Addons/config')}"><i class="layui-icon layui-icon-set"></i>设置</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="uninstall" data-url="{:url('Addons/uninstall')}"><i class="layui-icon layui-icon-delete"></i>卸载</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{include file="public/user_login" /}
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
var addonsIndex = "{:url('Addons/index')}",
|
||||
addonsDelete = "{:url('Addons/delete')}",
|
||||
addonsEdit = "{:url('Addons/edit')}";
|
||||
var addonList = "{:url('Addons/index')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'addons','table','form','upload'], function(){
|
||||
}).use(['index', 'addons','table','form','upload',"notify"], function(){
|
||||
var $ = layui.jquery
|
||||
,table = layui.table
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
var notify = layui.notify;
|
||||
|
||||
//事件
|
||||
form.render('select'); // 渲染所在容器内的 select 元素
|
||||
//监听版本选择
|
||||
form.on('select(versSelect)', function(obj){
|
||||
layer.tips(this.value + ' ' + this.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
|
||||
//事件
|
||||
var active = {
|
||||
batchdel: function(){
|
||||
var checkStatus = table.checkStatus('addons-list')
|
||||
,checkData = checkStatus.data; //得到选中的数据
|
||||
|
||||
if(checkData.length === 0){
|
||||
return layer.msg('请选择数据');
|
||||
}
|
||||
|
||||
layer.prompt({
|
||||
formType: 1
|
||||
,title: '敏感操作,请验证口令'
|
||||
}, function(value, index){
|
||||
layer.close(index);
|
||||
|
||||
layer.confirm('确定删除吗?', function(index) {
|
||||
|
||||
//执行 Ajax 后重载
|
||||
/*
|
||||
admin.req({
|
||||
url: 'xxx'
|
||||
//,……
|
||||
});
|
||||
*/
|
||||
table.reload('addons-list');
|
||||
layer.msg('已删除');
|
||||
});
|
||||
});
|
||||
}
|
||||
,add: function(){
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加插件'
|
||||
@ -106,35 +89,42 @@
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/Addons/add')}",
|
||||
url:"{:url('Addons/add')}",
|
||||
data:field,
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
if (res.code === 0) {
|
||||
notify.success(res.msg, "topRight");
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
notify.error(res.msg, "topRight");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
table.reload('addons-list'); //数据刷新
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
});
|
||||
submit.trigger('click');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 启动禁用
|
||||
form.on('switch(addonsStatus)', function(data){
|
||||
var data = data.elem;
|
||||
var url = $(this).data('url');
|
||||
//执行帖子审核
|
||||
$.post(url,{ name: data.name },function(res){
|
||||
if(res.code === 0){
|
||||
notify.success(res.msg, "topRight");
|
||||
} else {
|
||||
notify.error(res.msg, "topRight");
|
||||
}
|
||||
table.reloadData("addons-list",{},'deep');
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-admin').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
|
69
app/admin/view/addons/pay.html
Normal file
69
app/admin/view/addons/pay.html
Normal file
@ -0,0 +1,69 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
<style>
|
||||
.layui-container{background-color: #F9F9F9}
|
||||
.auth-type{margin: 10px 0px;}
|
||||
.order-info{margin:10px 0px; line-height: 30px;}
|
||||
.pay-type{line-height: 50px;}
|
||||
.soft-info{margin: 10px;}
|
||||
.pay-tips{line-height:20px;text-align: center;margin-bottom: 20px;}
|
||||
</style>
|
||||
|
||||
<div class="layui-container">
|
||||
|
||||
<div class="layui-row">
|
||||
<div class="auth-type">
|
||||
授权
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="order-info">
|
||||
<p>订单标题:<em>{$orderData.subject}</em></p>
|
||||
<p>订单编号:<em>{$orderData.out_trade_no}</em></p>
|
||||
<p>订单价格:<em class="scanpay-price">¥{$orderData.total_amount}</em> 元</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-sm6">
|
||||
<div class="pay-type">
|
||||
<div style="padding: 5px; text-align: center;"><img src="/static/res/images/alipay.jpg" style="height:80px;"></div>
|
||||
</div>
|
||||
<div class="soft-info">
|
||||
<div>不支持退款</div>
|
||||
<br />
|
||||
<div>软件协议:本软件为原作者拥有版权权限,购买软件可以商用,禁止第三方出售行为。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-sm6">
|
||||
<div class="qrcode" data-text="支付宝当面付" style="padding: 5px; text-align: center;">
|
||||
<img src="{$orderData.qr_code_img}">
|
||||
</div>
|
||||
<div class="pay-tips">
|
||||
<p>请使用支付宝扫一扫<br>扫描二维码进行支付</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script type="text/javascript">
|
||||
var $ = layui.jquery;
|
||||
var out_trade_no = "{$orderData.out_trade_no}";
|
||||
var interval = setInterval(function(){
|
||||
var url = 'https://www.aieok.com/pay/checkstatus.html?out_trade_no=' + out_trade_no;
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: url,
|
||||
data: {out_trade_no:out_trade_no},
|
||||
dataType:"json",
|
||||
success: function (res) {
|
||||
// 等等支付时,一直轮询
|
||||
if(res.code !== 0) {
|
||||
clearInterval(interval);
|
||||
}
|
||||
}
|
||||
})
|
||||
},2500);
|
||||
</script>
|
||||
{/block}
|
@ -1,48 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-admin" id="layuiadmin-form-admin" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">登录名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="username" lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="password" lay-verify="password" placeholder="请输入密码" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="mobile" lay-verify="phone" placeholder="请输入号码" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="email" lay-verify="email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-user-back-submit" id="LAY-user-back-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -1,51 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-admin" id="layuiadmin-form-admin" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$admin.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">登录名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="username" disabled lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input layui-disabled" value="{$admin.username}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="password" lay-verify="password" placeholder="请输入密码" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="mobile" lay-verify="phone" placeholder="请输入号码" autocomplete="off" class="layui-input" value="{$admin.mobile}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="email" lay-verify="email" placeholder="请输入邮箱" autocomplete="off" class="layui-input" value="{$admin.email}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-user-back-submit" id="LAY-user-back-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -1,247 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">登录名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="username" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">手机</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="mobile" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="email" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn layuiadmin-btn-admin" lay-submit lay-filter="LAY-user-back-search">
|
||||
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layuiadmin-btn-admin" data-type="batchdel">删除</button>
|
||||
<button class="layui-btn layuiadmin-btn-admin" data-type="add">添加</button>
|
||||
</div>
|
||||
|
||||
<table id="LAY-user-back-manage" lay-filter="LAY-user-back-manage"></table>
|
||||
<!-- <script type="text/html" id="buttonTpl">
|
||||
{{# if(d.check == 1){ }}
|
||||
<button class="layui-btn layui-btn-xs">已审核</button>
|
||||
{{# } else { }}
|
||||
<button class="layui-btn layui-btn-primary layui-btn-xs">未审核</button>
|
||||
{{# } }}
|
||||
</script>
|
||||
-->
|
||||
<script type="text/html" id="buttonTpl">
|
||||
{{# if(d.id == '1'){ }}
|
||||
<input type="checkbox" name="check" lay-skin="switch" disabled lay-text="通过|禁用" value="1" checked id="{{d.id}}">
|
||||
{{# } else { }}
|
||||
{if condition="checkRuleButton('admin/admin/check')"}<input type="checkbox" name="check" lay-skin="switch" lay-filter="admincheck" lay-text="通过|禁用" {{# if(d.check == 1){ }} checked {{# } }} id="{{d.id}}" >{else}<button class="layui-btn layui-btn-xs layui-btn-radius layui-btn-disabled">无权限</button>{/if}
|
||||
{{# } }}
|
||||
</script>
|
||||
<script type="text/html" id="table-useradmin-admin">
|
||||
{if condition="checkRuleButton('admin/admin/edit')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
|
||||
{else /}<a class="layui-btn layui-btn-normal layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-edit"></i>编辑</a>{/if}
|
||||
{{# if(d.id == '1'){ }}
|
||||
<a class="layui-btn layui-btn-disabled layui-btn-xs"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
{{# } else { }}
|
||||
{if condition="checkRuleButton('admin/admin/delete')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
{else /}<a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-delete"></i>删除</a>{/if}
|
||||
{{# } }}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
var userList = "{:url('User/list')}";
|
||||
var userDelete = "{:url('User/delete')}";
|
||||
var userEdit = "{:url('User/userEdit')}";
|
||||
var adminIndex = "{:url('Admin/index')}";
|
||||
var adminDelete = "{:url('Admin/delete')}";
|
||||
var adminEdit = "{:url('Admin/edit')}";
|
||||
var authGroupList = "{:url('AuthGroup/list')}";
|
||||
var authGroupRoledel = "{:url('AuthGroup/roleDel')}";
|
||||
var authGroupRoleEdit = "{:url('AuthGroup/roleEdit')}";
|
||||
var authAccessIndex = "{:url('AuthAccess/index')}";
|
||||
var authAccessDelete = "{:url('AuthAccess/delete')}";
|
||||
var authAccessEdit = "{:url('AuthAccess/edit')}";
|
||||
var authRuleIndex = "{:url('AuthRule/index')}";
|
||||
var authRuleDelete = "{:url('AuthRule/delete')}";
|
||||
var authRuleEdit = "{:url('AuthRule/edit')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'useradmin', 'table'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
|
||||
//监听搜索
|
||||
form.on('submit(LAY-user-back-search)', function(data){
|
||||
var field = data.field;
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/admin/index')}",
|
||||
data:{"id":field.id,"username":field.username,"mobile":field.mobile,"email":field.email},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
|
||||
} else {
|
||||
layer.open({
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
//执行重载
|
||||
table.reload('LAY-user-back-manage', {
|
||||
where: field
|
||||
});
|
||||
});
|
||||
|
||||
//监听管理员审核
|
||||
form.on('switch(admincheck)', function(data){
|
||||
var data= data.elem;
|
||||
//console.log(data);
|
||||
|
||||
if(data.checked == true){
|
||||
data.value = 1;
|
||||
}else{
|
||||
data.value = 0;
|
||||
}
|
||||
//执行管理员审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('admin/admin/check')}",
|
||||
data:{"id":data.id,"status":data.value,},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//事件
|
||||
var active = {
|
||||
batchdel: function(){
|
||||
var checkStatus = table.checkStatus('LAY-user-back-manage')
|
||||
,checkData = checkStatus.data; //得到选中的数据
|
||||
|
||||
if(checkData.length === 0){
|
||||
return layer.msg('请选择数据');
|
||||
}
|
||||
|
||||
layer.prompt({
|
||||
formType: 1
|
||||
,title: '敏感操作,请验证口令'
|
||||
}, function(value, index){
|
||||
layer.close(index);
|
||||
|
||||
layer.confirm('确定删除吗?', function(index) {
|
||||
|
||||
//执行 Ajax 后重载
|
||||
/*
|
||||
admin.req({
|
||||
url: 'xxx'
|
||||
//,……
|
||||
});
|
||||
*/
|
||||
table.reload('LAY-user-back-manage');
|
||||
layer.msg('已删除');
|
||||
});
|
||||
});
|
||||
}
|
||||
,add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加管理员'
|
||||
,content: 'add.html'
|
||||
,area: ['400px', '380px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var iframeWindow = window['layui-layer-iframe'+ index]
|
||||
,submitID = 'LAY-user-back-submit'
|
||||
,submit = layero.find('iframe').contents().find('#'+ submitID);
|
||||
|
||||
//监听提交
|
||||
iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
|
||||
var field = data.field; //获取提交的字段
|
||||
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/admin/add')}",
|
||||
data:{"username":field.username,"password":field.password,"mobile":field.mobile,"email":field.email,"auth_group_id":field.auth_group_id,"status":field.status},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
table.reload('LAY-user-back-manage'); //数据刷新
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
$('.layui-btn.layuiadmin-btn-admin').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,44 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-admin" id="layuiadmin-form-admin" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">管理员</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="uid" lay-verify="required">
|
||||
{volist name="admins" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.username}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="group_id" lay-verify="required">
|
||||
{volist name="auth_groups" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-admin-group-submit" id="LAY-admin-group-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -1,47 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-admin" id="layuiadmin-form-admin" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$access.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">管理员</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="uid" lay-verify="required">
|
||||
{volist name="admins" id="vo"}
|
||||
<option {if condition="$access.uid eq $vo.id"} selected {/if} value="{$vo.id}">{$vo.username}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="group_id" lay-verify="required">
|
||||
{volist name="auth_groups" id="vo"}
|
||||
<option {if condition="$access.group_id eq $vo.id"} selected {/if} value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-admin-group-submit" id="LAY-admin-group-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -1,207 +0,0 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
管理员筛选
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<select name="uid" lay-filter="LAY-admin-group-type">
|
||||
<option value="">全部用户</option>
|
||||
{volist name="admins" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.username}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layuiadmin-btn-role" data-type="batchdel">删除</button>
|
||||
<button class="layui-btn layuiadmin-btn-role" data-type="add">添加</button>
|
||||
</div>
|
||||
|
||||
<table id="LAY-user-back-group" lay-filter="LAY-user-back-group"></table>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
{if condition="checkRuleButton('admin/AuthAccess/check')"}<input type="checkbox" name="check" lay-skin="switch" lay-filter="groupcheck" lay-text="开启|禁用" {{# if(d.check == 1){ }} checked {{# } }} id="{{d.id}}" >{else /}<button class="layui-btn layui-btn-xs layui-btn-radius layui-btn-disabled">无权限</button>{/if}
|
||||
</script>
|
||||
<script type="text/html" id="table-useradmin-admin">
|
||||
{if condition="checkRuleButton('admin/AuthAccess/edit')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
|
||||
{else /}<a class="layui-btn layui-btn-normal layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-edit"></i>编辑</a>{/if}
|
||||
{if condition="checkRuleButton('admin/AuthAccess/delete')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
{else /}<a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-delete"></i>删除</a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
var userList = "{:url('User/list')}";
|
||||
var userDelete = "{:url('User/delete')}";
|
||||
var userEdit = "{:url('User/userEdit')}";
|
||||
var adminIndex = "{:url('Admin/index')}";
|
||||
var adminDelete = "{:url('Admin/delete')}";
|
||||
var adminEdit = "{:url('Admin/edit')}";
|
||||
var authGroupList = "{:url('AuthGroup/list')}";
|
||||
var authGroupRoledel = "{:url('AuthGroup/roleDel')}";
|
||||
var authGroupRoleEdit = "{:url('AuthGroup/roleEdit')}";
|
||||
var authAccessIndex = "{:url('AuthAccess/index')}";
|
||||
var authAccessDelete = "{:url('AuthAccess/delete')}";
|
||||
var authAccessEdit = "{:url('AuthAccess/edit')}";
|
||||
var authRuleIndex = "{:url('AuthRule/index')}";
|
||||
var authRuleDelete = "{:url('AuthRule/delete')}";
|
||||
var authRuleEdit = "{:url('AuthRule/edit')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'useradmin', 'table'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
|
||||
//搜索角色
|
||||
form.on('select(LAY-admin-group-type)', function(data){
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/AuthAccess/index')}",
|
||||
data:{"uid":data.value},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == -1){
|
||||
layer.open({
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
//执行重载
|
||||
table.reload('LAY-user-back-group', {
|
||||
where: {
|
||||
uid: data.value
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
//监听角色审核
|
||||
form.on('switch(groupcheck)', function(data){
|
||||
var data= data.elem;
|
||||
//console.log(data);
|
||||
|
||||
if(data.checked == true){
|
||||
data.value = 1;
|
||||
}else{
|
||||
data.value = 0;
|
||||
}
|
||||
//执行角色审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('admin/AuthAccess/check')}",
|
||||
data:{id:data.id,status:data.value,},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//事件
|
||||
var active = {
|
||||
batchdel: function(){
|
||||
var checkStatus = table.checkStatus('LAY-user-back-group')
|
||||
,checkData = checkStatus.data; //得到选中的数据
|
||||
if(checkData.length === 0){
|
||||
return layer.msg('请选择数据');
|
||||
}
|
||||
|
||||
layer.confirm('确定删除吗?', function(index) {
|
||||
|
||||
//执行 Ajax 后重载
|
||||
/*
|
||||
admin.req({
|
||||
url: 'xxx'
|
||||
//,……
|
||||
});
|
||||
*/
|
||||
table.reload('LAY-user-back-group');
|
||||
layer.msg('已删除');
|
||||
});
|
||||
},
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加权限'
|
||||
,content: 'add.html'
|
||||
,area: ['400px', '300px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var iframeWindow = window['layui-layer-iframe'+ index]
|
||||
,submit = layero.find('iframe').contents().find("#LAY-admin-group-submit");
|
||||
|
||||
//监听提交
|
||||
iframeWindow.layui.form.on('submit(LAY-admin-group-submit)', function(data){
|
||||
var field = data.field;
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/AuthAccess/add')}",
|
||||
data:field,
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
//刷新数据
|
||||
table.reload('LAY-user-back-group');
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
$('.layui-btn.layuiadmin-btn-role').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
|
@ -1,231 +0,0 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
角色筛选
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<select name="id" lay-filter="LAY-user-adminrole-type">
|
||||
<option value="">全部角色</option>
|
||||
{volist name="roles" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layuiadmin-btn-role" data-type="batchdel">删除</button>
|
||||
<button class="layui-btn layuiadmin-btn-role" data-type="add">添加</button>
|
||||
</div>
|
||||
|
||||
<table id="LAY-user-back-role" lay-filter="LAY-user-back-role"></table>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
{if condition="checkRuleButton('admin/AuthGroup/check')"}<input type="checkbox" name="check" lay-skin="switch" lay-filter="rolecheck" lay-text="打开|关闭" {{# if(d.check == 1){ }} checked {{# } }} id="{{d.id}}" >
|
||||
{else /}<button class="layui-btn layui-btn-xs layui-btn-radius layui-btn-disabled">无权限</button>{/if}
|
||||
</script>
|
||||
<script type="text/html" id="table-useradmin-admin">
|
||||
{if condition="checkRuleButton('admin/AuthGroup/roleedit')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
|
||||
{else /} <a class="layui-btn layui-btn-normal layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-edit"></i>编辑</a>{/if}
|
||||
{if condition="checkRuleButton('admin/AuthGroup/roledel')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
{else /} <a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-delete"></i>删除</a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
var userList = "{:url('User/list')}";
|
||||
var userDelete = "{:url('User/delete')}";
|
||||
var userEdit = "{:url('User/userEdit')}";
|
||||
var adminIndex = "{:url('Admin/index')}";
|
||||
var adminDelete = "{:url('Admin/delete')}";
|
||||
var adminEdit = "{:url('Admin/edit')}";
|
||||
var authGroupList = "{:url('AuthGroup/list')}";
|
||||
var authGroupRoledel = "{:url('AuthGroup/roleDel')}";
|
||||
var authGroupRoleEdit = "{:url('AuthGroup/roleEdit')}";
|
||||
var authAccessIndex = "{:url('AuthAccess/index')}";
|
||||
var authAccessDelete = "{:url('AuthAccess/delete')}";
|
||||
var authAccessEdit = "{:url('AuthAccess/edit')}";
|
||||
var authRuleIndex = "{:url('AuthRule/index')}";
|
||||
var authRuleDelete = "{:url('AuthRule/delete')}";
|
||||
var authRuleEdit = "{:url('AuthRule/edit')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'useradmin', 'table'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
|
||||
//搜索角色
|
||||
form.on('select(LAY-user-adminrole-type)', function(data){
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/AuthGroup/list')}",
|
||||
data:{"id":data.value},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
|
||||
} else {
|
||||
layer.open({
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
//执行重载
|
||||
table.reload('LAY-user-back-role', {
|
||||
where: {
|
||||
id: data.value
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
//监听角色审核
|
||||
form.on('switch(rolecheck)', function(data){
|
||||
var data= data.elem;
|
||||
//console.log(data);
|
||||
|
||||
if(data.checked == true){
|
||||
data.value = 1;
|
||||
}else{
|
||||
data.value = 0;
|
||||
}
|
||||
//执行角色审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('admin/AuthGroup/check')}",
|
||||
data:{id:data.id,status:data.value,},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//事件
|
||||
var active = {
|
||||
batchdel: function(){
|
||||
var checkStatus = table.checkStatus('LAY-user-back-role')
|
||||
,checkData = checkStatus.data; //得到选中的数据
|
||||
if(checkData.length === 0){
|
||||
return layer.msg('请选择数据');
|
||||
}
|
||||
|
||||
layer.confirm('确定删除吗?', function(index) {
|
||||
|
||||
//执行 Ajax 后重载
|
||||
/*
|
||||
admin.req({
|
||||
url: 'xxx'
|
||||
//,……
|
||||
});
|
||||
*/
|
||||
table.reload('LAY-user-back-role');
|
||||
layer.msg('已删除');
|
||||
});
|
||||
},
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加新角色'
|
||||
,content: 'roleadd.html'
|
||||
,area: ['500px', '480px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var iframeWindow = window['layui-layer-iframe'+ index]
|
||||
,submit = layero.find('iframe').contents().find("#LAY-user-role-submit");
|
||||
|
||||
//监听提交
|
||||
iframeWindow.layui.form.on('submit(LAY-user-role-submit)', function(data){
|
||||
var field = data.field;
|
||||
//checkbox 父子级级联或取id
|
||||
var mId = "";
|
||||
var e =iframeWindow.$(":checkbox");
|
||||
e.each(function () {
|
||||
if($(this).next().hasClass("layui-form-checked")){
|
||||
mId+=$(this).val()+",";
|
||||
};
|
||||
})
|
||||
rules = mId.substring(0,mId.length-1);
|
||||
|
||||
/*
|
||||
var arr = new Array(); //获取提交的字段
|
||||
$(iframeWindow.document).find('input[name=rules]:checked').each(function(){
|
||||
arr.push($(this).val());
|
||||
});
|
||||
var rules = arr.join(',');//将数组元素连接起来以构建一个字符串
|
||||
*/
|
||||
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/AuthGroup/roleAdd')}",
|
||||
data:{"rules":rules,"title":field.title,"descr":field.descr},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
table.reload('LAY-user-back-role');
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
$('.layui-btn.layuiadmin-btn-role').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
|
@ -1,101 +0,0 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-role" id="layuiadmin-form-role" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="请输入角色名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" id="test">
|
||||
<label class="layui-form-label">权限范围</label>
|
||||
{volist name="menus" id="vo1"}
|
||||
<ul class="layui-input-block" style="margin-top: 10px ;">
|
||||
<li>
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" value="{$vo1.id}" title="{$vo1.title}:">
|
||||
|
||||
<ul>
|
||||
{if condition="isset($vo1['children'])"}
|
||||
{volist name="vo1['children']" id="vo2"}
|
||||
{if condition="isset($vo2['children'])"}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" value="{$vo2.id}" title="{$vo2.title}:">
|
||||
{volist name="vo2['children']" id="vo3"}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo3.id}" value="{$vo3.id}" title="{$vo3.title}">
|
||||
{/volist}
|
||||
{else /}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo2.id}" value="{$vo2.id}" title="{$vo2.title}">
|
||||
{/if}
|
||||
{/volist}
|
||||
{/if}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{/volist}
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">具体描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="descr" lay-verify="required" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<button class="layui-btn" lay-submit lay-filter="LAY-user-role-submit" id="LAY-user-role-submit">提交</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
|
||||
form.on('checkbox()', function(data){
|
||||
var pc = data.elem.classList; //获取选中的checkbox的class属性
|
||||
if(data.elem.checked==true){
|
||||
if(pc=="parent"){
|
||||
var c =$(data.elem).siblings().children("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().addClass("layui-form-checked");
|
||||
});
|
||||
}else{
|
||||
$(data.elem).parent().prev().addClass("layui-form-checked");
|
||||
}
|
||||
|
||||
}else{
|
||||
if(pc=="parent"){
|
||||
var c =$(data.elem).siblings().children("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().removeClass("layui-form-checked");
|
||||
});
|
||||
}else{
|
||||
var c = $(data.elem).siblings("div");
|
||||
var count =0;
|
||||
c.each(function(){
|
||||
var is = $(this).get(0).classList;
|
||||
if(is.length==3){
|
||||
count++;
|
||||
}
|
||||
});
|
||||
if(count>0){
|
||||
|
||||
}else{
|
||||
$(data.elem).parent().prev().removeClass("layui-form-checked");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -1,129 +0,0 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-role" id="layuiadmin-form-role" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$auth.id}">
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="title">
|
||||
{volist name="authGroup" id="vo"}
|
||||
<option {if condition="$vo.id eq $Request.param.id"} selected {/if} id="{$vo.id}" value="{$vo.title}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" id="test">
|
||||
<label class="layui-form-label">权限范围</label>
|
||||
{volist name="menus" id="vo1"}
|
||||
<ul class="layui-input-block" style="margin-top: 10px ;">
|
||||
<li>
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" value="{$vo1.id}" title="{$vo1.title}:">
|
||||
|
||||
<ul>
|
||||
{if condition="isset($vo1['children'])"}
|
||||
{volist name="vo1['children']" id="vo2"}
|
||||
{if condition="isset($vo2['children'])"}
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" value="{$vo2.id}" title="{$vo2.title}:">
|
||||
{volist name="vo2['children']" id="vo3"}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo3.id}" value="{$vo3.id}" title="{$vo3.title}">
|
||||
{/volist}
|
||||
{else /}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo2.id}" value="{$vo2.id}" title="{$vo2.title}">
|
||||
{/if}
|
||||
{/volist}
|
||||
{/if}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{/volist}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">具体描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="descr" lay-verify="required" autocomplete="off" class="layui-textarea" value="{$auth.descr}">{$auth.descr}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<button class="layui-btn" lay-submit lay-filter="LAY-user-role-submit" id="LAY-user-role-submit">提交</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
var name = "{$ru}";
|
||||
var names = name.split(",");
|
||||
var inputs = $('input[name=rules]');
|
||||
for (var i =0;i<inputs.length;i++) {
|
||||
for (var n =0;n<names.length;n++) {
|
||||
if (names[n]===inputs[i].value) {
|
||||
inputs[i].checked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'table','form'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
|
||||
form.on('checkbox()', function(data){
|
||||
var pc = data.elem.classList; //获取选中的checkbox的class属性
|
||||
if(data.elem.checked==true){
|
||||
if(pc=="parent"){
|
||||
var c =$(data.elem).siblings().children("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().addClass("layui-form-checked");
|
||||
});
|
||||
}else{
|
||||
$(data.elem).parent().prev().addClass("layui-form-checked");
|
||||
}
|
||||
|
||||
}else{
|
||||
if(pc=="parent"){
|
||||
var c =$(data.elem).siblings().children("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().removeClass("layui-form-checked");
|
||||
});
|
||||
}else{
|
||||
var c = $(data.elem).siblings("div");
|
||||
var count =0;
|
||||
c.each(function(){
|
||||
var is = $(this).get(0).classList;
|
||||
if(is.length==3){
|
||||
count++;
|
||||
}
|
||||
});
|
||||
if(count>0){
|
||||
|
||||
}else{
|
||||
$(data.elem).parent().prev().removeClass("layui-form-checked");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
|
||||
{/block}
|
@ -1,117 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-admin" id="layuiadmin-rule-add" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级菜单</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">菜单名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="请输入菜单名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权限地址</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入权限地址" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="icon" id="iconPicker" lay-filter="iconPicker" style="display:none;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sort" lay-verify="" placeholder="排序序号" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="ishidden" lay-skin="primary" title="目录" value="-1">
|
||||
<input type="radio" name="ishidden" lay-skin="primary" title="菜单" value="1" checked>
|
||||
<input type="radio" name="ishidden" lay-skin="primary" title="按钮" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-user-rule-submit" id="LAY-user-rule-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form','admin', 'xmSelect', 'iconPicker'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
var admin = layui.admin;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var iconPicker = layui.iconPicker;
|
||||
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
//权限菜单结构
|
||||
admin.req({
|
||||
type: "post",
|
||||
url: "{:url('AuthRule/tree')}",
|
||||
data:{},
|
||||
done:function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'title',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,122 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-admin" id="layuiadmin-rule-edit" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$rules.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级菜单</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">菜单名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="请输入权限名" autocomplete="off" class="layui-input" value="{$rules.title}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权限地址</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入权限地址" autocomplete="off" class="layui-input" value="{$rules.name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="icon" id="iconPicker" lay-filter="iconPicker" value="{$rules.icon}" style="display:none;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sort" lay-verify="required" placeholder="排序序号" autocomplete="off" class="layui-input" value="{$rules.sort}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="ishidden" lay-skin="primary" title="目录" value="-1" {if condition="$rules.ishidden == -1"}checked{/if}>
|
||||
<input type="radio" name="ishidden" lay-skin="primary" title="菜单" value="1" {if condition="$rules.ishidden == 1"}checked{/if}>
|
||||
<input type="radio" name="ishidden" lay-skin="primary" title="按钮" value="0" {if condition="$rules.ishidden == 0"}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-user-rule-submit" id="LAY-user-rule-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form','admin', 'xmSelect', 'iconPicker'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
|
||||
var admin = layui.admin;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var iconPicker = layui.iconPicker;
|
||||
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
//权限菜单结构
|
||||
admin.req({
|
||||
type: "post",
|
||||
url: "{:url('AuthRule/tree')}",
|
||||
data:{},
|
||||
done:function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [{$rules['pid']}],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'title',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -1,319 +0,0 @@
|
||||
|
||||
{extend name="public:base" /}
|
||||
{block name="css"}<link rel="stylesheet" href="/static/admin/tree/css/treeTable.css">{/block}
|
||||
{block name="body"}
|
||||
|
||||
|
||||
<body class="layui-hide">
|
||||
|
||||
<div class="page-wrapper">
|
||||
|
||||
<div class="demo-side">
|
||||
<table id="LAY-user-auth-rule"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 表格操作列 -->
|
||||
<script type="text/html" id="tbBar">
|
||||
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
|
||||
<!--a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a-->
|
||||
{{# if(d.id == '1' | d.id == '2' | d.id == '9' | d.id == '10' ){ }}<a class="layui-btn layui-btn-disabled layui-btn-xs">删除</a>
|
||||
{{# } else { }}
|
||||
{if condition="checkRuleButton('admin/authrule/delete')"}<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
{else /}<a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled">删除</a>{/if}
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/modules/'
|
||||
}).use(['layer', 'util', 'treeTable'], function () {
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
var util = layui.util;
|
||||
var treeTable = layui.treeTable;
|
||||
$('body').removeClass('layui-hide');
|
||||
|
||||
// 渲染表格
|
||||
var insTb = treeTable.render({
|
||||
elem: '#LAY-user-auth-rule',
|
||||
url: "{:url('AuthRule/index')}",
|
||||
toolbar: 'default',
|
||||
//height: 'full-200',
|
||||
tree: {
|
||||
iconIndex: 2,
|
||||
isPidData: true,
|
||||
idName: 'id',
|
||||
pidName: 'pid'
|
||||
},
|
||||
defaultToolbar: ['filter', 'print', 'exports'],
|
||||
cols: [
|
||||
[
|
||||
{type: 'numbers'},
|
||||
{type: 'checkbox'},
|
||||
{field: 'title', title: '菜单名称', minWidth: 165},
|
||||
{field: 'url', title: '菜单地址', rowspan: 2},
|
||||
{
|
||||
title: '菜单图标', align: 'center',
|
||||
templet: '<p><i class="layui-icon {{d.icon}}"></i></p>'
|
||||
},
|
||||
{field: 'authority', title: '权限标识'},
|
||||
{field: 'isMenu', title: '类型', templet: type, align: 'center', width: 60},
|
||||
//{title: '类型', templet: '<p>{{d.isMenu ? "菜单" : "按钮"}}</p>', align: 'center', width: 60},
|
||||
{field: 'sort', title: '排序', align: 'center', width: 60},
|
||||
{field: 'ctime',title: '创建时间'},
|
||||
{align: 'center', toolbar: '#tbBar', title: '操作', width: 120}
|
||||
]
|
||||
],
|
||||
style: 'margin-top:0;'
|
||||
});
|
||||
|
||||
//自定义“状态”列
|
||||
function type(data) {
|
||||
var isMenu = data.isMenu;
|
||||
var btns = "";
|
||||
if (isMenu == -1) {
|
||||
return "目录";
|
||||
}
|
||||
if (isMenu == 1) {
|
||||
btns += '<span class="layui-btn layui-btn-sm">菜单</span>';
|
||||
//return "菜单";
|
||||
}
|
||||
if (isMenu == 0) {
|
||||
btns += '<span class="layui-btn layui-btn-normal layui-btn-sm">按钮</span>';
|
||||
//return "按钮";
|
||||
}
|
||||
return btns;
|
||||
}
|
||||
|
||||
|
||||
// 工具列点击事件
|
||||
treeTable.on('tool(LAY-user-auth-rule)', function (obj) {
|
||||
var event = obj.event;
|
||||
var data = obj.data;
|
||||
if (event === 'del') {
|
||||
|
||||
layer.prompt({
|
||||
formType: 1
|
||||
,title: '敏感操作,请验证口令'
|
||||
}, function(value, index){
|
||||
layer.close(index);
|
||||
layer.confirm('确定删除此权限?', function(index){
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('AuthRule/delete')}",
|
||||
data:{id:data.id},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'删除失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
|
||||
} else if (event === 'edit') {
|
||||
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '编辑权限'
|
||||
,content: "{:url('AuthRule/edit')}" +'?id='+ data.id
|
||||
,area: ['420px', '550px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var iframeWindow = window['layui-layer-iframe'+ index]
|
||||
,submitID = 'LAY-user-rule-submit'
|
||||
,submit = layero.find('iframe').contents().find('#'+ submitID);
|
||||
|
||||
//监听提交
|
||||
iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
|
||||
var field = data.field; //获取提交的字段
|
||||
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('AuthRule/edit')}",
|
||||
data:{"id":field.id,"pid":field.pid,"title":field.title,"name":field.name,"icon":field.icon,"sort":field.sort,"ishidden":field.ishidden},
|
||||
daType:"json",
|
||||
success:function (res){
|
||||
if (res.code == 0) {
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
}, function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
tiele:'修改失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//treeTable.reload('LAY-user-auth-rule'); //数据刷新
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
}
|
||||
,success: function(layero, index){
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 头部工具栏点击事件
|
||||
treeTable.on('toolbar(LAY-user-auth-rule)', function (obj) {
|
||||
switch (obj.event) {
|
||||
case 'add':
|
||||
layer.msg('添加');
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加权限'
|
||||
,content: 'add.html'
|
||||
,area: ['420px', '550px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var iframeWindow = window['layui-layer-iframe'+ index]
|
||||
,submitID = 'LAY-user-rule-submit'
|
||||
,submit = layero.find('iframe').contents().find('#'+ submitID);
|
||||
|
||||
//监听提交
|
||||
iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
|
||||
var field = data.field; //获取提交的字段
|
||||
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('AuthRule/add')}",
|
||||
data:{"pid":field.pid,"title":field.title,"name":field.name,"icon":field.icon,"sort":field.sort,"ishidden":field.ishidden},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
}, function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
treeTable.reload('LAY-user-auth-rule'); //数据刷新
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
break;
|
||||
case 'delete':
|
||||
layer.msg('删除');
|
||||
break;
|
||||
case 'update':
|
||||
layer.msg('编辑');
|
||||
break;
|
||||
case 'LAYTABLE_TIPS':
|
||||
layer.msg('提示');
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// 全部展开
|
||||
$('#btnExpandAll').click(function () {
|
||||
insTb.expandAll();
|
||||
});
|
||||
|
||||
// 全部折叠
|
||||
$('#btnFoldAll').click(function () {
|
||||
insTb.foldAll();
|
||||
});
|
||||
|
||||
// 展开指定
|
||||
$('#btnExpand').click(function () {
|
||||
insTb.expand(2);
|
||||
});
|
||||
|
||||
// 折叠指定
|
||||
$('#btnFold').click(function () {
|
||||
insTb.fold(2);
|
||||
});
|
||||
|
||||
// 设置选中
|
||||
$('#btnChecked').click(function () {
|
||||
insTb.expand(4);
|
||||
insTb.setChecked([4]);
|
||||
});
|
||||
|
||||
// 搜索
|
||||
$('#btnSearch').click(function () {
|
||||
var keywords = $('#edtSearch').val();
|
||||
if (keywords) {
|
||||
insTb.filterData(keywords);
|
||||
} else {
|
||||
insTb.clearFilter();
|
||||
}
|
||||
});
|
||||
|
||||
// 清除搜索
|
||||
$('#btnClearSearch').click(function () {
|
||||
insTb.clearFilter();
|
||||
});
|
||||
|
||||
// 重载
|
||||
$('#btnReload').click(function () {
|
||||
insTb.reload();
|
||||
});
|
||||
$('#btnRefresh').click(function () {
|
||||
insTb.refresh();
|
||||
});
|
||||
|
||||
// 获取选中
|
||||
$('#btnGetChecked').click(function () {
|
||||
layer.alert('<pre>' + JSON.stringify(insTb.checkStatus().map(function (d) {
|
||||
return {
|
||||
authorityName: d.authorityName,
|
||||
authorityId: d.authorityId,
|
||||
LAY_INDETERMINATE: d.LAY_INDETERMINATE
|
||||
};
|
||||
}), null, 3) + '</pre>');
|
||||
});
|
||||
|
||||
// 演示侧边栏
|
||||
$('#btnToggleSide').click(function () {
|
||||
$('.demo-side').toggleClass('show');
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
210
app/admin/view/content/cate/add.html
Normal file
210
app/admin/view/content/cate/add.html
Normal file
@ -0,0 +1,210 @@
|
||||
{extend name="public:admin_form" /}
|
||||
|
||||
{block name="body"}
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级分类</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="catename" lay-verify="required" placeholder="分类名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">EN别名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="ename" lay-verify="required" placeholder="英文名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="icon" placeholder="图标*" id="iconPicker" lay-filter="iconPicker" style="display:none;" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">详情页模板</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="detpl" id="tpl" lay-verify="required">
|
||||
{volist name="template" id="vo"}
|
||||
<option value="{$vo}" >{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="desc" lay-verify="required" placeholder="描述*" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="sort" lay-verify="number|required" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="cate-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.use(['form', 'iconPicker', 'xmSelect',], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form ;
|
||||
var iconPicker = layui.iconPicker;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var initPid = 0;
|
||||
|
||||
let ADD_EDIT = "{:url('content.cate/addEdit')}";
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(cate-save)', function(data) {
|
||||
$.ajax({
|
||||
url: ADD_EDIT,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
// parent.layui.table.reload("cate-table");
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
window.parent.location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
(function (){
|
||||
//分类菜单结构
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: "{:url('content.forum/getCateTree')}",
|
||||
success: function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [initPid],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
|
||||
|
||||
// var demo4 = xmSelect.render({
|
||||
// el: '#menuSelectBox',
|
||||
// model: { label: { type: 'text' } },
|
||||
// tree: {
|
||||
// show: true,
|
||||
// strict: false,
|
||||
// expandedKeys: [ -1 ],
|
||||
// },
|
||||
// on: function(data){
|
||||
// if(data.isAdd){
|
||||
// return data.change.slice(0, 1)
|
||||
// }
|
||||
// },
|
||||
// height: 'auto',
|
||||
// })
|
||||
|
||||
// //这里模拟ajax
|
||||
// setTimeout(function(){
|
||||
// demo4.update({
|
||||
// data: [
|
||||
// {name: '销售员', value: -1, children: [
|
||||
// {name: '张三', value: 100, children: []},
|
||||
// {name: '李四1', value: 2},
|
||||
// {name: '王五1', value: 3, disabled: true},
|
||||
// ]},
|
||||
// {name: '奖品', value: -2, children: [
|
||||
// {name: '奖品3', value: -3, children: [
|
||||
// {name: '苹果3', value: 14},
|
||||
// {name: '香蕉3', value: 15},
|
||||
// {name: '葡萄3', value: 16},
|
||||
// ]},
|
||||
// {name: '苹果2', value: 4, disabled: true},
|
||||
// {name: '香蕉2', value: 5},
|
||||
// {name: '葡萄2', value: 6},
|
||||
// ]},
|
||||
// ]
|
||||
// })
|
||||
|
||||
// //设置默认值
|
||||
// demo4.setValue([
|
||||
// {name: '李四1', value: 2},
|
||||
// {name: '苹果3', value: 14},
|
||||
// ], null, true)
|
||||
|
||||
// }, 300)
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
})()
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
{/block}
|
163
app/admin/view/content/cate/edit.html
Normal file
163
app/admin/view/content/cate/edit.html
Normal file
@ -0,0 +1,163 @@
|
||||
{extend name="public:admin_form" /}
|
||||
|
||||
{block name="body"}
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级分类</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="catename" lay-verify="required" value="{$cate.catename}" placeholder="分类名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">EN别名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="ename" lay-verify="required" value="{$cate.ename}" placeholder="英文名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="icon" placeholder="图标*" value="{$cate.icon}" id="iconPicker" lay-filter="iconPicker" style="display:none;" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">详情页模板</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="detpl" id="tpl" lay-verify="required">
|
||||
{volist name="template" id="vo"}
|
||||
<option value="{$vo}" {if($vo == $cate.detpl)} selected {/if} >{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="desc" lay-verify="required" value="{$cate.desc}" placeholder="描述*" autocomplete="off" class="layui-textarea">{$cate.desc}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="sort" lay-verify="number|required" value="{$cate.sort}" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-block layui-hide">
|
||||
<input type="text" name="id" lay-verify="number|required" value="{$cate.id}" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="cate-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.use(['form', 'iconPicker', 'xmSelect',], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form ;
|
||||
var iconPicker = layui.iconPicker;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var initPid = "{$cate.pid}";
|
||||
let ADD_EDIT = "{:url('content.cate/addEdit')}";
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(cate-save)', function(data) {
|
||||
$.ajax({
|
||||
url: ADD_EDIT,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
window.parent.location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
(function (){
|
||||
//分类菜单结构
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: "{:url('content.forum/getCateTree')}",
|
||||
success: function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [initPid],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
})()
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
{/block}
|
231
app/admin/view/content/cate/index.html
Normal file
231
app/admin/view/content/cate/index.html
Normal file
@ -0,0 +1,231 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>分类管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="cate-table" lay-filter="cate-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="cate-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-success pear-btn-md" lay-event="expandAll">
|
||||
<i class="layui-icon layui-icon-spread-left"></i>
|
||||
展开
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-success pear-btn-md" lay-event="foldAll">
|
||||
<i class="layui-icon layui-icon-shrink-right"></i>
|
||||
折叠
|
||||
</button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="cate-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit" data-href="{:url('cate/edit')}"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="cate-hot">
|
||||
<input type="checkbox" name="is_hot" value="{{d.id}}" lay-skin="primary" lay-filter="cate-hot" {{ d.is_hot == 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
<script type="text/html" id="cate-check">
|
||||
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="cate-check" {{ d.status== 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="icon">
|
||||
<i class="layui-icon {{d.icon}}"></i>
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const CATE = "{:url('content.cate/list')}";
|
||||
const DELETE = "{:url('content.cate/delete')}";
|
||||
const CHECK = "{:url('content.cate/check')}";
|
||||
|
||||
layui.use(['table','form','jquery','treetable'],function () {
|
||||
let $ = layui.jquery;
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let treetable = layui.treetable;
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{type: 'checkbox'}
|
||||
,{field: 'catename', title: '分类名', width: 150}
|
||||
,{field: 'ename', title: 'EN别名', width: 100}
|
||||
,{field: 'detpl',title: '模板', align: 'center',width: 100}
|
||||
,{field: 'icon', title: '图标', align: 'center',width: 50, templet: '<p><i class="layui-icon {{d.icon}}"></i></p>'}
|
||||
,{field: 'is_hot', title: '热门', align: 'center',width: 50, templet: '#cate-hot'}
|
||||
,{field: 'desc', title: '描述', minWidth: 200}
|
||||
,{field: 'status', title: '状态', width: 80,templet:'#cate-check'}
|
||||
,{field: 'id', title: 'ID',width: 60}
|
||||
,{field: 'sort', title: '排序', width: 80, sort: true}
|
||||
,{title: '操作', width: 120, align: 'center', toolbar: '#cate-bar'}
|
||||
]
|
||||
];
|
||||
|
||||
window.render = function(){
|
||||
treetable.render({
|
||||
treeColIndex: 1,
|
||||
treeSpid: 0,
|
||||
treeIdName: 'id',
|
||||
treePidName: 'pid',
|
||||
skin:'line',
|
||||
treeDefaultClose: false,
|
||||
toolbar:'#cate-toolbar',
|
||||
elem: '#cate-table',
|
||||
url: CATE,
|
||||
page: false,
|
||||
cols: cols
|
||||
});
|
||||
}
|
||||
|
||||
render();
|
||||
|
||||
table.on('tool(cate-table)',function(obj){
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
table.on('toolbar(cate-table)', function(obj){
|
||||
if(obj.event === 'add'){
|
||||
window.add();
|
||||
} else if(obj.event === 'refresh'){
|
||||
window.refresh();
|
||||
} else if(obj.event === 'batchRemove'){
|
||||
window.batchRemove(obj);
|
||||
} else if(obj.event === 'expandAll'){
|
||||
treetable.expandAll("#cate-table");
|
||||
} else if(obj.event === 'foldAll'){
|
||||
treetable.foldAll("#cate-table");
|
||||
}
|
||||
});
|
||||
|
||||
form.on('checkbox(cate-hot)', function(obj){
|
||||
layer.tips(this.value + ' ' + this.name + ':' + obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : 0;
|
||||
$.post(CHECK,{id:this.value, name:this.name, value: status},function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{icon:res.icon,time:2000})
|
||||
} else {
|
||||
layer.open({title:'审核失败',content:res.msg,icon:5,adim:6})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
form.on('switch(cate-check)', function(obj){
|
||||
layer.tips(this.value + ' ' + this.name + ':' + obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : 0;
|
||||
$.post(CHECK,{id:this.value, name:this.name, value: status},function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{icon:res.icon,time:2000})
|
||||
} else {
|
||||
layer.open({title:'审核失败',content:res.msg,icon:5,adim:6})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
window.add = function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: ['550px', '650px'],
|
||||
content: 'addEdit.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['550px', '650px'],
|
||||
content: 'addEdit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
window.remove = function(obj){
|
||||
layer.confirm('确定要删除该权限', {icon: 3, title:'提示'}, function(index){
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: DELETE+"?id="+obj.data['id'],
|
||||
dataType:'json',
|
||||
type:'delete',
|
||||
success:function(result){
|
||||
layer.close(loading);
|
||||
if(result.code === 0){
|
||||
layer.msg(result.msg,{icon:1,time:1000},function(){
|
||||
obj.del();
|
||||
});
|
||||
}else{
|
||||
layer.msg(result.msg,{icon:2,time:1000});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
let data = table.checkStatus(obj.config.id).data;
|
||||
if (data.length === 0) {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
let ids = "";
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
ids += data[i].id + ",";
|
||||
}
|
||||
ids = ids.substr(0, ids.length - 1);
|
||||
layer.confirm('确定要删除这些权限', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: DELETE + "?id=" + ids,
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('user-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
257
app/admin/view/content/cate/index1.html
Normal file
257
app/admin/view/content/cate/index1.html
Normal file
@ -0,0 +1,257 @@
|
||||
{extend name="public:base" /}
|
||||
{block name="css"}<link rel="stylesheet" href="/static/admin/tree/css/treeTable.css">{/block}
|
||||
{block name="css"}
|
||||
<style type="text/css">
|
||||
.layui-table-body, .layui-table-box, .layui-table-cell{
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* 设置下拉框的高度与表格单元相同 */
|
||||
td .layui-table-cell .layui-form-select {
|
||||
margin-top: -10px;
|
||||
margin-left: -15px;
|
||||
margin-right: -15px;
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header layuiadmin-card-header-auto">
|
||||
{if condition="checkRuleButton('forum/addtags')"}
|
||||
<button class="layui-btn layuiadmin-btn-tags" data-type="add">添加</button>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="page-wrapper">
|
||||
<div class="demo-side">
|
||||
<table id="Article-cate-list"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<script type="text/html" id="buttonHot">
|
||||
{if condition="checkRuleButton('Forum/tagshot')"}<input type="checkbox" name="is_hot" lay-skin="primary" lay-filter="menu-show" {{# if(d.is_hot ==1){ }} checked value="0"{{# } else { }}value="1"{{# } }} id="{{d.id}}" >
|
||||
{else /}<input type="checkbox" title="禁用" disabled> {/if}
|
||||
</script>
|
||||
<script type="text/html" id="layuiadmin-app-cont-tagsbar">
|
||||
{if condition="checkRuleButton('forum/tagsform')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-disabled layui-btn-normal layui-btn-xs"><i class="layui-icon layui-icon-edit"></i></a>{/if}
|
||||
{if condition="checkRuleButton('forum/tagsdelete')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-disabled layui-btn-danger layui-btn-xs"><i class="layui-icon layui-icon-delete"></i></a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
var forumList = "{:url('Forum/list')}",
|
||||
forumListdel = "{:url('Forum/listdel')}",
|
||||
forumListform = "{:url('Forum/listform')}",
|
||||
forumReplys = "{:url('Forum/replys')}",
|
||||
forumRedel = "{:url('Forum/redel')}",
|
||||
forumReplysform = "{:url('Forum/replysform')}",
|
||||
forumTags = "{:url('Forum/tags')}",
|
||||
forumTagsDelete = "{:url('Forum/tagsdelete')}",
|
||||
forumTagsForm = "{:url('Forum/tagsform')}";
|
||||
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','treeTable'], function(){
|
||||
|
||||
var table = layui.table, form = layui.form;
|
||||
var $ = layui.$,treeTable = layui.treeTable;
|
||||
|
||||
// 渲染分类表格
|
||||
var insTb = treeTable.render({
|
||||
elem: '#Article-cate-list',
|
||||
url: forumTags,
|
||||
//toolbar: 'default',
|
||||
//height: 'full-200',
|
||||
tree: {
|
||||
iconIndex: 2,
|
||||
isPidData: true,
|
||||
idName: 'id',
|
||||
pidName: 'pid'
|
||||
},
|
||||
defaultToolbar: ['filter', 'print', 'exports'],
|
||||
cols: [
|
||||
[
|
||||
{type: 'numbers'},
|
||||
{type: 'checkbox'}
|
||||
,{field: 'catename', title: '分类名', width: 150}
|
||||
,{field: 'appname', title: '所属应用', width: 90}
|
||||
,{field: 'ename', title: 'EN别名', width: 100}
|
||||
,{field: 'detpl',title: '模板', align: 'center',width: 100}
|
||||
,{title: '图标', align: 'center',width: 50,templet: '<p><i class="layui-icon {{d.icon}}"></i></p>'}
|
||||
,{field: 'is_hot', title: '热门', align: 'center',width: 50, templet: '#buttonHot'}
|
||||
,{field: 'desc', title: '描述', minWidth: 200}
|
||||
,{field: 'id', title: 'ID',width: 60}
|
||||
,{field: 'sort', title: '排序', width: 80, sort: true}
|
||||
,{title: '操作', width: 120, align: 'center', toolbar: '#layuiadmin-app-cont-tagsbar'}
|
||||
]
|
||||
],
|
||||
style: 'margin-top:0;'
|
||||
});
|
||||
|
||||
//监听工具条
|
||||
treeTable.on('tool(Article-cate-list)', function(obj){
|
||||
var data = obj.data;
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('是否删除此分类及分类下内容?', function(index){
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:forumTagsDelete,
|
||||
data:{id:data.id},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){layer.msg(data.msg,{icon:6,time:2000},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({title:'删除失败',content:data.msg,icon:5,adim:6})
|
||||
}
|
||||
}
|
||||
});
|
||||
layer.close(index);
|
||||
});
|
||||
} else if(obj.event === 'edit'){
|
||||
var tr = $(obj.tr);
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '编辑分类'
|
||||
,content: forumTagsForm + '?id='+ data.id
|
||||
,area: ['400px', '500px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
//获取iframe元素的值
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags")
|
||||
,pid = othis.find('input[name="pid"]').val()
|
||||
,sort = othis.find('input[name="sort"]').val()
|
||||
,appname = othis.find('select[name="appname"]').val()
|
||||
,catename = othis.find('input[name="catename"]').val()
|
||||
,ename = othis.find('input[name="ename"]').val()
|
||||
,detpl = othis.find('select[name="detpl"]').val()
|
||||
,icon = othis.find('input[name="icon"]').val()
|
||||
,desc = othis.find('input[name="desc"]').val();
|
||||
|
||||
if(!catename.replace(/\s/g, '')) return;
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:forumTagsForm,
|
||||
data:{"id":data.id,"pid":pid,"sort":sort,"appname":appname,"catename":catename,"ename":ename,"detpl":detpl,"icon":icon,"desc":desc},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if(data.code == 0){layer.msg(data.msg,{icon:6,time:2000},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({title:'修改失败',content:data.msg,icon:5,adim:6})
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
obj.update({
|
||||
tags: tags
|
||||
,ename: ename
|
||||
,sort: sort
|
||||
});
|
||||
*/
|
||||
treeTable.reload('Article-cate-list'); //数据刷新
|
||||
layer.close(index);
|
||||
}
|
||||
,success: function(layero, index){
|
||||
//给iframe元素赋值
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags").click();
|
||||
othis.find('input[name="pid"]').val(data.pid)
|
||||
,othis.find('input[name="sort"]').val(data.sort)
|
||||
,othis.find('select[name="appname"]').val(data.appname)
|
||||
,othis.find('input[name="catename"]').val(data.catename)
|
||||
,othis.find('input[name="ename"]').val(data.ename)
|
||||
,othis.find('input[name="icon"]').val(data.icon)
|
||||
,othis.find('input[name="desc"]').val(data.desc);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var active = {
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加分类'
|
||||
,content: 'tagsform.html'
|
||||
,area: ['450px', '550px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags")
|
||||
,pid = othis.find('input[name="pid"]').val()
|
||||
,sort = othis.find('input[name="sort"]').val()
|
||||
,appname = othis.find('select[name="appname"]').val()
|
||||
,catename = othis.find('input[name="catename"]').val()
|
||||
,ename = othis.find('input[name="ename"]').val()
|
||||
,detpl = othis.find('select[name="detpl"]').val()
|
||||
,icon = othis.find('input[name="icon"]').val()
|
||||
,desc = othis.find('input[name="desc"]').val();
|
||||
|
||||
if(!catename.replace(/\s/g, '')) return;
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Forum/tagsform')}",
|
||||
data:{pid:pid,"sort":sort,"appname":appname,"catename":catename,"ename":ename,"detpl":detpl,"icon":icon,"desc":desc},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{icon:6,time:2000});
|
||||
} else {
|
||||
layer.open({title:'添加失败',content:data.msg,icon:5,anim:6});
|
||||
}
|
||||
}
|
||||
});
|
||||
table.reload('LAY-app-content-tags');
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//分类热点控制
|
||||
form.on('checkbox(menu-show)', function(data){
|
||||
var data = data.elem;
|
||||
data.value = data.checked ? 1 : 0;
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('Forum/tagshot')}",
|
||||
data:{"id":data.id,"is_hot":data.value,},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{icon:6,time:2000});
|
||||
} else {
|
||||
layer.open({title:'修改失败',content:data.msg,icon:5,adim:6});
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-tags').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
258
app/admin/view/content/comment/index.html
Normal file
258
app/admin/view/content/comment/index.html
Normal file
@ -0,0 +1,258 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>管理员管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline layuiadmin-input-useradmin">
|
||||
<label class="layui-form-label">回帖人</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">内容</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="content" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="status" lay-filter="fourm-check">
|
||||
<option value="">全部</option>
|
||||
<option value="0">待审</option>
|
||||
<option value="-1">禁止</option>
|
||||
<option value="1">通过</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="comment-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="comment-table" lay-filter="comment-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="comment-toolbar">
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/html" id="imgTpl">
|
||||
<img style="width: 25px; height: 25px;" src= {{ d.avatar }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
<input type="checkbox" name="check" lay-skin="switch" lay-filter="check" lay-text="通过|{{ d.check == 0 ? '待审' : '禁止' }}" {{ d.check == 1 ? 'checked' : '' }} id="{{d.id}}" >
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="comment-bar">
|
||||
<!--<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>-->
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const COMMENT_DELETE = "{:url('content.comment/delete')}";
|
||||
|
||||
layui.use(['jquery','table','form','common'], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
let common = layui.common;
|
||||
|
||||
//评论管理
|
||||
table.render({
|
||||
elem: '#comment-table'
|
||||
,url: "{:url('content.comment/list')}"
|
||||
,toolbar: '#comment-toolbar'
|
||||
,cols: [[
|
||||
{type: 'checkbox'}
|
||||
,{field: 'id', width: 80, title: 'ID', sort: true}
|
||||
,{field: 'avatar', title: '头像', width: 60, templet: '#imgTpl'}
|
||||
,{field: 'replyer', title: '账号', width: 80}
|
||||
,{field: 'title', title: '标题',minWidth: 150, templet: '<div><a href="{{d.url}}" target="_blank">{{d.title}}</a></div>'}
|
||||
,{field: 'content', title: '评论', minWidth: 200}
|
||||
,{field: 'replytime', title: '回复时间', width: 120, sort: true}
|
||||
,{field: 'check', title: '审核', templet: '#buttonCheck', width: 100}
|
||||
,{title: '操作', width: 60, align: 'center', toolbar: '#comment-bar'}
|
||||
]]
|
||||
,page: true
|
||||
,limit: 15
|
||||
,limits: [10, 15, 20, 25, 30]
|
||||
,text: '对不起,加载出现异常!'
|
||||
});
|
||||
|
||||
table.on('tool(comment-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(comment-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(comment-query)', function(data) {
|
||||
table.reload('comment-table', {
|
||||
where: data.field,
|
||||
page: {
|
||||
curr: 1 //重新从第 1 页开始
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
//监听回贴审核
|
||||
form.on('switch(check)', function(data){
|
||||
var data= data.elem;
|
||||
var status = data.checked ? 1 : -1;
|
||||
//执行回帖审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('content.comment/check')}",
|
||||
data:{id:data.id,status:status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
table.reload('comment-table');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: COMMENT_DELETE + "?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: COMMENT_DELETE,
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('comment-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('comment-table');
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
212
app/admin/view/content/forum/add.html
Normal file
212
app/admin/view/content/forum/add.html
Normal file
@ -0,0 +1,212 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增帖子</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<style>
|
||||
#L_title {position: relative;}
|
||||
.bdsug {height: auto; position: absolute; left: 0; top: 30px; z-index: 100; background: #fff; border-radius: 0 0 10px 10px; border: 1px solid #dadade!important; border-top: 0!important; box-shadow: none;}
|
||||
.bdsug ul{display: block;margin: 5px 2px 0; padding: 5px 0 7px; background: 0 0; border-top: 0px solid #f5f5f6;}
|
||||
.bdsug ul>li{margin-top: 0;height:30px;line-height: 25px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">{:lang('special column')}</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="CateId" class="xm-select-demo"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md8">
|
||||
<label for="L_title" class="layui-form-label">{:lang('title')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" style="position:relative;" value=""/>
|
||||
<input type="hidden" id="L_title_color" name="title_color" autocomplete="off" class="layui-input" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md1">
|
||||
<div id="color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" lay-verify="required" placeholder="{:lang('please input the content')}" class="layui-textarea taonyeditor"> </textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">{:lang('enclosure')}</label>
|
||||
<div class="layui-input-inline" style="width: 190px">
|
||||
<input type="text" class="layui-input" name="upzip" value="" placeholder="zip,image文件" title="上传附件" />
|
||||
</div>
|
||||
<button type="button" class="layui-btn" id="zip-button"><i class="layui-icon"></i>{:lang('uploads')}</button>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('描述')}</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="description" class="layui-textarea" placeholder="SEO描述"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
{//关键词}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('添加关键词')}</label>
|
||||
<div class="layui-input-block">
|
||||
<!-- <input type="text" class="layui-input" name="" id="inputTags" value="" placeholder="多个回车添加" title="添加关键词" /> -->
|
||||
<input type="text" class="layui-input" name="keywords" value="" placeholder="多个用逗号隔开" title="添加关键词" />
|
||||
</div>
|
||||
</div>
|
||||
{//tag}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('add tags')}</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="tag"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="forum-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(["form", "colorpicker", "upload",'xmSelect'], function () {
|
||||
var $ = layui.jquery, form = layui.form, colorpicker = layui.colorpicker, upload = layui.upload;
|
||||
var xmSelect = layui.xmSelect;
|
||||
|
||||
// 分类选择
|
||||
$.get("{:url('content.forum/getCateList')}",function(res){
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#CateId',
|
||||
name: 'cate_id',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: res.data,
|
||||
initValue: [res.data[0].id],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择'
|
||||
});
|
||||
});
|
||||
|
||||
// tag标签
|
||||
$(function(){
|
||||
//1.渲染标签
|
||||
var addTags = xmSelect.render({
|
||||
el: '#tag',
|
||||
name: 'tagid',
|
||||
layVerify: '',
|
||||
layVerType: 'msg',
|
||||
paging: true,
|
||||
pageSize: 5,
|
||||
data: []
|
||||
});
|
||||
//2.动态标签赋值
|
||||
$.get("{:url('content.tag/getAllTag')}",function(res){
|
||||
if(res.code === 0){
|
||||
addTags.update({
|
||||
data: res.data,
|
||||
autoRow: true,
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
//上传附件
|
||||
upload.render({
|
||||
elem: "#zip-button",
|
||||
url: "{:url('content.forum/uploads')}", //改成您自己的上传接口
|
||||
data: { type: "zip" },
|
||||
accept: "file",
|
||||
before: function(obj){
|
||||
layer.load();
|
||||
},
|
||||
done: function (res) {
|
||||
layer.closeAll('loading');
|
||||
if (res.status === 0) {
|
||||
$('input[name="upzip"]').val(res.url);
|
||||
layer.msg("上传成功");
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
// 改变标题颜色
|
||||
colorpicker.render({
|
||||
elem: "#color",
|
||||
color: "#393d49",
|
||||
predefine: true, // 开启预定义颜色
|
||||
done: function (color) {
|
||||
//譬如你可以在回调中把得到的 color 赋值给表单
|
||||
$("#L_title_color").val(color);
|
||||
$("#L_title").css("color", color);
|
||||
},
|
||||
});
|
||||
|
||||
form.on('submit(forum-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('content.forum/add')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layui.table.reload("forum-table");
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
{:hook('taonyeditor')}
|
||||
{// 百度标题词条}
|
||||
{:hook('seoBaiduTitle')}
|
||||
{// 百度关键词}
|
||||
{:hook('seoBaiduKeywords')}
|
||||
</body>
|
||||
</html>
|
231
app/admin/view/content/forum/edit.html
Normal file
231
app/admin/view/content/forum/edit.html
Normal file
@ -0,0 +1,231 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<style>
|
||||
#L_title {position: relative;}
|
||||
.bdsug {height: auto; position: absolute; left: 0; top: 30px; z-index: 100; background: #fff; border-radius: 0 0 10px 10px; border: 1px solid #dadade!important; border-top: 0!important; box-shadow: none;}
|
||||
.bdsug ul{display: block;margin: 5px 2px 0; padding: 5px 0 7px; background: 0 0; border-top: 0px solid #f5f5f6;}
|
||||
.bdsug ul>li{margin-top: 0;height:30px;line-height: 25px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<input type="hidden" name="id" value="{$article.id}">
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">{:lang('special column')}</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="CateId" class="xm-select-demo"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md8">
|
||||
<label for="L_title" class="layui-form-label">{:lang('title')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" value="{$article.title}">
|
||||
<input type="hidden" id="L_title_color" name="title_color" autocomplete="off" class="layui-input" value="{$article.title_color ?? '#333'}">
|
||||
<input type="hidden" name="user_id" value="{$article.user_id}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md1">
|
||||
<div id="color"></div>
|
||||
<div id="test9" style="margin-left: 30px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="required" placeholder="详细内容" class="layui-textarea taonyeditor">{$article.content}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">{:lang('enclosure')}</label>
|
||||
<div class="layui-input-inline" style="width: 190px;">
|
||||
<input type="text" class="layui-input" name="upzip" value="{$article.upzip ?? ''}" placeholder="zip,jpg格式" title="上传附件"/>
|
||||
</div>
|
||||
<button type="button" class="layui-btn" id="zip-button"><i class="layui-icon"></i>上传文件</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('描述')}</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="description" class="layui-textarea" placeholder="SEO描述">{$article.description}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
{//关键词}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('添加关键词')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="keywords" value="{$article.keywords}" placeholder="多个英文逗号隔开" title="添加关键词" />
|
||||
</div>
|
||||
</div>
|
||||
{//tag}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('add tags')}</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="tag"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<button type="submit" class="layui-btn" lay-filter="article-edit" lay-submit id="article-edit">{:lang('post now')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="forum-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(['colorpicker','form','upload','xmSelect'], function(){
|
||||
var $ = layui.jquery
|
||||
,colorpicker = layui.colorpicker
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
var artId = "{$article.id}";
|
||||
var xmSelect = layui.xmSelect;
|
||||
|
||||
$(function(){
|
||||
//1.渲染标签
|
||||
var addTags = xmSelect.render({
|
||||
el: '#tag',
|
||||
name: 'tagid',
|
||||
layVerify: '',
|
||||
layVerType: 'msg',
|
||||
paging: true,
|
||||
pageSize: 5,
|
||||
data: []
|
||||
});
|
||||
//2.动态赋值
|
||||
$.get("{:url('content.tag/getArticleTag')}",{id:artId},function(res){
|
||||
if(res.code === 0){
|
||||
addTags.setValue(
|
||||
res.data
|
||||
)
|
||||
}
|
||||
});
|
||||
//3.动态标签赋值
|
||||
$.get("{:url('content.tag/getAllTag')}",function(res){
|
||||
if(res.code === 0){
|
||||
addTags.update({
|
||||
data: res.data,
|
||||
autoRow: true,
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
// 分类选择
|
||||
$.get("{:url('content.forum/getCateList')}",function(res){
|
||||
var INITCID = "{$article.cate_id}";
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#CateId',
|
||||
name: 'cate_id',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: res.data,
|
||||
initValue: [INITCID],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择'
|
||||
});
|
||||
});
|
||||
|
||||
//预定义颜色项
|
||||
colorpicker.render({
|
||||
elem: '#color'
|
||||
,color: "{$article.title_color ?? '#333'}"
|
||||
,predefine: true // 开启预定义颜色
|
||||
,done: function(color){
|
||||
//譬如你可以在回调中把得到的 color 赋值给表单
|
||||
$('#L_title_color').val(color);
|
||||
//改变标题颜色
|
||||
$('#L_title').css("color", color);
|
||||
}
|
||||
});
|
||||
|
||||
//指定允许上传的文件类型
|
||||
upload.render({
|
||||
elem: '#zip-button'
|
||||
,url: "{:url('content.forum/uploads')}" //改成您自己的上传接口
|
||||
,data: {type:'zip'}
|
||||
,accept: 'file',
|
||||
before: function(obj){
|
||||
layer.load();
|
||||
},
|
||||
done: function(res){
|
||||
layer.closeAll('loading');
|
||||
if(res.status === 0){
|
||||
$('input[name="upzip"]').val(res.url);
|
||||
layer.msg('上传成功');
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(forum-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('content.forum/edit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layui.table.reload("forum-table");
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
{:hook('taonyeditor')}
|
||||
{// 百度标题词条}
|
||||
{:hook('seoBaiduTitle')}
|
||||
{// 百度关键词}
|
||||
{:hook('seoBaiduKeywords')}
|
||||
</body>
|
||||
</html>
|
362
app/admin/view/content/forum/index.html
Normal file
362
app/admin/view/content/forum/index.html
Normal file
@ -0,0 +1,362 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>用户管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-row layui-col-space15 ">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">选择类目</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="CateId" class="xm-select-demo"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">帖子ID</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">发帖人</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="sec">
|
||||
<option value="">选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="5">禁止</option>
|
||||
<option value="6">待审</option>
|
||||
<option value="2">置顶</option>
|
||||
<option value="3">加精</option>
|
||||
<option value="4">禁评</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="forum-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="forum-table" lay-filter="forum-table" ></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="forum-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="avatarTpl">
|
||||
<div><img style="width: 25px; height: 25px;" src= "{{ d.avatar }}"></div>
|
||||
</script>
|
||||
<script type="text/html" id="forum-istop">
|
||||
<input type="checkbox" name="is_top" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="isTop" {{ d.top == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonHot">
|
||||
<input type="checkbox" name="is_hot" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="isHot" {{ d.hot == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonReply">
|
||||
<input type="checkbox" name="is_reply" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="isReply" {{ d.reply == 0 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-filter="artStatus" lay-text="通过|{{ d.check == 0 ? '待审' : '禁止' }}" {{ d.check == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="forum-table-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
const FORUM_List = "{:url('content.forum/list')}";
|
||||
|
||||
layui.use(['toast','jquery','form', 'table','common','xmSelect'], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
let common = layui.common;
|
||||
var toast = layui.toast;
|
||||
var xmSelect = layui.xmSelect;
|
||||
|
||||
//如果你是采用模版自带的编辑器,你需要开启以下语句来解析。
|
||||
var taonystatus = "{:hook('taonystatus')}";
|
||||
// 编辑器插件启用状态
|
||||
var isShow = taonystatus ? false : true;
|
||||
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{type: 'checkbox'}
|
||||
,{field: 'id', width: 60, title: 'ID', sort: true}
|
||||
,{field: 'avatar', title: '头像', width: 60, templet: '#avatarTpl'}
|
||||
,{field: 'poster', title: '账号',width: 80}
|
||||
,{field: 'title', title: '标题', minWidth: 180,templet: '<div><a href="{{- d.url }}" target="_blank">{{- d.title }}</a></div>'}
|
||||
,{field: 'cate', title: '类别', width: 120}
|
||||
,{field: 'content', title: '内容', 'escape':false, minWidth: 200}
|
||||
,{field: 'posttime', title: '时间',width: 120, sort: true}
|
||||
,{field: 'top', title: '置顶', templet: '#forum-istop', width: 80, align: 'center'}
|
||||
,{field: 'hot', title: '加精', templet: '#buttonHot', width: 80, align: 'center'}
|
||||
,{field: 'reply', title: '禁评', templet: '#buttonReply', width: 80, align: 'center'}
|
||||
,{field: 'check', title: '审帖', templet: '#buttonCheck', width: 95, align: 'center'}
|
||||
,{title: '操作', width: 110, align: 'center', toolbar: '#forum-table-bar'}
|
||||
]
|
||||
];
|
||||
|
||||
table.render({
|
||||
elem: '#forum-table',
|
||||
url: FORUM_List,
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line',
|
||||
toolbar: '#forum-toolbar',
|
||||
defaultToolbar: [{
|
||||
title: '刷新',
|
||||
layEvent: 'refresh',
|
||||
icon: 'layui-icon-refresh',
|
||||
}, 'filter', 'print', 'exports']
|
||||
});
|
||||
|
||||
// 动态分类
|
||||
function getSelectCate() {
|
||||
// 分类选择
|
||||
$.get("{:url('content.forum/getCateList')}", function(res){
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#CateId',
|
||||
name: 'cate_id',
|
||||
height: '250px',
|
||||
layVerify: '',
|
||||
layVerType: 'tips',
|
||||
data: res.data,
|
||||
initValue: [],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择'
|
||||
});
|
||||
});
|
||||
}
|
||||
getSelectCate();
|
||||
|
||||
table.on('tool(forum-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(forum-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(forum-query)', function(data) {
|
||||
table.reload('forum-table', {
|
||||
where: data.field,
|
||||
page: {
|
||||
curr: 1 //重新从第 1 页开始
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听置顶
|
||||
form.on('switch(isTop)', function(obj){
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value:obj.elem.checked ? 1 : 0},function(res){
|
||||
layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
});
|
||||
|
||||
// 监听加精
|
||||
form.on('switch(isHot)', function(obj){
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value: obj.elem.checked ? 1 : 0},function(res){
|
||||
layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
});
|
||||
|
||||
// 监听回复
|
||||
form.on('switch(isReply)', function(obj){
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value: obj.elem.checked ? 0 : 1},function(res){
|
||||
layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
});
|
||||
|
||||
// 监听审贴
|
||||
form.on('switch(artStatus)', function(obj){
|
||||
//layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value: obj.elem.checked ? 1 : -1},function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{icon:res.icon,time:2000})
|
||||
} else {
|
||||
layer.open({title:'审核失败',content:res.msg,icon:5,adim:6})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
window.add = function() {
|
||||
if(isShow) {
|
||||
toast.info({title: '信息',message: '编辑器插件未开启或未安装',position: 'topRight'});
|
||||
return false;
|
||||
}
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: [common.isModile()?'100%':'100%', common.isModile()?'100%':'100%'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj) {
|
||||
if(isShow) {
|
||||
toast.info({title: '信息',message: '编辑器插件未开启或未安装',position: 'topRight'});
|
||||
return false;
|
||||
}
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['100%', '100%'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
// $(document).on('focusin', function(e) {
|
||||
// if ($(e.target).closest(".tox-tinymce, .tox-tinymce-aux, .moxman-window, .tam-assetmanager-root").length) {
|
||||
// e.stopImmediatePropagation();
|
||||
// }
|
||||
// });
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('content.forum/delete')}?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('content.forum/delete')}?id=" + checkIds,
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('forum-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('forum-table');
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
91
app/admin/view/content/tag/add.html
Normal file
91
app/admin/view/content/tag/add.html
Normal file
@ -0,0 +1,91 @@
|
||||
|
||||
{extend name="public/admin_form" /}
|
||||
|
||||
{block name="body"}
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="tag名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">别名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="ename" lay-verify="required" placeholder="英文或者拼音别名" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="keywords" lay-verify="required" placeholder="关键词 多个以逗号,隔开" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">摘要</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="description" lay-verify="required" placeholder="请输入内容" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">seo标题</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="tag标题" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="tag-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.use(['form', 'jquery', 'upload'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
let ADD_URL = "{:url('content.tag/add')}";
|
||||
|
||||
form.on('submit(tag-save)', function(data) {
|
||||
$.ajax({
|
||||
url: ADD_URL,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
parent.layui.table.reload("tag-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
90
app/admin/view/content/tag/edit.html
Normal file
90
app/admin/view/content/tag/edit.html
Normal file
@ -0,0 +1,90 @@
|
||||
{extend name="public/admin_form" /}
|
||||
|
||||
{block name="body"}
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="tag名" class="layui-input" value="{$tag.name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">别名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="ename" lay-verify="required" placeholder="英文或者拼音别名" class="layui-input" value="{$tag.ename}" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="keywords" lay-verify="required" placeholder="关键词 多个以逗号,隔开" autocomplete="off" class="layui-input" value="{$tag.keywords}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">摘要</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="description" lay-verify="required" placeholder="请输入内容" autocomplete="off" class="layui-textarea">{$tag.description}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">seo标题</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="tag标题" autocomplete="off" class="layui-input" value="{$tag.title}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<input type="text" name="id" lay-verify="required" class="layui-input layui-hide" value="{$tag.id}">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="tag-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(tag-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('content.tag/edit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
parent.layui.table.reload("tag-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
191
app/admin/view/content/tag/index.html
Normal file
191
app/admin/view/content/tag/index.html
Normal file
@ -0,0 +1,191 @@
|
||||
{extend name="public/admin_base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="tag-table" lay-filter="tag-table" ></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="tag-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
<script type="text/html" id="tag-table-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.use(['toast', 'common'], function(){
|
||||
var $ = layui.jquery
|
||||
,layer = layui.layer
|
||||
,table = layui.table
|
||||
,form = layui.form;
|
||||
let toast = layui.toast;
|
||||
let common = layui.common;
|
||||
|
||||
//第一个实例
|
||||
table.render({
|
||||
elem: '#tag-table'
|
||||
,url: "{:url('content.tag/list')}" //数据接口
|
||||
,page: true //开启分页
|
||||
,cols: [[ //表头
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'name', title: '名称', width:100}
|
||||
,{field: 'ename', title: '别名', width:100}
|
||||
,{field: 'keywords', title: '关键词', width:150}
|
||||
,{field: 'description', title: '摘要', minWidth:300}
|
||||
,{field: 'title', title: 'seo标题', width:200}
|
||||
,{field: 'time', title: '时间', width:120}
|
||||
,{title:'操作', toolbar: '#tag-table-bar', width:100}
|
||||
]],
|
||||
skin: 'line',
|
||||
toolbar: '#tag-toolbar',
|
||||
limit: 100,
|
||||
text: '对不起,加载出现异常!'
|
||||
});
|
||||
|
||||
table.on('tool(tag-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(tag-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(Tag-link-search)', function(data){
|
||||
$.post("{:url('Tag/list')}", {"tag":data.value}, function (data){
|
||||
if (data.code == -1){
|
||||
layer.open({content:data.msg,icon:5,anim:6});
|
||||
}
|
||||
}
|
||||
);
|
||||
//执行重载
|
||||
table.reload('tag-link', {
|
||||
where: {tag: data.value}
|
||||
,page: {
|
||||
curr: 1 //重新从第 1 页开始
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
window.add = function() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: [common.isModile()?'100%':'450px', common.isModile()?'100%':'500px'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: [common.isModile()?'100%':'450px', common.isModile()?'100%':'500px'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除该用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('content.tag/delete')}?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除这些用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('content.tag/delete')}",
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('tag-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('tag-table');
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,130 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header layuiadmin-card-header-auto">
|
||||
<button class="layui-btn layuiadmin-btn-ledger" data-type="back">备份</button>
|
||||
</div>
|
||||
|
||||
<div class="layui-progress layui-progress-big" lay-showpercent="true" lay-filter="demo">
|
||||
<div class="layui-progress-bar layui-bg-red" lay-percent="0%"></div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<table id="LAY-app-content-ledger" lay-filter="LAY-app-content-ledger"></table>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="tao-ledger">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>备份</a>
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="down"><i class="layui-icon layui-icon-edit"></i>下载</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-edit"></i>删除</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','table','layer','element'], function(){
|
||||
|
||||
var table = layui.table,
|
||||
layer = layui.layer,
|
||||
element = layui.element;
|
||||
var $ = layui.$;
|
||||
|
||||
var active = {
|
||||
|
||||
back: function backup(predate)
|
||||
{
|
||||
//var index = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('admin/Databackup/backup')}",
|
||||
type: 'POST', //POST
|
||||
async: true, //或false,是否异步
|
||||
dataType: 'json',
|
||||
data:predate,
|
||||
success: function (data) {
|
||||
|
||||
if (data.totalpercentage >= 100)
|
||||
{
|
||||
//关闭
|
||||
//layer.close(index);
|
||||
layer.alert('备份完成', {icon: 1});
|
||||
}
|
||||
|
||||
element.progress('demo', data.totalpercentage+'%');
|
||||
|
||||
//循环备份
|
||||
if (data.totalpercentage < 100)
|
||||
{
|
||||
backup(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
//总帐信息
|
||||
table.render({
|
||||
elem: '#LAY-app-content-ledger'
|
||||
,url: "{:url('admin/Database/index')}" //进列表接口
|
||||
,toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
|
||||
,defaultToolbar: ['filter', 'exports', 'print']
|
||||
,cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
,{field:'id', title:'ID', width:80, fixed: 'left', unresize: true, sort: true}
|
||||
,{field: 'time', title: '备份时间',width: 180}
|
||||
,{field: 'name', title: '备份名', minWidth: 200}
|
||||
,{title: '操作', width: 150, align: 'center', toolbar: '#tao-ledger'}
|
||||
]]
|
||||
,page: true
|
||||
,limit: 15
|
||||
,limits: [10, 15, 20, 25, 30]
|
||||
,text: '对不起,加载出现异常!'
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
$('#back1').on('click',function(){
|
||||
|
||||
//询问框
|
||||
layer.confirm('确定备份?', {
|
||||
btn: ['确定','取消'] //按钮
|
||||
}, function(){
|
||||
console.log(123);
|
||||
backup({});
|
||||
//layer.msg('的确很重要', {icon: 1});
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-ledger').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,218 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header layuiadmin-card-header-auto">
|
||||
<button class="layui-btn layuiadmin-btn-database" data-type="back">备份</button>
|
||||
</div>
|
||||
|
||||
<div class="layui-progress layui-progress-big" lay-showpercent="true" lay-filter="demo">
|
||||
<div class="layui-progress-bar layui-bg-red" lay-percent="0%"></div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<table id="LAY-app-content-database" lay-filter="LAY-app-content-database"></table>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="tao-database">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="down"><i class="layui-icon layui-icon-download-circle"></i></a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i></a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','table','layer','element'], function(){
|
||||
|
||||
var table = layui.table,
|
||||
layer = layui.layer,
|
||||
element = layui.element;
|
||||
var $ = layui.$;
|
||||
|
||||
var active = {
|
||||
|
||||
back: function backup(predate)
|
||||
{
|
||||
var index = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('admin/Database/backup')}",
|
||||
type: 'POST', //POST
|
||||
async: true, //或false,是否异步
|
||||
dataType: 'json',
|
||||
data:predate,
|
||||
success: function (data, textStatus, jqXHR) {
|
||||
|
||||
if (data.totalpercentage >= 100)
|
||||
{
|
||||
//关闭
|
||||
layer.close(index);
|
||||
layer.alert('备份完成', {icon: 1});
|
||||
table.reload('LAY-app-content-database'); //数据刷新
|
||||
}
|
||||
|
||||
element.progress('demo', data.totalpercentage+'%');
|
||||
|
||||
//循环备份
|
||||
if (data.totalpercentage < 100)
|
||||
{
|
||||
backup(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
//信息
|
||||
table.render({
|
||||
elem: '#LAY-app-content-database'
|
||||
,url: "{:url('admin/Database/index')}" //进列表接口
|
||||
,toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
|
||||
,cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
,{field:'id', title:'ID', width:80, fixed: 'left', unresize: true, sort: true}
|
||||
,{field: 'time', title: '备份时间',width: 180}
|
||||
,{field: 'name', title: '备份名', minWidth: 200}
|
||||
,{title: '操作', width: 100, align: 'center', toolbar: '#tao-database'}
|
||||
]]
|
||||
,page: true
|
||||
,limit: 15
|
||||
,limits: [10, 15, 20, 25, 30]
|
||||
,text: '对不起,加载出现异常!'
|
||||
});
|
||||
|
||||
//监听工具条
|
||||
table.on('tool(LAY-app-content-database)', function(obj){
|
||||
var data = obj.data;
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('确定删除此站点?', function(index){
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('Database/delete')}",
|
||||
data:{name:data.name},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'删除失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
//obj.del();
|
||||
layer.close(index);
|
||||
});
|
||||
} else if(obj.event === 'down'){
|
||||
var tr = $(obj.tr);
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '下载'
|
||||
,content: "{:url('Database/down')}" + '?id='+ data.id
|
||||
,area: ['420px', '460px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
|
||||
//获取iframe元素的值
|
||||
var iframeWindow = window['layui-layer-iframe'+ index]
|
||||
,submit = layero.find('iframe').contents().find("#LAY-admin-pay-submit");
|
||||
|
||||
//监听提交
|
||||
iframeWindow.layui.form.on('submit(LAY-admin-pay-submit)', function(data){
|
||||
var field = data.field; //获取提交的字段
|
||||
|
||||
//提交 Ajax 成功后,静态更新表格中的数据
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:payEdit,
|
||||
data:field,
|
||||
daType:"json",
|
||||
success:function (res){
|
||||
if (res.code == 0) {
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'修改失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
table.reload('LAY-app-content-pay'); //数据刷新
|
||||
layer.close(index); //关闭弹层
|
||||
});
|
||||
|
||||
submit.trigger('click');
|
||||
|
||||
}
|
||||
,success: function(layero, index){
|
||||
//给iframe元素赋值
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-pay").click();
|
||||
othis.find('input[name="pay_value"]').val(Math.abs(data.pay_value))
|
||||
,othis.find('input[name="pay_name"]').val(data.pay_name);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
$('#back1').on('click',function(){
|
||||
|
||||
//询问框
|
||||
layer.confirm('确定备份?', {
|
||||
btn: ['确定','取消'] //按钮
|
||||
}, function(){
|
||||
console.log(123);
|
||||
backup({});
|
||||
//layer.msg('的确很重要', {icon: 1});
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-database').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,80 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="en" data-ng-app="FileManagerApp">
|
||||
<head>
|
||||
<!--
|
||||
* Angular FileManager v1.5.1 (https://github.com/joni2back/angular-filemanager)
|
||||
* Jonas Sciangula Street <joni2back@gmail.com>
|
||||
* Licensed under MIT (https://github.com/joni2back/angular-filemanager/blob/master/LICENSE)
|
||||
-->
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
|
||||
<meta charset="utf-8">
|
||||
<title>angular-filemanager</title>
|
||||
|
||||
<!-- third party -->
|
||||
<script src="/file/node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script src="/file/node_modules/angular/angular.min.js"></script>
|
||||
<script src="/file/node_modules/angular-translate/dist/angular-translate.min.js"></script>
|
||||
<script src="/file/node_modules/ng-file-upload/dist/ng-file-upload.min.js"></script>
|
||||
<script src="/file/node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
<link rel="stylesheet" href="/file/node_modules/bootswatch/paper/bootstrap.min.css" />
|
||||
<!-- /third party -->
|
||||
|
||||
<!-- Uncomment if you need to use raw source code-->
|
||||
<script src="/file/src/js/app.js"></script>
|
||||
<script src="/file/src/js/directives/directives.js"></script>
|
||||
<script src="/file/src/js/filters/filters.js"></script>
|
||||
<script src="/file/src/js/providers/config.js"></script>
|
||||
<script src="/file/src/js/entities/chmod.js"></script>
|
||||
<script src="/file/src/js/entities/item.js"></script>
|
||||
<script src="/file/src/js/services/apihandler.js"></script>
|
||||
<script src="/file/src/js/services/apimiddleware.js"></script>
|
||||
<script src="/file/src/js/services/filenavigator.js"></script>
|
||||
<script src="/file/src/js/providers/translations.js"></script>
|
||||
<script src="/file/src/js/controllers/main.js"></script>
|
||||
<script src="/file/src/js/controllers/selector-controller.js"></script>
|
||||
<link href="/file/src/css/animations.css" rel="stylesheet">
|
||||
<link href="/file/src/css/dialogs.css" rel="stylesheet">
|
||||
<link href="/file/src/css/main.css" rel="stylesheet">
|
||||
|
||||
|
||||
<!-- Comment if you need to use raw source code
|
||||
<link href="/file/dist/angular-filemanager.min.css" rel="stylesheet">
|
||||
<script src="/file/dist/angular-filemanager.min.js"></script>
|
||||
/Comment if you need to use raw source code -->
|
||||
|
||||
<script type="text/javascript">
|
||||
//example to override angular-filemanager default config
|
||||
angular.module('FileManagerApp').config(['fileManagerConfigProvider', function (config) {
|
||||
var defaults = config.$get();
|
||||
config.set({
|
||||
appName: 'angular-filemanager',
|
||||
listUrl: '/FileManager/data',
|
||||
pickCallback: function(item) {
|
||||
var msg = 'Picked %s "%s" for external use'
|
||||
.replace('%s', item.type)
|
||||
.replace('%s', item.fullPath());
|
||||
window.alert(msg);
|
||||
},
|
||||
|
||||
allowedActions: angular.extend(defaults.allowedActions, {
|
||||
pickFiles: false,
|
||||
pickFolders: false,
|
||||
}),
|
||||
});
|
||||
}]);
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body class="ng-cloak">
|
||||
<angular-filemanager></angular-filemanager>
|
||||
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-35182652-1', 'auto');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,188 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">帖子ID</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">发帖人</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="sec">
|
||||
<option value="">选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="5">禁止</option>
|
||||
<option value="6">待审</option>
|
||||
<option value="2">置顶</option>
|
||||
<option value="3">加精</option>
|
||||
<option value="4">禁评</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn layuiadmin-btn-forum-list" lay-submit lay-filter="LAY-app-forumlist-search">
|
||||
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layuiadmin-btn-forum-list" data-type="batchdel">删除</button>
|
||||
</div>
|
||||
<table id="LAY-app-forum-list" lay-filter="LAY-app-forum-list"></table>
|
||||
<script type="text/html" id="imgTpl">
|
||||
<img style="display: inline-block; width: 50%; height: 100%;" src= "{{ d.avatar }}">
|
||||
</script>
|
||||
<script type="text/html" id="title">
|
||||
<a href="{$domain}/jie/{{d.id}}.html" target="_blank">{{d.content}}</a>
|
||||
</script>
|
||||
<script type="text/html" id="buttonTpl">
|
||||
{{# if(d.top == 1){ }}
|
||||
<button class="layui-btn layui-btn-xs">置顶</button>
|
||||
{{# } else { }}
|
||||
<button class="layui-btn layui-btn-primary layui-btn-xs">正常</button>
|
||||
{{# } }}
|
||||
</script>
|
||||
<script type="text/html" id="buttonHot">
|
||||
{{# if(d.hot == 1){ }}
|
||||
<button class="layui-btn layui-btn-xs">加精</button>
|
||||
{{# } else { }}
|
||||
<button class="layui-btn layui-btn-primary layui-btn-xs">正常</button>
|
||||
{{# } }}
|
||||
</script>
|
||||
<script type="text/html" id="buttonReply">
|
||||
{{# if(d.reply == 1){ }}
|
||||
<button class="layui-btn layui-btn-primary layui-btn-xs">正常</button>
|
||||
{{# } else { }}
|
||||
<button class="layui-btn layui-btn-xs">禁评</button>
|
||||
{{# } }}
|
||||
</script>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
{if condition="checkRuleButton('admin/forum/check')"}
|
||||
<input type="checkbox" name="check" lay-skin="switch" lay-filter="forumcheck" lay-text="通过|{{# if(d.check == -1){ }}禁止{{# } }} {{# if(d.check == 0){ }}待审{{# } }}" {{# if(d.check == 1){ }} checked {{# } }} id="{{d.id}}" >
|
||||
{else /}<button class="layui-btn layui-btn-xs layui-btn-radius layui-btn-disabled">无权限</button>{/if}
|
||||
</script>
|
||||
<script type="text/html" id="table-forum-list">
|
||||
{if condition="checkRuleButton('admin/forum/listdel')"}
|
||||
<!--a class="layui-btn layui-btn-disabled layui-btn-xs" lay-event="edit" ><i class="layui-icon layui-icon-edit"></i>编辑</a-->
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-delete"></i></a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
var forumList = "{:url('Forum/list')}",
|
||||
forumListdel = "{:url('Forum/listdel')}",
|
||||
forumListform = "{:url('Forum/listform')}",
|
||||
forumReplys = "{:url('Forum/replys')}",
|
||||
forumRedel = "{:url('Forum/redel')}",
|
||||
forumReplysform = "{:url('Forum/replysform')}",
|
||||
forumTags = "{:url('Forum/tags')}",
|
||||
forumTagsDelete = "{:url('Forum/tagsdelete')}",
|
||||
forumTagsForm = "{:url('Forum/tagsform')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'forum', 'table'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
|
||||
//监听搜索
|
||||
form.on('submit(LAY-app-forumlist-search)', function(data){
|
||||
var field = data.field;
|
||||
$.post("{:url('admin/Forum/list')}",field);
|
||||
//执行重载
|
||||
table.reload('LAY-app-forum-list', {
|
||||
where: field
|
||||
});
|
||||
});
|
||||
|
||||
//事件
|
||||
var active = {
|
||||
batchdel: function(){
|
||||
var checkStatus = table.checkStatus('LAY-app-forum-list')
|
||||
,checkData = checkStatus.data; //得到选中的数据
|
||||
|
||||
if(checkData.length === 0){
|
||||
return layer.msg('请选择数据');
|
||||
}
|
||||
|
||||
layer.confirm('确定删除吗?', function(index) {
|
||||
|
||||
//执行 Ajax 后重载
|
||||
/*
|
||||
admin.req({
|
||||
url: 'xxx'
|
||||
//,……
|
||||
});
|
||||
*/
|
||||
table.reload('LAY-app-forum-list');
|
||||
layer.msg('已删除');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//监听帖子审核
|
||||
form.on('switch(forumcheck)', function(data){
|
||||
var data= data.elem;
|
||||
status = data.checked ? 1 : -1;
|
||||
//执行帖子审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('admin/Forum/check')}",
|
||||
data:{id:data.id,status:status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
table.reload('LAY-app-forum-list');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-forum-list').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,167 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline layuiadmin-input-useradmin">
|
||||
<label class="layui-form-label">回帖人</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">内容</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="content" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="status" lay-filter="fourm-check">
|
||||
<option value="">全部</option>
|
||||
<option value="0">待审</option>
|
||||
<option value="-1">禁止</option>
|
||||
<option value="1">通过</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn layuiadmin-btn-replys" data-type="reload" lay-submit lay-filter="LAY-app-forumreply-search">
|
||||
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layuiadmin-btn-replys" data-type="batchdel">删除</button>
|
||||
</div>
|
||||
<table id="LAY-app-forumreply-list" lay-filter="LAY-app-forumreply-list"></table>
|
||||
<script type="text/html" id="imgTpl">
|
||||
<img style="display: inline-block; width: 50%; height: 100%;" src= {{ d.avatar }}>
|
||||
</script>
|
||||
<script type="text/html" id="title">
|
||||
<a href="{$domain}/jie/{{d.cid}}.html" target="_blank">{{d.cardid}}</a>
|
||||
</script>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
{if condition="checkRuleButton('admin/forum/recheck')"}<input type="checkbox" name="check" lay-skin="switch" lay-filter="recheck" lay-text="通过|{{# if(d.check == -1){ }}禁止{{# } }} {{# if(d.check == 0){ }}待审{{# } }}" {{# if(d.check == 1){ }} checked {{# } }} id="{{d.id}}" >
|
||||
{else /}<button class="layui-btn layui-btn-xs layui-btn-radius layui-btn-disabled">无权限</button>{/if}
|
||||
</script>
|
||||
<script type="text/html" id="table-forum-replys">
|
||||
{if condition="checkRuleButton('admin/forum/redel')"}
|
||||
<!--a class="layui-btn layui-btn-disabled layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a-->
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
{else / }<a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-delete"></i>删除</a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
var forumList = "{:url('Forum/list')}",
|
||||
forumListdel = "{:url('Forum/listdel')}",
|
||||
forumListform = "{:url('Forum/listform')}",
|
||||
forumReplys = "{:url('Forum/replys')}",
|
||||
forumRedel = "{:url('Forum/redel')}",
|
||||
forumReplysform = "{:url('Forum/replysform')}",
|
||||
forumTags = "{:url('Forum/tags')}",
|
||||
forumTagsDelete = "{:url('Forum/tagsdelete')}",
|
||||
forumTagsForm = "{:url('Forum/tagsform')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'forum', 'table'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
|
||||
//监听搜索
|
||||
form.on('submit(LAY-app-forumreply-search)', function(data){
|
||||
var field = data.field;
|
||||
$.post("{:url('admin/Forum/replys')}",field);
|
||||
//执行重载
|
||||
table.reload('LAY-app-forumreply-list', {
|
||||
where: field
|
||||
});
|
||||
});
|
||||
|
||||
//状态选择
|
||||
form.on('select(fourm-check)',function(data){
|
||||
$.post("{:url('admin/Forum/replys')}",{"status":data.value});
|
||||
//执行重载
|
||||
table.reload('LAY-app-forumreply-list', {
|
||||
where: {
|
||||
status: data.value
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
var active = {
|
||||
batchdel: function(){
|
||||
var checkStatus = table.checkStatus('LAY-app-forumreply-list')
|
||||
,checkData = checkStatus.data; //得到选中的数据
|
||||
|
||||
if(checkData.length === 0){
|
||||
return layer.msg('请选择数据');
|
||||
}
|
||||
|
||||
layer.confirm('确定删除吗?', function(index) {
|
||||
|
||||
//执行 Ajax 后重载
|
||||
/*
|
||||
admin.req({
|
||||
url: 'xxx'
|
||||
//,……
|
||||
});
|
||||
*/
|
||||
table.reload('LAY-app-forumreply-list');
|
||||
layer.msg('已删除');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//监听回贴审核
|
||||
form.on('switch(recheck)', function(data){
|
||||
var data= data.elem;
|
||||
status = data.checked ? 1 : -1;
|
||||
//执行回帖审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('admin/Forum/recheck')}",
|
||||
data:{id:data.id,status:status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
|
||||
table.reload('LAY-app-forumreply-list');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-replys').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,137 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header layuiadmin-card-header-auto">
|
||||
{if condition="checkRuleButton('admin/forum/addtags')"}
|
||||
<button class="layui-btn layuiadmin-btn-tags" data-type="add">添加</button>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<table id="LAY-app-content-tags" lay-filter="LAY-app-content-tags"></table>
|
||||
<script type="text/html" id="buttonHot">
|
||||
{if condition="checkRuleButton('admin/Forum/tagshot')"}<input type="checkbox" name="is_hot" lay-skin="primary" lay-filter="menu-show" {{# if(d.is_hot ==1){ }}checked value="0"{{# } else { }}value="1"{{# } }} id="{{d.id}}" >
|
||||
{else /}<input type="checkbox" title="禁用" disabled> {/if}
|
||||
</script>
|
||||
<script type="text/html" id="layuiadmin-app-cont-tagsbar">
|
||||
{if condition="checkRuleButton('admin/forum/tagsform')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-disabled layui-btn-normal layui-btn-xs"><i class="layui-icon layui-icon-edit"></i></a>{/if}
|
||||
{if condition="checkRuleButton('admin/forum/tagsdelete')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-disabled layui-btn-danger layui-btn-xs"><i class="layui-icon layui-icon-delete"></i></a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
var forumList = "{:url('Forum/list')}",
|
||||
forumListdel = "{:url('Forum/listdel')}",
|
||||
forumListform = "{:url('Forum/listform')}",
|
||||
forumReplys = "{:url('Forum/replys')}",
|
||||
forumRedel = "{:url('Forum/redel')}",
|
||||
forumReplysform = "{:url('Forum/replysform')}",
|
||||
forumTags = "{:url('Forum/tags')}",
|
||||
forumTagsDelete = "{:url('Forum/tagsdelete')}",
|
||||
forumTagsForm = "{:url('Forum/tagsform')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'forum', 'table','form'], function(){
|
||||
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
var $ = layui.$, active = {
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加分类'
|
||||
,content: 'tagsform.html'
|
||||
,area: ['400px', '450px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags")
|
||||
,sort = othis.find('input[name="sort"]').val()
|
||||
,tags = othis.find('input[name="tags"]').val()
|
||||
,ename = othis.find('input[name="ename"]').val()
|
||||
,icon = othis.find('input[name="icon"]').val()
|
||||
,desc = othis.find('input[name="desc"]').val();
|
||||
|
||||
if(!tags.replace(/\s/g, '')) return;
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('admin/Forum/addtags')}",
|
||||
data:{"sort":sort,"catename":tags,"ename":ename,"icon":cion,"desc":desc},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
table.reload('LAY-app-content-tags');
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//分类热点控制
|
||||
form.on('checkbox(menu-show)', function(data){
|
||||
var data = data.elem;
|
||||
if(data.checked == true){
|
||||
data.value = 1;
|
||||
}else{
|
||||
data.value = 0;
|
||||
}
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('admin/Forum/tagshot')}",
|
||||
data:{"id":data.id,"is_hot":data.value,},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'修改失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-tags').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,56 +0,0 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-tags" id="layuiadmin-app-form-tags" style="padding: 20px 30px 0 0 ; text-align: center;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="tags" lay-verify="required" placeholder="分类名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">EN别名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="ename" lay-verify="required" placeholder="英文名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="icon" placeholder="图标*" id="iconPicker" lay-filter="iconPicker" style="display:none;" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="desc" lay-verify="required" placeholder="描述*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sort" lay-verify="required" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'iconPicker'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form ;
|
||||
var iconPicker = layui.iconPicker;
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
634
app/admin/view/index/console1.html
Normal file
634
app/admin/view/index/console1.html
Normal file
@ -0,0 +1,634 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>控制后台</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/console1.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div>
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">今日访问</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value1">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 1024 1024" width="200" height="200" t="1591462258798"
|
||||
p-id="942" version="1.1">
|
||||
<path fill="#fcc66f" d="M 262.7 835 c -15.3 0 -28.1 -11.4 -29.8 -26.6 L 174.1 291 c -0.6 -5.1 1 -10.2 4.5 -14 s 8.3 -6 13.4 -6 h 640 c 5.1 0 10 2.2 13.4 6 s 5 8.9 4.5 14 l -58.8 517.4 c -1.7 15.2 -14.5 26.6 -29.8 26.6 H 262.7 Z"
|
||||
p-id="943" />
|
||||
<path fill="#ffd79c" d="M 802 289 l -58.8 517.4 c -0.7 6.1 -5.8 10.6 -11.9 10.6 h 30 c 6.1 0 11.2 -4.6 11.9 -10.6 L 832 289 h -30 Z"
|
||||
p-id="944" />
|
||||
<path fill="#f56e73" d="M 164 307 c -16.5 0 -30 -13.5 -30 -30 v -58 c 0 -16.5 13.5 -30 30 -30 h 696 c 16.5 0 30 13.5 30 30 v 58 c 0 16.5 -13.5 30 -30 30 H 164 Z"
|
||||
p-id="945" />
|
||||
<path fill="#ffa1a8" d="M 860 207 h -30 c 6.6 0 12 5.4 12 12 v 58 c 0 6.6 -5.4 12 -12 12 h 30 c 6.6 0 12 -5.4 12 -12 v -58 c 0 -6.6 -5.4 -12 -12 -12 Z"
|
||||
p-id="946" />
|
||||
<path fill="#65c8ff" d="M 190.9 651.5 c -31.4 0 -56.9 -25.5 -56.9 -56.9 V 219 c 0 -16.5 13.5 -30 30 -30 h 466.2 c 9.9 0 18 8.1 18 18 v 301.1 c 0 34.7 -28.2 62.9 -62.9 62.9 s -62.9 -28.2 -62.9 -62.9 V 393.5 c 0 -23.2 -18.8 -42 -42 -42 s -42 18.8 -42 42 v 68.1 c 0 29.4 -23.9 53.4 -53.4 53.4 s -53.4 -23.9 -53.4 -53.4 v -68.1 c 0 -23.2 -18.8 -42 -42 -42 s -42 18.8 -42 42 v 201.1 c 0.1 31.4 -25.4 56.9 -56.7 56.9 Z"
|
||||
p-id="947" />
|
||||
<path fill="#b3eaff" d="M 277.8 321.5 c -33.1 0 -60 26.9 -60 60 v 201.1 c 0 21.5 -17.4 38.9 -38.9 38.9 c -7.7 0 -14.8 -2.2 -20.8 -6.1 c 6.9 10.9 19 18.1 32.8 18.1 c 21.5 0 38.9 -17.4 38.9 -38.9 V 393.5 c 0 -33.1 26.9 -60 60 -60 c 13.5 0 25.9 4.5 36 12 c -11 -14.5 -28.4 -24 -48 -24 Z M 618.3 207 v 289.1 c 0 24.8 -20.1 44.9 -44.9 44.9 c -9.3 0 -18 -2.8 -25.2 -7.7 c 8.1 11.9 21.7 19.7 37.2 19.7 c 24.8 0 44.9 -20.1 44.9 -44.9 V 207 h -12 Z M 468.5 321.5 c -33.1 0 -60 26.9 -60 60 v 68.1 c 0 19.5 -15.8 35.4 -35.4 35.4 c -6.7 0 -12.9 -1.9 -18.3 -5.1 c 6.2 10.2 17.4 17.1 30.3 17.1 c 19.5 0 35.4 -15.8 35.4 -35.4 v -68.1 c 0 -33.1 26.9 -60 60 -60 c 13.5 0 25.9 4.5 36 12 c -11 -14.5 -28.4 -24 -48 -24 Z"
|
||||
p-id="948" />
|
||||
<path fill="#453b56" d="M 698 729.4 m -18 0 a 18 18 0 1 0 36 0 a 18 18 0 1 0 -36 0 Z" p-id="949" />
|
||||
<path fill="#453b56" d="M 860 171 H 632.5 v 0.1 c -0.7 0 -1.5 -0.1 -2.2 -0.1 H 164 c -26.5 0 -48 21.5 -48 48 v 375.6 c 0 41.3 33.6 74.9 74.9 74.9 c 2.7 0 5.4 -0.2 8.1 -0.5 l 16 141.4 c 2.8 24.3 23.3 42.6 47.7 42.6 h 498.6 c 24.4 0 44.9 -18.3 47.7 -42.6 l 55.2 -485.6 c 24.5 -2.1 43.8 -22.7 43.8 -47.8 v -58 c 0 -26.5 -21.5 -48 -48 -48 Z M 190.9 633.5 c -21.5 0 -38.9 -17.4 -38.9 -38.9 V 219 c 0 -6.6 5.4 -12 12 -12 h 466.3 v 301.1 c 0 24.8 -20.1 44.9 -44.9 44.9 c -24.8 0 -44.9 -20.1 -44.9 -44.9 V 393.5 c 0 -33.1 -26.9 -60 -60 -60 s -60 26.9 -60 60 v 68.1 c 0 19.5 -15.8 35.4 -35.4 35.4 c -19.5 0 -35.4 -15.8 -35.4 -35.4 v -68.1 c 0 -33.1 -26.9 -60 -60 -60 s -60 26.9 -60 60 v 201.1 c 0.1 21.5 -17.4 38.9 -38.8 38.9 Z m 582.3 172.9 c -0.7 6.1 -5.8 10.6 -11.9 10.6 H 262.7 c -6.1 0 -11.2 -4.6 -11.9 -10.6 l -6.7 -59 h 396.6 c 9.9 0 18 -8.1 18 -18 s -8.1 -18 -18 -18 H 240 l -6.3 -55.4 c 19.3 -13.6 32.1 -36 32.1 -61.3 V 393.5 c 0 -13.2 10.8 -24 24 -24 s 24 10.8 24 24 v 68.1 c 0 39.4 32 71.4 71.4 71.4 s 71.4 -32 71.4 -71.4 v -68.1 c 0 -13.2 10.8 -24 24 -24 s 24 10.8 24 24 v 114.6 c 0 44.6 36.3 80.9 80.9 80.9 c 44.6 0 80.9 -36.3 80.9 -80.9 V 325 h 161.7 l -54.9 481.4 Z M 872 277 c 0 6.6 -5.4 12 -12 12 H 666.3 v -82 H 860 c 6.6 0 12 5.4 12 12 v 58 Z"
|
||||
p-id="950" /></svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">今日访客数UV</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value2">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg t="1591462430908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="3170" width="200" height="200">
|
||||
<path d="M532 784.2c0 24.4-19.8 44.3-44.3 44.3s-44.3-19.8-44.3-44.3c0-24.4 44.3-80.3 44.3-80.3s44.3 55.8 44.3 80.3zM766 784.2c0 24.4 19.8 44.3 44.3 44.3 24.4 0 44.3-19.8 44.3-44.3 0-24.4-44.3-80.3-44.3-80.3S766 759.7 766 784.2z"
|
||||
fill="#97DCFF" p-id="3171"></path>
|
||||
<path d="M123.5 471.3c-9.9 0-18-8.1-18-18v-302c0-9.9 8.1-18 18-18h58c9.9 0 18 8.1 18 18v302c0 9.9-8.1 18-18 18h-58z"
|
||||
fill="#FCC66F" p-id="3172"></path>
|
||||
<path d="M181.5 151.3v302h-58v-302h58m0-36h-58c-19.9 0-36 16.1-36 36v302c0 19.9 16.1 36 36 36h58c19.9 0 36-16.1 36-36v-302c0-19.8-16.1-36-36-36z"
|
||||
fill="#453B56" p-id="3173"></path>
|
||||
<path d="M266.4 210.7m-18 0a18 18 0 1 0 36 0 18 18 0 1 0-36 0Z" fill="#453B56" p-id="3174"></path>
|
||||
<path d="M430.8 641.1c-9.9 0-18-8.1-18-18v-21.6c0-130.3 106-236.3 236.3-236.3s236.3 106 236.3 236.3v21.6c0 9.9-8.1 18-18 18H430.8z"
|
||||
fill="#FCC66F" p-id="3175"></path>
|
||||
<path d="M649 383.2c-5 0-10 0.2-15 0.6 113.5 7.7 203.3 102.2 203.3 217.7v21.6h30v-21.6c0-120.6-97.7-218.3-218.3-218.3z"
|
||||
fill="#FFD79C" p-id="3176"></path>
|
||||
<path d="M419.6 694.4c-22.1 0-40.1-18-40.1-40.1s18-40.1 40.1-40.1h458.8c22.1 0 40.1 18 40.1 40.1s-18 40.1-40.1 40.1H419.6z"
|
||||
fill="#F56E73" p-id="3177"></path>
|
||||
<path d="M878.4 632.3h-30c12.2 0 22.1 9.9 22.1 22.1s-9.9 22.1-22.1 22.1h30c12.2 0 22.1-9.9 22.1-22.1s-9.9-22.1-22.1-22.1z"
|
||||
fill="#FFA1A8" p-id="3178"></path>
|
||||
<path d="M693.3 846.4c0 24.4-19.8 44.3-44.3 44.3-24.4 0-44.3-19.8-44.3-44.3s44.3-80.3 44.3-80.3 44.3 55.9 44.3 80.3z"
|
||||
fill="#97DCFF" p-id="3179"></path>
|
||||
<path d="M649 908.7c-34.3 0-62.3-27.9-62.3-62.3 0-28.5 36.9-77.2 48.1-91.4 3.4-4.3 8.6-6.8 14.1-6.8s10.7 2.5 14.1 6.8c11.3 14.2 48.1 62.9 48.1 91.4 0.2 34.3-27.8 62.3-62.1 62.3z m0-112.3c-14.1 20.4-26.3 41.9-26.3 50 0 14.5 11.8 26.3 26.3 26.3s26.3-11.8 26.3-26.3c0-8.1-12.1-29.6-26.3-50z"
|
||||
fill="#453B56" p-id="3180"></path>
|
||||
<path d="M903.3 601.9v-0.5c0-134.1-104.4-244.3-236.3-253.6v-30.7c0-68.7-55.9-124.6-124.6-124.6H326.5c-9.9 0-18 8.1-18 18s8.1 18 18 18h215.9c48.8 0 88.6 39.7 88.6 88.6v30.7c-131.8 9.3-236.3 119.4-236.3 253.6v0.5c-19.6 9.3-33.2 29.3-33.2 52.4 0 32 26 58.1 58.1 58.1H459c-14.8 21-33.5 51.5-33.5 71.8 0 34.3 27.9 62.3 62.3 62.3 34.3 0 62.2-27.9 62.2-62.3 0-20.3-18.6-50.7-33.5-71.8h264.9c-14.8 21-33.5 51.5-33.5 71.8 0 34.3 27.9 62.3 62.3 62.3 34.3 0 62.3-27.9 62.3-62.3 0-20.3-18.6-50.7-33.5-71.8h39.4c32 0 58.1-26 58.1-58.1 0-23.1-13.6-43-33.2-52.4zM487.8 810.4c-14.5 0-26.3-11.8-26.3-26.3 0-8.1 12.1-29.6 26.3-50 14.1 20.4 26.2 41.9 26.2 50 0 14.5-11.8 26.3-26.2 26.3z m322.5 0c-14.5 0-26.3-11.8-26.3-26.3 0-8.1 12.1-29.6 26.3-50 14.1 20.4 26.3 41.9 26.3 50-0.1 14.5-11.9 26.3-26.3 26.3zM649 383.2c118.8 0 215.4 94.9 218.1 213.1H430.9c2.8-118.1 99.3-213.1 218.1-213.1z m251.5 271.1c0 12.2-9.9 22.1-22.1 22.1H419.6c-12.2 0-22.1-9.9-22.1-22.1 0-12.2 9.9-22.1 22.1-22.1h458.8c12.2 0.1 22.1 10 22.1 22.1z"
|
||||
fill="#453B56" p-id="3181"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">今日ip数</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value3">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg t="1591462464512" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="3311" width="200" height="200">
|
||||
<path d="M750.4 216.5h-130v-15.3c0-32.9-26.8-59.7-59.7-59.7h-97.3c-32.9 0-59.7 26.8-59.7 59.7v15.3h-130c-30.7 0-55.6 25-55.6 55.6v72.4c0 9.9 8.1 18 18 18h31.5v478c0 23.2 18.8 42 42 42h405c23.2 0 42-18.8 42-42v-478H788c9.9 0 18-8.1 18-18v-72.4c0-30.6-25-55.6-55.6-55.6z"
|
||||
fill="#FCC66F" p-id="3312"></path>
|
||||
<path d="M708.5 344.5v496c0 13.3-10.7 24-24 24h30c13.3 0 24-10.7 24-24v-496h-30z" fill="#FFD79C" p-id="3313"></path>
|
||||
<path d="M309.5 882.5c-23.2 0-42-18.8-42-42V596c0-9.9 8.1-18 18-18h36.8c30.2 0 54.8 24.6 54.8 54.8v231.7c0 9.9-8.1 18-18 18h-49.6zM664.9 882.5c-9.9 0-18-8.1-18-18V632.8c0-30.2 24.6-54.8 54.8-54.8h36.8c9.9 0 18 8.1 18 18v244.5c0 23.2-18.8 42-42 42h-49.6z"
|
||||
fill="#F56E73" p-id="3314"></path>
|
||||
<path d="M708.5 596v244.5c0 13.3-10.7 24-24 24h30c13.3 0 24-10.7 24-24V596h-30z" fill="#FFA1A8" p-id="3315"></path>
|
||||
<path d="M475.2 882.5c-9.9 0-18-8.1-18-18V632.8c0-30.2 24.6-54.8 54.8-54.8 30.2 0 54.8 24.6 54.8 54.8v231.7c0 9.9-8.1 18-18 18h-73.6z"
|
||||
fill="#F56E73" p-id="3316"></path>
|
||||
<path d="M560.7 159.5h-18c23 0 41.7 18.7 41.7 41.7V221h18v-19.8c-0.1-23-18.7-41.7-41.7-41.7zM750.4 234.5h-30c20.8 0 37.6 16.8 37.6 37.6v72.4h30v-72.4c0-20.8-16.8-37.6-37.6-37.6z"
|
||||
fill="#FFD79C" p-id="3317"></path>
|
||||
<path d="M750.4 198.5H638.2c-1.4-41.6-35.6-75-77.5-75h-97.3c-41.9 0-76.1 33.4-77.5 75H273.6c-40.6 0-73.6 33-73.6 73.6v72.4c0 19.9 16.1 36 36 36h13.5v460c0 33.1 26.9 60 60 60H714.7c33.1 0 60-26.9 60-60v-460H788c19.9 0 36-16.1 36-36v-72.4c0-40.6-33-73.6-73.6-73.6z m-287.1-39h97.3c22.1 0 40.2 17.2 41.5 39H421.8c1.4-21.8 19.4-39 41.5-39z m-104.2 705h-49.6c-13.3 0-24-10.7-24-24V596h36.8c20.3 0 36.8 16.5 36.8 36.8v231.7z m189.7 0h-73.6V632.8c0-20.3 16.5-36.8 36.8-36.8 20.3 0 36.8 16.5 36.8 36.8v231.7z m189.7-24c0 13.3-10.7 24-24 24h-49.6V632.8c0-20.3 16.5-36.8 36.8-36.8h36.8v244.5z m0-280.5h-36.8c-40.1 0-72.8 32.6-72.8 72.8v231.7h-44.2V632.8c0-40.1-32.6-72.8-72.8-72.8-40.1 0-72.8 32.6-72.8 72.8v231.7h-44.2V632.8c0-40.1-32.6-72.8-72.8-72.8h-36.8v-74.5h279c9.9 0 18-8.1 18-18s-8.1-18-18-18h-279v-69h453V560zM788 344.5H236v-72.4c0-20.8 16.8-37.6 37.6-37.6h476.8c20.8 0 37.6 16.8 37.6 37.6v72.4z"
|
||||
fill="#453B56" p-id="3318"></path>
|
||||
<path d="M621.8 467.5m-18 0a18 18 0 1 0 36 0 18 18 0 1 0-36 0Z" fill="#453B56" p-id="3319"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">平均访问时长s</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value4">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg t="1591462491887" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="3449" width="200" height="200">
|
||||
<path d="M363.2 807c-9.9 0-18-8.1-18-18v-75.5c0-9.9 8.1-18 18-18h108.5c9.9 0 18 8.1 18 18V789c0 9.9-8.1 18-18 18H363.2z"
|
||||
fill="#F56E73" p-id="3450"></path>
|
||||
<path d="M441.7 713.5h30V789h-30z" fill="#FFA1A8" p-id="3451"></path>
|
||||
<path d="M259.6 398c-9.9 0-18-8.1-18-18V178.6c0-23.8 19.3-43.1 43.1-43.1s43.1 19.3 43.1 43.1V380c0 9.9-8.1 18-18 18h-50.2zM525.1 398c-9.9 0-18-8.1-18-18V178.6c0-23.8 19.3-43.1 43.1-43.1s43.1 19.3 43.1 43.1V380c0 9.9-8.1 18-18 18h-50.2z"
|
||||
fill="#65C8FF" p-id="3452"></path>
|
||||
<path d="M550.2 153.5c-3.2 0-6.2 0.7-9 1.7 9.4 3.6 16.1 12.7 16.1 23.4V380h18V178.6c0.1-13.9-11.2-25.1-25.1-25.1z"
|
||||
fill="#97DCFF" p-id="3453"></path>
|
||||
<path d="M686 330.5H149c-9.9 0-18 8.1-18 18v63c0 9.9 8.1 18 18 18h33.2l45 225c8.7 43.4 47.1 75 91.4 75h197.6c44.3 0 82.7-31.5 91.4-75l45-225H686c9.9 0 18-8.1 18-18v-63c0-9.9-8.1-18-18-18z"
|
||||
fill="#FCC66F" p-id="3454"></path>
|
||||
<path d="M608 411.5L560.1 651c-7 35.2-37.9 60.5-73.8 60.5h30c35.9 0 66.7-25.3 73.8-60.5L638 411.5h-30zM656 348.5h30v63h-30z"
|
||||
fill="#FFD79C" p-id="3455"></path>
|
||||
<path d="M474.2 543.5m-18 0a18 18 0 1 0 36 0 18 18 0 1 0-36 0Z" fill="#453B56" p-id="3456"></path>
|
||||
<path d="M416.9 525.5h-125c-9.9 0-18 8.1-18 18s8.1 18 18 18h125c9.9 0 18-8.1 18-18s-8.1-18-18-18zM893 543.5h-33.4c-65.2 0-118.2 53-118.2 118.2v19.6c0 9.9 8.1 18 18 18s18-8.1 18-18v-19.6c0-45.3 36.9-82.2 82.2-82.2H893c9.9 0 18-8.1 18-18s-8-18-18-18zM772.2 744.2c7-7 7-18.4 0-25.5-7-7-18.4-7-25.5 0s-7 18.4 0 25.5 18.4 7.1 25.5 0z"
|
||||
fill="#453B56" p-id="3457"></path>
|
||||
<path d="M759.5 761.6c-9.9 0-18 8.1-18 18v11.6c0 43.7-35.6 79.3-79.3 79.3H487.3c-26.4 0-48.3-19.9-51.4-45.5h35.8c19.9 0 36-16.1 36-36v-41.5h8.6c52.8 0 98.7-37.6 109.1-89.4l42.1-210.6H686c19.9 0 36-16.1 36-36v-63c0-19.9-16.1-36-36-36h-74.6V178.6c0-33.7-27.4-61.1-61.1-61.1s-61.1 27.4-61.1 61.1v133.9H345.9V178.6c0-33.7-27.4-61.1-61.1-61.1s-61.1 27.4-61.1 61.1v133.9H149c-19.9 0-36 16.1-36 36v63c0 19.9 16.1 36 36 36h18.5l42.1 210.6c10.4 51.8 56.2 89.4 109.1 89.4h8.6V789c0 19.9 16.1 36 36 36h36.6c3.3 45.5 41.2 81.5 87.5 81.5h174.8c63.6 0 115.3-51.7 115.3-115.3v-11.6c0-10-8.1-18-18-18z m-234.4-583c0-13.9 11.2-25.1 25.1-25.1s25.1 11.2 25.1 25.1v133.9H525V178.6z m-265.5 0c0-13.9 11.2-25.1 25.1-25.1s25.1 11.2 25.1 25.1v133.9h-50.3V178.6zM149 411.5v-63h537v63H149z m169.7 300c-35.9 0-66.7-25.3-73.8-60.5l-40.7-203.5h426.6L590.1 651c-7 35.2-37.9 60.5-73.8 60.5H318.7z m44.5 77.5v-41.5h108.5V789H363.2z"
|
||||
fill="#453B56" p-id="3458"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md9">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-tab custom-tab layui-tab-brief" lay-filter="docDemoTabBrief">
|
||||
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
|
||||
<div class="layui-tab layui-tab-brief layadmin-latestData">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">官方动态</li>
|
||||
<li>发送反馈</li>
|
||||
<li>今周发帖</li>
|
||||
<li>今周评论</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
|
||||
<div class="layui-tab-item layui-show">
|
||||
<table id="console-news" lay-filter="console-news"></table>
|
||||
</div>
|
||||
<div class="layui-tab-item layui-form-text">
|
||||
<div class="layui-form layui-form-pane">
|
||||
<div class="layui-row layui-col-space12 layui-form-item" >
|
||||
<div class="layui-col-md5">
|
||||
<label class="layui-form-label">发送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="type" lay-verify="required" lay-filter="type">
|
||||
<option value="1">问题资讯</option>
|
||||
<option value="2">提交BUG</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md7">
|
||||
<label for="L_title" class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="post" lay-verify="required" autocomplete="off" class="layui-input layui-hide" value="{$insurl}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button type="submit" class="layui-btn " lay-filter="cunsult-add" lay-submit id="cunsult-add">立即发布</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<table id="LAY-index-topreply" lay-filter="LAY-index-topreply"></table>
|
||||
<script type="text/html" id="tao-reply">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table id="console-topSearch"></table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table id="console-topCard"></table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">版本信息</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<div class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">系统调试:</label>
|
||||
<div class="layui-input-inline" style="width: 60px;">
|
||||
<input type="checkbox" name="sys-sys" lay-skin="switch" lay-text="开启|关闭" lay-filter="sys-sys" {if env('APP_DEBUG') == true} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col style="width:70px;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>系统</td>
|
||||
<td>
|
||||
<?php echo php_uname('s'); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>版本</td>
|
||||
<td>
|
||||
TaoLer_{:config('taoler.version')}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>日志</td>
|
||||
<td>
|
||||
<a href="https://www.aieok.com/article/doc/timeline.html" target="_blank">更新日志</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>框架</td>
|
||||
<td>
|
||||
Thinkphp_{:think\\App::VERSION}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHP</td>
|
||||
<td>
|
||||
PHP_{$Think.PHP_VERSION}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>UI</td>
|
||||
<td class="UI"> Layui
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>运行</td>
|
||||
<td>
|
||||
{$runTime}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>授权</td>
|
||||
<td>
|
||||
<span id="cy">{$syscy}</span>
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" id="check">
|
||||
<i class="layui-icon layui-icon-refresh-1"></i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
链接
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<a target="_blank" href="https://www.aieok.com" class="pear-btn pear-btn-primary layui-btn-fluid" style="margin-top: 8px;height: 50px;line-height: 50px;">官 网</a>
|
||||
<br />
|
||||
<a target="_blank" href="https://gitee.com/toogee/TaoLer" class="pear-btn pear-btn-warming layui-btn-fluid"
|
||||
style="margin-top: 8px;height: 50px;line-height: 50px;">下 载</a>
|
||||
<br />
|
||||
<a target="_blank" href="https://www.aieok.com/article" class="pear-btn pear-btn-danger layui-btn-fluid"
|
||||
style="margin-top: 8px;height: 50px;line-height: 50px;">交 流</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
寄语
|
||||
</div>
|
||||
<div class="layui-card-body" style="line-height:40px;">
|
||||
不是最好,只会越来越好!高效迅速、专注其道,简洁简单,功能专一,又具有更多的应用功能。
|
||||
<br>不管是自用、商用,还是学习,都可让您轻松愉快的使用。
|
||||
<br>作者尽最大热情,持续迭代更新维护,做到项目长期可用,不放弃不遗忘。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--</div>-->
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const indexForums = "{:url('Index/forums')}"; //帖子
|
||||
const indexReplys = "{:url('Index/replys')}"; //回复
|
||||
const NEWS = "{:url('index/news')}"; //动态
|
||||
const indexReply = "{:url('Index/reply')}"; //反馈
|
||||
const v = layui.v;
|
||||
|
||||
|
||||
layui.use(['form','layer', 'echarts', 'element', 'count','toast'], function() {
|
||||
let $ = layui.jquery, form = layui.form,
|
||||
layer = layui.layer,
|
||||
element = layui.element,
|
||||
count = layui.count,
|
||||
echarts = layui.echarts;
|
||||
let toast = layui.toast;
|
||||
let table = layui.table;
|
||||
|
||||
$('.UI').append(v);
|
||||
|
||||
|
||||
count.up("value1", {
|
||||
time: 4000,
|
||||
num: {:hook('seoBaiduTongji',['name'=>'tpv']) ?: 0},
|
||||
bit: 0,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
count.up("value2", {
|
||||
time: 4000,
|
||||
num: {:hook('seoBaiduTongji',['name'=>'tuv']) ?: 0},
|
||||
bit: 0,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
count.up("value3", {
|
||||
time: 4000,
|
||||
num: {:hook('seoBaiduTongji',['name'=>'tip']) ?: 0},
|
||||
bit: 0,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
count.up("value4", {
|
||||
time: 4000,
|
||||
bit: 2,
|
||||
num: {:hook('seoBaiduTongji',['name'=>'tvt']) ?: 0},
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
|
||||
|
||||
const colorList = ["#9E87FF", '#73DDFF', '#fe9a8b', '#F56948', '#9E87FF']
|
||||
var pv = "{:hook('seoBaiduTodayTime',['name'=>'pv']) ?: 0}";
|
||||
var uv = "{:hook('seoBaiduTodayTime',['name'=>'uv']) ?: 0}";
|
||||
|
||||
var option = {
|
||||
backgroundColor: '#fff',
|
||||
tooltip: {
|
||||
show: false
|
||||
},
|
||||
grid: {
|
||||
top: '10%',
|
||||
bottom: '6%',
|
||||
left: '6%',
|
||||
right: '6%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: [{
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
margin: 10,
|
||||
//textStyle: {
|
||||
fontSize: 14,
|
||||
color: 'rgba(#999)'
|
||||
//}
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#939ab6',
|
||||
opacity: .15
|
||||
}
|
||||
},
|
||||
data: ['00:00', '01:00', '02:10', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00']
|
||||
}, ],
|
||||
yAxis: [{
|
||||
type: 'value',
|
||||
offset: 15,
|
||||
max: 50,
|
||||
min: 0,
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
margin: 10,
|
||||
//textStyle: {
|
||||
fontSize: 14,
|
||||
color: '#999'
|
||||
//}
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
}
|
||||
|
||||
}],
|
||||
series: [{
|
||||
name: '2',
|
||||
type: 'line',
|
||||
z: 3,
|
||||
showSymbol: false,
|
||||
smoothMonotone: 'x',
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [{
|
||||
offset: 0,
|
||||
color: 'rgba(59,102,246)' // 0% 处的颜色
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(118,237,252)' // 100% 处的颜色
|
||||
}]
|
||||
},
|
||||
shadowBlur: 4,
|
||||
shadowColor: 'rgba(69,126,247,.2)',
|
||||
shadowOffsetY: 4
|
||||
},
|
||||
areaStyle: {
|
||||
//normal: {
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [{
|
||||
offset: 0,
|
||||
color: 'rgba(227,233,250,.9)' // 0% 处的颜色
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(248,251,252,.3)' // 100% 处的颜色
|
||||
}]
|
||||
}
|
||||
//}
|
||||
},
|
||||
smooth: true,
|
||||
data: pv.split(",")
|
||||
}, {
|
||||
name: '1',
|
||||
type: 'line',
|
||||
showSymbol: false,
|
||||
smoothMonotone: 'x',
|
||||
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0,
|
||||
color: 'rgba(255,84,108)'
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(252,140,118)'
|
||||
}], false),
|
||||
shadowBlur: 4,
|
||||
shadowColor: 'rgba(253,121,128,.2)',
|
||||
shadowOffsetY: 4
|
||||
},
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0,
|
||||
color: 'rgba(255,84,108,.15)'
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(252,140,118,0)'
|
||||
}], false),
|
||||
},
|
||||
smooth: true,
|
||||
data: uv.split(",")
|
||||
}, ]
|
||||
|
||||
};
|
||||
echartsRecords.setOption(option);
|
||||
|
||||
window.onresize = function() {
|
||||
echartsRecords.resize();
|
||||
}
|
||||
|
||||
//动态news
|
||||
table.render({
|
||||
elem: '#console-news'
|
||||
,url: NEWS //接口
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'name', title: '发帖者', width: 100,}
|
||||
,{field: 'title', title: '标题', minWidth: 300, templet: '<div><a href="{{d.id}}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
|
||||
,{field: 'time', title: '时间', sort: true}
|
||||
,{field: 'catename', title: '类别'}
|
||||
]]
|
||||
,page: true
|
||||
,limit: 10
|
||||
,limits: [10, 15, 20, 25, 30]
|
||||
,text: '对不起,加载出现异常!'
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
//反馈
|
||||
table.render({
|
||||
elem: '#console-topreply'
|
||||
,url: indexReply //评论接口
|
||||
,page: true
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'time', title: '时间', width: 120}
|
||||
,{field: 'content', title: '内容', minWidth: 300}
|
||||
,{field: '操作', width: 80, align: 'center', fixed: 'right', toolbar: '#tao-reply'}
|
||||
|
||||
]]
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
//本周发贴
|
||||
table.render({
|
||||
elem: '#console-topSearch'
|
||||
,url: indexForums //发贴接口
|
||||
,page: true
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'title', title: '标题', minWidth: 300, templet: '<div><a href="{{d.id}}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
|
||||
,{field: 'name', title: '发帖者'}
|
||||
,{field: 'catename', title: '类别'}
|
||||
,{field: 'pv', title: '点击率', sort: true}
|
||||
]]
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
//本周评论
|
||||
table.render({
|
||||
elem: '#console-topCard'
|
||||
,url: indexReplys //评论接口
|
||||
,page: true
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'content', title: '评论', minWidth: 300}
|
||||
,{field: 'title', title: '帖子', minWidth: 200, templet: '<div><a href="{{d.cid}}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
|
||||
,{field: 'name', title: '评论者'}
|
||||
|
||||
]]
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
// 系统调试
|
||||
form.on('switch(sys-sys)',function(data){
|
||||
var status = data.elem.checked;
|
||||
$.post("{:url('index/sysSys')}",{status:status},function(res){
|
||||
if (res.code == 0) { toast.info({title:"通知消息",message:res.msg})} else {
|
||||
toast.error({title:"错误消息",message:res.msg});
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
//系统检测
|
||||
$("#check").click(function (){
|
||||
$.get("{:url('index/check')}", function (res){
|
||||
if(res.code === 0) {
|
||||
toast.info({title:"提示消息",message:res.msg});
|
||||
$("#cy").html(res.data.info);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// 升级提醒
|
||||
$(function (){
|
||||
$.get("{:url('system.upgrade/check')}",function (data){
|
||||
if (data.code === 1) {
|
||||
//可升级
|
||||
layer.confirm('发现新版本V' + data.data.version + ',确定升级?',{icon: 3, title:'系统检测'}, function(index){
|
||||
//更新
|
||||
$.get("{:url('system.upgrade/upload')}",function (res){
|
||||
if (res.code === 0) {
|
||||
layer.close(index);
|
||||
toast.info({title:"通知消息", message: res.msg ,position: 'topRight'})
|
||||
} else {
|
||||
layer.close(index);
|
||||
toast.error({title:"服务器错误", message:res.msg})
|
||||
}
|
||||
return false;
|
||||
});
|
||||
//关闭load加载层
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
530
app/admin/view/index/console2.html
Normal file
530
app/admin/view/index/console2.html
Normal file
@ -0,0 +1,530 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>数据分析</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/console2.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md8">
|
||||
<div class="layui-row layui-col-space10">
|
||||
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-voice"></i><a href="{:url('system.upgrade/index')}" id="up_version" lay-href="{:url('system.upgrade/index')}"></a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
快捷菜单
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home1" data-title="主页"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-home"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">主页</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home2" data-title="弹层"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-camera"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">弹层</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home2" data-title="聊天"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-star"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">聊天</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home3" data-title="相机"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-camera"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">相机</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home4" data-title="表单"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-console"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">表单</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home5" data-title="安全"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-auz"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">安全</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home6" data-title="公告"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-cart"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">公告</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home7" data-title="更多"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-app"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">更多</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
代办任务
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审评论</div>
|
||||
<div class="count pear-text">{$pendComms}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审帖子</div>
|
||||
<div class="count pear-text">{$pendForums}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审文章</div>
|
||||
<div class="count pear-text">0</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审用户</div>
|
||||
<div class="count pear-text">{$pendUser}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-tab custom-tab layui-tab-brief" lay-filter="docDemoTabBrief">
|
||||
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
使用记录
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<table id="role-table" lay-filter="role-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md4">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">留言板</div>
|
||||
<div class="layui-card-body">
|
||||
<ul class="pear-card-status">
|
||||
<li>
|
||||
<p>要不要作为我的家人,搬来我家。</p>
|
||||
<span>12月25日 19:92</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>快乐的时候不敢尽兴,频繁警戒自己保持清醒。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>夏天真的来了,尽管它还有些犹豫。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>看似不可达到的高度,只要坚持不懈就可能到达。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>当浑浊变成了一种常态,那么清白就成了一种罪过。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>那是一种内在的东西,他们到达不了,也无法触及!</p>
|
||||
<span>5月12日 01:25</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
<p>希望是一个好东西,也许是最好的,好东西是不会消亡的!</p>
|
||||
<span>6月11日 15:33</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>一切都在不可避免的走向庸俗。</p>
|
||||
<span>2月09日 13:40</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>路上没有灯火的时候,就点亮自己的头颅。</p>
|
||||
<span>3月11日 12:30</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<p>我们应该不虚度一生,应该能够说:"我已经做了我能做的事。"</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
<p>接近,是我对一切的态度,是我对一切态度的距离</p>
|
||||
<span>6月11日 15:33</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>没有锚的船当然也可以航行,只是紧张充满你的一生。</p>
|
||||
<span>2月09日 13:40</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--</div>-->
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['layer', 'echarts', 'carousel', 'element', 'table'], function() {
|
||||
var $ = layui.jquery,
|
||||
layer = layui.layer,
|
||||
element = layui.element,
|
||||
echarts = layui.echarts,
|
||||
table = layui.table,
|
||||
carousel = layui.carousel;
|
||||
|
||||
let cols = [
|
||||
[{
|
||||
type: 'checkbox'
|
||||
},
|
||||
{
|
||||
title: '角色名',
|
||||
field: 'roleName',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
title: 'Key值',
|
||||
field: 'roleCode',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '描述',
|
||||
field: 'details',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '是否可用',
|
||||
field: 'enable',
|
||||
align: 'center',
|
||||
templet: '#role-enable'
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
table.render({
|
||||
elem: '#role-table',
|
||||
url: '/static/admin/data/role.json',
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line'
|
||||
});
|
||||
|
||||
|
||||
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
|
||||
|
||||
$("body").on("click", "[data-url]", function() {
|
||||
parent.layui.tab.addTabOnlyByElem("content", {
|
||||
id: $(this).attr("data-id"),
|
||||
title: $(this).attr("data-title"),
|
||||
url: $(this).attr("data-url"),
|
||||
close: true
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
let bgColor = "#fff";
|
||||
let color = [
|
||||
"#0090FF",
|
||||
"#36CE9E",
|
||||
"#FFC005",
|
||||
"#FF515A",
|
||||
"#8B5CFF",
|
||||
"#00CA69"
|
||||
];
|
||||
let echartData = [{
|
||||
name: "1",
|
||||
value1: 100,
|
||||
value2: 233
|
||||
},
|
||||
{
|
||||
name: "2",
|
||||
value1: 138,
|
||||
value2: 233
|
||||
},
|
||||
{
|
||||
name: "3",
|
||||
value1: 350,
|
||||
value2: 200
|
||||
},
|
||||
{
|
||||
name: "4",
|
||||
value1: 173,
|
||||
value2: 180
|
||||
},
|
||||
{
|
||||
name: "5",
|
||||
value1: 180,
|
||||
value2: 199
|
||||
},
|
||||
{
|
||||
name: "6",
|
||||
value1: 150,
|
||||
value2: 233
|
||||
},
|
||||
{
|
||||
name: "7",
|
||||
value1: 180,
|
||||
value2: 210
|
||||
},
|
||||
{
|
||||
name: "8",
|
||||
value1: 230,
|
||||
value2: 180
|
||||
}
|
||||
];
|
||||
|
||||
let xAxisData = echartData.map(v => v.name);
|
||||
// ["1", "2", "3", "4", "5", "6", "7", "8"]
|
||||
let yAxisData1 = echartData.map(v => v.value1);
|
||||
// [100, 138, 350, 173, 180, 150, 180, 230]
|
||||
let yAxisData2 = echartData.map(v => v.value2);
|
||||
// [233, 233, 200, 180, 199, 233, 210, 180]
|
||||
const hexToRgba = (hex, opacity) => {
|
||||
let rgbaColor = "";
|
||||
let reg = /^#[\da-f]{6}$/i;
|
||||
if (reg.test(hex)) {
|
||||
rgbaColor =
|
||||
`rgba(${parseInt("0x" + hex.slice(1, 3))},${parseInt(
|
||||
"0x" + hex.slice(3, 5)
|
||||
)},${parseInt("0x" + hex.slice(5, 7))},${opacity})`;
|
||||
}
|
||||
return rgbaColor;
|
||||
}
|
||||
|
||||
option = {
|
||||
backgroundColor: bgColor,
|
||||
color: color,
|
||||
legend: {
|
||||
right: 10,
|
||||
top: 10
|
||||
},
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
formatter: function(params) {
|
||||
let html = '';
|
||||
params.forEach(v => {
|
||||
html +=
|
||||
`<div style="color: #666;font-size: 14px;line-height: 24px">
|
||||
<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${color[v.componentIndex]};"></span>
|
||||
${v.seriesName}.${v.name}
|
||||
<span style="color:${color[v.componentIndex]};font-weight:700;font-size: 18px">${v.value}</span>
|
||||
万元`;
|
||||
})
|
||||
return html
|
||||
},
|
||||
extraCssText: 'background: #fff; border-radius: 0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);color: #333;',
|
||||
axisPointer: {
|
||||
type: 'shadow',
|
||||
shadowStyle: {
|
||||
color: '#ffffff',
|
||||
shadowColor: 'rgba(225,225,225,1)',
|
||||
shadowBlur: 5
|
||||
}
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
top: 100,
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: [{
|
||||
type: "category",
|
||||
boundaryGap: false,
|
||||
axisLabel: {
|
||||
formatter: '{value}月',
|
||||
textStyle: {
|
||||
color: "#333"
|
||||
}
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#D9D9D9"
|
||||
}
|
||||
},
|
||||
data: xAxisData
|
||||
}],
|
||||
yAxis: [{
|
||||
type: "value",
|
||||
name: '单位:万千瓦时',
|
||||
axisLabel: {
|
||||
textStyle: {
|
||||
color: "#666"
|
||||
}
|
||||
},
|
||||
nameTextStyle: {
|
||||
color: "#666",
|
||||
fontSize: 12,
|
||||
lineHeight: 40
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
type: "dashed",
|
||||
color: "#E9E9E9"
|
||||
}
|
||||
},
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
}],
|
||||
series: [{
|
||||
name: "2018",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbolSize: 8,
|
||||
zlevel: 3,
|
||||
lineStyle: {
|
||||
normal: {
|
||||
color: color[0],
|
||||
shadowBlur: 3,
|
||||
shadowColor: hexToRgba(color[0], 0.5),
|
||||
shadowOffsetY: 8
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
[{
|
||||
offset: 0,
|
||||
color: hexToRgba(color[0], 0.3)
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: hexToRgba(color[0], 0.1)
|
||||
}
|
||||
],
|
||||
false
|
||||
),
|
||||
shadowColor: hexToRgba(color[0], 0.1),
|
||||
shadowBlur: 10
|
||||
}
|
||||
},
|
||||
data: yAxisData1
|
||||
}, {
|
||||
name: "2019",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbolSize: 8,
|
||||
zlevel: 3,
|
||||
lineStyle: {
|
||||
normal: {
|
||||
color: color[1],
|
||||
shadowBlur: 3,
|
||||
shadowColor: hexToRgba(color[1], 0.5),
|
||||
shadowOffsetY: 8
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
[{
|
||||
offset: 0,
|
||||
color: hexToRgba(color[1], 0.3)
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: hexToRgba(color[1], 0.1)
|
||||
}
|
||||
],
|
||||
false
|
||||
),
|
||||
shadowColor: hexToRgba(color[1], 0.1),
|
||||
shadowBlur: 10
|
||||
}
|
||||
},
|
||||
data: yAxisData2
|
||||
}]
|
||||
};
|
||||
|
||||
echartsRecords.setOption(option);
|
||||
|
||||
window.onresize = function() {
|
||||
echartsRecords.resize();
|
||||
};
|
||||
|
||||
//加载版本检测
|
||||
(function(){
|
||||
$.get("{:url('Index/sysUpgradeCheck')}",function(data){
|
||||
$('#up_version').html(data);
|
||||
})
|
||||
})();
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -5,11 +5,11 @@
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md8">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><span style="color:red">{$versions}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-voice"></i><a id="up_version" lay-href="{:url('Upgrade/index')}"></a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">快捷方式</div>
|
||||
@ -74,6 +74,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-col-md6">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">待办事项</div>
|
||||
@ -83,13 +84,13 @@
|
||||
<div carousel-item>
|
||||
<ul class="layui-row layui-col-space10">
|
||||
<li class="layui-col-xs6">
|
||||
<a lay-href="{:url('admin/Forum/replys')}" class="layadmin-backlog-body">
|
||||
<a lay-href="{:url('Forum/replys')}" class="layadmin-backlog-body">
|
||||
<h3>待审评论</h3>
|
||||
<p><cite>{$comms}</cite></p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs6">
|
||||
<a lay-href="{:url('admin/Forum/list')}" class="layadmin-backlog-body">
|
||||
<a lay-href="{:url('Forum/list')}" class="layadmin-backlog-body">
|
||||
<h3>待审帖子</h3>
|
||||
<p><cite>{$forums}</cite></p>
|
||||
</a>
|
||||
@ -97,13 +98,13 @@
|
||||
<li class="layui-col-xs6">
|
||||
<a lay-href="javascript:;" class="layadmin-backlog-body">
|
||||
<h3>待审商品</h3>
|
||||
<p><cite>99</cite></p>
|
||||
<p><cite>0</cite></p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs6">
|
||||
<a href="javascript:;" onclick="layer.tips('不跳转', this, {tips: 3});" class="layadmin-backlog-body">
|
||||
<h3>待发货</h3>
|
||||
<p><cite>20</cite></p>
|
||||
<p><cite>0</cite></p>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@ -120,11 +121,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">数据概览</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-carousel layadmin-carousel layadmin-dataview" data-anim="fade" lay-filter="LAY-index-dataview">
|
||||
<div carousel-item id="LAY-index-dataview">
|
||||
<div><i class="layui-icon layui-icon-loading1 layadmin-loading"></i></div>
|
||||
@ -132,61 +133,60 @@
|
||||
<div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-tab layui-tab-brief layadmin-latestData">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">官方动态</li>
|
||||
<li class="layui-this">官方动态</li>
|
||||
<li>发送反馈</li>
|
||||
<li>今周发帖</li>
|
||||
<li>今周评论</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
|
||||
<div class="layui-tab-item layui-show">
|
||||
|
||||
<div class="layui-tab-item layui-show">
|
||||
<table id="LAY-index-topnews"></table>
|
||||
</div>
|
||||
<div class="layui-tab-item layui-form-text">
|
||||
<div class="layui-form layui-form-pane">
|
||||
<div class="layui-row layui-col-space12 layui-form-item" >
|
||||
<div class="layui-col-md5">
|
||||
<label class="layui-form-label">发送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="type" lay-verify="required" lay-filter="type">
|
||||
<option value="1">问题资讯</option>
|
||||
<option value="2">提交BUG</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md7">
|
||||
<label for="L_title" class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="post" lay-verify="required" autocomplete="off" class="layui-input layui-hide" value="{$insurl}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button type="submit" class="layui-btn " lay-filter="cunsult-add" lay-submit id="cunsult-add">立即发布</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<table id="LAY-index-topreply" lay-filter="LAY-index-topreply"></table>
|
||||
<script type="text/html" id="tao-reply">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
</script>
|
||||
</div>
|
||||
<div class="layui-form layui-form-pane">
|
||||
<div class="layui-row layui-col-space12 layui-form-item" >
|
||||
<div class="layui-col-md5">
|
||||
<label class="layui-form-label">发送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="type" lay-verify="required" lay-filter="type">
|
||||
<option value="1">问题资讯</option>
|
||||
<option value="2">提交BUG</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md7">
|
||||
<label for="L_title" class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="post" lay-verify="required" autocomplete="off" class="layui-input layui-hide" value="{$insurl}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button type="submit" class="layui-btn " lay-filter="cunsult-add" lay-submit id="cunsult-add">立即发布</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<table id="LAY-index-topreply" lay-filter="LAY-index-topreply"></table>
|
||||
<script type="text/html" id="tao-reply">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-tab-item">
|
||||
<table id="LAY-index-topSearch"></table>
|
||||
</div>
|
||||
@ -204,13 +204,21 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">版本信息</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<div class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">系统调试:</label>
|
||||
<div class="layui-input-inline" style="width: 60px;">
|
||||
<input type="checkbox" name="sys-sys" lay-skin="switch" lay-text="开启|关闭" lay-filter="sys-sys" {if env('APP_DEBUG') == true} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col width="100">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tr>
|
||||
<td>当前系统</td>
|
||||
<td>
|
||||
<script type="text/html" template>
|
||||
@ -223,11 +231,11 @@
|
||||
<td>
|
||||
<script type="text/html" template>
|
||||
TaoLer_{:config('taoler.version')}
|
||||
<a href="http://bbs.aieok.com/doc/timeline.html" target="_blank" style="padding-left: 15px;">更新日志</a>
|
||||
<a href="https://www.aieok.com/article/doc/timeline.html" target="_blank">更新日志</a>
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td>核心框架</td>
|
||||
<td>
|
||||
<script type="text/html" template>
|
||||
@ -235,7 +243,7 @@
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td>PHP版本</td>
|
||||
<td>
|
||||
<script type="text/html" template>
|
||||
@ -251,7 +259,7 @@
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td>运行时间</td>
|
||||
<td>
|
||||
<script type="text/html" template>
|
||||
@ -259,7 +267,7 @@
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td>当前授权</td>
|
||||
<td>
|
||||
<script type="text/html" template>
|
||||
@ -267,7 +275,6 @@
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@ -322,13 +329,14 @@
|
||||
<div class="layui-card-body layui-text layadmin-text">
|
||||
<p>TaoLer,采用Thinkphp6.0最新版本为开发框架,代码简洁,运行高效,更新及时。layui是国内比较流行的前端框架,两者完美结合,您会拥有一个非常让人舒适的网站。</p>
|
||||
<p>专注专一,大简其道!--本系统的特点,力争做到简洁,不臃肿,功能专一。不管是学习还是商用,都可以良好的运行。</p>
|
||||
<p>作者尽最大可能,长期进行项目的维护,做到长期可用。</p>
|
||||
<p>作者尽最大可能,长期进行项目的维护,做到长期可用。</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{include file="public/user_login" /}
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
@ -336,12 +344,29 @@
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'console','element', 'layedit','form','table'],function(){
|
||||
}).use(['index', 'console','element', 'layedit','form','table','notify'],function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form
|
||||
,layedit = layui.layedit
|
||||
,table = layui.table
|
||||
,element = layui.element; //Tab的切换功能,切换事件监听等,需要依赖element模块
|
||||
var notify = layui.notify;
|
||||
|
||||
var api = {
|
||||
userinfo: {
|
||||
get: function () {
|
||||
var userinfo = localStorage.getItem("taoleradmin_userinfo");
|
||||
return userinfo ? JSON.parse(userinfo) : null;
|
||||
},
|
||||
set: function (data) {
|
||||
if (data) {
|
||||
localStorage.setItem("taoleradmin_userinfo", JSON.stringify(data));
|
||||
} else {
|
||||
localStorage.removeItem("taoleradmin_userinfo");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var index = layedit.build('L_content', {
|
||||
height: 120 //设置编辑器高度
|
||||
@ -366,41 +391,100 @@
|
||||
return layedit.sync(index);
|
||||
}
|
||||
});
|
||||
|
||||
// 系统调试
|
||||
form.on('switch(sys-sys)',function(data){
|
||||
var status = data.elem.checked;
|
||||
$.post("{:url('index/sysSys')}",{status:status},function(res){
|
||||
if (res.code == 0) { notify.info(res.msg)} else {
|
||||
notify.error(res.msg);
|
||||
}
|
||||
})
|
||||
});
|
||||
// 发送反馈
|
||||
form.on('submit(cunsult-add)',function(data){
|
||||
var field = data.field;
|
||||
var userinfo = api.userinfo.get();
|
||||
if(!userinfo) {
|
||||
// 登录
|
||||
layer.confirm('你当前还未登录TaoLer社区账号,请登录后操作!', {
|
||||
title : '温馨提示',
|
||||
btnAlign: 'c',
|
||||
btn: ['立即登录'] //按钮
|
||||
},function (index){
|
||||
layer.close(index);
|
||||
// 登录窗口
|
||||
layer.open({
|
||||
type: 1,
|
||||
shadeClose: true,
|
||||
title: '登录账号',
|
||||
content: $("#user-info").html(),
|
||||
area: ['400px','300px'],
|
||||
btn: ['登录','注册'],
|
||||
yes:function (index, layero) {
|
||||
var url = "{:url('Addons/userLogin')}";
|
||||
var data = {
|
||||
name: $("#username", layero).val(),
|
||||
password: $("#password", layero).val(),
|
||||
};
|
||||
if (!data.name || !data.password) {
|
||||
notify.error('Account Or Password Cannot Empty');
|
||||
return false;
|
||||
}
|
||||
$.ajax({
|
||||
url: url, type: 'post', data: data, dataType: "json", success: function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.close(index);
|
||||
api.userinfo.set(res.data);
|
||||
notify.success("登录成功", function (){
|
||||
location.reload();
|
||||
});
|
||||
|
||||
} else {
|
||||
notify.alert(res.msg);
|
||||
}
|
||||
}, error: function (res) {
|
||||
notify.error(res.msg);
|
||||
}
|
||||
})
|
||||
},
|
||||
btn2: function () {
|
||||
return false;
|
||||
},
|
||||
success: function (layero, index) {
|
||||
$(".layui-layer-btn1", layero).prop("href", "https://www.aieok.com/article/reg.html").prop("target", "_blank");
|
||||
},
|
||||
end: function () {
|
||||
$("#login").hide();
|
||||
},
|
||||
|
||||
});
|
||||
});
|
||||
} else {
|
||||
field.id = userinfo.uid;
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Index/cunsult')}",
|
||||
data:field,
|
||||
dataType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
notify.success(data.msg, function(){location.reload()});
|
||||
} else {
|
||||
notify.error(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
form.on('submit(cunsult-add)',function(data){
|
||||
var field = data.field;
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Index/cunsult')}",
|
||||
data:field,
|
||||
dataType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
}, function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//监听工具条
|
||||
//监听工具条
|
||||
table.on('tool(LAY-index-topreply)', function(obj){
|
||||
var data = obj.data;
|
||||
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('确定删除此站点?', function(index){
|
||||
layer.confirm('确定删除?', function(index){
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('Index/delReply')}",
|
||||
@ -408,41 +492,49 @@
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
},function(){
|
||||
notify.success(data.msg,function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'删除失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
notify.error(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
//obj.del();
|
||||
table.reload('LAY-index-topreply');
|
||||
table.reload('LAY-index-topreply');
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
//加载版本检测
|
||||
(function(){
|
||||
$.get("{:url('Index/getVersion')}",function(data){
|
||||
$('#up_version').html(data);
|
||||
})
|
||||
})();
|
||||
// 用户信息清理
|
||||
(function (){
|
||||
var time = Date.parse(new Date());
|
||||
var userinfo = api.userinfo.get();
|
||||
if(userinfo) {
|
||||
if(time > userinfo.expiretime *1000) {
|
||||
api.userinfo.set();
|
||||
}
|
||||
}
|
||||
})()
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-oiltank').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
var indexForums = "{:url('Index/forums')}", //帖子
|
||||
indexReplys = "{:url('Index/replys')}"; //回复
|
||||
var indexNews = "{:url('Index/news')}", //动态
|
||||
indexReply = "{:url('Index/reply')}"; //反馈
|
||||
var monthTime = "{$monthTime}",
|
||||
indexReplys = "{:url('Index/replys')}", //回复
|
||||
indexNews = "{:url('Index/news')}", //动态
|
||||
indexReply = "{:url('Index/reply')}", //反馈
|
||||
monthTime = "{$monthTime}",
|
||||
monthUserCount = "{$monthUserCount}";
|
||||
</script>
|
||||
{/block}
|
@ -1,33 +1,150 @@
|
||||
{extend name="public:base" /}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>TaoLer Admin管理系统</title>
|
||||
<!-- 依 赖 样 式 -->
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<!-- 加 载 样 式 -->
|
||||
<link rel="stylesheet" href="/static/admin/css/loader.css" />
|
||||
<!-- 布 局 样 式 -->
|
||||
<link rel="stylesheet" href="/static/admin/css/admin.css" />
|
||||
</head>
|
||||
<!-- 结 构 代 码 -->
|
||||
<body class="layui-layout-body pear-admin">
|
||||
<!-- 布 局 框 架 -->
|
||||
<div class="layui-layout layui-layout-admin">
|
||||
<!-- 顶 部 样 式 -->
|
||||
<div class="layui-header">
|
||||
<!-- 菜 单 顶 部 -->
|
||||
<div class="layui-logo">
|
||||
<!-- 图 标 -->
|
||||
<img class="logo">
|
||||
<!-- 标 题 -->
|
||||
<span class="title"></span>
|
||||
</div>
|
||||
<!-- 顶 部 左 侧 功 能 -->
|
||||
<ul class="layui-nav layui-layout-left">
|
||||
<li class="collapse layui-nav-item"><a href="#" class="layui-icon layui-icon-shrink-right"></a></li>
|
||||
<li class="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1" loading = 600></a></li>
|
||||
</ul>
|
||||
<!-- 多 系 统 菜 单 -->
|
||||
<div id="control" class="layui-layout-control"></div>
|
||||
<!-- 顶 部 右 侧 菜 单 -->
|
||||
<ul class="layui-nav layui-layout-right">
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="#" class="menuSearch layui-icon layui-icon-search"></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="#" class="fullScreen layui-icon layui-icon-screen-full"></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="{$domain}" class="layui-icon layui-icon-website" target="_blank"></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="javascript:void(0);" layadmin-event="clearcache" id="clearcache"><i class="layui-icon layui-icon-fonts-clear"></i></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs message"></li>
|
||||
<li class="layui-nav-item user">
|
||||
<!-- 头 像 -->
|
||||
<a class="layui-icon layui-icon-username" href="javascript:;"></a>
|
||||
<!-- 功 能 菜 单 -->
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a user-menu-url="{:url('system.admin/info')}" user-menu-id="5555" user-menu-title="基本资料">基本资料</a></dd>
|
||||
<dd><a href="javascript:void(0);" id="resetPassword">修改密码</a></dd>
|
||||
<dd><a href="javascript:void(0);" class="logout">注销登录</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- 主 题 配 置 -->
|
||||
<li class="layui-nav-item setting"><a href="#" class="layui-icon layui-icon-more-vertical"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- 侧 边 区 域 -->
|
||||
<div class="layui-side layui-bg-black">
|
||||
<!-- 菜 单 顶 部 -->
|
||||
<div class="layui-logo">
|
||||
<!-- 图 标 -->
|
||||
<img class="logo">
|
||||
<!-- 标 题 -->
|
||||
<span class="title"></span>
|
||||
</div>
|
||||
<!-- 菜 单 内 容 -->
|
||||
<div class="layui-side-scroll">
|
||||
<div id="sideMenu"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 视 图 页 面 -->
|
||||
<div class="layui-body">
|
||||
<!-- 内 容 页 面 -->
|
||||
<div id="content"></div>
|
||||
</div>
|
||||
<!-- 页脚 -->
|
||||
<div class="layui-footer layui-text">
|
||||
<span class="left">
|
||||
作者qq: 317927823 官方qq群:863422399
|
||||
</span>
|
||||
<span class="center"></span>
|
||||
<span class="right">
|
||||
Copyright © 2020-2023 aieok.com
|
||||
</span>
|
||||
</div>
|
||||
<!-- 遮 盖 层 -->
|
||||
<div class="pear-cover"></div>
|
||||
<!-- 加 载 动 画 -->
|
||||
<div class="loader-main">
|
||||
<!-- 动 画 对 象 -->
|
||||
<div class="loader"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 移 动 端 便 捷 操 作 -->
|
||||
<div class="pear-collapsed-pe collapse">
|
||||
<a href="#" class="layui-icon layui-icon-shrink-right"></a>
|
||||
</div>
|
||||
<!-- 依 赖 脚 本 -->
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<!-- 框 架 初 始 化 -->
|
||||
<script>
|
||||
layui.use(['admin','jquery','popup','drawer'], function() {
|
||||
var $ = layui.jquery;
|
||||
var admin = layui.admin;
|
||||
var popup = layui.popup;
|
||||
|
||||
admin.setConfigType("yml");
|
||||
admin.setConfigPath("/static/config/pear.config.yml");
|
||||
|
||||
admin.render();
|
||||
|
||||
// 登出逻辑
|
||||
admin.logout(function(){
|
||||
$.get("{:url('system.admin/logout')}",function(res){
|
||||
if(res.code === 0) {
|
||||
popup.success("注销成功",function(){
|
||||
location.href = "{:url('system.login/index')}";
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
// 注销逻辑 返回 true / false
|
||||
return true;
|
||||
})
|
||||
|
||||
// 消息点击回调
|
||||
admin.message(function(id, title, context, form) {});
|
||||
|
||||
{block name="body"}
|
||||
<div id="LAY_app">
|
||||
<div class="layui-layout layui-layout-admin">
|
||||
{include file="public/header,public/side_menu,public/page_tabs" /}
|
||||
|
||||
<!-- 主体内容 -->
|
||||
<div class="layui-body" id="LAY_app_body">
|
||||
<div class="layadmin-tabsbody-item layui-show">
|
||||
<iframe src="{:url('index/home')}" frameborder="0" class="layadmin-iframe"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
{include file="public/footer" /}
|
||||
<!-- 辅助元素,一般用于移动设备下遮罩 -->
|
||||
<div class="layadmin-body-shade" layadmin-event="shade"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
$("#clearcache").click(function(){
|
||||
$.get("{:url('system.admin/clearCache')}",function(res){
|
||||
if(res.code === 0) {
|
||||
popup.success("清理成功");
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use('index');
|
||||
</script>
|
||||
{/block}
|
||||
|
||||
|
||||
// 修改密码
|
||||
$("#resetPassword").click(function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改密码',
|
||||
shade: 0.1,
|
||||
area: ["350px", "300px"],
|
||||
content: "{:url('system.admin/repass')}",
|
||||
})
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,146 +1,117 @@
|
||||
{extend name="public/base" /}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>登录</title>
|
||||
<!-- 样 式 文 件 -->
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/login.css" />
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
</head>
|
||||
<!-- 代 码 结 构 -->
|
||||
<body background="/static/admin/images/background.svg" style="background-size: cover;">
|
||||
<form class="layui-form" action="javascript:void(0);">
|
||||
<div class="layui-form-item">
|
||||
<img class="logo" src="/static/admin/images/logo.png" />
|
||||
<div class="title">TaoLer Admin</div>
|
||||
<div class="desc">
|
||||
明 湖 区 最 具 影 响 力 的 设 计 规 范 之 一
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input name="username" placeholder="账 户 : admin " lay-verify="required" hover class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="password" name="password" placeholder="密 码 : admin " lay-verify="required" hover class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="text" name="captcha" placeholder="验证码 : " hover lay-verify="required" class="code layui-input layui-input-inline" />
|
||||
<img src="{:captcha_src()}" class="codeImage" style="width:120px;" id="captcha"/>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="checkbox" name="remember" title="记住密码" lay-skin="primary" checked>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button type="button" class="pear-btn pear-btn-success login" lay-submit lay-filter="login" id="login-submit">
|
||||
登 入
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- 资 源 引 入 -->
|
||||
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'button', 'popup'], function() {
|
||||
let $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
var button = layui.button;
|
||||
var popup = layui.popup;
|
||||
var $body = $('body');
|
||||
|
||||
{block name="title"}登入 - TaolerCMS管理系统{/block}
|
||||
{block name="css"}<link rel="stylesheet" href="/static/admin/style/login.css" media="all">{/block}
|
||||
{block name="body"}
|
||||
<div class="layadmin-user-login layadmin-user-display-show" id="LAY-user-login" style="display: none;">
|
||||
//回车登陆
|
||||
$(document).keydown(function(e){
|
||||
if(e.keyCode == 13){
|
||||
$("#login-submit").click()
|
||||
}
|
||||
})
|
||||
|
||||
// 登 录 提 交
|
||||
form.on('submit(login)', function(data) {
|
||||
//请求登入接口
|
||||
$.ajax({
|
||||
type: "post"
|
||||
,url: "{:url('login/index')}" //实际使用请改成服务端真实接口
|
||||
,data: data.field
|
||||
,success: function(res){
|
||||
if(res.code == 0){
|
||||
/*
|
||||
//请求成功后,写入 access_token
|
||||
layui.data(setter.tableName, {
|
||||
key: setter.request.tokenName
|
||||
,value: res.data.access_token
|
||||
});
|
||||
*/
|
||||
//登入成功的提示与跳转
|
||||
popup.success("登录成功", function() {
|
||||
location.href = "{:url('index/index')}"
|
||||
})
|
||||
|
||||
<div class="layadmin-user-login-main">
|
||||
<div class="layadmin-user-login-box layadmin-user-login-header">
|
||||
<h2>TaoLerAdmin</h2>
|
||||
<p>TaoLer管理系统-专业版</p>
|
||||
</div>
|
||||
<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label>
|
||||
<input type="text" name="username" id="LAY-user-login-username" lay-verify="required" placeholder="用户名" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label>
|
||||
<input type="password" name="password" id="LAY-user-login-password" lay-verify="required" placeholder="密码" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-xs7">
|
||||
<label class="layadmin-user-login-icon layui-icon layui-icon-vercode" for="LAY-user-login-vercode"></label>
|
||||
<input type="text" name="captcha" autocomplete="off" id="LAY-user-login-vercode" lay-verify="required" placeholder="图形验证码" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-col-xs5">
|
||||
<div style="margin-left: 10px;">
|
||||
<img src="{:captcha_src()}" class="layadmin-user-login-codeimg" id="LAY-user-get-vercode" alt="captcha">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="margin-bottom: 20px;">
|
||||
<input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
|
||||
<a href="{:url('admin/login/forget')}" class="layadmin-user-jump-change layadmin-link" style="margin-top: 7px;">忘记密码?</a>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="hidden" class="layui-hide" name="__token__" value="{:token()}" />
|
||||
<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-user-login-submit" id="LAY-user-login-submit">登 入</button>
|
||||
</div>
|
||||
<div class="layui-trans layui-form-item layadmin-user-login-other">
|
||||
<label>社交账号登入</label>
|
||||
<a href="javascript:;"><i class="layui-icon layui-icon-login-qq"></i></a>
|
||||
<a href="javascript:;"><i class="layui-icon layui-icon-login-wechat"></i></a>
|
||||
<a href="javascript:;"><i class="layui-icon layui-icon-login-weibo"></i></a>
|
||||
|
||||
<a href="{:url('admin/login/reg')}" class="layadmin-user-jump-change layadmin-link">注册帐号</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-trans layadmin-user-login-footer">
|
||||
|
||||
<p>© 2020 <a href="http://www.aieok.com/" target="_blank">aieok.com</a></p>
|
||||
<!--p>
|
||||
<span><a href="http://www.layui.com/admin/#get" target="_blank">获取授权</a></span>
|
||||
<span><a href="http://www.layui.com/admin/pro/" target="_blank">在线演示</a></span>
|
||||
<span><a href="http://www.layui.com/admin/" target="_blank">前往官网</a></span>
|
||||
</p-->
|
||||
</div>
|
||||
|
||||
<!--<div class="ladmin-user-login-theme">
|
||||
<script type="text/html" template>
|
||||
<ul>
|
||||
<li data-theme=""><img src="{{ layui.setter.base }}style/res/bg-none.jpg"></li>
|
||||
<li data-theme="#03152A" style="background-color: #03152A;"></li>
|
||||
<li data-theme="#2E241B" style="background-color: #2E241B;"></li>
|
||||
<li data-theme="#50314F" style="background-color: #50314F;"></li>
|
||||
<li data-theme="#344058" style="background-color: #344058;"></li>
|
||||
<li data-theme="#20222A" style="background-color: #20222A;"></li>
|
||||
</ul>
|
||||
</script>
|
||||
</div>-->
|
||||
|
||||
</div>
|
||||
{/block}
|
||||
} else {
|
||||
layer.open({title:'登陆失败', content:res.msg, icon:5, anim:6});
|
||||
layui.jquery('#captcha').attr('src', '{:captcha_src()}?' + Math.random());
|
||||
}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'user'], function(){
|
||||
var $ = layui.$
|
||||
,setter = layui.setter
|
||||
,admin = layui.admin
|
||||
,form = layui.form
|
||||
,router = layui.router()
|
||||
,search = router.search;
|
||||
}
|
||||
});
|
||||
|
||||
/// 验证
|
||||
|
||||
/// 登录
|
||||
|
||||
/// 动画
|
||||
// button.load({
|
||||
// elem: '.login',
|
||||
// time: 1500,
|
||||
// done: function() {
|
||||
// popup.success("登录成功", function() {
|
||||
// location.href = "index.html"
|
||||
// });
|
||||
// }
|
||||
// })
|
||||
return false;
|
||||
});
|
||||
|
||||
form.render();
|
||||
|
||||
//回车登陆
|
||||
$(document).keydown(function(e){
|
||||
if(e.keyCode == 13){
|
||||
$("#LAY-user-login-submit").click()
|
||||
}
|
||||
})
|
||||
|
||||
//提交
|
||||
form.on('submit(LAY-user-login-submit)', function(obj){
|
||||
|
||||
//请求登入接口
|
||||
admin.req({
|
||||
type: "post"
|
||||
,url: '{:url('login/index')}' //实际使用请改成服务端真实接口
|
||||
,data: obj.field
|
||||
,success: function(res){
|
||||
if(res.code == 0){
|
||||
/*
|
||||
//请求成功后,写入 access_token
|
||||
layui.data(setter.tableName, {
|
||||
key: setter.request.tokenName
|
||||
,value: res.data.access_token
|
||||
});
|
||||
*/
|
||||
//登入成功的提示与跳转
|
||||
layer.msg('登入成功', {
|
||||
offset: '15px'
|
||||
,icon: 1
|
||||
,time: 1000
|
||||
}, function(){
|
||||
location.href = "{:url('index/index')}"; //后台主页
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'登陆失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
layui.jquery('#LAY-user-get-vercode').attr('src', '{:captcha_src()}?'+Math.random());
|
||||
}
|
||||
//更换图形验证码
|
||||
$body.on('click', '#captcha', function(){
|
||||
var othis = $(this);
|
||||
this.src = '/captcha.html?t='+ new Date().getTime()
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
|
||||
})
|
||||
</script>
|
||||
{:hook('bacimghook')}
|
||||
</body>
|
||||
</html>
|
||||
|
@ -108,7 +108,7 @@
|
||||
,icon: 1
|
||||
,time: 1000
|
||||
}, function(){
|
||||
location.hash = '/admin/user/login'; //跳转到登入页
|
||||
location.hash = "{:url('user/login')}"; //跳转到登入页
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -1,67 +0,0 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form layui-form-pane">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="timeline">
|
||||
<div class="layui-tab-content" id="LAY_ucm" style="padding: 20px 0;">
|
||||
<div class="layui-tab-item layui-show">
|
||||
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">发送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="type" lay-filter="type">
|
||||
<option {if condition="$msg.type eq 0"} selected {/if} value="0">站内通知</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md9">
|
||||
<label for="L_title" class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" value="{$msg.title}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea " >{$msg.content}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$msg.id}">
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<button type="submit" class="layui-btn" lay-filter="notice-edit" lay-submit id="notice-edit">立即发布</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
var noticeIndex = "{:url('Notice/index')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','notice'],function(){
|
||||
var $ = layui.jquery;
|
||||
});
|
||||
</script>
|
||||
{/block}
|
@ -1,130 +0,0 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form layui-form-pane">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="timeline">
|
||||
<div class="layui-tab-content" id="LAY_ucm" style="padding: 20px 0;">
|
||||
<div class="layui-tab-item layui-show">
|
||||
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">发送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="type" lay-filter="type">
|
||||
<option value="0">站内通知</option>
|
||||
<option value="1">用户通知</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md9">
|
||||
<label for="L_title" class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea "></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
{if condition="checkRuleButton('admin/notice/add')"}
|
||||
<button type="submit" class="layui-btn " lay-filter="notice-add" lay-submit id="notice-add">立即发布</button>
|
||||
{else /}<button type="submit" class="layui-btn layui-btn-disabled">立即发布</button>{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<table id="notice-list" lay-filter="notice-list"></table>
|
||||
<script type="text/html" id="notice-tool">
|
||||
{if condition="checkRuleButton('admin/notice/edit')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
|
||||
{else /}<a class="layui-btn layui-btn-normal layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-edit"></i>编辑</a>{/if}
|
||||
{if condition="checkRuleButton('admin/notice/delete')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
{else /}<a class="layui-btn layui-btn-danger layui-btn-xs layui-btn-disabled"><i class="layui-icon layui-icon-delete"></i>删除</a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
var noticeIndex = "{:url('Notice/index')}",
|
||||
noticeAdd = "{:url('Notice/add')}",
|
||||
noticeDelete = "{:url('Notice/delete')}",
|
||||
noticeEdit = "{:url('Notice/edit')}";
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','notice', 'layedit','form' ,'table'],function(){
|
||||
var $ = layui.jquery
|
||||
,layedit = layui.layedit
|
||||
,table = layui.table
|
||||
,form = layui.form;
|
||||
/*
|
||||
form.on('select(type)', function(data){
|
||||
var tpl = '<div class="layui-col-md12">\
|
||||
<label for="L_title" class="layui-form-label">收件人</label>\
|
||||
<div class="layui-input-block">\
|
||||
<input type="text" id="receve_id" name="receve_id" required lay-verify="required" autocomplete="off" class="layui-input" >\
|
||||
</div>\
|
||||
</div>';
|
||||
//如果选择是用户追加收件人
|
||||
if(data.value == 1){
|
||||
$(this).parents('div .layui-col-md3').next('div').after(tpl);
|
||||
}else{
|
||||
$(this).parents('div .layui-col-md3').nextAll('div .layui-col-md12').remove();
|
||||
}
|
||||
});
|
||||
|
||||
//发布通知
|
||||
form.on('submit(notice-add)', function(data){
|
||||
var field = data.field;
|
||||
console.log(field);
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Notice/add')}",
|
||||
data:field,
|
||||
dataType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
table.reload('notice-list'); //数据刷新
|
||||
return false;
|
||||
});
|
||||
*/
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user