勾股cms初始化
This commit is contained in:
parent
7efeb7d3e1
commit
dc450e7786
25
.gitignore
vendored
25
.gitignore
vendored
@ -1,16 +1,9 @@
|
||||
# Node rules:
|
||||
## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
## Dependency directory
|
||||
## Commenting this out is preferred by some people, see
|
||||
## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
|
||||
# Book build output
|
||||
_book
|
||||
|
||||
# eBook build output
|
||||
*.epub
|
||||
*.mobi
|
||||
*.pdf
|
||||
/.idea
|
||||
/.vscode
|
||||
/vendor
|
||||
*.log
|
||||
.env
|
||||
/.env
|
||||
/public/storage
|
||||
/runtime
|
||||
/public/.user.ini
|
||||
|
42
.travis.yml
Normal file
42
.travis.yml
Normal file
@ -0,0 +1,42 @@
|
||||
sudo: false
|
||||
|
||||
language: php
|
||||
|
||||
branches:
|
||||
only:
|
||||
- stable
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.composer/cache
|
||||
|
||||
before_install:
|
||||
- composer self-update
|
||||
|
||||
install:
|
||||
- composer install --no-dev --no-interaction --ignore-platform-reqs
|
||||
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
|
||||
- composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
|
||||
- composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
|
||||
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
|
||||
|
||||
script:
|
||||
- php think unit
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key:
|
||||
secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
|
||||
file:
|
||||
- ThinkPHP_Core.zip
|
||||
- ThinkPHP_Full.zip
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
32
LICENSE.txt
Normal file
32
LICENSE.txt
Normal file
@ -0,0 +1,32 @@
|
||||
|
||||
ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
|
||||
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
|
||||
All rights reserved。
|
||||
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
|
||||
|
||||
Apache Licence是著名的非盈利开源组织Apache采用的协议。
|
||||
该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,
|
||||
允许代码修改,再作为开源或商业软件发布。需要满足
|
||||
的条件:
|
||||
1. 需要给代码的用户一份Apache Licence ;
|
||||
2. 如果你修改了代码,需要在被修改的文件中说明;
|
||||
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要
|
||||
带有原来代码中的协议,商标,专利声明和其他原来作者规
|
||||
定需要包含的说明;
|
||||
4. 如果再发布的产品中包含一个Notice文件,则在Notice文
|
||||
件中需要带有本协议内容。你可以在Notice中增加自己的
|
||||
许可,但不可以表现为对Apache Licence构成更改。
|
||||
具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
36
README.en.md
36
README.en.md
@ -1,36 +0,0 @@
|
||||
# 勾股CMS
|
||||
|
||||
#### Description
|
||||
gougucms代码管理
|
||||
|
||||
#### Software Architecture
|
||||
Software architecture description
|
||||
|
||||
#### Installation
|
||||
|
||||
1. xxxx
|
||||
2. xxxx
|
||||
3. xxxx
|
||||
|
||||
#### Instructions
|
||||
|
||||
1. xxxx
|
||||
2. xxxx
|
||||
3. xxxx
|
||||
|
||||
#### Contribution
|
||||
|
||||
1. Fork the repository
|
||||
2. Create Feat_xxx branch
|
||||
3. Commit your code
|
||||
4. Create Pull Request
|
||||
|
||||
|
||||
#### Gitee Feature
|
||||
|
||||
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
|
||||
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
|
||||
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
|
||||
4. The most valuable open source project [GVP](https://gitee.com/gvp)
|
||||
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
|
||||
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
56
app/admin/BaseController.php
Normal file
56
app/admin/BaseController.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
declare(strict_types = 1);
|
||||
|
||||
namespace app\admin;
|
||||
|
||||
use think\App;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
abstract class BaseController
|
||||
{
|
||||
/**
|
||||
* Request实例
|
||||
* @var \think\Request
|
||||
*/
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* 应用实例
|
||||
* @var \think\App
|
||||
*/
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* 是否批量验证
|
||||
* @var bool
|
||||
*/
|
||||
protected $batchValidate = false;
|
||||
|
||||
/**
|
||||
* 控制器中间件
|
||||
* @var array
|
||||
*/
|
||||
protected $middleware = [];
|
||||
|
||||
/**
|
||||
* 构造方法
|
||||
* @access public
|
||||
* @param App $app 应用对象
|
||||
*/
|
||||
public function __construct(App $app)
|
||||
{
|
||||
$this->app = $app;
|
||||
$this->request = $this->app->request;
|
||||
|
||||
// 控制器初始化
|
||||
$this->initialize();
|
||||
}
|
||||
|
||||
// 初始化
|
||||
protected function initialize()
|
||||
{
|
||||
$this->param = $this->request->param();
|
||||
}
|
||||
}
|
259
app/admin/common.php
Normal file
259
app/admin/common.php
Normal file
@ -0,0 +1,259 @@
|
||||
<?php
|
||||
// admin模块公共文件
|
||||
//获取后台模块当前登录用户的信息
|
||||
function get_login_admin($key = "")
|
||||
{
|
||||
$session_admin = get_config('app.session_admin');
|
||||
if (\think\facade\Session::has($session_admin)) {
|
||||
$gougu_admin = \think\facade\Session::get($session_admin);
|
||||
if (!empty($key)) {
|
||||
if (isset($gougu_admin[$key])) {
|
||||
return $gougu_admin[$key];
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
} else {
|
||||
return $gougu_admin;
|
||||
}
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'list', $root = 0)
|
||||
{
|
||||
// 创建Tree
|
||||
$tree = array();
|
||||
if (is_array($list)) {
|
||||
// 创建基于主键的数组引用
|
||||
$refer = array();
|
||||
foreach ($list as $key => $data) {
|
||||
$refer[$data[$pk]] = &$list[$key];
|
||||
}
|
||||
foreach ($list as $key => $data) {
|
||||
// 判断是否存在parent
|
||||
$parentId = $data[$pid];
|
||||
if ($root == $parentId) {
|
||||
$tree[$data[$pk]] = &$list[$key];
|
||||
} else {
|
||||
if (isset($refer[$parentId])) {
|
||||
$parent = &$refer[$parentId];
|
||||
$parent[$child][$data[$pk]] = &$list[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $tree;
|
||||
}
|
||||
|
||||
function create_tree_list($pid, $arr, $group, &$tree = []){
|
||||
foreach ( $arr as $key => $vo ){
|
||||
if($key == 0){
|
||||
$vo['spread'] = true;
|
||||
}
|
||||
if (!empty($group) and in_array($vo['id'], $group)) {
|
||||
$vo['checked'] = true;
|
||||
}
|
||||
else{
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
if( $vo['pid'] == $pid ){
|
||||
$child= create_tree_list( $vo['id'] ,$arr,$group);
|
||||
if( $child ){
|
||||
$vo['children'] = $child;
|
||||
}
|
||||
$tree[] = $vo;
|
||||
}
|
||||
}
|
||||
return $tree;
|
||||
}
|
||||
|
||||
//递归排序
|
||||
function set_recursion($result, $pid = 0, $format = "L ")
|
||||
{
|
||||
/*记录排序后的类别数组*/
|
||||
static $list = array();
|
||||
|
||||
foreach ($result as $k => $v) {
|
||||
if ($v['pid'] == $pid) {
|
||||
if ($pid != 0) {
|
||||
$v['title'] = $format . $v['title'];
|
||||
}
|
||||
/*将该类别的数据放入list中*/
|
||||
$list[] = $v;
|
||||
set_recursion($result, $v['id'], " " . $format);
|
||||
}
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
//获取指定管理员的信息
|
||||
function get_admin($id)
|
||||
{
|
||||
$admin = \think\facade\Db::name('admin')->where(['id' => $id])->find();
|
||||
$admin['group_id'] = \think\facade\Db::name('admin_group_access')->where(['uid' => $id])->column('group_id');
|
||||
return $admin;
|
||||
}
|
||||
|
||||
//读取后台菜单列表
|
||||
function get_admin_menu()
|
||||
{
|
||||
$menu = \think\facade\Db::name('admin_menu')->order('order asc')->select()->toArray();
|
||||
return $menu;
|
||||
}
|
||||
|
||||
//读取权限节点列表
|
||||
function get_admin_rule()
|
||||
{
|
||||
$rule = \think\facade\Db::name('admin_rule')->order('create_time asc')->select()->toArray();
|
||||
return $rule;
|
||||
}
|
||||
|
||||
//读取权限分组列表
|
||||
function get_admin_group()
|
||||
{
|
||||
$group = \think\facade\Db::name('admin_group')->order('create_time asc')->select()->toArray();
|
||||
return $group;
|
||||
}
|
||||
|
||||
//读取指定权限分组详情
|
||||
function get_admin_group_info($id)
|
||||
{
|
||||
$group = \think\facade\Db::name('admin_group')->where(['id' => $id])->find();
|
||||
$group['rules'] = explode(',', $group['rules']);
|
||||
$group['menus'] = explode(',', $group['menus']);
|
||||
return $group;
|
||||
}
|
||||
|
||||
|
||||
//菜单父子关系排序,用于后台菜单
|
||||
function get_admin_menus()
|
||||
{
|
||||
if (get_cache('menu' . get_login_admin('id'))) {
|
||||
$list = get_cache('menu' . get_login_admin('id'));
|
||||
} else {
|
||||
$adminGroup = \think\facade\Db::name('admin_group_access')->where(['uid' => get_login_admin('id')])->column('group_id');
|
||||
$adminMenu = \think\facade\Db::name('admin_group')->where('id', 'in', $adminGroup)->column('menus');
|
||||
$adminMenus = [];
|
||||
foreach ($adminMenu as $k => $v) {
|
||||
$v = explode(',', $v);
|
||||
$adminMenus = array_merge($adminMenus, $v);
|
||||
}
|
||||
$menu = \think\facade\Db::name('admin_menu')->where('id', 'in', $adminMenus)->order('order asc')->select()->toArray();
|
||||
$list = list_to_tree($menu);
|
||||
\think\facade\Cache::tag('adminMenu')->set('menu' . get_login_admin('id'), $list);
|
||||
}
|
||||
return $list;
|
||||
}
|
||||
|
||||
//读取导航列表,用于后台
|
||||
function get_nav($nav_id)
|
||||
{
|
||||
$nav = \think\facade\Db::name('NavInfo')->where('nav_id', $nav_id)->order('order asc')->select();
|
||||
return $nav;
|
||||
}
|
||||
|
||||
//读取关键字列表
|
||||
function get_keywords()
|
||||
{
|
||||
$keywords = \think\facade\Db::name('keywords')->where(['status' => 1])->order('create_time asc')->select();
|
||||
return $keywords;
|
||||
}
|
||||
//读取文章分类列表
|
||||
function get_article_cate()
|
||||
{
|
||||
$cate = \think\facade\Db::name('article_cate')->order('create_time asc')->select()->toArray();
|
||||
return $cate;
|
||||
}
|
||||
|
||||
//读取指定分类下的文章列表
|
||||
function get_article($cate_id = "")
|
||||
{
|
||||
$where = array();
|
||||
if (!empty($cate_id)) {
|
||||
$where['article_cate_id'] = $cate_id;
|
||||
}
|
||||
$article = \think\facade\Db::name('article')->where($where)->order('create_time desc')->paginate( get_config(app . page_size))->toArray();
|
||||
return $article;
|
||||
}
|
||||
|
||||
//读取指定文章的详情
|
||||
function get_article_info($id)
|
||||
{
|
||||
$article = \think\facade\Db::name('article')->where(['id' => $id])->find();
|
||||
if (empty($article)) {
|
||||
return $this->error('文章不存在');
|
||||
}
|
||||
$keywrod_array = \think\facade\Db::name('ArticleKeywords')
|
||||
->field('i.aid,i.keywords_id,k.title')
|
||||
->alias('i')
|
||||
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
|
||||
->order('i.create_time asc')
|
||||
->where(array('i.aid' => $id, 'k.status' => 1))
|
||||
->select()->toArray();
|
||||
|
||||
$article['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
|
||||
$article['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
|
||||
return $article;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 管理员操作日志
|
||||
* @param string $type 操作类型 login add edit view delete
|
||||
* @param int $param_id 操作类型
|
||||
* @param array $param 提交的参数
|
||||
*/
|
||||
function add_log($type, $param_id = '', $param = [])
|
||||
{
|
||||
$request = get_params();
|
||||
switch ($type) {
|
||||
case 'login':
|
||||
$title = '登录';
|
||||
break;
|
||||
case 'upload':
|
||||
$title = '上传';
|
||||
break;
|
||||
case 'add':
|
||||
$title = '新增';
|
||||
break;
|
||||
case 'edit':
|
||||
$title = '编辑';
|
||||
break;
|
||||
case 'view':
|
||||
$title = '查看';
|
||||
break;
|
||||
case 'delete':
|
||||
$title = '删除';
|
||||
break;
|
||||
default:
|
||||
$title = '未知';
|
||||
break;
|
||||
}
|
||||
if ($type == 'login') {
|
||||
$login_admin = \think\facade\Db::name('admin')->where(array('id' => $param_id))->find();
|
||||
} else {
|
||||
$session_admin = get_config('app.session_admin');
|
||||
$login_admin = \think\facade\Session::get($session_admin);
|
||||
}
|
||||
|
||||
$content = $login_admin['nickname'] . '在' . date('Y-m-d H:i:s') . '执行了' . $title . '操作';
|
||||
$data = [];
|
||||
$data['uid'] = $login_admin['id'];
|
||||
$data['nickname'] = $login_admin['nickname'];
|
||||
$data['type'] = $type;
|
||||
$data['title'] = $title;
|
||||
$data['content'] = $content;
|
||||
$data['param_id'] = $param_id;
|
||||
$data['param'] = json_encode($param);
|
||||
$data['module'] = \think\facade\App::initialize()->http->getName();
|
||||
$data['controller'] = app('request')->controller();
|
||||
$data['function'] = app('request')->action();
|
||||
$data['ip'] = app('request')->ip();
|
||||
$data['create_time'] = time();
|
||||
$parameter = $data['controller'] . '/' . $data['function'];
|
||||
$data['rule_menu'] = $parameter;
|
||||
$data['admin_menu'] = \think\facade\Db::name('admin_rule')->where(array('title' => $parameter))->value('title') ?? $title;
|
||||
\think\facade\Db::name('admin_log')->strict(false)->field(true)->insert($data);
|
||||
}
|
263
app/admin/controller/Admin.php
Normal file
263
app/admin/controller/Admin.php
Normal file
@ -0,0 +1,263 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\Admin as AdminList;
|
||||
use app\admin\validate\AdminCheck;
|
||||
use avatars\MDAvatars;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Admin extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//管理员列表
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|username|nickname|desc|mobile', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$admin = AdminList::where($where)
|
||||
->order('create_time asc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$groupId = Db::name('AdminGroupAccess')->where(['uid' => $item->id])->column('group_id');
|
||||
$groupName = Db::name('AdminGroup')->where('id', 'in', $groupId)->column('title');
|
||||
$item->groupName = implode(',', $groupName);
|
||||
$item->last_login_time = empty($item->last_login_time) ? '-' : date('Y-m-d H:i', $item->last_login_time);
|
||||
});
|
||||
return table_assign(1, '', $admin);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
if ($id > 0) {
|
||||
$admin = get_admin(get_params('id'));
|
||||
View::assign('admin', $admin);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
|
||||
public function to_avatars($char)
|
||||
{
|
||||
$defaultData = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z',
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾',
|
||||
'一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
|
||||
if (isset($char)) {
|
||||
$Char = $char;
|
||||
} else {
|
||||
$Char = $defaultData[mt_rand(0, count($defaultData) - 1)];
|
||||
}
|
||||
$OutputSize = min(512, empty($_GET['size']) ? 36 : intval($_GET['size']));
|
||||
|
||||
$Avatar = new MDAvatars($Char, 256, 1);
|
||||
$avatar_name = '/avatars/avatar_256_' . set_salt(10) . time() . '.png';
|
||||
$path = get_config('filesystem.disks.public.url') . $avatar_name;
|
||||
$res = $Avatar->Save('.' . $path, 256);
|
||||
$Avatar->Free();
|
||||
/*
|
||||
if ($res) {
|
||||
//写入到附件表
|
||||
$data = [];
|
||||
$data['filepath'] = $path;
|
||||
$data['name'] = $Char;
|
||||
$data['mimetype'] = 'image/png';
|
||||
$data['fileext'] = 'png';
|
||||
$data['filesize'] = 0;
|
||||
$data['filename'] = $avatar_name;
|
||||
$data['sha1'] = '';
|
||||
$data['md5'] = '';
|
||||
$data['module'] = \think\facade\App::initialize()->http->getName();
|
||||
$data['action'] = app('request')->action();
|
||||
$data['uploadip'] = app('request')->ip();
|
||||
$data['create_time'] = time();
|
||||
$data['user_id'] = get_login_admin('id') ? get_login_admin('id') : 0;
|
||||
if ($data['module'] = 'admin') {
|
||||
//通过后台上传的文件直接审核通过
|
||||
$data['status'] = 1;
|
||||
$data['admin_id'] = $data['user_id'];
|
||||
$data['audit_time'] = time();
|
||||
}
|
||||
$data['use'] = 'avatar'; //附件用处
|
||||
$fid = Db::name('file')->insertGetId($data);
|
||||
return $fid;
|
||||
}
|
||||
*/
|
||||
return $path;
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
if (!empty($param['pwd'])) {
|
||||
//重置密码
|
||||
if (empty($param['pwd_confirm']) or $param['pwd_confirm'] !== $param['pwd']) {
|
||||
return to_assign(0, '两次密码不一致');
|
||||
}
|
||||
$param['salt'] = set_salt(20);
|
||||
$param['pwd'] = set_password($param['pwd'], $param['salt']);
|
||||
} else {
|
||||
unset($param['pwd']);
|
||||
unset($param['salt']);
|
||||
}
|
||||
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
Db::name('Admin')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
Db::name('AdminGroupAccess')->where(['uid' => $param['id']])->delete();
|
||||
foreach ($param['group_id'] as $k => $v) {
|
||||
//为了系统安全,只有系统所有者才可创建id为1的管理员分组
|
||||
if ($v == 1 and get_login_admin('id') !== 1) {
|
||||
throw new Exception("你没有权限创建系统所有者", 1);
|
||||
}
|
||||
$data[$k] = [
|
||||
'uid' => $param['id'],
|
||||
'group_id' => $v,
|
||||
];
|
||||
}
|
||||
Db::name('AdminGroupAccess')->strict(false)->field(true)->insertAll($data);
|
||||
if (!isset($param['thumb']) || $param['thumb'] == '') {
|
||||
$char = mb_substr($param['nickname'], 0, 1, 'utf-8');
|
||||
Db::name('Admin')->where('id', $param['id'])->update(['thumb' => $this->to_avatars($char)]);
|
||||
}
|
||||
add_log('edit', $param['id'], $param);
|
||||
//清除菜单\权限缓存
|
||||
clear_cache('adminMenu');
|
||||
clear_cache('adminRules');
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
} catch (\Exception $e) {
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return to_assign(0, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['salt'] = set_salt(20);
|
||||
$param['pwd'] = set_password($param['pwd'], $param['salt']);
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
$uid = Db::name('Admin')->strict(false)->field(true)->insertGetId($param);
|
||||
foreach ($param['group_id'] as $k => $v) {
|
||||
//为了系统安全,只有系统所有者才可创建id为1的管理员分组
|
||||
if ($v == 1 and get_login_admin('id') !== 1) {
|
||||
throw new Exception("你没有权限创建系统所有者", 1);
|
||||
}
|
||||
$data[$k] = [
|
||||
'uid' => $uid,
|
||||
'group_id' => $v,
|
||||
];
|
||||
}
|
||||
Db::name('AdminGroupAccess')->strict(false)->field(true)->insertAll($data);
|
||||
if (!isset($param['thumb']) || $param['thumb'] == '') {
|
||||
$char = mb_substr($param['nickname'], 0, 1, 'utf-8');
|
||||
Db::name('Admin')->where('id', $uid)->update(['thumb' => $this->to_avatars($char)]);
|
||||
}
|
||||
add_log('add', $uid, $param);
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
} catch (\Exception $e) {
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return to_assign(0, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
add_log('view', get_params('id'));
|
||||
return view('', ['admin' => get_admin(get_params('id'))]);
|
||||
}
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
if ($id == 1) {
|
||||
return to_assign(0, "系统拥有者,无法删除");
|
||||
}
|
||||
if (Db::name('Admin')->delete($id) !== false) {
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(1, "删除管理员成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
public function log()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//系统操作列表
|
||||
public function get_log_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['nickname|admin_menu|param_id', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['title_cate'])) {
|
||||
$where['title'] = $param['title_cate'];
|
||||
}
|
||||
if (!empty($param['admin_menu'])) {
|
||||
$where['admin_menu'] = $param['admin_menu'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$content = DB::name('admin_log')
|
||||
->field("id,uid,nickname,title,content,admin_menu,ip,param_id,param,FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%s') create_time")
|
||||
->order('create_time desc')
|
||||
->where($where)
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
$content->toArray();
|
||||
foreach ($content as $k => $v) {
|
||||
$data = $v;
|
||||
$param_array = json_decode($v['param'], true);
|
||||
$param_value = '';
|
||||
foreach ($param_array as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
$value = implode(',', $value);
|
||||
}
|
||||
$param_value .= $key . ':' . $value . ' | ';
|
||||
}
|
||||
$data['param'] = $param_value;
|
||||
$content->offsetSet($k, $data);
|
||||
}
|
||||
return table_assign(1, '', $content);
|
||||
}
|
||||
}
|
262
app/admin/controller/Api.php
Normal file
262
app/admin/controller/Api.php
Normal file
@ -0,0 +1,262 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\AdminLog;
|
||||
use app\admin\validate\AdminCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
|
||||
class Api extends BaseController
|
||||
{
|
||||
//上传文件
|
||||
public function upload()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->file('file')) {
|
||||
$file = request()->file('file');
|
||||
} else {
|
||||
return to_assign(0, '没有选择上传文件');
|
||||
}
|
||||
// dump($file);die;
|
||||
// 获取上传文件的hash散列值
|
||||
$sha1 = $file->hash('sha1');
|
||||
$md5 = $file->hash('md5');
|
||||
$rule = [
|
||||
'image' => 'jpg,png,jpeg,gif',
|
||||
'doc' => 'doc,docx,ppt,pptx,xls,xlsx,pdf',
|
||||
'file' => 'zip,gz,7z,rar,tar',
|
||||
];
|
||||
$fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file'];
|
||||
//1M=1024*1024=1048576字节
|
||||
$fileSize = 2 * 1024 * 1024;
|
||||
if (isset($param['type']) && $param['type']) {
|
||||
$fileExt = $rule[$param['type']];
|
||||
}
|
||||
if (isset($param['size']) && $param['size']) {
|
||||
$fileSize = $param['size'];
|
||||
}
|
||||
$validate = \think\facade\Validate::rule([
|
||||
'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt,
|
||||
]);
|
||||
$file_check['image'] = $file;
|
||||
if (!$validate->check($file_check)) {
|
||||
return to_assign(0, $validate->getError());
|
||||
}
|
||||
// 日期前綴
|
||||
$dataPath = date('Ym');
|
||||
$use = 'thumb';
|
||||
$filename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file, function () use ($md5) {
|
||||
return $md5;
|
||||
});
|
||||
if ($filename) {
|
||||
//写入到附件表
|
||||
$data = [];
|
||||
$path = get_config('filesystem.disks.public.url');
|
||||
$data['filepath'] = $path . '/' . $filename;
|
||||
$data['name'] = $file->getOriginalName();
|
||||
$data['mimetype'] = $file->getOriginalMime();
|
||||
$data['fileext'] = $file->extension();
|
||||
$data['filesize'] = $file->getSize();
|
||||
$data['filename'] = $filename;
|
||||
$data['sha1'] = $sha1;
|
||||
$data['md5'] = $md5;
|
||||
$data['module'] = \think\facade\App::initialize()->http->getName();
|
||||
$data['action'] = app('request')->action();
|
||||
$data['uploadip'] = app('request')->ip();
|
||||
$data['create_time'] = time();
|
||||
$data['user_id'] = get_login_admin('id') ? get_login_admin('id') : 0;
|
||||
if ($data['module'] = 'admin') {
|
||||
//通过后台上传的文件直接审核通过
|
||||
$data['status'] = 1;
|
||||
$data['admin_id'] = $data['user_id'];
|
||||
$data['audit_time'] = time();
|
||||
}
|
||||
$data['use'] = request()->has('use') ? request()->param('use') : $use; //附件用处
|
||||
$res['id'] = Db::name('file')->insertGetId($data);
|
||||
$res['filepath'] = $data['filepath'];
|
||||
$res['name'] = $data['name'];
|
||||
$res['filename'] = $data['filename'];
|
||||
add_log('upload', $data['user_id'], $data);
|
||||
return to_assign(1, '上传成功', $res);
|
||||
} else {
|
||||
return to_assign(0, '上传失败,请重试');
|
||||
}
|
||||
}
|
||||
|
||||
//获取权限树所需的节点列表
|
||||
public function get_rule()
|
||||
{
|
||||
$rule = get_admin_rule();
|
||||
$group = [];
|
||||
if (!empty(get_params('id'))) {
|
||||
$group = get_admin_group_info(get_params('id'))['rules'];
|
||||
}
|
||||
$list = create_tree_list(0, $rule, $group);
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//获取菜单树列表
|
||||
public function get_menu()
|
||||
{
|
||||
$rule = get_admin_menu();
|
||||
$group = [];
|
||||
if (!empty(get_params('id'))) {
|
||||
$group = get_admin_group_info(get_params('id'))['menus'];
|
||||
}
|
||||
$list = create_tree_list(0, $rule, $group);
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//获取关键字
|
||||
public function get_keyword_cate()
|
||||
{
|
||||
$keyword = get_keywords();
|
||||
return to_assign(0, '', $keyword);
|
||||
}
|
||||
|
||||
//清空缓存
|
||||
public function cache_clear()
|
||||
{
|
||||
think\facade\Cache::clear();
|
||||
return to_assign(1, '系统缓存已清空');
|
||||
}
|
||||
|
||||
//发送测试邮件
|
||||
public function email_to($email)
|
||||
{
|
||||
$name = empty(get_config('webconfig.admin_title')) ? '系统' : get_config('webconfig.admin_title');
|
||||
if (send_email($email, "一封来自{$name}的测试邮件。")) {
|
||||
return to_assign(1, '发送成功,请注意查收');
|
||||
}
|
||||
return to_assign(0, '发送失败');
|
||||
}
|
||||
|
||||
//修改个人信息
|
||||
public function edit_personal()
|
||||
{
|
||||
return view('admin/edit_personal', [
|
||||
'admin' => get_login_admin(),
|
||||
]);
|
||||
}
|
||||
|
||||
//保存个人信息修改
|
||||
public function personal_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('editPersonal')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
unset($param['username']);
|
||||
$uid = get_login_admin('id');
|
||||
Db::name('Admin')->where([
|
||||
'id' => $uid,
|
||||
])->strict(false)->field(true)->update($param);
|
||||
$session_admin = get_config('app.session_admin');
|
||||
Session::set($session_admin, Db::name('admin')->find($uid));
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
//修改密码
|
||||
public function edit_password()
|
||||
{
|
||||
return view('admin/edit_password', [
|
||||
'admin' => get_login_admin(),
|
||||
]);
|
||||
}
|
||||
|
||||
//保存密码修改
|
||||
public function password_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('editpwd')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$admin = get_login_admin();
|
||||
if (set_password($param['old_pwd'], $admin['salt']) !== $admin['pwd']) {
|
||||
return to_assign(0, '旧密码不正确!');
|
||||
}
|
||||
unset($param['username']);
|
||||
$param['salt'] = set_salt(20);
|
||||
$param['pwd'] = set_password($param['pwd'], $param['salt']);
|
||||
Db::name('Admin')->where([
|
||||
'id' => $admin['id'],
|
||||
])->strict(false)->field(true)->update($param);
|
||||
$session_admin = get_config('app.session_admin');
|
||||
Session::set($session_admin, Db::name('admin')->find($admin['id']));
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
//首页获取
|
||||
public function get_admin_list()
|
||||
{
|
||||
$content = Db::name('Admin')
|
||||
->where(['status' => 1])
|
||||
->order('id desc')
|
||||
->limit(10)
|
||||
->select()->toArray();
|
||||
$res['data']=$content;
|
||||
return table_assign(1, '', $res);
|
||||
}
|
||||
|
||||
//首页获取最新10位用户
|
||||
public function get_user_list()
|
||||
{
|
||||
$list = Db::name('User')
|
||||
->where(['status' => 1])
|
||||
->order('id desc')
|
||||
->limit(10)
|
||||
->select()->toArray();
|
||||
foreach($list as $key=>$val){
|
||||
$list[$key]['last_login_time']=date('Y-m-d :h:m:s',$val['last_login_time']);
|
||||
}
|
||||
$res['data']=$list;
|
||||
return table_assign(1, '', $res);
|
||||
}
|
||||
|
||||
//首页文章
|
||||
public function get_article_list()
|
||||
{
|
||||
$list = Db::name('Article')
|
||||
->field('a.*,c.title as cate_title')
|
||||
->alias('a')
|
||||
->join('article_cate c', 'a.article_cate_id = c.id')
|
||||
->where(['a.status' => 1])
|
||||
->order('a.id desc')
|
||||
->limit(10)
|
||||
->select()->toArray();
|
||||
foreach($list as $key=>$val){
|
||||
$list[$key]['create_time']=date('Y-m-d :h:m:s',$val['create_time']);
|
||||
}
|
||||
$res['data']=$list;
|
||||
return table_assign(1, '', $res);
|
||||
}
|
||||
|
||||
//系统操作日志
|
||||
public function log_list()
|
||||
{
|
||||
return view('admin/log_list');
|
||||
}
|
||||
|
||||
public function get_log_list()
|
||||
{
|
||||
$param=get_params();
|
||||
$log = new AdminLog();
|
||||
$content = $log->get_log_list($param);
|
||||
return table_assign(0,'',$content);
|
||||
}
|
||||
|
||||
}
|
196
app/admin/controller/Article.php
Normal file
196
app/admin/controller/Article.php
Normal file
@ -0,0 +1,196 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\Article as ArticleList;
|
||||
use app\admin\model\ArticleCate;
|
||||
use app\admin\validate\ArticleCateCheck;
|
||||
use app\admin\validate\ArticleCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Article extends BaseController
|
||||
{
|
||||
public function cate()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//列表
|
||||
public function cate_list()
|
||||
{
|
||||
$cate = Db::name('ArticleCate')->order('create_time asc')->select();
|
||||
return to_assign(0, '', $cate);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function cate_add()
|
||||
{
|
||||
return view('', ['pid' => get_params('pid')]);
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function cate_post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ArticleCateCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$data[$param['field']] = $param['value'];
|
||||
$data['id'] = $param['id'];
|
||||
$data['update_time'] = time();
|
||||
$res = ArticleCate::strict(false)->field(true)->update($data);
|
||||
if($res) add_log('edit',$data['id'],$data);
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(ArticleCateCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = ArticleCate::strict(false)->field(true)->insertGetId($param);
|
||||
if($insertId) add_log('add',$insertId,$param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function cate_delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$cate_count = Db::name('ArticleCate')->where(["pid" => $id])->count();
|
||||
if ($cate_count > 0) {
|
||||
return to_assign(0, "该分类下还有子分类,无法删除");
|
||||
}
|
||||
$content_count = Db::name('Article')->where(["article_cate_id" => $id])->count();
|
||||
if ($content_count > 0) {
|
||||
return to_assign(0, "该分类下还有文章,无法删除");
|
||||
}
|
||||
if (Db::name('ArticleCate')->delete($id) !== false) {
|
||||
add_log('delete',$id);
|
||||
return to_assign(1, "删除分类成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//列表
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['a.id|a.title|a.keywords|a.desc|a.content|w.title','like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['article_cate_id'])) {
|
||||
$where[] =['a.article_cate_id','=', $param['article_cate_id']];
|
||||
}
|
||||
$where[] = ['a.status', '>=', 0];
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$content = ArticleList::where($where)
|
||||
->field('*,w.id as cate_id,a.id as id,w.title as cate_title,a.title as title')
|
||||
->alias('a')
|
||||
->join('article_cate w', 'a.article_cate_id = w.id')
|
||||
->order('a.create_time desc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $content);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
View::assign('id', $id);
|
||||
if ($id > 0) {
|
||||
$article = get_article_info($id);
|
||||
View::assign('article', $article);
|
||||
return view('edit');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ArticleCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = ArticleList::strict(false)->field(true)->update($param);
|
||||
if($res) add_log('edit',$param['id'],$param);
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(ArticleCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
Db::startTrans();
|
||||
$param['create_time'] = time();
|
||||
$aid = ArticleList::strict(false)->field(true)->insertGetId($param);
|
||||
if ($aid) {
|
||||
if (isset($param['keyword_names']) && $param['keyword_names']) {
|
||||
$uidArray = explode(',', $param['keyword_names']);
|
||||
foreach ($uidArray as $key => $value) {
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$data = [];
|
||||
$data['aid'] = $aid;
|
||||
$newKeyword['title'] = $value;
|
||||
$keywords_id = Db::name('Keywords')->insertGetId($newKeyword);
|
||||
$data['keywords_id'] = $keywords_id;
|
||||
$data['create_time'] = time();
|
||||
Db::name('ArticleKeywords')->strict(false)->field(true)->insertGetId($data);
|
||||
}
|
||||
}
|
||||
if($aid) add_log('add',$aid,$param);
|
||||
Db::commit();
|
||||
return to_assign();
|
||||
} else {
|
||||
Db::rollback();
|
||||
return to_assign(0, '添加失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$data['status'] = '-1';
|
||||
$data['id'] = $id;
|
||||
$data['update_time'] = time();
|
||||
if (Db::name('Article')->update($data) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(1, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
117
app/admin/controller/Conf.php
Normal file
117
app/admin/controller/Conf.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\validate\ConfCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\View;
|
||||
|
||||
class Conf extends BaseController
|
||||
{
|
||||
//网站信息
|
||||
public function web()
|
||||
{
|
||||
$conf = get_config('webconfig');
|
||||
$webConf = [
|
||||
'title' => empty($conf['title']) ? '' : $conf['title'],
|
||||
'keywords' => empty($conf['keywords']) ? '' : $conf['keywords'],
|
||||
'desc' => empty($conf['desc']) ? '' : $conf['desc'],
|
||||
'logo' => empty($conf['logo']) ? '' : $conf['logo'],
|
||||
'admin_title' => empty($conf['admin_title']) ? '' : $conf['admin_title'],
|
||||
'icp' => empty($conf['icp']) ? '' : $conf['icp'],
|
||||
'code' => empty($conf['code']) ? '' : $conf['code'],
|
||||
'domain' => empty($conf['domain']) ? '' : $conf['domain'],
|
||||
'version' => empty($conf['version']) ? '' : $conf['version'],
|
||||
'port_cache_time' => empty($conf['port_cache_time']) ? '' : $conf['port_cache_time'],
|
||||
];
|
||||
return view('', ['webConf' => $webConf]);
|
||||
}
|
||||
|
||||
//提交网站信息
|
||||
public function web_submit()
|
||||
{
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(ConfCheck::class)->scene('web')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$conf = "<?php return ['admin_title'=>'{$param["admin_title"]}','title'=>'{$param["title"]}','keywords'=>'{$param["keywords"]}','logo'=>'{$param["logo"]}','desc'=>'{$param["desc"]}','icp'=>'{$param["icp"]}','code'=>'{$param["code"]}','domain'=>'{$param["domain"]}','version'=>'{$param["version"]}','port_cache_time'=>'{$param["port_cache_time"]}'];";
|
||||
file_put_contents(CMS_ROOT . "config/webconfig.php", $conf);
|
||||
add_log('edit',0,$param);
|
||||
return to_assign();
|
||||
}
|
||||
|
||||
//邮箱配置
|
||||
public function email()
|
||||
{
|
||||
$conf = get_config('emailconfig');
|
||||
$emailConf = [
|
||||
'smtp' => empty($conf['smtp']) ? '' : $conf['smtp'],
|
||||
'username' => empty($conf['username']) ? '' : $conf['username'],
|
||||
'password' => empty($conf['password']) ? '' : $conf['password'],
|
||||
'port' => empty($conf['port']) ? '' : $conf['port'],
|
||||
'email' => empty($conf['email']) ? '' : $conf['email'],
|
||||
'from' => empty($conf['from']) ? '' : $conf['from'],
|
||||
'template' => empty($conf['template']) ? '' : $conf['template'],
|
||||
];
|
||||
return view('', ['emailConf' => $emailConf]);
|
||||
}
|
||||
|
||||
//提交邮箱配置
|
||||
public function email_submit()
|
||||
{
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(ConfCheck::class)->scene('email')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$conf = "<?php return ['smtp'=>'{$param["smtp"]}','username'=>'{$param["username"]}','password'=>'{$param["password"]}','port'=>'{$param["port"]}','email'=>'{$param["email"]}','from'=>'{$param["from"]}','template'=>'{$param["template"]}'];";
|
||||
file_put_contents(CMS_ROOT . "config/emailconfig.php", $conf);
|
||||
add_log('edit',0,$param);
|
||||
return to_assign();
|
||||
}
|
||||
|
||||
//微信配置
|
||||
public function wechat()
|
||||
{
|
||||
$conf = get_config('wechatconfig');
|
||||
$wechatConf = [
|
||||
'Token' => empty($conf['Token']) ? '' : $conf['Token'],
|
||||
'appID' => empty($conf['appID']) ? '' : $conf['appID'],
|
||||
'appsecret' => empty($conf['appsecret']) ? '' : $conf['appsecret'],
|
||||
//微信支付商户号
|
||||
'MCHID' => empty($conf['MCHID']) ? '' : $conf['MCHID'],
|
||||
//微信支付API密钥
|
||||
'SECRECT_KEY' => empty($conf['SECRECT_KEY']) ? '' : $conf['SECRECT_KEY'],
|
||||
//微信支付证书路径
|
||||
'CERT_URL' => empty($conf['CERT_URL']) ? '' : $conf['CERT_URL'],
|
||||
//微信支付回调地址
|
||||
'PAY_BACK_URL' => empty($conf['PAY_BACK_URL']) ? '' : $conf['PAY_BACK_URL'],
|
||||
//微信登录回调地址
|
||||
'LOGIN_BACK_URL' => empty($conf['LOGIN_BACK_URL']) ? '' : $conf['LOGIN_BACK_URL'],
|
||||
];
|
||||
return view('', ['wechatConf' => $wechatConf]);
|
||||
}
|
||||
|
||||
//微信配置配置
|
||||
public function wechat_submit()
|
||||
{
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(ConfCheck::class)->scene('wechat')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$conf = "<?php return ['Token'=>'{$param["Token"]}','LOGIN_BACK_URL' => '{$param["LOGIN_BACK_URL"]}','appID'=>'{$param["appID"]}','appsecret'=>'{$param["appsecret"]}','MCHID' => '{$param["MCHID"]}','SECRECT_KEY' => '{$param["SECRECT_KEY"]}','CERT_URL' => '{$param["CERT_URL"]}','PAY_BACK_URL' => '{$param["PAY_BACK_URL"]}'];";
|
||||
file_put_contents(CMS_ROOT . "config/wechatconfig.php", $conf);
|
||||
add_log('edit',0,$param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
35
app/admin/controller/Index.php
Normal file
35
app/admin/controller/Index.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$menu = get_admin_menus();
|
||||
View::assign('menu', $menu);
|
||||
return View();
|
||||
}
|
||||
|
||||
public function main()
|
||||
{
|
||||
$adminCount=Db::name('admin')->where('status','1')->count();
|
||||
$userCount=Db::name('user')->where('status','1')->count();
|
||||
$articleCount=Db::name('article')->where('status','1')->count();
|
||||
View::assign('adminCount', $adminCount);
|
||||
View::assign('userCount', $userCount);
|
||||
View::assign('articleCount', $articleCount);
|
||||
return View();
|
||||
}
|
||||
|
||||
public function errorShow()
|
||||
{
|
||||
echo '错误';
|
||||
}
|
||||
|
||||
}
|
91
app/admin/controller/Keywords.php
Normal file
91
app/admin/controller/Keywords.php
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\validate\KeywordsCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Keywords extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['title','like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['status', '>=', 0];
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$content = Db::name('Keywords')
|
||||
->order('create_time desc')
|
||||
->where($where)
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $content);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
if ($id > 0) {
|
||||
$keywords = Db::name('Keywords')->where(['id' => $id])->find();
|
||||
View::assign('keywords', $keywords);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(KeywordsCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('Keywords')->strict(false)->field(true)->update($param);
|
||||
if($res) add_log('edit',$param['id'],$param);
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(KeywordsCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('Keywords')->strict(false)->field(true)->insertGetId($param);
|
||||
if($insertId) add_log('add',$insertId,$param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$data['status'] = '-1';
|
||||
$data['id'] = $id;
|
||||
$data['update_time'] = time();
|
||||
if (Db::name('Keywords')->update($data) !== false) {
|
||||
add_log('delete',$id,$data);
|
||||
return to_assign(1, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
68
app/admin/controller/Login.php
Normal file
68
app/admin/controller/Login.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\validate\UserCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
|
||||
class Login
|
||||
{
|
||||
//登录
|
||||
public function index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
//错误页面
|
||||
public function errorshow()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
//提交登录
|
||||
public function login_submit()
|
||||
{
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(UserCheck::class)->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
|
||||
$admin = Db::name('admin')->where(['username' => $param['username']])->find();
|
||||
if (empty($admin)) {
|
||||
return to_assign(0, '用户名或密码错误');
|
||||
}
|
||||
$param['pwd'] = set_password($param['password'], $admin['salt']);
|
||||
if ($admin['pwd'] !== $param['pwd']) {
|
||||
return to_assign(0, '用户名或密码错误');
|
||||
}
|
||||
if ($admin['status'] == -1) {
|
||||
return to_assign(0, '该用户禁止登录,请于系统所有者联系');
|
||||
}
|
||||
$data = [
|
||||
'last_login_time' => time(),
|
||||
'last_login_ip' => request()->ip(),
|
||||
'login_num' => $admin['login_num'] + 1,
|
||||
];
|
||||
Db::name('admin')->where(['id' => $admin['id']])->update($data);
|
||||
$session_admin = get_config('app.session_admin');
|
||||
Session::set($session_admin, $admin);
|
||||
$token = make_token();
|
||||
set_cache($token, $admin, 7200);
|
||||
$admin['token'] = $token;
|
||||
add_log('login',$admin['id'],$data);
|
||||
return to_assign(1, '登录成功', ['uid'=>$admin['id']]);
|
||||
}
|
||||
|
||||
//退出登录
|
||||
public function login_out()
|
||||
{
|
||||
$session_admin = get_config('app.session_admin');
|
||||
Session::delete($session_admin);
|
||||
//redirect('/')->send();
|
||||
return to_assign(1, "退出成功");
|
||||
}
|
||||
}
|
94
app/admin/controller/Menu.php
Normal file
94
app/admin/controller/Menu.php
Normal file
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\validate\MenuCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Menu extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
return view();
|
||||
}
|
||||
|
||||
//菜单列表
|
||||
|
||||
public function get_list()
|
||||
{
|
||||
$menu = Db::name('AdminMenu')->order('order asc')->select();
|
||||
return to_assign(0, '', $menu);
|
||||
}
|
||||
|
||||
//添加菜单页面
|
||||
|
||||
public function add()
|
||||
{
|
||||
return view('', ['pid' => get_params('pid')]);
|
||||
}
|
||||
|
||||
//提交添加
|
||||
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if ($param['id'] > 0) {
|
||||
try {
|
||||
validate(MenuCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$data[$param['field']] = $param['value'];
|
||||
$data['id'] = $param['id'];
|
||||
Db::name('AdminMenu')->strict(false)->field(true)->update($data);
|
||||
add_log('edit', $param['id'], $data);
|
||||
} else {
|
||||
try {
|
||||
validate(MenuCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$mid = Db::name('AdminMenu')->strict(false)->field(true)->insertGetId($param);
|
||||
//自动为系统所有者管理组分配新增的菜单
|
||||
$group = Db::name('AdminGroup')->find(1);
|
||||
if (!empty($group)) {
|
||||
$newGroup['id'] = 1;
|
||||
$newGroup['menus'] = $group['menus'] . ',' . $mid;
|
||||
Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup);
|
||||
add_log('add', $mid, $param);
|
||||
}
|
||||
}
|
||||
// 删除后台菜单缓存
|
||||
clear_cache('adminMenu');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params('id');
|
||||
$count = Db::name('AdminMenu')->where(['pid' => $id])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(0, '该菜单下还有子菜单,无法删除');
|
||||
}
|
||||
if (Db::name('AdminMenu')->delete($id) !== false) {
|
||||
// 删除后台菜单缓存
|
||||
clear_cache('adminMenu');
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(1, '删除菜单成功');
|
||||
} else {
|
||||
return to_assign(0, '删除失败');
|
||||
}
|
||||
}
|
||||
}
|
190
app/admin/controller/Nav.php
Normal file
190
app/admin/controller/Nav.php
Normal file
@ -0,0 +1,190 @@
|
||||
<?php
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\Nav as NavList;
|
||||
use app\admin\model\NavInfo;
|
||||
use app\admin\validate\NavCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Nav extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//列表
|
||||
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|title|desc', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$nav = NavList::where($where)
|
||||
->order('create_time asc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $nav);
|
||||
}
|
||||
|
||||
//添加
|
||||
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
if ($id > 0) {
|
||||
$nav = Db::name('nav')->where(['id' => $id])->find();
|
||||
View::assign('nav', $nav);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交添加
|
||||
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(NavCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
NavList::where(['id' => $param['id']])
|
||||
->strict(false)
|
||||
->field(true)
|
||||
->update($param);
|
||||
// 删除导航缓存
|
||||
clear_cache('homeNav');
|
||||
add_log('edit',$param['id'], $param);
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(NavCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$nid = NavList::strict(false)->field(true)->insertGetId($param);
|
||||
// 删除导航缓存
|
||||
clear_cache('homeNav');
|
||||
add_log('add',$nid, $param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params('id');
|
||||
$count = Db::name('NavInfo')->where([
|
||||
'nav_id' => $id,
|
||||
])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(0, '该组下还有导航,无法删除');
|
||||
}
|
||||
if (Db::name('Nav')->delete($id) !== false) {
|
||||
return to_assign(1, '删除成功');
|
||||
// 删除导航缓存
|
||||
clear_cache('homeNav');
|
||||
add_log('delete',$id, []);
|
||||
} else {
|
||||
return to_assign(0, '删除失败');
|
||||
}
|
||||
}
|
||||
|
||||
//管理导航
|
||||
|
||||
public function nav_info()
|
||||
{
|
||||
return view('', [
|
||||
'nav_id' => get_params('id'),
|
||||
]);
|
||||
}
|
||||
|
||||
//导航列表
|
||||
|
||||
public function nav_info_list()
|
||||
{
|
||||
$id = get_params('id');
|
||||
$navInfoList = Db::name('NavInfo')
|
||||
->where(['nav_id' => $id])
|
||||
->order('order asc')
|
||||
->select();
|
||||
return to_assign(0, '', $navInfoList);
|
||||
}
|
||||
|
||||
//添加导航
|
||||
|
||||
public function nav_info_add()
|
||||
{
|
||||
return view('', [
|
||||
'nav_id' => get_params('nid'),
|
||||
'pid' => get_params('pid'),
|
||||
]);
|
||||
}
|
||||
|
||||
//保存添加
|
||||
|
||||
public function nav_info_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(NavCheck::class)->scene('editInfo')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$data[$param['field']] = $param['value'];
|
||||
$data['id'] = $param['id'];
|
||||
NavInfo::strict(false)->field(true)->update($data);
|
||||
// 删除导航缓存
|
||||
clear_cache('homeNav');
|
||||
add_log('edit',$param['id'], $data);
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(NavCheck::class)->scene('addInfo')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$nid = NavInfo::strict(false)->field(true)->insertGetId($param);
|
||||
// 删除导航缓存
|
||||
clear_cache('homeNav');
|
||||
add_log('add', $nid, $param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
|
||||
public function nav_info_delete()
|
||||
{
|
||||
$id = get_params('id');
|
||||
if (Db::name('NavInfo')->delete($id) !== false) {
|
||||
//清除导航缓存
|
||||
clear_cache('homeNav');
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(1, '删除成功');
|
||||
} else {
|
||||
return to_assign(0, '删除失败');
|
||||
}
|
||||
}
|
||||
}
|
113
app/admin/controller/Role.php
Normal file
113
app/admin/controller/Role.php
Normal file
@ -0,0 +1,113 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\AdminGroup;
|
||||
use app\admin\validate\GroupCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Role extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//管理员列表
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title|desc','like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app.page_size) : $param['limit'];
|
||||
$group = AdminGroup::where($where)
|
||||
->order('create_time asc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $group);
|
||||
}
|
||||
|
||||
//添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
if ($id > 0) {
|
||||
$role = Db::name('admin_group')->where(['id' => $id])->find();
|
||||
View::assign('role', $role);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交保存
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(GroupCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
//为了系统安全id为1的系统所有者管理组不允许修改
|
||||
if ($param['id'] == 1) {
|
||||
return to_assign(0, '为了系统安全,该管理组不允许修改');
|
||||
}
|
||||
/*
|
||||
if (!empty($param['rules'])) {
|
||||
$param['rules'] = implode(',', $param['rules']);
|
||||
}
|
||||
if (!empty($param['menus'])) {
|
||||
$param['menus'] = implode(',', $param['menus']);
|
||||
}
|
||||
*/
|
||||
Db::name('admin_group')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
add_log('edit',$param['id'],$param);
|
||||
} else {
|
||||
try {
|
||||
validate(GroupCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
/*
|
||||
if (!empty($param['rules'])) {
|
||||
$param['rules'] = implode(',', $param['rules']);
|
||||
}
|
||||
if (!empty($param['menus'])) {
|
||||
$param['menus'] = implode(',', $param['menus']);
|
||||
}
|
||||
*/
|
||||
$gid = Db::name('admin_group')->strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add',$gid,$param);
|
||||
}
|
||||
//清除菜单\权限缓存
|
||||
clear_cache('adminMenu');
|
||||
clear_cache('adminRules');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
if ($id == 1) {
|
||||
return to_assign(0, "该组是系统所有者,无法删除");
|
||||
}
|
||||
if (Db::name('AdminGroup')->delete($id) !== false) {
|
||||
add_log('delete',$id,[]);
|
||||
return to_assign(1, "删除角色成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
87
app/admin/controller/Rule.php
Normal file
87
app/admin/controller/Rule.php
Normal file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\validate\RuleCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Rule extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//节点列表
|
||||
public function get_list()
|
||||
{
|
||||
$menu = Db::name('adminRule')->order('create_time asc')->select();
|
||||
return to_assign(0, '', $menu);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
return view('', ['pid' => get_params('pid')]);
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if ($param['id'] > 0) {
|
||||
try {
|
||||
validate(RuleCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$data[$param['field']] = $param['value'];
|
||||
$data['id'] = $param['id'];
|
||||
Db::name('AdminRule')->strict(false)->field(true)->update($data);
|
||||
add_log('edit', $param['id'], $data);
|
||||
} else {
|
||||
try {
|
||||
validate(RuleCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$rid = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($param);
|
||||
//自动为系统所有者管理组分配新增的节点
|
||||
$group = Db::name('AdminGroup')->find(1);
|
||||
if (!empty($group)) {
|
||||
$newGroup['id'] = 1;
|
||||
$newGroup['rules'] = $group['rules'] . ',' . $rid;
|
||||
Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup);
|
||||
add_log('add', $rid, $param);
|
||||
}
|
||||
}
|
||||
// 删除后台节点缓存
|
||||
clear_cache('adminRules');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$count = Db::name('AdminRule')->where(["pid" => $id])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(0, "该节点下还有子节点,无法删除");
|
||||
}
|
||||
if (Db::name('AdminRule')->delete($id) !== false) {
|
||||
clear_cache('adminRules');
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(1, "删除节点成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
43
app/admin/controller/Search.php
Normal file
43
app/admin/controller/Search.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Search extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['title','like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$content = Db::name('SearchKeywords')
|
||||
->order('id desc')
|
||||
->where($where)
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $content);
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
if (Db::name('SearchKeywords')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(1, "删除成功!");
|
||||
} else {
|
||||
return to_assign(0, "删除失败!");
|
||||
}
|
||||
}
|
||||
}
|
193
app/admin/controller/Sitemap.php
Normal file
193
app/admin/controller/Sitemap.php
Normal file
@ -0,0 +1,193 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\Sitemap as SitemapInfo;
|
||||
use app\admin\model\SitemapCate;
|
||||
use app\admin\validate\SitemapCateCheck;
|
||||
use app\admin\validate\SitemapCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Sitemap extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//列表
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['status','=',1];
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$SitemapCate = SitemapCate::where($where)
|
||||
->order('sort desc, id desc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $SitemapCate);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
if ($id > 0) {
|
||||
$cate = Db::name('SitemapCate')->where(['id' => $id])->find();
|
||||
View::assign('cate', $cate);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SitemapCateCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = SitemapCate::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if($res) add_log('edit', $param['id'], $param);
|
||||
// 删除菜单缓存
|
||||
clear_cache('homeSitemap');
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SitemapCateCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$sid = SitemapCate::strict(false)->field(true)->insertGetId($param);
|
||||
if($sid) add_log('add', $sid, $param);
|
||||
// 删除菜单缓存
|
||||
clear_cache('homeSitemap');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$where[] = ['sitemap_cate_id','=',$id];
|
||||
$where[] = ['status','>=',0];
|
||||
$count = Db::name('Sitemap')->where($where)->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(0, '该分类下还有数据,无法删除');
|
||||
}
|
||||
$data['status'] = '-1';
|
||||
$data['id'] = $id;
|
||||
$data['update_time'] = time();
|
||||
if (Db::name('SitemapCate')->update($data) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(1, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
//管理网站地图
|
||||
public function sitemap_info()
|
||||
{
|
||||
return view('', [
|
||||
'sitemap_cate_id' => get_params('id'),
|
||||
]);
|
||||
}
|
||||
|
||||
//网站地图列表
|
||||
public function sitemap_info_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
$where[] = ['sitemap_cate_id','=',$param['id']];
|
||||
$where[] = ['status','>=',0];
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$sitemap = SitemapInfo::where($where)
|
||||
->order('sort desc, id desc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $sitemap);
|
||||
}
|
||||
|
||||
//添加网站地图
|
||||
public function sitemap_info_add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
$sitemap_cate_id = empty(get_params('cid')) ? 0 : get_params('cid');
|
||||
if ($id > 0) {
|
||||
$sitemap = Db::name('Sitemap')->where(['id' => $id])->find();
|
||||
View::assign('sitemap', $sitemap);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('sitemap_cate_id', $sitemap_cate_id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//保存网站地图添加
|
||||
public function sitemap_info_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SitemapCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$param['name'] = htmlspecialchars($param['name']);
|
||||
$res = SitemapInfo::where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
if($res) add_log('edit',$param['id'],$param);
|
||||
// 删除导航缓存
|
||||
clear_cache('homeSitemap');
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SitemapCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['name'] = htmlspecialchars($param['name']);
|
||||
$param['create_time'] = time();
|
||||
$sid = SitemapInfo::strict(false)->field(true)->insertGetId($param);
|
||||
if($sid) add_log('add', $sid, $param);
|
||||
// 删除导航缓存
|
||||
clear_cache('homeSitemap');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除网站地图
|
||||
public function sitemap_info_delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$data['status'] = '-1';
|
||||
$data['id'] = $id;
|
||||
$data['update_time'] = time();
|
||||
if (Db::name('Sitemap')->update($data) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(1, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
183
app/admin/controller/Slide.php
Normal file
183
app/admin/controller/Slide.php
Normal file
@ -0,0 +1,183 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\Slide as SlideList;
|
||||
use app\admin\model\SlideInfo;
|
||||
use app\admin\validate\SlideCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Slide extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//列表
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|title|desc', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$slide = SlideList::where($where)
|
||||
->order('create_time asc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $slide);
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
if ($id > 0) {
|
||||
$slide = Db::name('slide')->where(['id' => $id])->find();
|
||||
View::assign('slide', $slide);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SlideCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = SlideList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if($res) add_log('edit', $param['id'], $param);
|
||||
clear_cache('homeSlide');
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SlideCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$sid = SlideList::strict(false)->field(true)->insertGetId($param);
|
||||
if($sid) add_log('add', $sid, $param);
|
||||
// 删除banner缓存
|
||||
clear_cache('homeSlide');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$count = Db::name('SlideInfo')->where([
|
||||
'slide_id' => $id,
|
||||
])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(0, '该组下还有幻灯片,无法删除');
|
||||
}
|
||||
if (Db::name('Slide')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
clear_cache('homeSlide');
|
||||
return to_assign(1, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
//管理幻灯片
|
||||
public function slide_info()
|
||||
{
|
||||
return view('', [
|
||||
'slide_id' => get_params('id'),
|
||||
]);
|
||||
}
|
||||
|
||||
//幻灯片列表
|
||||
public function slide_info_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
$where[] = ['slide_id','=',$param['id']];
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$slideInfoList = SlideInfo::where($where)
|
||||
->order('sort desc, id desc')
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(1, '', $slideInfoList);
|
||||
}
|
||||
|
||||
//添加幻灯片
|
||||
public function slide_info_add()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
$slide_id = empty(get_params('sid')) ? 0 : get_params('sid');
|
||||
if ($id > 0) {
|
||||
$slide_info = Db::name('SlideInfo')->where(['id' => $id])->find();
|
||||
View::assign('slide_info', $slide_info);
|
||||
$slide_id = $slide_info['slide_id'];
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('slide_id', $slide_id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//保存幻灯片添加
|
||||
public function slide_info_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SlideCheck::class)->scene('editInfo')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = SlideInfo::where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
if($res) add_log('edit',$param['id'],$param);
|
||||
// 删除缓存
|
||||
clear_cache('homeSlide');
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SlideCheck::class)->scene('addInfo')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(0, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$sid = SlideInfo::strict(false)->field(true)->insertGetId($param);
|
||||
if($sid) add_log('add', $sid, $param);
|
||||
// 删除缓存
|
||||
clear_cache('homeSlide');
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
//删除幻灯片
|
||||
public function slide_info_delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
if (Db::name('SlideInfo')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
clear_cache('homeSlide');
|
||||
return to_assign(1, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
138
app/admin/controller/User.php
Normal file
138
app/admin/controller/User.php
Normal file
@ -0,0 +1,138 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use app\admin\model\User as UserList;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class User extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
//列表
|
||||
public function get_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['nickname|truename|mobile|province|city','like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
|
||||
//按时间检索
|
||||
$start_time = isset($param['start_time']) ? strtotime(urldecode($param['start_time'])) : 0;
|
||||
$end_time = isset($param['end_time']) ? strtotime(urldecode($param['end_time'])) : 0;
|
||||
|
||||
if ($start_time > 0 && $end_time > 0) {
|
||||
if ($start_time === $end_time) {
|
||||
$where['register_time'] = array('eq', $start_time);
|
||||
} else {
|
||||
$where['register_time'] = array(array('egt', $start_time), array('elt', $end_time), 'and');
|
||||
}
|
||||
} elseif ($start_time > 0 && $end_time == 0) {
|
||||
$where['register_time'] = array('egt', $start_time);
|
||||
} elseif ($start_time == 0 && $end_time > 0) {
|
||||
$where['register_time'] = array('elt', $end_time);
|
||||
}
|
||||
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$content = UserList::where($where)
|
||||
->order('id desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$item->register_time = empty($item->register_time) ? '-' : date('Y-m-d H:i', $item->register_time);
|
||||
});
|
||||
return table_assign(1, '', $content);
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
$user = Db::name('user')->where(['id' => $id])->find();
|
||||
View::assign('user', $user);
|
||||
return view();
|
||||
}
|
||||
|
||||
//提交添加
|
||||
public function post_submit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$res = Db::name('user')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
if($res){
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
}else{
|
||||
return to_assign(0, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
$user = Db::name('user')->where(['id' => $id])->find();
|
||||
add_log('view', get_params('id'));
|
||||
View::assign('user', $user);
|
||||
return view();
|
||||
}
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$data['status'] = get_params("status");
|
||||
$data['id'] = $id;
|
||||
if (Db::name('user')->update($data) !== false) {
|
||||
add_log('edit', $id);
|
||||
return to_assign(1, "操作成功");
|
||||
} else {
|
||||
return to_assign(0, "操作失败");
|
||||
}
|
||||
}
|
||||
|
||||
public function log()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
//平台用户日志列表
|
||||
public function get_log_list()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['nickname|title','like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
|
||||
$content = DB::name('user_log')
|
||||
->field("id,uid,nickname,title,content,ip,param,FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%s') create_time")
|
||||
->order('create_time desc')
|
||||
->where($where)
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
|
||||
$content->toArray();
|
||||
foreach ($content as $k => $v) {
|
||||
$data = $v;
|
||||
$param_array = json_decode($v['param'], true);
|
||||
$param_value = '';
|
||||
foreach ($param_array as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
$value = array_to_string($value);
|
||||
}
|
||||
$param_value .= $key . ':' . $value . ' | ';
|
||||
}
|
||||
$data['param'] = $param_value;
|
||||
$content->offsetSet($k, $data);
|
||||
}
|
||||
return table_assign(1, '', $content);
|
||||
}
|
||||
|
||||
}
|
5
app/admin/event.php
Normal file
5
app/admin/event.php
Normal file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
// 这是系统自动生成的event定义文件
|
||||
return [
|
||||
|
||||
];
|
10
app/admin/middleware.php
Normal file
10
app/admin/middleware.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
//验证勾股cms是否完成安装
|
||||
\app\home\middleware\Install::class,
|
||||
//验证管理员操作权限
|
||||
\app\admin\middleware\Auth::class,
|
||||
];
|
86
app/admin/middleware/Auth.php
Normal file
86
app/admin/middleware/Auth.php
Normal file
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\middleware;
|
||||
|
||||
use think\facade\Cache;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
|
||||
class Auth
|
||||
{
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
//获取模块名称
|
||||
$controller = app('http')->getName();
|
||||
$pathInfo = str_replace('.' . $request->ext(), '', $request->pathInfo());
|
||||
$action = explode('/', $pathInfo)[0];
|
||||
// var_dump($pathInfo);
|
||||
//验证用户登录
|
||||
if ($action !== 'login') {
|
||||
$session_admin = get_config('app.session_admin');
|
||||
if (!Session::has($session_admin)) {
|
||||
return $request->isAjax() ? to_assign(404, '请先登录') : redirect((string) url('/admin/login/index'));
|
||||
}
|
||||
|
||||
// 验证用户访问权限
|
||||
if ($action !== 'index' && $action !== 'api') {
|
||||
if (!$this->checkAuth($controller, $pathInfo, $action, Session::get($session_admin)['id'])) {
|
||||
return $request->isAjax() ? to_assign(202, '你没有权限!') : redirect((string) url('/admin/login/errorshow'));
|
||||
}
|
||||
}
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证用户访问权限
|
||||
* @DateTime 2020-12-21
|
||||
* @param string $controller 当前访问控制器
|
||||
* @param string $action 当前访问方法
|
||||
* @param string $uid 当前用户id
|
||||
* @return [type]
|
||||
*/
|
||||
protected function checkAuth($controller, $pathInfo, $action, $uid)
|
||||
{
|
||||
Cache::delete('RulesSrc' . $uid);
|
||||
if ($uid == 8) {
|
||||
// id=1的管理员默认拥有所有权限
|
||||
return true;
|
||||
} else {
|
||||
if (!Cache::get('RulesSrc' . $uid)) {
|
||||
//用户所在权限组及所拥有的权限
|
||||
// 执行查询
|
||||
$user_groups = Db::name('admin_group_access')
|
||||
->alias('a')
|
||||
->join("admin_group w", "a.group_id=w.id", 'LEFT')
|
||||
->where("a.uid='{$uid}' and w.status='1'")
|
||||
->select()
|
||||
->toArray();
|
||||
$groups = $user_groups ?: [];
|
||||
|
||||
$ids = []; //保存用户所属用户组设置的所有权限规则id
|
||||
foreach ($groups as $g) {
|
||||
$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
|
||||
}
|
||||
$ids = array_unique($ids);
|
||||
//读取用户组所有权限规则
|
||||
$rules = Db::name('admin_rule')->where('id', 'in', $ids)->field('src')->select();
|
||||
//循环规则,判断结果。
|
||||
$authList = []; //
|
||||
foreach ($rules as $rule) {
|
||||
//只要存在就记录
|
||||
$authList[] = strtolower($rule['src']);
|
||||
}
|
||||
//规则列表结果保存到Cache
|
||||
Cache::tag('adminRules')->set('RulesSrc' . $uid, $authList, 36000);
|
||||
} else {
|
||||
$authList = Cache::get('RulesSrc' . $uid);
|
||||
}
|
||||
if (!in_array((string) $controller . '/' . $pathInfo, $authList)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
17
app/admin/middleware/Install.php
Normal file
17
app/admin/middleware/Install.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\middleware;
|
||||
|
||||
class Install
|
||||
{
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
if(!file_exists(root_path() . './config/install.lock'))
|
||||
{
|
||||
return $request->isAjax()?vae_assign(202,'请先完成系统安装引导'):redirect((string)url('/install/index'));
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
7
app/admin/model/Admin.php
Normal file
7
app/admin/model/Admin.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class Admin extends Model
|
||||
{
|
||||
|
||||
}
|
7
app/admin/model/AdminGroup.php
Normal file
7
app/admin/model/AdminGroup.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class AdminGroup extends Model
|
||||
{
|
||||
|
||||
}
|
116
app/admin/model/AdminLog.php
Normal file
116
app/admin/model/AdminLog.php
Normal file
@ -0,0 +1,116 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class AdminLog extends Model
|
||||
{
|
||||
|
||||
/**
|
||||
* 读取日志标题
|
||||
* @return array
|
||||
*/
|
||||
public function get_title($type)
|
||||
{
|
||||
$type_array=[
|
||||
'Conf/web_submit'=>'网站信息',
|
||||
'Conf/email_submit'=>'邮箱配置',
|
||||
'Conf/wechat_submit'=>'微信配置',
|
||||
'Menu/post_submit'=>'菜单',
|
||||
'Menu/delete'=>'菜单',
|
||||
'Rule/post_submit'=>'节点',
|
||||
'Rule/delete'=>'节点',
|
||||
'Role/post_submit'=>'角色',
|
||||
'Role/delete'=>'角色',
|
||||
'Admin/post_submit'=>'管理员',
|
||||
'Admin/view'=>'管理员',
|
||||
'Admin/delete'=>'管理员',
|
||||
'Nav/post_submit'=>'导航组',
|
||||
'Nav/delete'=>'导航组',
|
||||
'Nav/nav_info_submit'=>'导航',
|
||||
'Nav/nav_info_delete'=>'导航',
|
||||
'Sitemap/post_submit'=>'网站地图分类',
|
||||
'Sitemap/delete'=>'网站地图分类',
|
||||
'Sitemap/sitemap_info'=>'网站地图',
|
||||
'Sitemap/sitemap_info_submit'=>'网站地图',
|
||||
'Sitemap/sitemap_info_delete'=>'网站地图',
|
||||
'Slide/post_submit'=>'轮播组',
|
||||
'Slide/delete'=>'轮播组',
|
||||
'Slide/slide_info_submit'=>'轮播图',
|
||||
'Slide/slide_info_delete'=>'轮播图',
|
||||
'Keywords/post_submit'=>'SEO关键字',
|
||||
'Keywords/delete'=>'SEO关键字',
|
||||
'Search/delete'=>'搜索关键字',
|
||||
'User/post_submit'=>'用户',
|
||||
'User/view'=>'用户',
|
||||
'User/delete'=>'用户',
|
||||
'Article/cate_post_submit'=>'文章分类',
|
||||
'Article/cate_delete'=>'文章分类',
|
||||
'Article/post_submit'=>'文章',
|
||||
'Article/delete'=>'文章',
|
||||
'Api/upload'=>'附件',
|
||||
'Login/login_submit'=>'系统'
|
||||
];
|
||||
if (!empty($type_array[$type])) {
|
||||
return $type_array[$type];
|
||||
} else {
|
||||
return '未知';
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 读取日志模块
|
||||
* @return array
|
||||
*/
|
||||
public function get_controller($controller,$fun)
|
||||
{
|
||||
$controller_array = ['Admin' => '系统用户', 'Article' => '文章', 'Conf' => '配置信息', 'Index' => '系统1', 'Keywords' => '关键字', 'Login' => '系统', 'Menu' => '菜单','Nav' => '导航分类', 'Role' => '角色', 'Rule' => '节点', 'Search' => '搜索词', 'Sitemap' => '网站地图', 'Slide' => '广告', 'User' => '用户','Api'=>''];
|
||||
if (!empty($controller_array[$controller])) {
|
||||
if($fun=='cate_post_submit'){
|
||||
return '文章分类';
|
||||
}
|
||||
else{
|
||||
return $controller_array[$controller];
|
||||
}
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
public function get_log_list($param = [])
|
||||
{
|
||||
$where = array();
|
||||
if (!empty($param['no_delete'])) {
|
||||
$where['type'] = ['neq', 'delete']; //过滤删除操作
|
||||
}
|
||||
if (!empty($param['no_admin'])) {
|
||||
$where['uid'] = ['neq', 1]; //超级管理员删除操作
|
||||
}
|
||||
if (!empty($param['uid'])) {
|
||||
$where['uid'] = $param['uid']; //查询指定用户的操作
|
||||
}
|
||||
$where['status'] = 1;
|
||||
$rows = empty($param['limit']) ? get_config('app.pages') : $param['limit'];
|
||||
$content = \think\facade\Db::name('admin_log')
|
||||
->field("id,uid,nickname,type,title,module,controller,function,param,create_time")
|
||||
->order('create_time desc')
|
||||
->where($where)
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
|
||||
$content->toArray();
|
||||
foreach ($content as $k => $v) {
|
||||
$data = $v;
|
||||
$param_array = json_decode($v['param'], true);
|
||||
$name='';
|
||||
if(!empty($param_array['name'])){
|
||||
$name=$param_array['name'];
|
||||
}
|
||||
if(!empty($param_array['title'])){
|
||||
$name=$param_array['title'];
|
||||
}
|
||||
$data['content'] = $v['nickname'] . $v['title']. '了' .$this->get_title($v['controller'].'/'.$v['function']) .$name ;
|
||||
$data['times'] = time_trans($v['create_time']);
|
||||
$content->offsetSet($k, $data);
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
}
|
7
app/admin/model/Article.php
Normal file
7
app/admin/model/Article.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class Article extends Model
|
||||
{
|
||||
|
||||
}
|
7
app/admin/model/ArticleCate.php
Normal file
7
app/admin/model/ArticleCate.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class ArticleCate extends Model
|
||||
{
|
||||
|
||||
}
|
7
app/admin/model/Nav.php
Normal file
7
app/admin/model/Nav.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class Nav extends Model
|
||||
{
|
||||
|
||||
}
|
7
app/admin/model/NavInfo.php
Normal file
7
app/admin/model/NavInfo.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class NavInfo extends Model
|
||||
{
|
||||
|
||||
}
|
29
app/admin/model/Sitemap.php
Normal file
29
app/admin/model/Sitemap.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class Sitemap extends Model
|
||||
{
|
||||
protected $append = ['pc_img_url', 'mobile_img_url'];
|
||||
protected $resultSetType = 'collection';
|
||||
/**
|
||||
* 获取pc图片链接
|
||||
* @param string $pc_img_url 转换pc图片链接
|
||||
*/
|
||||
public function getPcImgUrlAttr($value, $data)
|
||||
{
|
||||
return get_file($data['pc_img']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获mobile图片链接
|
||||
* @param string mobile_img_url 转mobile图片链接
|
||||
*/
|
||||
public function getMobileImgUrlAttr($value, $data)
|
||||
{
|
||||
return get_file($data['mobile_img']);
|
||||
}
|
||||
|
||||
}
|
17
app/admin/model/SitemapCate.php
Normal file
17
app/admin/model/SitemapCate.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
|
||||
class SitemapCate extends Model
|
||||
{
|
||||
/**
|
||||
* 关联网站地图
|
||||
* @param [type] $value [description]
|
||||
*/
|
||||
public function sitemap()
|
||||
{
|
||||
return $this->hasMany('sitemap', 'sitemap_cate_id', 'id')->order('sort desc, id desc');
|
||||
}
|
||||
|
||||
}
|
7
app/admin/model/Slide.php
Normal file
7
app/admin/model/Slide.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class Slide extends Model
|
||||
{
|
||||
|
||||
}
|
7
app/admin/model/SlideInfo.php
Normal file
7
app/admin/model/SlideInfo.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
class SlideInfo extends Model
|
||||
{
|
||||
|
||||
}
|
8
app/admin/model/User.php
Normal file
8
app/admin/model/User.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
namespace app\admin\model;
|
||||
use think\Model;
|
||||
|
||||
class User extends Model
|
||||
{
|
||||
|
||||
}
|
48
app/admin/validate/AdminCheck.php
Normal file
48
app/admin/validate/AdminCheck.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class AdminCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'username' => 'require|unique:admin',
|
||||
'pwd' => 'require|confirm',
|
||||
'mobile' => 'require',
|
||||
'nickname' => 'require',
|
||||
'group_id' => 'require',
|
||||
'id' => 'require',
|
||||
'status' => 'require|checkStatus:-1,1',
|
||||
'old_pwd' => 'require|different:pwd',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'username.require' => '登录账号不能为空',
|
||||
'pwd.require' => '密码不能为空',
|
||||
'pwd.confirm' => '两次密码不一致',
|
||||
'username.unique' => '同样的登录账号已经存在!',
|
||||
'mobile.require' => '手机不能为空',
|
||||
'nickname.require' => '昵称不能为空',
|
||||
'group_id.require' => '至少要选择一个用户角色',
|
||||
'id.require' => '缺少更新条件',
|
||||
'status.require' => '状态为必选',
|
||||
'status.checkStatus' => '系统所有者不能被禁用!',
|
||||
'old_pwd.require' => '请提供旧密码',
|
||||
'old_pwd.different' => '新密码不能和旧密码一样',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['phone', 'nickname', 'group_id', 'pwd', 'username', 'status'],
|
||||
'edit' => ['phone', 'nickname', 'group_id', 'id', 'username.unique', 'status'],
|
||||
'editPersonal' => ['phone', 'nickname'],
|
||||
'editpwd' => ['old_pwd', 'pwd'],
|
||||
];
|
||||
|
||||
// 自定义验证规则
|
||||
protected function checkStatus($value,$rule,$data)
|
||||
{
|
||||
if($value == -1 and $data['id'] == 1) {
|
||||
return $rule == false;
|
||||
}
|
||||
return $rule == true;
|
||||
}
|
||||
}
|
26
app/admin/validate/ArticleCateCheck.php
Normal file
26
app/admin/validate/ArticleCateCheck.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class ArticleCateCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:article_cate',
|
||||
'pid' => 'require',
|
||||
'id' => 'require',
|
||||
'field' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'pid.require' => '父级分类为必选',
|
||||
'title.unique' => '同样的记录已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
'filed.require' => '缺少要更新的字段名',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'pid'],
|
||||
'edit' => ['id', 'field','title.unique'],
|
||||
];
|
||||
}
|
27
app/admin/validate/ArticleCheck.php
Normal file
27
app/admin/validate/ArticleCheck.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class ArticleCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:article',
|
||||
'content' => 'require',
|
||||
'id' => 'require',
|
||||
'article_cate_id' => 'require',
|
||||
'status' => 'require'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '标题不能为空',
|
||||
'article_cate_id.require' => '所属分类为必选',
|
||||
'title.unique' => '同样的记录已经存在!',
|
||||
'id.require' => '缺少更新条件',
|
||||
'status.require' => '状态为必选',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'thumb', 'article_cate_id', 'content', 'status'],
|
||||
'edit' => ['title', 'thumb', 'article_cate_id', 'content', 'id', 'status'],
|
||||
];
|
||||
}
|
48
app/admin/validate/ConfCheck.php
Normal file
48
app/admin/validate/ConfCheck.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class ConfCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'admin_title' => 'require',
|
||||
'smtp' => 'require',
|
||||
'username' => 'require',
|
||||
'password' => 'require',
|
||||
'port' => 'require',
|
||||
'email' => 'require',
|
||||
'from' => 'require',
|
||||
'appkey' => 'require',
|
||||
'secretkey' => 'require',
|
||||
'FreeSignName' => 'require',
|
||||
'Token' => 'require',
|
||||
'appID' => 'require',
|
||||
'appsecret' => 'require',
|
||||
'LOGIN_BACK_URL' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '网站标题不能为空',
|
||||
'admin_title.require' => '后台标题不能为空',
|
||||
'smpt.require' => 'SMTP服务器地址不能为空',
|
||||
'username.require' => '邮箱账户不能为空',
|
||||
'password.require' => '密码不能为空',
|
||||
'port.require' => '端口不能为空',
|
||||
'email.require' => '发送者邮箱不能为空',
|
||||
'from.require' => '要显示的发送者信息不能为空',
|
||||
'appkey.require' => 'appkey不能为空',
|
||||
'secretkey.require' => 'secretkey不能为空',
|
||||
'FreeSignName.require' => '签名不能为空',
|
||||
'Token.require' => 'Token不能为空',
|
||||
'appID.require' => 'appID不能为空',
|
||||
'appsecret.require' => 'appsecret不能为空',
|
||||
'LOGIN_BACK_URL.require' => '微信授权登录回到地址不能为空',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'web' => ['title', 'admin_title'],
|
||||
'email' => ['smtp', 'username', 'password', 'port', 'email', 'from'],
|
||||
'wechat' => ['Token', 'appID', 'appsecret','LOGIN_BACK_URL'],
|
||||
];
|
||||
}
|
34
app/admin/validate/GroupCheck.php
Normal file
34
app/admin/validate/GroupCheck.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class GroupCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:admin_group',
|
||||
'id' => 'require',
|
||||
'status' => 'require|checkStatus:-1,1'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的记录已经存在!',
|
||||
'id.require' => '缺少更新条件',
|
||||
'status.require' => '状态为必选',
|
||||
'status.checkStatus' => '系统所有者组不能被禁用!',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title','status'],
|
||||
'edit' => ['id', 'title', 'status'],
|
||||
];
|
||||
|
||||
// 自定义验证规则
|
||||
protected function checkStatus($value,$rule,$data)
|
||||
{
|
||||
if($value == -1 and $data['id'] == 1) {
|
||||
return $rule == false;
|
||||
}
|
||||
return $rule == true;
|
||||
}
|
||||
}
|
40
app/admin/validate/KeywordsCheck.php
Normal file
40
app/admin/validate/KeywordsCheck.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class KeywordsCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|checkUnique',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '关键字名称不能为空',
|
||||
'title.checkUnique' => '同样的关键字名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id','title']
|
||||
];
|
||||
|
||||
//自定义验证规则
|
||||
protected function checkUnique($value,$rule,$data)
|
||||
{
|
||||
if(isset($data['id'])){
|
||||
$unique =Db::name('keywords')->where([['id','<>',$data['id']],['title','=',$value],['status','>=',0]])->value('id');
|
||||
}else{
|
||||
$unique =Db::name('keywords')->where([['title','=',$value],['status','>=',0]])->value('id');
|
||||
}
|
||||
|
||||
if($unique) {
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
26
app/admin/validate/MenuCheck.php
Normal file
26
app/admin/validate/MenuCheck.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class MenuCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:admin_menu',
|
||||
'pid' => 'require',
|
||||
'id' => 'require',
|
||||
'field' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '菜单名称不能为空',
|
||||
'pid.require' => '父级菜单为必选',
|
||||
'title.unique' => '同样的菜单名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
'filed.require' => '缺少要更新的字段名',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'pid'],
|
||||
'edit' => ['id', 'field', 'title.unique'],
|
||||
];
|
||||
}
|
34
app/admin/validate/NavCheck.php
Normal file
34
app/admin/validate/NavCheck.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class NavCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:nav',
|
||||
'name' => 'require|unique:nav',
|
||||
'id' => 'require',
|
||||
'status' => 'require',
|
||||
'slide_id' => 'require',
|
||||
'field' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '标题不能为空',
|
||||
'name.require' => '标识不能为空',
|
||||
'title.unique' => '同样的记录已经存在!',
|
||||
'name.unique' => '同样的记录已经存在!',
|
||||
'id.require' => '缺少更新条件',
|
||||
'status.require' => '状态为必选',
|
||||
'slide_id.require' => '缺少导航组ID',
|
||||
'filed.require' => '缺少要更新的字段名',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'name', 'status'],
|
||||
'edit' => ['id', 'title', 'name', 'status'],
|
||||
'addInfo' => ['title', 'nav_id'],
|
||||
'editInfo' => ['id', 'field'],
|
||||
];
|
||||
}
|
29
app/admin/validate/RuleCheck.php
Normal file
29
app/admin/validate/RuleCheck.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class RuleCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:admin_rule',
|
||||
'src' => 'unique:admin_rule',
|
||||
'pid' => 'require',
|
||||
'id' => 'require',
|
||||
'field' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '节点名称不能为空',
|
||||
'pid.require' => '父级节点为必选',
|
||||
'title.unique' => '同样的节点名称已经存在',
|
||||
'src.unique' => '同样的节点规则已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
'filed.require' => '缺少要更新的字段名',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'pid', 'src'],
|
||||
'edit' => ['id', 'field', 'title.unique', 'src.unique'],
|
||||
];
|
||||
}
|
21
app/admin/validate/SitemapCateCheck.php
Normal file
21
app/admin/validate/SitemapCateCheck.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
class SitemapCateCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'name' => 'require|unique:sitemap_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '名称不能为空',
|
||||
'name.unique' => '同样的记录已经存在!',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name'],
|
||||
'edit' => ['id', 'name'],
|
||||
];
|
||||
}
|
31
app/admin/validate/SitemapCheck.php
Normal file
31
app/admin/validate/SitemapCheck.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class SitemapCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'name' => 'require',
|
||||
'id' => 'require',
|
||||
'sitemap_cate_id' => 'require',
|
||||
'pc_img' => 'require',
|
||||
'pc_src' => 'require',
|
||||
'mobile_img' => 'require',
|
||||
'mobile_src' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '名称不能为空',
|
||||
'pc_img.require' => 'pc端图片不能为空',
|
||||
'pc_src.require' => 'pc端链接不能为空',
|
||||
'mobile_img.require' => '移动端图片不能为空',
|
||||
'mobile_src.require' => '移动端链接不能为空',
|
||||
'id.require' => '缺少更新条件',
|
||||
'sitemap_cate_id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['sitemap_cate_id', 'name', 'pc_src', 'mobile_src'],
|
||||
'edit' => ['id', 'name', 'pc_src', 'mobile_src'],
|
||||
];
|
||||
}
|
33
app/admin/validate/SlideCheck.php
Normal file
33
app/admin/validate/SlideCheck.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class SlideCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:slide',
|
||||
'name' => 'require|unique:slide',
|
||||
'id' => 'require',
|
||||
'status' => 'require',
|
||||
'img' => 'require',
|
||||
'slide_id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '标题不能为空',
|
||||
'name.require' => '标识不能为空',
|
||||
'title.unique' => '同样的记录已经存在!',
|
||||
'name.unique' => '同样的记录已经存在!',
|
||||
'id.require' => '缺少更新条件',
|
||||
'status.require' => '状态为必选',
|
||||
'img.require' => '请上传图片',
|
||||
'slide_id.require' => '缺少换灯组ID',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'name', 'status'],
|
||||
'edit' => ['id', 'title', 'name', 'status'],
|
||||
'addInfo' => ['title', 'img', 'status', 'slide_id'],
|
||||
'editInfo' => ['title', 'img', 'status', 'id'],
|
||||
];
|
||||
}
|
19
app/admin/validate/UserCheck.php
Normal file
19
app/admin/validate/UserCheck.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class UserCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'username' => 'require',
|
||||
'password' => 'require',
|
||||
'captcha' => 'require|captcha',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'username.require' => '用户名不能为空',
|
||||
'password.require' => '密码不能为空',
|
||||
'captcha.require' => '验证码不能为空',
|
||||
'captcha.captcha' => '验证码不正确',
|
||||
];
|
||||
}
|
215
app/admin/view/admin/add.html
Normal file
215
app/admin/view/admin/add.html
Normal file
@ -0,0 +1,215 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
{if condition="$id eq 0"}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">登录账号<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="username" lay-verify="required" autocomplete="off" placeholder="请输入登录账号"
|
||||
lay-reqText="请输入登录账号" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">用户名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="nickname" lay-verify="required" placeholder="请输入用户名" lay-reqText="请输入用户名"
|
||||
autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray2">头像<br /><span style="font-size: 12px;">(如若不上传<br />系统将自动生成)</span>
|
||||
</td>
|
||||
<td rowspan="3" valign="top" style="width: 100px;">
|
||||
<div class="layui-upload" style="width: 100px;">
|
||||
<div class="layui-upload-list" id="demo1" style="width: 100%; height:100px; overflow: hidden;">
|
||||
<img src="/static/admin/images/nonepic600x600.jpg" height="100" style="max-width: 100%; width: 100%;" />
|
||||
<input type="hidden" name="thumb" value="">
|
||||
</div>
|
||||
<button type="button" class="layui-btn layui-btn-normal" style="width: 100%;"
|
||||
id="test1">上传头像</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">密码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="password" name="pwd" lay-verify="required" placeholder="请输入密码" lay-reqText="请输入密码"
|
||||
autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">确认密码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="password" name="pwd_confirm" lay-verify="required" placeholder="请再次输入密码"
|
||||
lay-reqText="请再次输入密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">手机号码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="mobile" lay-verify="required" placeholder="请输入手机" lay-reqText="请输入手机"
|
||||
autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="0" title="禁止登录">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">用户角色<font>*</font>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
{volist name=":get_admin_group()" id="v"}
|
||||
<input type="checkbox" name="group_id[]" title="{$v.title}" value="{$v.id}" lay-skin="primary">
|
||||
{/volist}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">备注</td>
|
||||
<td colspan="5">
|
||||
<textarea name="desc" placeholder="请输入备注" class="layui-textarea"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">登录账号<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$admin.id}">
|
||||
<input type="text" name="username" lay-verify="required" autocomplete="off" placeholder="请输入登录账号"
|
||||
lay-reqText="请输入登录账号" class="layui-input" value="{$admin.username}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">用户名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="nickname" lay-verify="required" placeholder="请输入用户名" lay-reqText="请输入用户名"
|
||||
autocomplete="off" class="layui-input" value="{$admin.nickname}">
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray2">头像<br /><span style="font-size: 12px;">(如若不上传<br />系统将自动生成)</span>
|
||||
</td>
|
||||
<td rowspan="3" valign="top" style="width: 100px;">
|
||||
<div class="layui-upload" style="width: 100px;">
|
||||
<div class="layui-upload-list" id="demo1" style="width: 100%; height:100px; overflow: hidden;">
|
||||
<img src="{$admin.thumb}" height="100" style="max-width: 100%; width: 100%;" />
|
||||
<input type="hidden" name="thumb" value="{$admin.thumb}">
|
||||
</div>
|
||||
<button type="button" class="layui-btn layui-btn-normal" style="width: 100%;"
|
||||
id="test1">上传头像</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">密码</td>
|
||||
<td>
|
||||
<input type="password" name="pwd" placeholder="请输入密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">确认密码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="password" name="pwd_confirm" placeholder="请再次输入密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">手机号码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="mobile" lay-verify="required" placeholder="请输入手机" lay-reqText="请输入手机"
|
||||
autocomplete="off" class="layui-input" value="{$admin.mobile}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$admin.status" value="1" }checked{/eq}>
|
||||
<input type="radio" name="status" value="0" title="禁止登录" {eq name="$admin.status" value="0"
|
||||
}checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">用户角色<font>*</font>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
{volist name=":get_admin_group()" id="v"}
|
||||
<input type="checkbox" name="group_id[]" title="{$v.title}" value="{$v.id}" {volist
|
||||
name="$admin.group_id" id="a" }{eq name="$a" value="$v.id" }checked{/eq}{/volist} lay-skin="primary">
|
||||
{/volist}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">备注</td>
|
||||
<td colspan="5">
|
||||
<textarea name="desc" placeholder="请输入备注" class="layui-textarea">{$admin.desc}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/if}
|
||||
|
||||
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, upload = layui.upload;
|
||||
|
||||
//头像上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: '/admin/api/upload'
|
||||
, done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.filepath);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/admin/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
66
app/admin/view/admin/edit_password.html
Normal file
66
app/admin/view/admin/edit_password.html
Normal file
@ -0,0 +1,66 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<h3 style="height:36px">重置密码</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">用户名 <span style="color: red">*</span></td>
|
||||
<td><input type="text" lay-verify="required" autocomplete="off" placeholder="" class="layui-input"
|
||||
value="{$admin.username}" disabled></td>
|
||||
<td class="layui-td-gray2">旧密码<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="password" lay-verify="required" name="old_pwd" placeholder="请输入旧密码" lay-reqText="请输入旧密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">新密码 <span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="password" lay-verify="required" name="pwd" placeholder="请输入新密码" lay-reqText="请输入新密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">确认新密码 <span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="password" lay-verify="required" name="pwd_confirm" placeholder="请再次输入新密码" lay-reqText="请再次输入新密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/api/password_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.msg('修改密码成功');
|
||||
setTimeout(function () {
|
||||
$('.ittab-tab .layui-tab-title .layui-this i', parent.document).click();
|
||||
layer.close(index);
|
||||
}, 1000)
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
90
app/admin/view/admin/edit_personal.html
Normal file
90
app/admin/view/admin/edit_personal.html
Normal file
@ -0,0 +1,90 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<h3 style="height:36px">修改个人信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">用户名 <span style="color: red">*</span></td>
|
||||
<td><input type="text" lay-verify="required" autocomplete="off" placeholder="请输入节点名称" class="layui-input"
|
||||
value="{$admin.username}" disabled></td>
|
||||
<td class="layui-td-gray2" rowspan="3">头像</td>
|
||||
<td rowspan="3">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal" id="test1">上传头像</button>
|
||||
<div class="layui-upload-list" id="demo1">
|
||||
<img src="{$admin.thumb}" width="100" />
|
||||
<input type="hidden" name="thumb" value="{$admin.thumb}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">昵称<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="text" name="nickname" lay-verify="required" placeholder="请输入昵称" lay-reqText="请输入昵称"
|
||||
autocomplete="off" class="layui-input" value="{$admin.nickname}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">手机</td>
|
||||
<td><input type="text" name="mobile" lay-verify="required" placeholder="请输入手机" autocomplete="off"
|
||||
class="layui-input" value="{$admin.mobile}"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, upload = layui.upload;
|
||||
|
||||
//头像上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: '/admin/api/upload'
|
||||
, done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.filepath);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/api/personal_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,关闭本页面吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$('.ittab-tab .layui-tab-title .layui-this i', parent.document).click();
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
150
app/admin/view/admin/index.html
Normal file
150
app/admin/view/admin/index.html
Normal file
@ -0,0 +1,150 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<div style="height:36px">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="ID/登录账户/用户名/手机号码/备注" class="layui-input" autocomplete="off"
|
||||
style="max-width: 320px;display: inline;margin: -11px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="thumb">
|
||||
<img src="{{d.thumb}}" width="30" height="30" />
|
||||
</script>
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/admin/add">添加用户</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/admin/admin/view?id={{d.id}}">详情</a>
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/admin/add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '管理员列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/admin/get_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'username',
|
||||
title: '登录账号',
|
||||
align: 'center',
|
||||
width: 132
|
||||
}, {
|
||||
field: 'thumb',
|
||||
title: '头像',
|
||||
toolbar: '#thumb',
|
||||
align: 'center',
|
||||
width: 60
|
||||
}, {
|
||||
field: 'nickname',
|
||||
title: '用户名',
|
||||
align: 'center',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'groupName',
|
||||
title: '角色'
|
||||
}, {
|
||||
field: 'login_num',
|
||||
title: '累计登录',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'last_login_time',
|
||||
title: '最后登录时间',
|
||||
align: 'center',
|
||||
width: 148
|
||||
}, {
|
||||
field: 'last_login_ip',
|
||||
title: '最后登录IP',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 60
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 168,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (data.id == 1) {
|
||||
layer.msg('超级管理员不能删除');
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('您确定要删除该员工', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/admin/delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
102
app/admin/view/admin/log.html
Normal file
102
app/admin/view/admin/log.html
Normal file
@ -0,0 +1,102 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="昵称/操作节点名称/操作数据ID" class="layui-input" autocomplete="off"
|
||||
style="max-width: 320px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<div class="layui-input-inline">
|
||||
<select name="title_cate">
|
||||
<option value="">请选择类型</option>
|
||||
<option value="登录">登录操作</option>
|
||||
<option value="上传">上传操作</option>
|
||||
<option value="新增">新增操作</option>
|
||||
<option value="编辑">编辑操作</option>
|
||||
<option value="查看">查看操作</option>
|
||||
<option value="删除">删除操作</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '操作日志列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/admin/get_log_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'admin_menu',
|
||||
title: '操作类型',
|
||||
width: 90,
|
||||
align: 'center',
|
||||
}, {
|
||||
field: 'content',
|
||||
title: '操作描述',
|
||||
width: 348
|
||||
}, {
|
||||
field: 'param_id',
|
||||
title: '操作数据ID',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'param',
|
||||
title: '操作数据'
|
||||
}, {
|
||||
field: 'nickname',
|
||||
title: '操作用户',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'ip',
|
||||
title: 'IP地址',
|
||||
align: 'center',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'create_time',
|
||||
title: '操作时间',
|
||||
fixed: 'right',
|
||||
align: 'center',
|
||||
width: 160
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords,
|
||||
title_cate: data.field.title_cate
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
62
app/admin/view/admin/log_list.html
Normal file
62
app/admin/view/admin/log_list.html
Normal file
@ -0,0 +1,62 @@
|
||||
{extend name="common/base"/}
|
||||
{block name="style"}
|
||||
<style type="text/css">
|
||||
.table-title{font-size: 20px; padding-bottom: 12px;}
|
||||
.latest-news{padding-top: 12px; padding-bottom:30px; padding-left: 20px; position: relative;}
|
||||
.latest-news .layui-timeline-title{padding-bottom:0; font-size: 14px;}
|
||||
.latest-news .layui-timeline-item{padding-bottom:5px;}
|
||||
.layui-timeline-title span{color:#999}
|
||||
.panel-more{width: 100%; height:48px; line-height: 48px; text-align: center; position: absolute; bottom: 0; left:0; background: linear-gradient(rgba(225,225,225,0),rgba(225,225,225,.8));}
|
||||
.panel-more a{color:#0088FF}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="vae-content" style="padding: 20px;">
|
||||
<div class="table-title">最新动态</div>
|
||||
<div class="latest-news">
|
||||
<ul class="layui-timeline" id="logs">
|
||||
</ul>
|
||||
<div class="panel-more"><a href="javascript:getLogs();">查看更多动态</a></div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var page=1,limit=20;
|
||||
function getLogs() {
|
||||
$.ajax({
|
||||
url: "/admin/api/get_log_list",
|
||||
type: 'post',
|
||||
data: {
|
||||
page:page,
|
||||
limit: limit
|
||||
},
|
||||
success: function(e) {
|
||||
if (e.code == 0) {
|
||||
var html = '';
|
||||
if(e.data.length>0){
|
||||
page++;
|
||||
$.each(e.data, function(key, value) {
|
||||
html += '<li class="layui-timeline-item">\
|
||||
<i class="layui-icon layui-timeline-axis"></i>\
|
||||
<div class="layui-timeline-content layui-text">\
|
||||
<div class="layui-timeline-title"><span title="'+value.id+'">'+value.times+'</span>,'+value.content+'</div>\
|
||||
</div>\
|
||||
</li>';
|
||||
});
|
||||
$('#logs').append(html);
|
||||
}else{
|
||||
$('.panel-more').remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
getLogs();
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
86
app/admin/view/admin/view.html
Normal file
86
app/admin/view/admin/view.html
Normal file
@ -0,0 +1,86 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">登录账号</td>
|
||||
<td>
|
||||
{$admin.username}
|
||||
</td>
|
||||
<td class="layui-td-gray2">用户名</td>
|
||||
<td>
|
||||
{$admin.nickname}
|
||||
</td>
|
||||
<td rowspan="2" class="layui-td-gray2">头像</td>
|
||||
<td rowspan="2" valign="top" style="width: 100px;">
|
||||
<div class="layui-upload">
|
||||
<img src="{$admin.thumb}" width="100" height="100" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">手机号码</td>
|
||||
<td>
|
||||
{$admin.mobile}
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态</td>
|
||||
<td>
|
||||
{eq name="$admin.status" value="1" }正常{/eq}
|
||||
{eq name="$admin.status" value="0" }禁止登录{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">用户角色<font>*</font>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
{volist name=":get_admin_group()" id="v"}
|
||||
{volist name="$admin.group_id" id="a"}{eq name="$a" value="$v.id" }{$v.title},{/eq}{/volist}
|
||||
{/volist}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">最后登录时间</td>
|
||||
<td>
|
||||
{$admin.last_login_time | date='Y-m-d H:i:s'}
|
||||
</td>
|
||||
<td class="layui-td-gray2">最后登录IP</td>
|
||||
<td>
|
||||
{$admin.last_login_ip}
|
||||
</td>
|
||||
<td class="layui-td-gray2">累计登录次数</td>
|
||||
<td>
|
||||
{$admin.login_num}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">备注</td>
|
||||
<td colspan="5">
|
||||
{$admin.desc}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form;
|
||||
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
162
app/admin/view/article/add.html
Normal file
162
app/admin/view/article/add.html
Normal file
@ -0,0 +1,162 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">标题 <span style="color: red">*</span></td>
|
||||
<td colspan="7"><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">分类<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<select name="article_cate_id" lay-verify="required" lay-search="">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_article_cate())" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray2">关键字</td>
|
||||
<td>
|
||||
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" placeholder="请选择关键字"
|
||||
class="layui-input" readonly>
|
||||
<input type="hidden" id="keyword_id" name="keyword_ids" autocomplete="off">
|
||||
</td>
|
||||
<td class="layui-td-gray2">属性</td>
|
||||
<td>
|
||||
<select name="type">
|
||||
<option value="">请选择属性</option>
|
||||
<option value="1">精华</option>
|
||||
<option value="2">热门</option>
|
||||
<option value="3">推荐</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="0" placeholder="请输入排序,数字" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">首页显示</td>
|
||||
<td>
|
||||
<input type="radio" name="is_home" value="1" title="是">
|
||||
<input type="radio" name="is_home" value="0" title="否" checked>
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="0" title="下架">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">文章来源</td>
|
||||
<td>
|
||||
<input type="text" name="origin" class="layui-input" autocomplete="off" placeholder="请输入文章来源">
|
||||
</td>
|
||||
<td class="layui-td-gray2">来源链接</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="origin_url" class="layui-input" autocomplete="off" placeholder="请输入来源链接">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">缩略图</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">上传缩略图(尺寸:498x280)</button>
|
||||
<div class="layui-upload-list" id="demo1">
|
||||
<img src="" style="max-width: 100%; height:100px;" />
|
||||
<input type="hidden" name="thumb" value="">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2" style="vertical-align:top;">摘要</td>
|
||||
<td colspan="7">
|
||||
<textarea name="desc" placeholder="请输入摘要,不能超过200个字" class="layui-textarea"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2" style="vertical-align:top;">内容</td>
|
||||
<td colspan="7">
|
||||
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" lay-verify="required"
|
||||
style="border:0;padding:0"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="layui-form-item">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, tagspicker = layui.tagpicker
|
||||
, upload = layui.upload;
|
||||
|
||||
var tags = new tagspicker({
|
||||
'url': '/admin/api/get_keyword_cate',
|
||||
'target': 'keyword_name',
|
||||
'tag_ids': 'keyword_id',
|
||||
'tag_tags': 'keyword_name',
|
||||
'height': 500,
|
||||
'isDiy': 1
|
||||
});
|
||||
|
||||
//封面上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: '/admin/api/upload'
|
||||
, done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/article/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="['tagpicker']" use="['upload','form','tagpicker']" callback="init" /}
|
||||
{include file="common/ueditor" id="container" name="content" width="776px" height="100%" toolbar="[]" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
101
app/admin/view/article/cate.html
Normal file
101
app/admin/view/article/cate.html
Normal file
@ -0,0 +1,101 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 样式 -->
|
||||
{block name="style"}
|
||||
<style>
|
||||
html,body{
|
||||
height: calc(100% - 20px);
|
||||
}
|
||||
</style>
|
||||
<!-- /样式 -->
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content" style="height: 100%">
|
||||
<div style="height:39px;">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/article/cate_add">添加分类</a>
|
||||
</div>
|
||||
<div style="height: calc(100% - 30px)">
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="switchStatus">
|
||||
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var editObj=null,ptable=null,treeGrid=null,tableId='treeTable',layer=null;
|
||||
function init(layui){
|
||||
var table=layui.table,form = layui.form;
|
||||
treeGrid = layui.treeGrid;//很重要
|
||||
layer=layui.layer;
|
||||
ptable=treeGrid.render({
|
||||
id:tableId
|
||||
,elem: '#'+tableId
|
||||
,idField:'id'
|
||||
,url:'/admin/article/cate_list'
|
||||
,cellMinWidth: 100
|
||||
,treeId:'id'//树形id字段名称
|
||||
,treeUpId:'pid'//树形父id字段名称
|
||||
,treeShowName:'title'//以树形式显示的字段
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序', edit: "text", align:'center', style:'cursor: pointer;', width:80}
|
||||
,{field:'title', edit:'text',width:240, title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', edit:"text",width:80, align:'center'}
|
||||
,{field:'keywords', title: '关键词', edit:"text",width:200,}
|
||||
,{field:'desc', title: '描述', edit:"text"}
|
||||
,{width:100,title: '操作', align:'center'
|
||||
,templet: function(d){
|
||||
var html='';
|
||||
var addBtn='<a class="layui-btn layui-btn-normal layui-btn-xs" title="添加分类" href="/admin/article/cate_add?pid='+d.id+'">添加</a>';
|
||||
var delBtn='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
return addBtn+delBtn;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
//,skin:'line'
|
||||
});
|
||||
//单元格编辑
|
||||
treeGrid.on('edit('+tableId+')', function(obj){
|
||||
layer.confirm('确定要提交修改吗?', {icon: 3, title:'提示'}, function(index){
|
||||
$.ajax({
|
||||
url:"/admin/article/cate_post_submit",
|
||||
type:'post',
|
||||
data:{id:obj.data.id,field:obj.field,value:obj.value},
|
||||
success:function(res){
|
||||
if(res.code == 1){
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
//删除
|
||||
treeGrid.on('tool('+tableId+')',function (obj) {
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('确定要删除吗?', {icon: 3, title:'提示'}, function(index){
|
||||
$.ajax({
|
||||
url:"/admin/article/cate_delete",
|
||||
type:'post',
|
||||
data:{id:obj.data.id},
|
||||
success:function(res){
|
||||
layer.msg(res.msg);
|
||||
if(res.code == 1){
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="['treeGrid']" use="['treeGrid','layer','table']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
81
app/admin/view/article/cate_add.html
Normal file
81
app/admin/view/article/cate_add.html
Normal file
@ -0,0 +1,81 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name=":set_recursion(get_article_cate())" id="v"}
|
||||
<option value="{$v.id}" {eq name="pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray2">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">关键词</td>
|
||||
<td>
|
||||
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">描述</td>
|
||||
<td colspan="3"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui){
|
||||
var form = layui.form
|
||||
,layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
$.ajax({
|
||||
url:"/admin/article/cate_post_submit",
|
||||
type:'post',
|
||||
data:data.field,
|
||||
success:function(e){
|
||||
if(e.code==1){
|
||||
layer.confirm('保存成功,返回列表页吗?', {icon: 3, title:'提示'}, function(index){
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
}else{
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click','[lay-event="back"]',function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
168
app/admin/view/article/edit.html
Normal file
168
app/admin/view/article/edit.html
Normal file
@ -0,0 +1,168 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<div>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">标题 <span style="color: red">*</span></td>
|
||||
<td colspan="7"> <input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input" value="{$article.title}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">分类<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<select name="article_cate_id" lay-verify="required" lay-search="">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_article_cate())" id="v"}
|
||||
<option value="{$v.id}" {eq name="$article.article_cate_id" value="$v.id" }selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray2">关键字</td>
|
||||
<td>
|
||||
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" placeholder="请选择关键字"
|
||||
class="layui-input" value="{$article.keyword_names}" readonly>
|
||||
<input type="hidden" id="keyword_id" name="keywords_id" autocomplete="off" value="{$article.keyword_ids}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">属性</td>
|
||||
<td>
|
||||
<select name="type" lay-search="">
|
||||
<option value="">请选择属性</option>
|
||||
<option value="1" {eq name="$article.type" value="1" }selected{/eq}>精华</option>
|
||||
<option value="2" {eq name="$article.type" value="2" }selected{/eq}>热门</option>
|
||||
<option value="3" {eq name="$article.type" value="3" }selected{/eq}>推荐</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input"
|
||||
value="{$article.sort}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">首页显示</td>
|
||||
<td>
|
||||
<input type="radio" name="is_home" value="1" title="是" {eq name="$article.is_home" value="1" }checked{/eq}>
|
||||
<input type="radio" name="is_home" value="0" title="否" {eq name="$article.is_home" value="0" }checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$article.status" value="1" }checked{/eq}>
|
||||
<input type="radio" name="status" value="0" title="下架" {eq name="$article.status" value="0" }checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">文章来源</td>
|
||||
<td>
|
||||
<input type="text" name="origin" class="layui-input" autocomplete="off" placeholder="请输入文章来源"
|
||||
value="{$article.origin}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">来源链接</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="origin_url" class="layui-input" autocomplete="off" placeholder="请输入来源链接"
|
||||
value="{$article.origin_url}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">缩略图</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">上传缩略图(尺寸:498x280)</button>
|
||||
<div class="layui-upload-list" id="demo1">
|
||||
<img src="{:get_file($article.thumb)}" style="max-width: 100%; height:100px;" />
|
||||
<input type="hidden" name="thumb" value="{$article.thumb}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2" style="vertical-align:top;">摘要</td>
|
||||
<td colspan="7">
|
||||
<textarea name="desc" placeholder="请输入摘要,不能超过200个字" class="layui-textarea">{$article.desc}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2" style="vertical-align:top;">内容</td>
|
||||
<td colspan="7">
|
||||
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" lay-verify="required"
|
||||
style="border:0;padding:0">{$article.content}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="layui-form-item">
|
||||
<input type="hidden" name="id" value="{$article.id}">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, tagspicker = layui.tagpicker
|
||||
, upload = layui.upload;
|
||||
|
||||
var tags = new tagspicker({
|
||||
'url': '/admin/api/get_keyword_cate',
|
||||
'target': 'keyword_name',
|
||||
'tag_ids': 'keyword_id',
|
||||
'tag_tags': 'keyword_name',
|
||||
'height': 500,
|
||||
'isDiy': 1
|
||||
});
|
||||
|
||||
//封面上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: '/admin/api/upload'
|
||||
, done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/article/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="['tagpicker']" use="['upload','form','tagpicker']" callback="init" /}
|
||||
{include file="common/ueditor" id="container" name="content" width="776px" height="100%" toolbar="[]" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
138
app/admin/view/article/index.html
Normal file
138
app/admin/view/article/index.html
Normal file
@ -0,0 +1,138 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<div class="layui-input-inline">
|
||||
<select name="article_cate_id">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_article_cate())" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<input type="text" name="keywords" placeholder="ID/标题/分类/描述/内容" class="layui-input" autocomplete="off" style="max-width: 320px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="is_home">
|
||||
<i class="layui-icon {{# if(d.is_home == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" title="添加文章" href="/admin/article/add">添加文章</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/article/add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '文章分类列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/article/get_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: '编号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'sort',
|
||||
title: '排序',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'cate_title',
|
||||
title: '分类',
|
||||
width: 200
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '文章标题',
|
||||
templet: '<div><a href="/home/index/index/id/{{d.id}}.html" class="layui-table-link" target="_blank">{{d.title}}</a></div>'
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 66
|
||||
}, {
|
||||
field: 'is_home',
|
||||
title: '首页显示',
|
||||
toolbar: '#is_home',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 120,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function(obj) {
|
||||
var data = obj.data;
|
||||
//console.log(obj)
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
$.ajax({
|
||||
url: "/admin/article/delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function(res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function(data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords,
|
||||
article_cate_id: data.field.article_cate_id
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
44
app/admin/view/common/base.html
Normal file
44
app/admin/view/common/base.html
Normal file
@ -0,0 +1,44 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<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">
|
||||
{block name="meta"}
|
||||
<link rel="mobile-prefetch" href=""/>
|
||||
{/block}
|
||||
{block name="title"}
|
||||
<title>{:get_config('webconfig.admin_title')}</title>
|
||||
{/block}
|
||||
{block name="keywords"}
|
||||
<meta name="keywords" content="{:get_config('webconfig.keywords')}"/>
|
||||
<meta name="description" content="{:get_config('webconfig.desc')}"/>
|
||||
{/block}
|
||||
{block name="css"}
|
||||
<link rel="stylesheet" href="{__LAYUI__}/css/layui.css?v={:get_config('webconfig.version')}" media="all">
|
||||
<link rel="stylesheet" href="{__ADMIN_CSS__}/common.css?v={:get_config('webconfig.version')}" media="all">
|
||||
{/block}
|
||||
{block name="style"}{/block}
|
||||
{block name="js"}
|
||||
<script language="javascript" src="{__STATIC__}/jquery.min.js"></script>
|
||||
{/block}
|
||||
</head>
|
||||
<body class="main-body">
|
||||
<!-- 主体 -->
|
||||
{block name="body"}{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 底部 -->
|
||||
{block name="footer"}{/block}
|
||||
<!-- /底部 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}{/block}
|
||||
<!-- /脚本 -->
|
||||
|
||||
<!-- 统计代码 -->
|
||||
{block name="code"}{/block}
|
||||
<!-- /统计代码 -->
|
||||
</body>
|
||||
</html>
|
24
app/admin/view/common/layui.html
Normal file
24
app/admin/view/common/layui.html
Normal file
@ -0,0 +1,24 @@
|
||||
<script src="{__LAYUI__}/layui.js?v={:get_config('webconfig.version')}"></script>
|
||||
<script>
|
||||
var base='{__ADMIN_JS__}/module/';
|
||||
{if condition=" '[base]'!=='base' "}
|
||||
base=[base];
|
||||
{/if}
|
||||
var moduleArray=[use];
|
||||
var extendArray=[extend];
|
||||
var callback=[callback];
|
||||
var extend={};
|
||||
if(extendArray){
|
||||
if(extendArray.length>0){
|
||||
for(var i=0;i<extendArray.length;i++){
|
||||
extend[extendArray[i]]=extendArray[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
layui.config({
|
||||
base: base,
|
||||
version:'{:get_config('webconfig.version')}'
|
||||
}).extend(extend).use(moduleArray, function(){
|
||||
callback(layui);
|
||||
});
|
||||
</script>
|
33
app/admin/view/common/ueditor.html
Normal file
33
app/admin/view/common/ueditor.html
Normal file
@ -0,0 +1,33 @@
|
||||
<script id="[id]" name="[name]" type="text/plain"></script>
|
||||
{if condition=" '[ueditor]'!=='more' "}
|
||||
<script type="text/javascript" src="{__STATIC__}/ueditor/ueditor.config.min.js"></script>
|
||||
<script type="text/javascript" src="{__STATIC__}/ueditor/ueditor.all.min.js"></script>
|
||||
{/if}
|
||||
<script type="text/javascript">
|
||||
var id='[id]';
|
||||
var width='[width]';
|
||||
var height='[height]';
|
||||
var readonly='[readonly]';
|
||||
var toolbarArray=[toolbar];
|
||||
var read=false;
|
||||
if(readonly=='true'){
|
||||
read=true;
|
||||
}
|
||||
var toolbar=['fullscreen', 'source', 'undo', 'redo','|','fontsize','bold', 'italic', 'underline','forecolor', 'strikethrough', 'superscript', 'subscript','|', 'removeformat', 'formatmatch', 'autotypeset', 'pasteplain','link','unlink','|','justifyleft','justifycenter','justifyright','justifyjustify','|', 'insertorderedlist', 'insertunorderedlist','simpleupload', 'insertimage', 'inserttable', 'selectall', 'cleardoc'];
|
||||
if(toolbarArray && toolbarArray.length>0){
|
||||
toolbar=toolbarArray;
|
||||
}
|
||||
if(toolbarArray && toolbarArray.length>0){
|
||||
toolbar=toolbarArray;
|
||||
}
|
||||
var ue = UE.getEditor(id,{
|
||||
//初始化高度
|
||||
toolbars: [
|
||||
toolbar
|
||||
],
|
||||
pasteplain:true,
|
||||
readonly:read,
|
||||
initialFrameWidth:width,
|
||||
initialFrameHeight:height
|
||||
});
|
||||
</script>
|
139
app/admin/view/conf/email.html
Normal file
139
app/admin/view/conf/email.html
Normal file
@ -0,0 +1,139 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<h3 style="height:36px">邮箱配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">SMTP地址<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="smtp" lay-verify="required" autocomplete="off" placeholder="请输入SMTP服务器地址"
|
||||
class="layui-input" value="{$emailConf.smtp}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">如:QQ邮箱的SMTP服务器地址是smtp.qq.com,163邮箱的SMTP服务器地址是smtp.163.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">协议端口号<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="port" lay-verify="required" autocomplete="off" placeholder="请输入端口"
|
||||
class="layui-input" value="{$emailConf.port}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">邮箱账户<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="username" lay-verify="required" autocomplete="off" placeholder="请输入邮箱用户名"
|
||||
class="layui-input" value="{$emailConf.username}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">如:gougucms@qq.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">邮箱密码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="password" name="password" lay-verify="required" autocomplete="off" placeholder="请输入邮箱密码"
|
||||
class="layui-input" value="{$emailConf.password}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">
|
||||
不一定是登录密码,如QQ邮箱的是第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="layui-td-gray2">发送人<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="from" lay-verify="required" autocomplete="off" placeholder="请输入要显示的发送者"
|
||||
class="layui-input" value="{$emailConf.from}" style="width:240px; display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">用于展示给发送方,如:勾股CMS系统管理员</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">显示的邮箱<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="email" lay-verify="required" autocomplete="off" placeholder="请输入要显示的发送者邮箱"
|
||||
class="layui-input" value="{$emailConf.email}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999;font-size:12px;">可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">邮件模板</td>
|
||||
<td><textarea name="template" placeholder="" class="layui-textarea" id="container" style="border:0;padding:0">{$emailConf.template}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<a class="layui-btn" href="javascript:;" id="emailto">发送测试</a>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/conf/email_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,关闭本页面吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$('.ittab-tab .layui-tab-title .layui-this i', parent.document).click();
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#emailto').click(function () {
|
||||
layer.prompt({
|
||||
formType: 0,
|
||||
value: '',
|
||||
title: '输入接收测试邮件的邮箱',
|
||||
id: 'email_to'
|
||||
}, function (value, index, elem) {
|
||||
var isEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
|
||||
if (value.length < 6 || !(isEmail.test(value))) {
|
||||
layer.tips('请正确输入邮箱', elem);
|
||||
return false;
|
||||
}
|
||||
$.ajax({
|
||||
url: "/admin/api/emailto",
|
||||
data: { email: value },
|
||||
type: "post",
|
||||
beforeSend: function () {
|
||||
// 禁用按钮防止重复提交
|
||||
$("#email_to input").val('');
|
||||
},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 1) {
|
||||
layer.close(index);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{include file="common/ueditor" id="container" name="content" width="100%" height="100%" toolbar="[]" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
141
app/admin/view/conf/web.html
Normal file
141
app/admin/view/conf/web.html
Normal file
@ -0,0 +1,141 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<h3 style="height:36px">系统配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">系统名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="admin_title" lay-verify="required" autocomplete="off" placeholder="请输入系统名称"
|
||||
lay-reqText="请输入系统名称" class="layui-input" value="{$webConf.admin_title}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">网站名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入网站平台名称"
|
||||
lay-reqText="请输入网站名称" class="layui-input" value="{$webConf.title}">
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray2">系统LOGO</td>
|
||||
<td rowspan="3" style="width: 240px;">
|
||||
<div class="layui-upload" style="width: 240px;">
|
||||
<div class="layui-upload-list" id="demo1" style="width: 100%; height:100px; overflow: hidden;">
|
||||
<img src="{$webConf.logo}" style="max-width: 100%; width: 100%;" />
|
||||
<input type="hidden" name="logo" value="{$webConf.logo}">
|
||||
</div>
|
||||
<button type="button" class="layui-btn layui-btn-normal" style="width: 100%;"
|
||||
id="test1">上传LOGO</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">网站域名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="domain" lay-verify="required" autocomplete="off" placeholder="请输入网站域名"
|
||||
lay-reqText="请输入网站域名" class="layui-input" value="{$webConf.domain}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">ICP备案号</td>
|
||||
<td>
|
||||
<input type="text" name="icp" autocomplete="off" placeholder="请输入ICP备案号" class="layui-input"
|
||||
value="{$webConf.icp}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">SEO关键词<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="keywords" lay-verify="required" autocomplete="off" placeholder="多个关键词用“,”隔开"
|
||||
lay-reqText="请输入SEO关键字" class="layui-input" value="{$webConf.keywords}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">SEO描述<font>*</font>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<textarea name="desc" lay-verify="required" placeholder="请输入网站描述" lay-reqText="请输入网站描述"
|
||||
class="layui-textarea">{$webConf.desc}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">统计代码</td>
|
||||
<td colspan="5">
|
||||
<textarea name="code" placeholder="请输入完整的统计代码" class="layui-textarea">{$webConf.code}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">API缓存时间</td>
|
||||
<td>
|
||||
<input type="text" name="port_cache_time" autocomplete="off" placeholder="请输入API模块接口数据缓存时间"
|
||||
class="layui-input" value="{$webConf.port_cache_time}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">代码版本号<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="text" lay-verify="required" name="version" autocomplete="off" placeholder="请输入版本号"
|
||||
lay-reqText="请输入版本号" class="layui-input" value="{$webConf.version}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
upload = layui.upload;
|
||||
|
||||
|
||||
//logo上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1',
|
||||
url: '/admin/api/upload',
|
||||
done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
layer.msg('上传成功');
|
||||
$('#demo1 input').attr('value', res.data.filepath);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/conf/web_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,关闭本页面吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$('.ittab-tab .layui-tab-title .layui-this i', parent.document).click();
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
97
app/admin/view/conf/wechat.html
Normal file
97
app/admin/view/conf/wechat.html
Normal file
@ -0,0 +1,97 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<h3 style="height:36px">微信配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">Token<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="Token" lay-verify="required" autocomplete="off" placeholder="请输入Token" class="layui-input"
|
||||
value="{$wechatConf.Token}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">登录回调地址<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="LOGIN_BACK_URL" lay-verify="required" autocomplete="off" placeholder="请输入微信登录回调地址" class="layui-input"
|
||||
value="{$wechatConf.LOGIN_BACK_URL}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">appID<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="appID" lay-verify="required" autocomplete="off" placeholder="请输入appID" class="layui-input"
|
||||
value="{$wechatConf.appID}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">appsecret<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="appsecret" lay-verify="required" autocomplete="off" placeholder="请输入secretey" class="layui-input"
|
||||
value="{$wechatConf.appsecret}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">支付商户号</td>
|
||||
<td>
|
||||
<input type="text" name="MCHID" autocomplete="off" placeholder="请输入微信支付商户号" class="layui-input"
|
||||
value="{$wechatConf.MCHID}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">支付API密钥</td>
|
||||
<td>
|
||||
<input type="text" name="SECRECT_KEY" autocomplete="off" placeholder="请输入微信支付API密钥" class="layui-input"
|
||||
value="{$wechatConf.SECRECT_KEY}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">支付证书路径</td>
|
||||
<td>
|
||||
<input type="text" name="CERT_URL" autocomplete="off" placeholder="请输入微信支付证书路径" class="layui-input"
|
||||
value="{$wechatConf.CERT_URL}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">支付回调地址</td>
|
||||
<td>
|
||||
<input type="text" name="PAY_BACK_URL" autocomplete="off" placeholder="请输入微信支付回调地址" class="layui-input"
|
||||
value="{$wechatConf.PAY_BACK_URL}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data) {
|
||||
$.ajax({
|
||||
url: "/admin/conf/wechat_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function(e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,关闭本页面吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
$('.ittab-tab .layui-tab-title .layui-this i', parent.document).click();
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
134
app/admin/view/index/index.html
Normal file
134
app/admin/view/index/index.html
Normal file
@ -0,0 +1,134 @@
|
||||
{extend name="common/base"/}
|
||||
{block name="style"}
|
||||
<link rel="stylesheet" href="{__LAYUI__}/font/extend/iconfont.css?v={:get_config('webconfig.version')}">
|
||||
<link rel="stylesheet" href="{__ADMIN_CSS__}/gougucms.css?v={:get_config('webconfig.version')}">
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-layout-body">
|
||||
<div class="layui-layout layui-layout-admin">
|
||||
<div class="layui-header">
|
||||
<div class="layui-logo" ittab-home><img src="{__ADMIN_IMG__}/syslogo.png" width="186"
|
||||
alt="{:get_config('webconfig.admin_title')}" /></div>
|
||||
<ul class="layui-nav layui-layout-right">
|
||||
<li class="layui-nav-item" lay-unselect>
|
||||
<a href="javascript:;" ittab-refresh class="refreshThis" id="ittab-refresh" title="刷新当前页"
|
||||
style="margin-top:3px;">
|
||||
<i class="layui-icon layui-icon-refresh-3"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-nav-item" lay-unselect>
|
||||
<a href="javascript:;" ittab-del-cache id="ittab-del-cache" style="margin-top:2px;" title="清空缓存"><i
|
||||
class="layui-icon layui-icon-fonts-clear"></i></a>
|
||||
</li>
|
||||
<li class="layui-nav-item" lay-unselect>
|
||||
<a href="javascript:;" ittab-logout title="{:get_login_admin('nickname')}-点击退出登录">
|
||||
<img src="{:get_login_admin('thumb')}" class="layui-nav-img"
|
||||
onerror="javascript:this.src='{__ADMIN_IMG__}/nonepic360x360.jpg';this.onerror=null;">
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="layui-side ittab-bg-gray">
|
||||
<div class="ittab-menulist">
|
||||
<div class="ittab-menulist-top">
|
||||
<a href="/admin/index" title="返回系统首页" style="background-color: #E94335"><i
|
||||
class="layui-icon layui-icon-windows"></i></a><a href="javascript:;" title="修改个人信息"
|
||||
style="background-color:#fbbc05" data-id="10000" data-title="修改个人信息"
|
||||
data-src="/admin/api/edit_personal" class="site-menu-active"><i
|
||||
class="layui-icon layui-icon-username"></i></a><a href="javascript:;" title="修改密码"
|
||||
style="background-color:#34a853" data-id="10001" data-title="修改密码"
|
||||
data-src="/admin/api/edit_password" class="site-menu-active"><i
|
||||
class="layui-icon layui-icon-password"></i></a><a href="/home/index" title="门户首页" style="background-color:#4285f4" target="_blank"><i
|
||||
class="layui-icon layui-icon-home"></i></a>
|
||||
</div>
|
||||
<div class="ittab-menulist-1">
|
||||
{foreach name="menu" item="a"}
|
||||
<div class="ittab-menulist-2"><i class="iconfont {$a.icon}"></i> {$a.title}</div>
|
||||
{notempty name="$a.list"}
|
||||
<div class="ittab-menulist-3">
|
||||
<ul>
|
||||
{foreach name="$a.list" item="b"}
|
||||
{empty name="$b.list"}
|
||||
<li data-id="{$b.id}" data-title="{$b.title}" data-src="{:url($b.src)}"
|
||||
class="site-menu-active"><span>{$b.title}</span></li>
|
||||
{else /}
|
||||
<li class="ittab-menulist-2">{$b.title}<i class="layui-icon layui-icon-triangle-r"></i></li>
|
||||
<div class="ittab-menulist-3 tab-menulist-4">
|
||||
<ul>
|
||||
{foreach name="$b.list" item="c"}
|
||||
{empty name="$c.list"}
|
||||
<li data-id="{$c.id}" data-title="{$c.title}" data-src="{:url($c.src)}"
|
||||
class="site-menu-active"><span>{$c.title}</span></li>
|
||||
{else /}
|
||||
<li class="ittab-menulist-2">{$c.title}<i
|
||||
class="layui-icon layui-icon-triangle-r"></i></li>
|
||||
<div class="ittab-menulist-3 tab-menulist-5">
|
||||
<ul>
|
||||
{foreach name="$c.list" item="d"}
|
||||
<li data-id="{$d.id}" data-title="{$d.title}" data-src="{:url($d.src)}"
|
||||
class="site-menu-active"><span>{$d.title}</span></li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/empty}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/empty}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/notempty}
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-body">
|
||||
<div class="layui-tab layui-tab-brief ittab-tab fr-admin-tab" lay-filter="fr-admin-tab"
|
||||
lay-allowClose="true" style="height: 100%;">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this ittab-tab-home" lay-id="0">首页</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content" style="height: 100%;">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<iframe id="0" data-frameid="0" name="myiframe" src="{:url('/admin/index/main')}"
|
||||
frameborder="0" align="left" width="100%" height="100%" scrolling="yes"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /主体 -->
|
||||
{/block}
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var layer = layui.layer;
|
||||
$("[ittab-logout]").on("click", function () {
|
||||
layer.confirm('确认注销登录吗?', { icon: 7, title: '警告' }, function (index) {
|
||||
//注销
|
||||
$.ajax({
|
||||
url: "/admin/login/login_out",
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
setTimeout(function () {
|
||||
location.href = "{:url('admin/login/index')}"
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
};
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['layer','fanqiecms']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
271
app/admin/view/index/main.html
Normal file
271
app/admin/view/index/main.html
Normal file
@ -0,0 +1,271 @@
|
||||
{extend name="common/base"/}
|
||||
|
||||
{block name="style"}
|
||||
<style type="text/css">
|
||||
.clearfix {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.clearfix:after {
|
||||
content: ".";
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
* html .clearfix {
|
||||
height: 0.1%;
|
||||
}
|
||||
|
||||
.panel-right {
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
padding: 0 20px 20px;
|
||||
}
|
||||
|
||||
.panel-num table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.panel-num td {
|
||||
text-align: center;
|
||||
padding: 20px 0;
|
||||
width: 16.6%;
|
||||
border-bottom: 1px solid #eee;
|
||||
border-left: 1px solid #eee
|
||||
}
|
||||
|
||||
.panel-num .num-title {
|
||||
padding-bottom: 10px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.panel-num .num-num {
|
||||
font-size: 28px;
|
||||
font-weight: 300;
|
||||
color: #009688;
|
||||
}
|
||||
|
||||
.latest-news {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 30px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.latest-news .layui-timeline-title {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.latest-news .layui-timeline-item {
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
|
||||
.layui-timeline-title span {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.panel-more {
|
||||
width: 100%;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
background: linear-gradient(rgba(225, 225, 225, 0), rgba(225, 225, 225, .8));
|
||||
}
|
||||
|
||||
.panel-more a {
|
||||
color: #0088FF
|
||||
}
|
||||
|
||||
.index-row {
|
||||
margin-right: 351px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
padding: 0 20px;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.panel-title {
|
||||
font-size: 18px;
|
||||
font-weight: 800;
|
||||
padding: 20px 0 15px;
|
||||
}
|
||||
|
||||
.table-title {
|
||||
font-size: 18px;
|
||||
font-weight: 800;
|
||||
padding: 20px 0 5px;
|
||||
}
|
||||
|
||||
.row-right {
|
||||
width: 350px;
|
||||
float: right;
|
||||
border-left: 1px solid #e8e8e8;
|
||||
background-color: #f7f7f7;
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div style="background-color: #fff;">
|
||||
<div class="row-right">
|
||||
<div class="panel-right">
|
||||
<div class="table-title">最新动态</div>
|
||||
<div class="latest-news">
|
||||
<ul class="layui-timeline" id="logs">
|
||||
</ul>
|
||||
<div class="panel-more"><a href="/admin/api/log_list/">查看更多动态</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-right">
|
||||
<div class="table-title">系统信息</div>
|
||||
<table class="layui-table" lay-skin="" lay-size="sm">
|
||||
<tr>
|
||||
<td><b>服务器系统</b></td>
|
||||
<td>{:get_system_info('os')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>PHP版本</b></td>
|
||||
<td>{:get_system_info('php')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>系统版本</b></td>
|
||||
<td>{:get_config('webconfig.version')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>ThinkPHP版本</b></td>
|
||||
<td>6.05<a class="layui-badge layui-bg-blue" style="margin-left:20px"
|
||||
href="https://www.kancloud.cn/manual/thinkphp6_0" target="_blank">TP6文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Layui版本</b></td>
|
||||
<td>2.73<a class="layui-badge layui-bg-blue" style="margin-left:20px" href="https://www.layui.com/doc/"
|
||||
target="_blank">Layui文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>上传附件限制</b></td>
|
||||
<td>{:get_system_info('upload_max_filesize')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>执行时间限制</b></td>
|
||||
<td>{:get_system_info('max_execution_time')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>BUG反馈</b></td>
|
||||
<td><a href="mailto:hdm58@qq.com" target="_blank">hdm58@qq.com</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="index-row">
|
||||
<div class="panel-num">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="num-title">系统用户</div>
|
||||
<div class="num-num">{$adminCount}</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="num-title">注册用户</div>
|
||||
<div class="num-num">{$userCount}</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="num-title">文章</div>
|
||||
<div class="num-num">{$articleCount}</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="num-title">图片</div>
|
||||
<div class="num-num">0</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="num-title">产品</div>
|
||||
<div class="num-num">0</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel">
|
||||
<div class="table-title">注册用户</div>
|
||||
<table id="UserList" lay-filter="UserList" class="layui-hide"></table>
|
||||
<div style="clear: left;"></div>
|
||||
</div>
|
||||
<div class="panel">
|
||||
<div class="table-title">文章列表</div>
|
||||
<table id="Article" lay-filter="Article" class="layui-hide"></table>
|
||||
<div style="clear: left;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear: right;"></div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function getLogs() {
|
||||
$.ajax({
|
||||
url: "/admin/api/get_log_list",
|
||||
type: 'post',
|
||||
data: {
|
||||
page: 1,
|
||||
limit: 10
|
||||
},
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
var html = '';
|
||||
$.each(e.data, function (key, value) {
|
||||
html += '<li class="layui-timeline-item">\
|
||||
<i class="layui-icon layui-timeline-axis"></i>\
|
||||
<div class="layui-timeline-content layui-text">\
|
||||
<div class="layui-timeline-title"><span title="'+value.id+'">'+ value.times + '</span>,' + value.content + '</div>\
|
||||
</div>\
|
||||
</li>';
|
||||
});
|
||||
$('#logs').html(html);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function init(layui) {
|
||||
var layer = layui.layer, table = layui.table;
|
||||
getLogs();
|
||||
//注册用户
|
||||
table.render({
|
||||
elem: '#UserList'
|
||||
, url: '/admin/api/get_user_list' //数据接口
|
||||
, page: false //开启分页
|
||||
, cols: [[ //表头
|
||||
{ field: 'username', title: '用户名' }
|
||||
, {
|
||||
field: 'headimgurl', title: '头像', align: 'center', templet: function (d) {
|
||||
return '<img src="' + d.headimgurl + '" width="20" height="20" />';
|
||||
}
|
||||
}
|
||||
, { field: 'login_num', title: '登录次数', align: 'center' }
|
||||
, { field: 'last_login_time', title: '最后登录时间', align: 'center' }
|
||||
]]
|
||||
});
|
||||
|
||||
//文章
|
||||
table.render({
|
||||
elem: '#Article'
|
||||
, url: '/admin/api/get_article_list' //数据接口
|
||||
, page: false //开启分页
|
||||
, cols: [[ //表头
|
||||
{ field: 'title', title: '标题' }
|
||||
, { field: 'cate_title', title: '分类', align: 'center' }
|
||||
, { field: 'create_time', title: '发布时间', align: 'center' }
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','layer']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
81
app/admin/view/keywords/add.html
Normal file
81
app/admin/view/keywords/add.html
Normal file
@ -0,0 +1,81 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">关键字名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入关键字名称"
|
||||
class="layui-input" style="max-width: 360px;" {notempty name="$keywords.title"}
|
||||
value="{$keywords.title}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input"
|
||||
style="max-width: 360px;" {notempty name="$keywords.sort" }value="{$keywords.sort}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{if condition="$id eq 0"}
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
{else/}
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$keywords.status" value="1"
|
||||
}checked{/eq}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {eq name="$keywords.status" value="0"
|
||||
}checked{/eq}>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/keywords/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
118
app/admin/view/keywords/index.html
Normal file
118
app/admin/view/keywords/index.html
Normal file
@ -0,0 +1,118 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="关键字名称" class="layui-input" autocomplete="off"
|
||||
style="max-width: 320px; display: inline-block;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/keywords/add">添加关键字</a>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '关键字列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/keywords/get_list',
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[{
|
||||
field: 'id',
|
||||
width: 80,
|
||||
title: 'ID编号',
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'sort',
|
||||
width: 80,
|
||||
title: '排序',
|
||||
align: 'center',
|
||||
edit: "text"
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '关键字名称',
|
||||
edit: "text"
|
||||
}, {
|
||||
field: 'status',
|
||||
width: 80,
|
||||
title: '状态',
|
||||
templet: '#status',
|
||||
align: 'center'
|
||||
}, {
|
||||
width: 120,
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
var delBtn = '<a class="layui-btn layui-btn-xs" href="/admin/keywords/add?id=' + d.id + '">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
return delBtn;
|
||||
}
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
if (data.field.keywords) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
} else {
|
||||
location.reload();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
//删除
|
||||
table.on('tool(test)', function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/keywords/delete",
|
||||
type: 'post',
|
||||
data: {
|
||||
id: obj.data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
27
app/admin/view/login/errorshow.html
Normal file
27
app/admin/view/login/errorshow.html
Normal file
@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>404错误</title>
|
||||
<style>
|
||||
.box-404{padding: 50px 0; text-align: center;}
|
||||
.error-404{width:480px; margin: 0 auto; line-height: 2;}
|
||||
.title-404{font-size: 24px; color: #EA4335;}
|
||||
.text-404{font-size: 16px; color:#333;}
|
||||
.btn-404{padding-top: 20px;}
|
||||
.btn-404 a{padding: 3px 20px; font-size: 14px; display: inline-block; background-color: #EA4335; color: #fff; margin-right: 30px; border-radius: 4px; text-decoration: none;}
|
||||
.btn-404 a:hover{opacity: .9;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="box-404">
|
||||
<div><img src="/static/home/images/404.gif" width="500" height="300" alt="404"></div>
|
||||
</div>
|
||||
<div class="error-404">
|
||||
<div class="title-404">出错啦!</div>
|
||||
<div class="text-404">对不起,您要访问的页面不见了...</div>
|
||||
<div class="btn-404"><a href="javascript:history.go(-1);">返回上一页</a><a href="/admin/index">返回首页</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
107
app/admin/view/login/index.html
Normal file
107
app/admin/view/login/index.html
Normal file
@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<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">
|
||||
<title>{:get_config('webconfig.admin_title')}</title>
|
||||
<link rel="stylesheet" href="{__LAYUI__}/css/layui.css?v={:get_config('webconfig.version')}" media="all">
|
||||
<style type="text/css">
|
||||
html,body {width: 100%;height: 100%;background: #34a853;}
|
||||
input:-webkit-autofill {
|
||||
-webkit-box-shadow: 0 0 0px 1000px white inset;
|
||||
}
|
||||
#container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;color: #ffffff;
|
||||
background: url({__ADMIN_IMG__}/bg.jpg);
|
||||
background-size: cover;
|
||||
background: url("{__ADMIN_IMG__}/bg_pattern.png"), -webkit-linear-gradient(to left, #34a853, #4285f4);
|
||||
/* Chrome 10-25, Safari 5.1-6 */
|
||||
background: url("{__ADMIN_IMG__}/bg_pattern.png"), linear-gradient(to left, #34a853, #4285f4);
|
||||
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
|
||||
}
|
||||
.container h2 {font-size: 36px;padding: 36px 0;font-weight: 500;}
|
||||
.login {width: 400px;text-align: center;position: absolute;top: 50%;left: 50%;margin-top: -240px;margin-left: -200px;border-radius: 12px;box-shadow: 0 2px 6px rgba(26, 26, 26, .36);
|
||||
}
|
||||
.login .top {width: 400px;height: 117px;background-color: #fbbc05;border-radius: 12px 12px 0 0;line-height: 117px;text-align: center;overflow: hidden;
|
||||
-webkit-transform: rotate(0deg);
|
||||
-moz-transform: rotate(0deg);
|
||||
-ms-transform: rotate(0deg);
|
||||
-o-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
.login .top .bg1 {display: inline-block;width: 72px;height: 72px;background: #fff;opacity: .1;border-radius: 0 72px 0 0;position: absolute;left: 0;top: 42px;}
|
||||
.login .top .bg2 {display: inline-block;width: 92px;height: 92px;background: #fff;opacity: .1;border-radius: 50%;position: absolute;right: -16px;top: -16px;}
|
||||
.login .bottom {background-color: #fff;padding: 30px 25px;border-radius: 0 0 12px 12px;}
|
||||
|
||||
.layui-input,.layui-textarea {height: 44px;border: 1px solid #ddd;}
|
||||
.captcha_img img{width:142px; height:44px; cursor:pointer;}
|
||||
.layui-btn {height: 48px;font-size: 16px;margin-top: 5px;background-color: #FF6347!important}
|
||||
.foot {position: absolute; font-size: 12px; bottom: 28px;text-align: center;width: 100%;color: #d3e8fa;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div class="login">
|
||||
<div class="top">
|
||||
<img src="{__ADMIN_IMG__}/login_logo.png" height="60" width="200">
|
||||
<span class="bg1"></span>
|
||||
<span class="bg2"></span>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<form class="layui-form" id="gougu-login">
|
||||
<div class="layui-form-item">
|
||||
<input type="text" name="username" lay-verify="required" placeholder="账户" lay-reqText="请输入账户" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="password" name="password" lay-verify="required" placeholder="密码" lay-reqText="请输入密码" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-inline" style="width:188px;">
|
||||
<input type="text" name="captcha" lay-verify="required" placeholder="验证码" lay-reqText="请输入验证码" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline captcha_img" style="width:142px; height:44px; margin-right:0">
|
||||
{:captcha_img()}
|
||||
<input type="hidden" value="{:make_token()}"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button id="login-submit" class="layui-btn layui-btn-fluid layui-bg-cyan" lay-submit lay-filter="login-submit">登入系统</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="foot">
|
||||
{:get_config('webconfig.copyright')} <a id="beian" href="//www.beian.miit.gov.cn" target="_blank" rel="nofollow"
|
||||
style="margin-left: 15px;color:#d3e8fa;">{:get_config('webconfig.icp')}</a>
|
||||
</div>
|
||||
</div>
|
||||
<script src="{__LAYUI__}/layui.js?v={:get_config('webconfig.version')}"></script>
|
||||
<script type="text/javascript">
|
||||
layui.use(['form'], function() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
$ = layui.$;
|
||||
form.on('submit(login-submit)', function(data) {
|
||||
$.ajax({
|
||||
url: "/admin/login/login_submit",
|
||||
data: $('#gougu-login').serialize(),
|
||||
type: 'post',
|
||||
async: false,
|
||||
success: function(res) {
|
||||
layer.tips(res.msg, '#login-submit');
|
||||
if (res.code === 1) {
|
||||
setTimeout(function() {
|
||||
// parent.document.location.reload();
|
||||
parent.document.location.href="{:url('/admin/index')}";
|
||||
}, 1500);
|
||||
} else {
|
||||
$('[alt="captcha"]').click();
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
89
app/admin/view/menu/add.html
Normal file
89
app/admin/view/menu/add.html
Normal file
@ -0,0 +1,89 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">父级菜单<font>*</font></td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="0">
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级菜单">
|
||||
<option value="0">作为顶级菜单</option>
|
||||
{volist name=":set_recursion(get_admin_menu())" id="v"}
|
||||
<option value="{$v.id}" {eq name="pid" value="$v.id" }selected="" {/eq}>{$v.title} </option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray2">菜单名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入菜单名称" lay-reqText="请输入菜单名称" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">菜单路径</td>
|
||||
<td>
|
||||
<input type="text" name="src" placeholder="请输入菜单路径,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">菜单参数</td>
|
||||
<td>
|
||||
<input type="text" name="param" placeholder="请输入菜单参数,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">菜单图标</td>
|
||||
<td>
|
||||
<input type="text" name="icon" placeholder="请输入图标样式,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td colspan="2">
|
||||
如:icon-jichuguanli<a href="{__LAYUI__}/font/extend/demo_index.html" target="_blank" style="margin-left:10px; color:#007AFF">[点击查看图标]</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data) {
|
||||
$.ajax({
|
||||
url: "/admin/menu/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function(e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function() {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
115
app/admin/view/menu/index.html
Normal file
115
app/admin/view/menu/index.html
Normal file
@ -0,0 +1,115 @@
|
||||
{extend name="common/base"/}
|
||||
|
||||
{block name="style"}
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
height: calc(100% - 20px);
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content" style="height: 100%">
|
||||
<div style="height:39px;">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/menu/add">添加菜单</a>
|
||||
</div>
|
||||
<div style="height: calc(100% - 30px)">
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var editObj = null, ptable = null, treeGrid = null, tableId = 'treeTable', layer = null;
|
||||
function init(layui) {
|
||||
var treeGrid = layui.treeGrid;//很重要
|
||||
layer = layui.layer;
|
||||
ptable = treeGrid.render({
|
||||
id: tableId
|
||||
, elem: '#' + tableId
|
||||
, idField: 'id'
|
||||
, url: '/admin/menu/get_list'
|
||||
, cellMinWidth: 100
|
||||
, treeId: 'id'//树形id字段名称
|
||||
, treeUpId: 'pid'//树形父id字段名称
|
||||
, treeShowName: 'title'//以树形式显示的字段
|
||||
, height: 'full-0'
|
||||
, cols: [[
|
||||
{ field: 'order', width: 80, title: '排序', edit: "text", align: 'center' }
|
||||
, { field: 'id', width: 80, title: 'ID号', align: 'center' }
|
||||
, { field: 'title', edit: 'text', width: 240, title: '名称', edit: "text" }
|
||||
, { field: 'icon', edit: 'text', width: 180, title: '图标<a href="{__LAYUI__}/font/extend/demo_index.html" target="_blank" style="color:#007AFF">[图标选择]</a>', edit: "text" }
|
||||
, { field: 'pid', title: '父级ID', edit: "text", width: 80, align: 'center' }
|
||||
, { field: 'src', title: '路径', edit: "text" }
|
||||
, {
|
||||
width: 100, title: '操作', align: 'center'
|
||||
, templet: function (d) {
|
||||
var html = '';
|
||||
var addBtn = '<a class="layui-btn layui-btn-normal layui-btn-xs" href="/admin/menu/add?pid=' + d.id + '">添加</a>';
|
||||
var delBtn = '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
return addBtn + delBtn;
|
||||
}
|
||||
}
|
||||
]]
|
||||
, page: false
|
||||
//,skin:'line'
|
||||
});
|
||||
//单元格编辑
|
||||
treeGrid.on('edit(' + tableId + ')', function (obj) {
|
||||
layer.confirm('确定要提交修改吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/menu/post_submit",
|
||||
type: 'post',
|
||||
data: { id: obj.data.id, field: obj.field, value: obj.value },
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
layer.msg(res.msg);
|
||||
setTimeout('location.reload()', 2000);
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
//删除
|
||||
treeGrid.on('tool(' + tableId + ')', function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/menu/delete",
|
||||
type: 'post',
|
||||
data: { id: obj.data.id },
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function openorclose() {
|
||||
var map = treeGrid.getDataMap(tableId);
|
||||
var o = map['1'];
|
||||
treeGrid.treeNodeOpen(o, !o[treeGrid.config.cols.isOpen]);
|
||||
}
|
||||
|
||||
function getCheckData() {
|
||||
var checkStatus = treeGrid.checkStatus(tableId)
|
||||
, data = checkStatus.data;
|
||||
layer.alert(JSON.stringify(data));
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="['treeGrid']" use="['jquery','treeGrid','layer']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
88
app/admin/view/nav/add.html
Normal file
88
app/admin/view/nav/add.html
Normal file
@ -0,0 +1,88 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">标题<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入标题"
|
||||
lay-reqText="请输入标题" class="layui-input" {notempty name="$nav.title" }value="{$nav.title}"
|
||||
{/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">标识<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入标识"
|
||||
lay-reqText="请输入标识" class="layui-input" {notempty name="$nav.name" }value="{$nav.name}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{if condition="$id eq 0"}
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="-1" title="禁用">
|
||||
{else/}
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$nav.status" value="1" }checked{/eq}>
|
||||
<input type="radio" name="status" value="-1" title="禁用" {eq name="$nav.status" value="-1" }checked{/eq}>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">备注</td>
|
||||
<td colspan="3"><textarea name="desc" placeholder="请输入备注"
|
||||
class="layui-textarea">{notempty name="$nav.desc" }{$nav.desc}{/notempty}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/nav/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
122
app/admin/view/nav/index.html
Normal file
122
app/admin/view/nav/index.html
Normal file
@ -0,0 +1,122 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" required lay-verify="required" placeholder="ID/标题/标识/备注" class="layui-input"
|
||||
autocomplete="off" style="max-width: 320px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/nav/add">添加导航组</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/nav/add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/admin/nav/nav_info?id={{d.id}}">管理导航</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/nav/get_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '标题',
|
||||
width: 300
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '标识',
|
||||
align: 'center',
|
||||
width: 150
|
||||
}, {
|
||||
field: 'desc',
|
||||
title: '备注',
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 200,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
//console.log(obj)
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('真的删除该导航组吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/nav/delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
if (data.field.keywords) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
155
app/admin/view/nav/nav_info.html
Normal file
155
app/admin/view/nav/nav_info.html
Normal file
@ -0,0 +1,155 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 样式 -->
|
||||
{block name="style"}
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
height: calc(100% - 20px);
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- /样式 -->
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content" style="height: 100%">
|
||||
<div>
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/nav/nav_info_add?nid={$nav_id}">添加导航</a>
|
||||
</div>
|
||||
<div style="height: calc(100% - 30px);margin-top: 10px;">
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var editObj = null,
|
||||
ptable = null,
|
||||
treeGrid = null,
|
||||
tableId = 'treeTable',
|
||||
layer = null;
|
||||
|
||||
function init(layui) {
|
||||
var table = layui.table;
|
||||
treeGrid = layui.treeGrid; //很重要
|
||||
layer = layui.layer;
|
||||
ittab = layui.ittab;
|
||||
ptable = treeGrid.render({
|
||||
id: tableId,
|
||||
elem: '#' + tableId,
|
||||
idField: 'id',
|
||||
url: '/admin/nav/nav_info_list', //数据接口
|
||||
where: {
|
||||
id: ittab.getParam('id')
|
||||
},
|
||||
cellMinWidth: 100,
|
||||
treeId: 'id', //树形id字段名称
|
||||
treeUpId: 'pid', //树形父id字段名称
|
||||
treeShowName: 'title', //以树形式显示的字段
|
||||
cols: [
|
||||
[{
|
||||
field: 'order',
|
||||
width: 80,
|
||||
title: '排序',
|
||||
edit: "text",
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'id',
|
||||
width: 90,
|
||||
title: 'ID号',
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'title',
|
||||
edit: 'text',
|
||||
width: 240,
|
||||
title: '名称',
|
||||
}, {
|
||||
field: 'pid',
|
||||
title: '父级ID',
|
||||
edit: "text",
|
||||
width: 80,
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'src',
|
||||
title: '链接',
|
||||
edit: "text"
|
||||
}, {
|
||||
field: 'param',
|
||||
title: '参数',
|
||||
edit: "text",
|
||||
width: 200,
|
||||
align: 'center'
|
||||
}, {
|
||||
width: 120,
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
var addBtn =
|
||||
'<a class="layui-btn layui-btn-normal layui-btn-xs" href="/admin/nav/nav_info_add?nid={$nav_id}&pid=' + d.id +
|
||||
'">添加</a>';
|
||||
var delBtn = '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
return addBtn + delBtn;
|
||||
}
|
||||
}]
|
||||
],
|
||||
page: false
|
||||
});
|
||||
//单元格编辑
|
||||
treeGrid.on('edit(' + tableId + ')', function (obj) {
|
||||
layer.confirm('确定要提交修改吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/nav/nav_info_submit",
|
||||
type: 'post',
|
||||
data: {
|
||||
id: obj.data.id,
|
||||
field: obj.field,
|
||||
value: obj.value
|
||||
},
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
layer.msg('操作成功');
|
||||
}
|
||||
else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
//删除
|
||||
treeGrid.on('tool(' + tableId + ')', function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/nav/nav_info_delete",
|
||||
type: 'post',
|
||||
data: {
|
||||
id: obj.data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="['treeGrid']" use="['treeGrid','layer','table','ittab']"
|
||||
callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
81
app/admin/view/nav/nav_info_add.html
Normal file
81
app/admin/view/nav/nav_info_add.html
Normal file
@ -0,0 +1,81 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">父级导航<font>*</font></td>
|
||||
<td>
|
||||
<input type="hidden" name="nav_id" value="{$nav_id}"/>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级导航" >
|
||||
<option value="0">作为顶级导航</option>
|
||||
{volist name=":set_recursion(get_nav($nav_id))" id="v"}
|
||||
<option value="{$v.id}" {eq name="pid" value="$v.id" }selected="" {/eq}>{$v.title} </option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray2">名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入名称" lay-reqText="请输入名称" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">路径</td>
|
||||
<td>
|
||||
<input type="text" name="src" placeholder="请输入导航路径,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">参数</td>
|
||||
<td>
|
||||
<input type="text" name="param" placeholder="请输入导航参数,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data) {
|
||||
$.ajax({
|
||||
url: "/admin/nav/nav_info_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function(e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function() {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
160
app/admin/view/role/add.html
Normal file
160
app/admin/view/role/add.html
Normal file
@ -0,0 +1,160 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">角色名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input class="layui-input" type="text" name="title" lay-verify="required" {notempty name="$role.title"
|
||||
}value="{$role.title}" {/notempty} placeholder="请输入角色名称" autocomplete="off" />
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
{if condition="$id eq 0"}
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="-1" title="禁用">
|
||||
{else/}
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$role.status" value="1" }checked{/eq}>
|
||||
<input type="radio" name="status" value="-1" title="禁用" {eq name="$role.status" value="-1" }checked{/eq}>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2" style="vertical-align: top;">菜单显示配置<font>*</font>
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
<div class="layui-input-inline" style="min-width: 400px; min-height: 200px;">
|
||||
<div id="tabMenu"></div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="layui-td-gray2" style="vertical-align: top;">操作权限配置<font>*</font>
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
|
||||
<div class="layui-input-inline" style="min-width: 400px;min-height: 200px;">
|
||||
<div id="tabTree"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2" style="vertical-align: top;">备注内容
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<textarea name="desc" placeholder="请输入备注"
|
||||
class="layui-textarea">{notempty name="$role.desc" } {$role.desc} {/notempty}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
// 获取选中节点的id
|
||||
function getChecked_list(data) {
|
||||
var id = "";
|
||||
$.each(data, function (index, item) {
|
||||
if (id != "") {
|
||||
id = id + "," + item.id;
|
||||
}
|
||||
else {
|
||||
id = item.id;
|
||||
}
|
||||
if (item.children) {
|
||||
var i = getChecked_list(item.children);
|
||||
if (i != "") {
|
||||
id = id + "," + i;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
return id;
|
||||
}
|
||||
function init(layui) {
|
||||
var tree = layui.tree;
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;;
|
||||
|
||||
// 初始化
|
||||
$.ajax({
|
||||
url: '/admin/api/get_rule?id={$id}',
|
||||
async: false,
|
||||
dataType: 'json',
|
||||
success: function (data) {
|
||||
tree.render({
|
||||
elem: '#tabTree'
|
||||
, data: data.data
|
||||
, checkChild: false
|
||||
, showCheckbox: true //是否显示复选框
|
||||
, id: 'demoId1'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 初始化
|
||||
$.ajax({
|
||||
url: '/admin/api/get_menu?id={$id}',
|
||||
async: false,
|
||||
dataType: 'json',
|
||||
success: function (data) {
|
||||
tree.render({
|
||||
elem: '#tabMenu'
|
||||
, data: data.data
|
||||
, checkChild: false
|
||||
, showCheckbox: true //是否显示复选框
|
||||
, id: 'demoId2'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (obj) {
|
||||
var checkRule = tree.getChecked('demoId1');
|
||||
var checkMenu = tree.getChecked('demoId2');
|
||||
|
||||
var rules = getChecked_list(checkRule);
|
||||
var menus = getChecked_list(checkMenu);
|
||||
obj.field['rules'] = rules;
|
||||
obj.field['menus'] = menus;
|
||||
$.ajax({
|
||||
url: '/admin/role/post_submit',
|
||||
data: obj.field,
|
||||
type: 'post',
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['tree', 'form', 'layer', 'ittab']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
99
app/admin/view/role/index.html
Normal file
99
app/admin/view/role/index.html
Normal file
@ -0,0 +1,99 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<div style="height:36px">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="ID/名称/备注" class="layui-input" autocomplete="off"
|
||||
style="max-width: 300px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="thumb">
|
||||
<img src='{{d.thumb}}' height="25" style="border-radius: 50%;" />
|
||||
</script>
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/role/add">添加管理组</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/role/add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table
|
||||
, form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test'
|
||||
, toolbar: '#toolbarDemo'
|
||||
, url: '/admin/role/get_list' //数据接口
|
||||
, page: true //开启分页
|
||||
, limit: 20
|
||||
, cols: [[ //表头
|
||||
{ field: 'id', title: 'ID号', align: 'center', width: 80 }
|
||||
, { field: 'title', title: '名称', width: 300 }
|
||||
, { field: 'desc', title: '备注' }
|
||||
, { field: 'status', title: '状态', toolbar: '#status', align: 'center', width: 90 }
|
||||
, { field: 'right', title: '操作', toolbar: '#barDemo', width: 120, align: 'center' }
|
||||
]]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
//console.log(obj)
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除该角色吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/role/delete",
|
||||
data: { id: data.id },
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
} else if (obj.event === 'edit') {
|
||||
layer.prompt({
|
||||
formType: 2
|
||||
, value: data.email
|
||||
}, function (value, index) {
|
||||
obj.update({
|
||||
email: value
|
||||
});
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: { keywords: data.field.keywords },
|
||||
page: { curr: 1 }
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
83
app/admin/view/rule/add.html
Normal file
83
app/admin/view/rule/add.html
Normal file
@ -0,0 +1,83 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">父级节点<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="0">
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级节点">
|
||||
<option value="0">作为顶级节点</option>
|
||||
{volist name=":set_recursion(get_admin_rule())" id="v"}
|
||||
<option value="{$v.id}" {eq name="pid" value="$v.id" }selected="" {/eq}>{$v.title} </option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray2">节点名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入节点名称"
|
||||
lay-reqText="请输入节点名称" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">节点验证规则</td>
|
||||
<td>
|
||||
<input type="text" name="name" placeholder="请输入验证规则" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray2">附加规则</td>
|
||||
<td>
|
||||
<input type="text" name="condition" placeholder="请输入附加规则,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/rule/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
114
app/admin/view/rule/index.html
Normal file
114
app/admin/view/rule/index.html
Normal file
@ -0,0 +1,114 @@
|
||||
{extend name="common/base"/}
|
||||
|
||||
{block name="style"}
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
height: calc(100% - 20px);
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content" style="height: 100%">
|
||||
<div style="height:39px;">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/rule/add">添加节点</a>
|
||||
</div>
|
||||
<div style="height: calc(100% - 30px)">
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var editObj = null, ptable = null, treeGrid = null, tableId = 'treeTable', layer = null;
|
||||
function init(layui) {
|
||||
var table = layui.table;
|
||||
treeGrid = layui.treeGrid;//很重要
|
||||
layer = layui.layer;
|
||||
ptable = treeGrid.render({
|
||||
id: tableId
|
||||
, elem: '#' + tableId
|
||||
, idField: 'id'
|
||||
, url: '/admin/rule/get_list'
|
||||
, cellMinWidth: 100
|
||||
, treeId: 'id'//树形id字段名称
|
||||
, treeUpId: 'pid'//树形父id字段名称
|
||||
, treeShowName: 'title'//以树形式显示的字段
|
||||
, cols: [[
|
||||
{ field: 'id', width: 80, title: 'ID号', align: 'center' }
|
||||
, { field: 'title', edit: 'text', width: 300, title: '名称', edit: "text" }
|
||||
, { field: 'pid', title: '父级ID', edit: "text", width: 80, align: 'center' }
|
||||
, { field: 'src', title: '规则', edit: "text" }
|
||||
, {
|
||||
width: 100, title: '操作', align: 'center'
|
||||
, templet: function (d) {
|
||||
var html = '';
|
||||
var addBtn = '<a class="layui-btn layui-btn-normal layui-btn-xs" href="/admin/rule/add?pid=' + d.id + '">添加</a>';
|
||||
var delBtn = '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
return addBtn + delBtn;
|
||||
}
|
||||
}
|
||||
]]
|
||||
, page: false
|
||||
//,skin:'line'
|
||||
});
|
||||
//单元格编辑
|
||||
treeGrid.on('edit(' + tableId + ')', function (obj) {
|
||||
layer.confirm('确定要提交修改吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/rule/post_submit",
|
||||
type: 'post',
|
||||
data: { id: obj.data.id, field: obj.field, value: obj.value },
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
layer.msg(res.msg);
|
||||
setTimeout('location.reload()', 2000);
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
//删除
|
||||
treeGrid.on('tool(' + tableId + ')', function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/rule/delete",
|
||||
type: 'post',
|
||||
data: { id: obj.data.id },
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function openorclose() {
|
||||
var map = treeGrid.getDataMap(tableId);
|
||||
var o = map['1'];
|
||||
treeGrid.treeNodeOpen(o, !o[treeGrid.config.cols.isOpen]);
|
||||
}
|
||||
|
||||
function getCheckData() {
|
||||
var checkStatus = treeGrid.checkStatus(tableId)
|
||||
, data = checkStatus.data;
|
||||
layer.alert(JSON.stringify(data));
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="['treeGrid']" use="['jquery','treeGrid','layer','table']"
|
||||
callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
99
app/admin/view/search/index.html
Normal file
99
app/admin/view/search/index.html
Normal file
@ -0,0 +1,99 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="关键字名称" class="layui-input" autocomplete="off"
|
||||
style="max-width: 320px; display: inline-block;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '关键字搜索列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/search/get_list',
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[{
|
||||
field: 'id',
|
||||
width: 90,
|
||||
title: 'ID号',
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '关键字名称'
|
||||
}, {
|
||||
field: 'times',
|
||||
width: 100,
|
||||
title: '搜索次数',
|
||||
align: 'center'
|
||||
}, {
|
||||
width: 80,
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
var delBtn = '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
return delBtn;
|
||||
}
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
//删除
|
||||
table.on('tool(test)', function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/search/delete",
|
||||
type: 'post',
|
||||
data: {
|
||||
id: obj.data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
70
app/admin/view/sitemap/add.html
Normal file
70
app/admin/view/sitemap/add.html
Normal file
@ -0,0 +1,70 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">分类名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入分类名"
|
||||
class="layui-input" {notempty name="$cate.name" }value="{$cate.name}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">排序
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sort" lay-verify="required" autocomplete="off" placeholder="请输入排序"
|
||||
class="layui-input" {notempty name="$cate.sort" }value="{$cate.sort}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
upload = layui.upload;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/sitemap/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
110
app/admin/view/sitemap/index.html
Normal file
110
app/admin/view/sitemap/index.html
Normal file
@ -0,0 +1,110 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="ID/分类名" class="layui-input"
|
||||
autocomplete="off" style="max-width: 320px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/sitemap/add">添加网站地图分类</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/sitemap/add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/admin/sitemap/sitemap_info?id={{d.id}}">管理分类详情</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '网站地图列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/sitemap/get_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'sort',
|
||||
title: '排序',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '网站地图分类名称'
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
align: 'center',
|
||||
width: 220
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
//console.log(obj)
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除该数据吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/sitemap/delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
110
app/admin/view/sitemap/sitemap_info.html
Normal file
110
app/admin/view/sitemap/sitemap_info.html
Normal file
@ -0,0 +1,110 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
<div>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/sitemap/sitemap_info_add?cid={$sitemap_cate_id}">添加网站地图</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/sitemap/sitemap_info_add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var sitemap_cate_id = '{$sitemap_cate_id}';
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '网站地图列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/sitemap/sitemap_info_list', //数据接口
|
||||
where: {
|
||||
id: sitemap_cate_id
|
||||
},
|
||||
page: false, //开启分页
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'sort',
|
||||
title: '排序',
|
||||
width: 80,
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '标题',
|
||||
width: 200
|
||||
}, {
|
||||
field: 'pc_src',
|
||||
title: 'pc端链接'
|
||||
}, {
|
||||
field: 'mobile_src',
|
||||
title: '移动端链接'
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 120,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除该数据吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/sitemap/sitemap_info_delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
148
app/admin/view/sitemap/sitemap_info_add.html
Normal file
148
app/admin/view/sitemap/sitemap_info_add.html
Normal file
@ -0,0 +1,148 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">标题<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入标题"
|
||||
lay-reqText="请输入标题" class="layui-input" {notempty name="$sitemap.name" }value="{$sitemap.name}"
|
||||
{/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" {notempty
|
||||
name="$sitemap.sort" }value="{$sitemap.sort}" {/notempty}></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">PC端链接<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="pc_src" lay-verify="required" autocomplete="off" placeholder="请输入PC端链接"
|
||||
lay-reqText="请输入PC端链接" class="layui-input" {notempty name="$sitemap.pc_src"
|
||||
}value="{$sitemap.pc_src}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">移动端链接<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="mobile_src" lay-verify="required" autocomplete="off" placeholder="请输入移动端链接"
|
||||
lay-reqText="请输入移动端链接" class="layui-input" {notempty name="$sitemap.mobile_src"
|
||||
}value="{$sitemap.mobile_src}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">PC端图片<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">上传PC端图片</button>
|
||||
<div class="layui-upload-list" id="demo1" style="width:200px; height:120px; overflow:hidden">
|
||||
<img {notempty name="$sitemap.pc_img" }src="{:get_file($sitemap.pc_img)}" {/notempty}
|
||||
heght="120px;" style="max-width: 100%;" />
|
||||
<input type="hidden" name="pc_img" {notempty name="$sitemap.pc_img" }value="{$sitemap.pc_img}"
|
||||
{/notempty}>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="layui-td-gray2">移动端图片<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test2">上传移动端图片</button>
|
||||
<div class="layui-upload-list" id="demo2" style="width:200px; height:120px; overflow:hidden">
|
||||
<img {notempty name="$sitemap.mobile_img" }src="{:get_file($sitemap.mobile_img)}" {/notempty}
|
||||
heght="120px;" style="max-width: 100%;" />
|
||||
<input type="hidden" name="mobile_img" {notempty name="$sitemap.mobile_img"
|
||||
}value="{$sitemap.mobile_img}" {/notempty}>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
{notempty name="$sitemap.sitemap_cate_id" }
|
||||
<input type="hidden" name="sitemap_cate_id" value="{$sitemap.sitemap_cate_id}" />
|
||||
{else/}
|
||||
<input type="hidden" name="sitemap_cate_id" value="{$sitemap_cate_id}" />
|
||||
{/notempty}
|
||||
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
upload = layui.upload;
|
||||
|
||||
//pc端图片
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1',
|
||||
url: '/admin/api/upload',
|
||||
done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
//移动端图片
|
||||
var uploadInst2 = upload.render({
|
||||
elem: '#test2',
|
||||
url: '/admin/api/upload',
|
||||
done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo2 input').attr('value', res.data.id);
|
||||
$('#demo2 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/sitemap/sitemap_info_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
87
app/admin/view/slide/add.html
Normal file
87
app/admin/view/slide/add.html
Normal file
@ -0,0 +1,87 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">标题<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input" {notempty name="$slide.title" }value="{$slide.title}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">标识</td>
|
||||
<td><input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入标识"
|
||||
class="layui-input" {notempty name="$slide.name" }value="{$slide.name}" {/notempty}></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{if condition="$id eq 0"}
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="-1" title="禁用">
|
||||
{else/}
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$slide.status" value="1" }checked{/eq}>
|
||||
<input type="radio" name="status" value="-1" title="禁用" {eq name="$slide.status" value="-1"
|
||||
}checked{/eq}>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">备注<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<textarea name="desc" placeholder="请输入备注"
|
||||
class="layui-textarea">{notempty name="$slide.desc" }{$slide.desc}{/notempty}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, upload = layui.upload;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/slide/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
121
app/admin/view/slide/index.html
Normal file
121
app/admin/view/slide/index.html
Normal file
@ -0,0 +1,121 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="ID/标题/标识/备注" class="layui-input"
|
||||
autocomplete="off" style="max-width: 320px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/slide/add">添加轮播组</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/slide/add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/admin/slide/slide_info?id={{d.id}}">管理轮播</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '轮播组列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/slide/get_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '标题',
|
||||
width: 240
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '标识',
|
||||
align: 'center',
|
||||
width: 160
|
||||
}, {
|
||||
field: 'desc',
|
||||
title: '备注'
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 200,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
//console.log(obj)
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定删除该轮播组吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/slide/delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
113
app/admin/view/slide/slide_info.html
Normal file
113
app/admin/view/slide/slide_info.html
Normal file
@ -0,0 +1,113 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
<div>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/slide/slide_info_add?sid={$slide_id}">添加轮播</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/slide/slide_info_add?id={{d.id}}">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var slide_id = '{$slide_id}';
|
||||
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '轮播列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/slide/slide_info_list', //数据接口
|
||||
where: {
|
||||
id: slide_id
|
||||
},
|
||||
page: false, //开启分页
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'sort',
|
||||
title: '排序',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '标题',
|
||||
width: 300
|
||||
}, {
|
||||
field: 'desc',
|
||||
title: '描述'
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 120,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function(obj) {
|
||||
var data = obj.data;
|
||||
//console.log(obj)
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定删除该轮播数据吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
$.ajax({
|
||||
url: "/admin/slide/slide_info_delete",
|
||||
data: {
|
||||
id: data.id
|
||||
},
|
||||
success: function(res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
121
app/admin/view/slide/slide_info_add.html
Normal file
121
app/admin/view/slide/slide_info_add.html
Normal file
@ -0,0 +1,121 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">标题<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入标题" class="layui-input"
|
||||
{notempty name="$slide_info.title" }value="{$slide_info.title}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" {notempty
|
||||
name="$slide_info.sort" }value="{$slide_info.sort}" {/notempty}></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">链接<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="src" autocomplete="off" placeholder="请输入链接" class="layui-input" {notempty
|
||||
name="$slide_info.src" }value="{$slide_info.src}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray2" rowspan="2">图片</td>
|
||||
<td rowspan="2">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal" id="test1">上传图片</button>
|
||||
<div class="layui-upload-list" id="demo1">
|
||||
<img {notempty name="$slide_info.img" }src="{:get_file($slide_info.img)}" {/notempty}
|
||||
style="max-height: 120px;" />
|
||||
<input type="hidden" name="img" {notempty name="$slide_info.img" }value="{$slide_info.img}" {/notempty}>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">状态<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
{if condition="$id eq 0"}
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="-1" title="禁用">
|
||||
{else/}
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$slide_info.status" value="1" }checked{/eq}>
|
||||
<input type="radio" name="status" value="-1" title="禁用" {eq name="$slide_info.status" value="-1" }checked{/eq}>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">备注<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<textarea name="desc" placeholder="请输入备注"
|
||||
class="layui-textarea">{notempty name="$slide_info.desc" }{$slide_info.desc}{/notempty}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, upload = layui.upload;
|
||||
|
||||
//头像上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: '/admin/api/upload'
|
||||
, done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/slide/slide_info_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
140
app/admin/view/user/edit.html
Normal file
140
app/admin/view/user/edit.html
Normal file
@ -0,0 +1,140 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">登录账号</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$user.id}">
|
||||
{$user.username}
|
||||
</td>
|
||||
<td class="layui-td-gray2">用户昵称</td>
|
||||
<td>
|
||||
<input type="text" name="nickname" placeholder="请输入用户昵称" autocomplete="off" class="layui-input" value="{$user.nickname}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">真实姓名</td>
|
||||
<td>
|
||||
<input type="text" name="name" placeholder="请输入真实姓名" autocomplete="off" class="layui-input" value="{$user.name}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">性别</td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男" {eq name="$user.sex" value="1" }checked{/eq}>
|
||||
<input type="radio" name="sex" value="2" title="女" {eq name="$user.sex" value="2" }checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray2">手机号码</td>
|
||||
<td>
|
||||
<input type="text" name="mobile" placeholder="请输入手机" autocomplete="off" class="layui-input" value="{$user.mobile}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">电子邮箱</td>
|
||||
<td>
|
||||
<input type="text" name="email" placeholder="请输入电子邮箱" autocomplete="off" class="layui-input" value="{$user.email}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">个人简介</td>
|
||||
<td colspan="5">
|
||||
<textarea name="desc" placeholder="请输入个人简介" class="layui-textarea">{$user.desc}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">国家</td>
|
||||
<td>
|
||||
<input type="text" name="country" placeholder="请输入所在国家" autocomplete="off" class="layui-input" value="{$user.country}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">省份</td>
|
||||
<td>
|
||||
<input type="text" name="province" placeholder="请输入所在省份" autocomplete="off" class="layui-input" value="{$user.province}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">城市</td>
|
||||
<td>
|
||||
<input type="text" name="city" placeholder="请输入所在城市" autocomplete="off" class="layui-input" value="{$user.city}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">所在企业</td>
|
||||
<td>
|
||||
<input type="text" name="company" placeholder="请输入所在企业" autocomplete="off" class="layui-input" value="{$user.company}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">所在部门</td>
|
||||
<td>
|
||||
<input type="text" name="depament" placeholder="请输入所在部门" autocomplete="off" class="layui-input" value="{$user.depament}">
|
||||
</td>
|
||||
<td class="layui-td-gray2">所在职位</td>
|
||||
<td>
|
||||
<input type="text" name="position" placeholder="请输入所在职位" autocomplete="off" class="layui-input" value="{$user.position}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">企业地址</td>
|
||||
<td colspan="5">
|
||||
<input type="text" name="address" placeholder="请输入企业地址" autocomplete="off" class="layui-input" value="{$user.address}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var form = layui.form
|
||||
, layer = layui.layer
|
||||
, upload = layui.upload;
|
||||
|
||||
//头像上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: '/admin/api/upload'
|
||||
, done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 0) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.filepath);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/admin/user/post_submit",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 1) {
|
||||
layer.confirm('保存成功,返回列表页吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
history.back(-1);
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['upload','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
192
app/admin/view/user/index.html
Normal file
192
app/admin/view/user/index.html
Normal file
@ -0,0 +1,192 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="昵称/真实姓名/手机号" class="layui-input" autocomplete="off" style="max-width: 230px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<input type="text" class="layui-input" id="start_time" readonly placeholder="注册开始时间" name="start_time" style="max-width: 120px;display: inline;margin: -10px 10px 0 0;">~
|
||||
<input type="text" class="layui-input" id="end_time" readonly placeholder="注册结束时间" name="end_time" style="max-width: 120px;display: inline;margin: -10px 10px 0 0;">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/admin/user/view?id={{d.id}}">详情</a>
|
||||
<a class="layui-btn layui-btn-xs" href="/admin/user/edit?id={{d.id}}">编辑</a>
|
||||
{{# if(d.status == 1){ }}<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">禁用</a>{{# } else { }}<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>{{# } }}
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form,
|
||||
laydate = layui.laydate;
|
||||
|
||||
laydate.render({
|
||||
elem: '#start_time',
|
||||
type: 'date'
|
||||
});
|
||||
|
||||
laydate.render({
|
||||
elem: '#end_time',
|
||||
type: 'date'
|
||||
});
|
||||
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '用户列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/user/get_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'headimgurl',
|
||||
title: '头像',
|
||||
align: 'center',
|
||||
width: 60,
|
||||
templet: function(d) {
|
||||
var html = '';
|
||||
var delBtn = '<img src="' + d.headimgurl + '" width="28" height="28"/>';
|
||||
return delBtn;
|
||||
}
|
||||
}, {
|
||||
field: 'username',
|
||||
title: '用户名',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'sex',
|
||||
title: '性别',
|
||||
align: 'center',
|
||||
width: 60,
|
||||
templet: function(d) {
|
||||
var html = '-';
|
||||
if (d.sex == 1) {
|
||||
html = '男'
|
||||
} else if (d.sex == 2) {
|
||||
html = '女'
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: 'nickname',
|
||||
title: '昵称',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '真实姓名',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'mobile',
|
||||
title: '手机号码',
|
||||
align: 'center',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'email',
|
||||
title: '电子邮箱',
|
||||
align: 'center'
|
||||
},{
|
||||
field: 'register_time',
|
||||
title: '注册时间',
|
||||
align: 'center',
|
||||
width: 160
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 66
|
||||
},{
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
toolbar: '#barDemo',
|
||||
width: 168
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('您确定要禁用该用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/user/delete",
|
||||
data: {
|
||||
id: data.id,
|
||||
status:0
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}else if (obj.event === 'open') {
|
||||
layer.confirm('您确定要启用该用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/user/delete",
|
||||
data: {
|
||||
id: data.id,
|
||||
status:1
|
||||
},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 1) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function(data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords,
|
||||
attach: data.field.attach,
|
||||
start_time: data.field.start_time,
|
||||
end_time: data.field.end_time
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form','laydate']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
86
app/admin/view/user/log.html
Normal file
86
app/admin/view/user/log.html
Normal file
@ -0,0 +1,86 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="body-content">
|
||||
<form class="layui-form" style="display: inline;">
|
||||
<input type="text" name="keywords" placeholder="昵称/操作标题" class="layui-input" autocomplete="off"
|
||||
style="max-width: 320px;display: inline;margin: -10px 10px 0 0;" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#test',
|
||||
title: '用户操作日志列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: '/admin/user/get_log_list', //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '操作类型',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'content',
|
||||
title: '操作描述',
|
||||
align: 'center',
|
||||
width: 348
|
||||
}, {
|
||||
field: 'param',
|
||||
title: '操作数据'
|
||||
}, {
|
||||
field: 'nickname',
|
||||
title: '昵称',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'ip',
|
||||
title: 'IP地址',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'create_time',
|
||||
title: '操作时间',
|
||||
align: 'center',
|
||||
width: 160
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
tableIns.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords,
|
||||
title_cate: data.field.title_cate
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="['table','form']" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
131
app/admin/view/user/view.html
Normal file
131
app/admin/view/user/view.html
Normal file
@ -0,0 +1,131 @@
|
||||
{extend name="common/base"/}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="layui-form body-content">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray2">登录账号</td>
|
||||
<td>
|
||||
{$user.username}
|
||||
</td>
|
||||
<td class="layui-td-gray2">昵称</td>
|
||||
<td>
|
||||
{$user.nickname}
|
||||
</td>
|
||||
<td rowspan="4" class="layui-td-gray2">头像</td>
|
||||
<td rowspan="4" valign="top" style="width: 150px;">
|
||||
<div class="layui-upload">
|
||||
<img src="{$user.headimgurl}" width="150" height="150" style="max-width: 100%;" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">注册时间</td>
|
||||
<td>
|
||||
{$user.register_time | date='Y-m-d H:i:s'}
|
||||
</td>
|
||||
<td class="layui-td-gray2">注册IP</td>
|
||||
<td>
|
||||
{$user.register_ip}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">真实姓名</td>
|
||||
<td>
|
||||
{$user.name}
|
||||
</td>
|
||||
<td class="layui-td-gray2">状态</td>
|
||||
<td>
|
||||
{eq name="$user.status" value="1" }正常{/eq}
|
||||
{eq name="$user.status" value="0" }禁止登录{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">手机号码</td>
|
||||
<td>
|
||||
{$user.mobile}
|
||||
</td>
|
||||
<td class="layui-td-gray2">电子邮箱</td>
|
||||
<td>
|
||||
{$user.email}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">所在城市</td>
|
||||
<td>
|
||||
{$user.country}-{$user.province}-{$user.city}
|
||||
</td>
|
||||
<td class="layui-td-gray2">性别</td>
|
||||
<td>
|
||||
{eq name="$user.sex" value="1" }男{/eq}
|
||||
{eq name="$user.sex" value="2" }女{/eq}
|
||||
{eq name="$user.sex" value="0" }未知{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray2">生日</td>
|
||||
<td>
|
||||
{$user.birthday | date='Y-m-d'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">个人简介</td>
|
||||
<td colspan="5">
|
||||
{$user.desc}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">所在企业</td>
|
||||
<td>
|
||||
{$user.company}
|
||||
</td>
|
||||
<td class="layui-td-gray2">所在部门</td>
|
||||
<td>
|
||||
{$user.depament}
|
||||
</td>
|
||||
<td class="layui-td-gray2">所在职位</td>
|
||||
<td>
|
||||
{$user.position}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">企业地址</td>
|
||||
<td colspan="5">
|
||||
{$user.address}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray2">最后登录时间</td>
|
||||
<td>
|
||||
{$user.last_login_time | date='Y-m-d H:i:s'}
|
||||
</td>
|
||||
<td class="layui-td-gray2">最后登录IP</td>
|
||||
<td>
|
||||
{$user.last_login_ip}
|
||||
</td>
|
||||
<td class="layui-td-gray2">累计登录次数</td>
|
||||
<td>
|
||||
{$user.login_num}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function init(layui) {
|
||||
//监听返回
|
||||
$('.body-content').on('click', '[lay-event="back"]', function () {
|
||||
history.back(-1);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{include file="common/layui" base='base' extend="[]" use="[]" callback="init" /}
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
224
app/common.php
Normal file
224
app/common.php
Normal file
@ -0,0 +1,224 @@
|
||||
<?php
|
||||
// 应用公共文件
|
||||
use think\facade\Cache;
|
||||
use think\facade\Config;
|
||||
use think\facade\Request;
|
||||
//取系统配置
|
||||
function get_config($key)
|
||||
{
|
||||
return Config::get($key);
|
||||
}
|
||||
|
||||
//系统信息
|
||||
function get_system_info($key)
|
||||
{
|
||||
$system = [
|
||||
'os' => PHP_OS,
|
||||
'php' => PHP_VERSION,
|
||||
'upload_max_filesize' => get_cfg_var("upload_max_filesize") ? get_cfg_var("upload_max_filesize") : "不允许上传附件",
|
||||
'max_execution_time' => get_cfg_var("max_execution_time") . "秒 ",
|
||||
];
|
||||
if (empty($key)) {
|
||||
return $system;
|
||||
} else {
|
||||
return $system[$key];
|
||||
}
|
||||
}
|
||||
|
||||
//获取url参数
|
||||
function get_params($key = "")
|
||||
{
|
||||
return Request::instance()->param($key);
|
||||
}
|
||||
|
||||
//生成一个不会重复的字符串
|
||||
function make_token()
|
||||
{
|
||||
$str = md5(uniqid(md5(microtime(true)), true));
|
||||
$str = sha1($str); //加密
|
||||
return $str;
|
||||
}
|
||||
|
||||
//随机字符串,默认长度10
|
||||
function set_salt($num = 10)
|
||||
{
|
||||
$str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
|
||||
$salt = substr(str_shuffle($str), 10, $num);
|
||||
return $salt;
|
||||
}
|
||||
//密码加密
|
||||
function set_password($pwd, $salt)
|
||||
{
|
||||
return md5(md5($pwd . $salt) . $salt);
|
||||
}
|
||||
|
||||
//设置缓存
|
||||
function set_cache($key, $value, $date = 86400)
|
||||
{
|
||||
Cache::set($key, $value, $date);
|
||||
}
|
||||
|
||||
//读取缓存
|
||||
function get_cache($key)
|
||||
{
|
||||
Cache::get($key);
|
||||
}
|
||||
|
||||
//情况缓存
|
||||
function clear_cache($key)
|
||||
{
|
||||
Cache::clear($key);
|
||||
}
|
||||
|
||||
//判断cms是否完成安装
|
||||
function is_installed()
|
||||
{
|
||||
static $isInstalled;
|
||||
if (empty($isInstalled)) {
|
||||
$isInstalled = file_exists(CMS_ROOT . 'config/install.lock');
|
||||
}
|
||||
return $isInstalled;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回json数据,用于接口
|
||||
* @param integer $code
|
||||
* @param string $msg
|
||||
* @param array $data
|
||||
* @param string $url
|
||||
* @param integer $httpCode
|
||||
* @param array $header
|
||||
* @param array $options
|
||||
* @return json
|
||||
*/
|
||||
function to_assign($code = 1, $msg = "操作成功", $data = [], $url = '', $httpCode = 200, $header = [], $options = [])
|
||||
{
|
||||
$res = ['code' => $code];
|
||||
$res['msg'] = $msg;
|
||||
$res['url'] = $url;
|
||||
if (is_object($data)) {
|
||||
$data = $data->toArray();
|
||||
}
|
||||
$res['data'] = $data;
|
||||
$response = \think\Response::create($res, "json", $httpCode, $header, $options);
|
||||
throw new \think\exception\HttpResponseException($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 适配layui数据列表的返回数据方法,用于接口
|
||||
* @param integer $code
|
||||
* @param string $msg
|
||||
* @param array $data
|
||||
* @param integer $httpCode
|
||||
* @param array $header
|
||||
* @param array $options
|
||||
* @return json
|
||||
*/
|
||||
function table_assign($code = 0, $msg = '请求成功', $data = [], $httpCode = 200, $header = [], $options = [])
|
||||
{
|
||||
$res['code'] = $code;
|
||||
$res['msg'] = $msg;
|
||||
if (is_object($data)) {
|
||||
$data = $data->toArray();
|
||||
}
|
||||
if (!empty($data['total'])) {
|
||||
$res['count'] = $data['total'];
|
||||
} else {
|
||||
$res['count'] = 0;
|
||||
}
|
||||
$res['data'] = $data['data'];
|
||||
$response = \think\Response::create($res, "json", $httpCode, $header, $options);
|
||||
throw new \think\exception\HttpResponseException($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 间隔时间段格式化
|
||||
* @param int $time 时间戳
|
||||
* @param string $format 格式 【d:显示到天 i显示到分钟 s显示到秒】
|
||||
* @return string
|
||||
*/
|
||||
function time_trans($time, $format = 'd')
|
||||
{
|
||||
$now = time();
|
||||
$diff = $now - $time;
|
||||
if ($diff < 60) {
|
||||
return '1分钟前';
|
||||
} else if ($diff < 3600) {
|
||||
return floor($diff / 60) . '分钟前';
|
||||
} else if ($diff < 86400) {
|
||||
return floor($diff / 3600) . '小时前';
|
||||
}
|
||||
$yes_start_time = strtotime(date('Y-m-d 00:00:00', strtotime('-1 days'))); //昨天开始时间
|
||||
$yes_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-1 days'))); //昨天结束时间
|
||||
$two_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-2 days'))); //2天前结束时间
|
||||
$three_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-3 days'))); //3天前结束时间
|
||||
$four_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-4 days'))); //4天前结束时间
|
||||
$five_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-5 days'))); //5天前结束时间
|
||||
$six_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-6 days'))); //6天前结束时间
|
||||
$seven_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-7 days'))); //7天前结束时间
|
||||
|
||||
if ($time > $yes_start_time && $time < $yes_end_time) {
|
||||
return '昨天';
|
||||
}
|
||||
|
||||
if ($time > $yes_start_time && $time < $two_end_time) {
|
||||
return '1天前';
|
||||
}
|
||||
|
||||
if ($time > $yes_start_time && $time < $three_end_time) {
|
||||
return '2天前';
|
||||
}
|
||||
|
||||
if ($time > $yes_start_time && $time < $four_end_time) {
|
||||
return '3天前';
|
||||
}
|
||||
|
||||
if ($time > $yes_start_time && $time < $five_end_time) {
|
||||
return '4天前';
|
||||
}
|
||||
|
||||
if ($time > $yes_start_time && $time < $six_end_time) {
|
||||
return '5天前';
|
||||
}
|
||||
|
||||
if ($time > $yes_start_time && $time < $seven_end_time) {
|
||||
return '6天前';
|
||||
}
|
||||
|
||||
switch ($format) {
|
||||
case 'd':
|
||||
$show_time = date('Y-m-d', $time);
|
||||
break;
|
||||
case 'i':
|
||||
$show_time = date('Y-m-d H:i', $time);
|
||||
break;
|
||||
case 's':
|
||||
$show_time = date('Y-m-d H:i:s', $time);
|
||||
break;
|
||||
}
|
||||
return $show_time;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据附件表的id返回url地址
|
||||
* @param [type] $id [description]
|
||||
*/
|
||||
function get_file($id)
|
||||
{
|
||||
if ($id) {
|
||||
$geturl = \think\facade\Db::name("file")->where(['id' => $id])->find();
|
||||
if ($geturl['status'] == 1) {
|
||||
//审核通过
|
||||
//获取签名的URL
|
||||
$url = $geturl['filepath'];
|
||||
return $url;
|
||||
} elseif ($geturl['status'] == 0) {
|
||||
//待审核
|
||||
return '/themes/admin_themes/lib/static/images/none_pic.jpg';
|
||||
} else {
|
||||
//不通过
|
||||
return '/themes/admin_themes/lib/static/images/none_pic.jpg';
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
91
app/home/BaseController.php
Normal file
91
app/home/BaseController.php
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home;
|
||||
|
||||
use think\App;
|
||||
use think\facade\View;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
abstract class BaseController
|
||||
{
|
||||
/**
|
||||
* Request实例
|
||||
* @var \think\Request
|
||||
*/
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* 应用实例
|
||||
* @var \think\App
|
||||
*/
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* 是否批量验证
|
||||
* @var bool
|
||||
*/
|
||||
protected $batchValidate = false;
|
||||
|
||||
/**
|
||||
* 控制器中间件
|
||||
* @var array
|
||||
*/
|
||||
protected $middleware = [];
|
||||
|
||||
/**
|
||||
* 构造方法
|
||||
* @access public
|
||||
* @param App $app 应用对象
|
||||
*/
|
||||
public function __construct(App $app)
|
||||
{
|
||||
$this->app = $app;
|
||||
$this->request = $this->app->request;
|
||||
// 控制器初始化
|
||||
$this->initialize();
|
||||
}
|
||||
|
||||
// 初始化
|
||||
protected function initialize()
|
||||
{
|
||||
$params = [
|
||||
'module' => \think\facade\App::initialize()->http->getName(),
|
||||
'controller' => app('request')->controller(),
|
||||
'action' => app('request')->action(),
|
||||
'isLogin' => 0,
|
||||
'uid' => 0,
|
||||
'nickname' => '',
|
||||
'mobile_status' => 0,
|
||||
'version' => get_config('webconfig.version'),
|
||||
];
|
||||
$login_class = "nav-login";
|
||||
$login_top = '<a id="topLogin" class="nav-a" href="/home/login/index"><span class="login-span">登录</span></a><a class="nav-a" href="/home/login/reg"><span class="reg-span">注册</span></a>';
|
||||
$info = $this->checkLogin();
|
||||
if ($info) {
|
||||
$login_class = 'nav-login nav-logined';
|
||||
$login_top = '<a class="nav-img" href="/home/user/index"><img src="' . $info['headimgurl'] . '" alt="' . $info['username'] . '" />'.$info['username'].'</a>';
|
||||
$params['isLogin'] = 1;
|
||||
$params['uid'] = $info['id'];
|
||||
$params['nickname'] = $info['nickname'];
|
||||
$params['username'] = $info['username'];
|
||||
}
|
||||
View::assign('webconfig', get_config('webconfig'));
|
||||
View::assign('params', $params);
|
||||
View::assign('login_class', $login_class);
|
||||
View::assign('login_top', $login_top);
|
||||
}
|
||||
// 检测用户登录状态
|
||||
protected function checkLogin()
|
||||
{
|
||||
$session_user = get_config('app.session_user');
|
||||
$login_user = \think\facade\Session::get($session_user);
|
||||
if ($login_user && is_array($login_user)) {
|
||||
return $login_user;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
118
app/home/common.php
Normal file
118
app/home/common.php
Normal file
@ -0,0 +1,118 @@
|
||||
<?php
|
||||
// 这是home公共文件
|
||||
//获取当前登录用户的信息
|
||||
function get_login_user($key = "")
|
||||
{
|
||||
$session_user = get_config('app.session_user');
|
||||
if (\think\facade\Session::has($session_user)) {
|
||||
$gougu_user = \think\facade\Session::get($session_user);
|
||||
if (!empty($key)) {
|
||||
if (isset($gougu_user[$key])) {
|
||||
return $gougu_user[$key];
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
} else {
|
||||
return $gougu_user;
|
||||
}
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 客户操作日志
|
||||
* @param string $type 操作类型 login add edit view delete,pay
|
||||
* @param int $param_id 操作类型
|
||||
* @param array $param 提交的参数
|
||||
*/
|
||||
function add_user_log($type, $param_id = '', $param = [])
|
||||
{
|
||||
$request = request();
|
||||
switch ($type) {
|
||||
case 'login':
|
||||
$title = '登录';
|
||||
break;
|
||||
case 'reg':
|
||||
$title = '注册';
|
||||
break;
|
||||
case 'add':
|
||||
$title = '新增';
|
||||
break;
|
||||
case 'edit':
|
||||
$title = '编辑';
|
||||
break;
|
||||
case 'view':
|
||||
$title = '查看';
|
||||
break;
|
||||
case 'delete':
|
||||
$title = '删除';
|
||||
break;
|
||||
case 'pay':
|
||||
$title = '支付';
|
||||
break;
|
||||
default:
|
||||
$title = '未知';
|
||||
break;
|
||||
}
|
||||
if ($type == 'login') {
|
||||
$login_user = \think\facade\Db::name('user')->where(array('id' => $param_id))->find();
|
||||
} else {
|
||||
$session_user = get_config('app.session_user');
|
||||
$login_user = \think\facade\Session::get($session_user);
|
||||
if (empty($login_user)) {
|
||||
$login_user['id'] = 0;
|
||||
$login_user['nickname'] = '游客';
|
||||
}
|
||||
}
|
||||
|
||||
$content = $login_user['nickname'] . '在' . date('Y-m-d H:i:s') . '执行了' . $title . '操作';
|
||||
$data = [];
|
||||
$data['uid'] = $login_user['id'];
|
||||
$data['nickname'] = $login_user['nickname'];
|
||||
$data['type'] = $type;
|
||||
$data['title'] = $title;
|
||||
$data['content'] = $content;
|
||||
$data['param_id'] = $param_id;
|
||||
$data['param'] = json_encode($param);
|
||||
$data['module'] = \think\facade\App::initialize()->http->getName();
|
||||
$data['controller'] = app('request')->controller();
|
||||
$data['function'] = app('request')->action();
|
||||
$data['ip'] = $request->ip();
|
||||
$data['create_time'] = time();
|
||||
\think\facade\Db::name('user_log')->strict(false)->field(true)->insert($data);
|
||||
}
|
||||
|
||||
//读取导航列表,用于前台
|
||||
function get_navs($name)
|
||||
{
|
||||
if (!get_cache('homeNav' . $name)) {
|
||||
$nav_id = \think\facade\Db::name('Nav')->where(['name' => $name, 'status' => 1])->value('id');
|
||||
if (empty($nav_id)) {
|
||||
return '';
|
||||
}
|
||||
$list = \think\facade\Db::name('NavInfo')->where(['nav_id' => $nav_id, 'status' => 1])->select();
|
||||
\think\facade\Cache::tag('homeNav')->set('homeNav' . $name, $list);
|
||||
}
|
||||
$navs = get_cache('homeNav' . $name);
|
||||
return $navs;
|
||||
}
|
||||
|
||||
//读取指定文章的详情
|
||||
function get_article_detail($id)
|
||||
{
|
||||
$article = \think\facade\Db::name('article')->where(['id' => $id])->find();
|
||||
if (empty($article)) {
|
||||
return $this->error('文章不存在');
|
||||
}
|
||||
$keywrod_array = \think\facade\Db::name('ArticleKeywords')
|
||||
->field('i.aid,i.keywords_id,k.title')
|
||||
->alias('i')
|
||||
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
|
||||
->order('i.create_time asc')
|
||||
->where(array('i.aid' => $id, 'k.status' => 1))
|
||||
->select()->toArray();
|
||||
|
||||
$article['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
|
||||
$article['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
|
||||
return $article;
|
||||
}
|
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