勾股cms初始化

This commit is contained in:
hdm 2021-01-30 20:59:12 +08:00
parent 7efeb7d3e1
commit dc450e7786
628 changed files with 158077 additions and 52 deletions

25
.gitignore vendored
View File

@ -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
View 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
View 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.

View File

@ -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/)

View 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
View 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);
}

View 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 . '&nbsp;&nbsp;|&nbsp;&nbsp;';
}
$data['param'] = $param_value;
$content->offsetSet($k, $data);
}
return table_assign(1, '', $content);
}
}

View 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);
}
}

View 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, "删除失败");
}
}
}

View 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();
}
}

View 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 '错误';
}
}

View 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, "删除失败");
}
}
}

View 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, "退出成功");
}
}

View 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, '删除失败');
}
}
}

View 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, '删除失败');
}
}
}

View 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, "删除失败");
}
}
}

View 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, "删除失败");
}
}
}

View 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, "删除失败!");
}
}
}

View 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, "删除失败");
}
}
}

View 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, "删除失败");
}
}
}

View 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 . '&nbsp;&nbsp;|&nbsp;&nbsp;';
}
$data['param'] = $param_value;
$content->offsetSet($k, $data);
}
return table_assign(1, '', $content);
}
}

5
app/admin/event.php Normal file
View File

@ -0,0 +1,5 @@
<?php
// 这是系统自动生成的event定义文件
return [
];

10
app/admin/middleware.php Normal file
View File

@ -0,0 +1,10 @@
<?php
// 这是系统自动生成的middleware定义文件
return [
//开启session中间件
//'think\middleware\SessionInit',
//验证勾股cms是否完成安装
\app\home\middleware\Install::class,
//验证管理员操作权限
\app\admin\middleware\Auth::class,
];

View 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;
}
}
}

View 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);
}
}

View File

@ -0,0 +1,7 @@
<?php
namespace app\admin\model;
use think\Model;
class Admin extends Model
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace app\admin\model;
use think\Model;
class AdminGroup extends Model
{
}

View 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;
}
}

View File

@ -0,0 +1,7 @@
<?php
namespace app\admin\model;
use think\Model;
class Article extends Model
{
}

View 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
View File

@ -0,0 +1,7 @@
<?php
namespace app\admin\model;
use think\Model;
class Nav extends Model
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace app\admin\model;
use think\Model;
class NavInfo extends Model
{
}

View 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']);
}
}

View 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');
}
}

View File

@ -0,0 +1,7 @@
<?php
namespace app\admin\model;
use think\Model;
class Slide extends Model
{
}

View 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
View File

@ -0,0 +1,8 @@
<?php
namespace app\admin\model;
use think\Model;
class User extends Model
{
}

View 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;
}
}

View 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'],
];
}

View 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'],
];
}

View 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'],
];
}

View 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;
}
}

View 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;
}
}
}

View 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'],
];
}

View 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'],
];
}

View 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'],
];
}

View 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'],
];
}

View 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'],
];
}

View 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'],
];
}

View 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' => '验证码不正确',
];
}

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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>

View 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>

View 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>

View 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.com163邮箱的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/587163邮箱的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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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>

View 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>

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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}
<!-- /脚本 -->

View 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
View 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;
}

View 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
View 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