first commit
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
/**
|
||||
======================
|
||||
*模块数据获取公共文件
|
||||
======================
|
||||
*/
|
||||
use think\facade\Db;
|
||||
|
||||
|
||||
//读取后台菜单列表
|
||||
function admin_menu()
|
||||
{
|
||||
$menu = Db::name('AdminRule')->where(['menu' => 1, 'status' => 1])->order('sort asc,id asc')->select()->toArray();
|
||||
return $menu;
|
||||
}
|
||||
|
||||
//读取权限节点列表
|
||||
function admin_rule()
|
||||
{
|
||||
$rule = Db::name('AdminRule')->where(['status' => 1])->order('sort asc,id asc')->select()->toArray();
|
||||
return $rule;
|
||||
}
|
||||
|
||||
//读取权限分组列表
|
||||
function admin_group()
|
||||
{
|
||||
$group = Db::name('AdminGroup')->order('id desc')->select()->toArray();
|
||||
return $group;
|
||||
}
|
||||
|
||||
//读取指定权限分组菜单详情
|
||||
function admin_group_info($id)
|
||||
{
|
||||
$rule = Db::name('AdminGroup')->where(['id' => $id])->value('rules');
|
||||
$rules = explode(',', $rule);
|
||||
return $rules;
|
||||
}
|
||||
|
||||
//读取公告分类列表
|
||||
function admin_note_cate()
|
||||
{
|
||||
$cate = Db::name('NoteCate')->order('id desc')->select()->toArray();
|
||||
return $cate;
|
||||
}
|
||||
|
||||
//读取公告分类子分类ids
|
||||
function admin_note_cate_son($id = 0, $is_self = 1)
|
||||
{
|
||||
$cate = admin_note_cate();
|
||||
$cate_list = get_data_node($cate, $id);
|
||||
$cate_array = array_column($cate_list, 'id');
|
||||
if ($is_self == 1) {
|
||||
//包括自己在内
|
||||
$cate_array[] = $id;
|
||||
}
|
||||
return $cate_array;
|
||||
}
|
||||
|
||||
//读取知识分类分类
|
||||
function admin_knowledge_cate()
|
||||
{
|
||||
$cate = Db::name('KnowledgeCate')->order('id desc')->select()->toArray();
|
||||
return $cate;
|
||||
}
|
||||
|
||||
//读取知识分类子分类ids
|
||||
function admin_knowledge_cate_son($id = 0, $is_self = 1)
|
||||
{
|
||||
$cate = admin_knowledge_cate();
|
||||
$cate_list = get_data_node($cate, $id);
|
||||
$cate_array = array_column($cate_list, 'id');
|
||||
if ($is_self == 1) {
|
||||
//包括自己在内
|
||||
$cate_array[] = $id;
|
||||
}
|
||||
return $cate_array;
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2021 勾股工作室
|
||||
* @license https://opensource.org/licenses/Apache-2.0
|
||||
* @link https://blog.gougucms.com
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\ConfCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Api
|
||||
// extends BaseController
|
||||
{
|
||||
//清空缓存
|
||||
public function cache_clear()
|
||||
{
|
||||
\think\facade\Cache::clear();
|
||||
return to_assign(0, '系统缓存已清空');
|
||||
}
|
||||
|
||||
//发送测试邮件
|
||||
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(0, '发送成功,请注意查收');
|
||||
}
|
||||
return to_assign(1, '发送失败');
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 测试邮件发送
|
||||
public function email_test()
|
||||
{
|
||||
$sender = get_params('email');
|
||||
//检查是否邮箱格式
|
||||
if (!is_email($sender)) {
|
||||
return to_assign(1, '测试邮箱码格式有误');
|
||||
}
|
||||
$email_config = \think\facade\Db::name('config')
|
||||
->where('name', 'email')
|
||||
->find();
|
||||
$config = unserialize($email_config['content']);
|
||||
$content = $config['template'];
|
||||
print_r($content);
|
||||
//所有项目必须填写
|
||||
if (empty($config['smtp']) || empty($config['smtp_port']) || empty($config['smtp_user']) || empty($config['smtp_pwd'])) {
|
||||
return to_assign(1, '请完善邮件配置信息!');
|
||||
}
|
||||
|
||||
$send = send_email($sender, '测试邮件', $content);
|
||||
if ($send) {
|
||||
return to_assign(0, '邮件发送成功!');
|
||||
} else {
|
||||
return to_assign(1, '邮件发送失败!');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\ConfCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Conf extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
$where[] = ['status', '>=', 0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$content = Db::name('Config')
|
||||
->where($where)
|
||||
->paginate($rows, false, ['query' => $param]);
|
||||
return table_assign(0, '', $content);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加/编辑配置项
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
try {
|
||||
validate(ConfCheck::class)->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('config')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('Config')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$config = Db::name('Config')->where(['id' => $id])->find();
|
||||
View::assign('config', $config);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除配置项
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$data['status'] = '-1';
|
||||
$data['id'] = $id;
|
||||
$data['update_time'] = time();
|
||||
if (Db::name('Config')->update($data) !== false) {
|
||||
add_log('delete', $id, $data);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//编辑配置信息
|
||||
public function edit()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
$data['content'] = serialize($param);
|
||||
$data['update_time'] = time();
|
||||
$data['id'] = $param['id'];
|
||||
$res = Db::name('Config')->strict(false)->field(true)->update($data);
|
||||
$conf = Db::name('Config')->where('id', $param['id'])->find();
|
||||
clear_cache('system_config' . $conf['name']);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$conf = Db::name('Config')->where('id', $id)->find();
|
||||
$config = [];
|
||||
if ($conf['content']) {
|
||||
$config = unserialize($conf['content']);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('config', $config);
|
||||
return view($conf['name']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use backup\Backup;
|
||||
use think\facade\Session;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Database extends BaseController
|
||||
{
|
||||
//数据表列表
|
||||
public function database()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
// 数据信息
|
||||
$db = new Backup();
|
||||
$list = $db->dataList();
|
||||
// 计算总大小
|
||||
$total = 0;
|
||||
foreach ($list as $k => $v) {
|
||||
$total += $v['data_length'];
|
||||
$list[$k]['data_size'] = $v['data_length'];
|
||||
$list[$k]['data_length'] = format_bytes($v['data_length']);
|
||||
}
|
||||
// 提示信息
|
||||
$dataTips = '数据库中共有<strong> ' . count($list) . '</strong> 张表,共计 <strong>' . format_bytes($total) . '</strong>大小。';
|
||||
$data['data'] = $list;
|
||||
return table_assign(0, $dataTips, $data);
|
||||
}
|
||||
return view();
|
||||
}
|
||||
|
||||
//备份数据
|
||||
public function backup()
|
||||
{
|
||||
$db = new Backup();
|
||||
if (request()->isPost()) {
|
||||
$tables = get_params('tables');
|
||||
$fileinfo = $db->getFile();
|
||||
//检查是否有正在执行的任务
|
||||
$lock = "{$fileinfo['filepath']}backup.lock";
|
||||
if (is_file($lock)) {
|
||||
return to_assign(2, '检测到有一个备份任务未完成');
|
||||
} else {
|
||||
//创建锁文件
|
||||
file_put_contents($lock, time());
|
||||
}
|
||||
// 检查备份目录是否可写
|
||||
if (!is_writeable($fileinfo['filepath'])) {
|
||||
return to_assign(1, '备份目录不存在或不可写,请检查后重试!');
|
||||
}
|
||||
|
||||
//缓存锁文件
|
||||
Session::set('lock', $lock);
|
||||
//缓存备份文件信息
|
||||
Session::set('backup_file', $fileinfo['file']);
|
||||
//缓存要备份的表
|
||||
Session::set('backup_tables', $tables);
|
||||
//创建备份文件
|
||||
if (false !== $db->Backup_Init()) {
|
||||
return to_assign(0, '初始化成功,开始备份...', ['tab' => ['id' => 0, 'start' => 0, 'table' => $tables[0]]]);
|
||||
} else {
|
||||
return to_assign(1, '初始化失败,备份文件创建失败!');
|
||||
}
|
||||
} else if (request()->isGet()) {
|
||||
$tables = Session::get('backup_tables');
|
||||
$file = Session::get('backup_file');
|
||||
$id = get_params('id');
|
||||
$start = get_params('start');
|
||||
$start = $db->setFile($file)->backup($tables[$id], $start);
|
||||
if (false === $start) {
|
||||
return to_assign(1, '备份出错');
|
||||
} else if (0 === $start) {
|
||||
if (isset($tables[++$id])) {
|
||||
return to_assign(0, '备份完成', ['tab' => ['id' => $id, 'start' => 0, 'table' => $tables[$id - 1]]]);
|
||||
} else { //备份完成,清空缓存
|
||||
unlink(Session::get('lock'));
|
||||
Session::delete('backup_tables');
|
||||
Session::delete('backup_file');
|
||||
add_log('bak');
|
||||
return to_assign(0, '备份完成', ['tab' => ['start' => 'ok', 'table' => $tables[$id - 1]]]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '参数错误!');
|
||||
}
|
||||
}
|
||||
|
||||
//优化表
|
||||
public function optimize($tables = null)
|
||||
{
|
||||
$db = new Backup();
|
||||
//return to_assign(0, $db->optimize($tables));
|
||||
if ($db->optimize($tables)) {
|
||||
add_log('optimize');
|
||||
return to_assign(0, '数据表优化完成');
|
||||
} else {
|
||||
return to_assign(1, '数据表优化出错请重试');
|
||||
}
|
||||
}
|
||||
|
||||
//修复表
|
||||
public function repair($tables = null)
|
||||
{
|
||||
$db = new Backup();
|
||||
//return to_assign(0, $db->repair($tables));
|
||||
if ($db->repair($tables)) {
|
||||
add_log('repair');
|
||||
return to_assign(0, '数据表修复完成');
|
||||
} else {
|
||||
return to_assign(1, '数据表修复出错请重试');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//备份文件列表
|
||||
public function backuplist()
|
||||
{
|
||||
$db = new Backup();
|
||||
$list = $db->fileList();
|
||||
$fileinfo = $db->getFile();
|
||||
$lock = "{$fileinfo['filepath']}backup.lock";
|
||||
$lock_time = 0;
|
||||
if (is_file($lock)) {
|
||||
$lock_time = file_get_contents($lock);
|
||||
}
|
||||
$listNew = [];
|
||||
$indx = 0;
|
||||
foreach ($list as $k => $v) {
|
||||
$listNew[$indx]['time'] = $k;
|
||||
$listNew[$indx]['timespan'] = $v['time'];
|
||||
$listNew[$indx]['data'] = $v;
|
||||
$indx++;
|
||||
}
|
||||
$list = $listNew;
|
||||
array_multisort(array_column($list, 'time'), SORT_DESC, $list);
|
||||
return view('', ['list' => $list, 'lock_time' => $lock_time]);
|
||||
}
|
||||
|
||||
//数据还原
|
||||
public function import($time = 0, $part = null, $start = null)
|
||||
{
|
||||
$db = new Backup();
|
||||
$time = (int) $time;
|
||||
if (is_numeric($time) && is_null($part) && is_null($start)) {
|
||||
$list = $db->getFile('timeverif', $time);
|
||||
if (is_array($list)) {
|
||||
Session::set('backup_list', $list);
|
||||
return to_assign(0, '初始化完成,开始还原...', array('part' => 1, 'start' => 0, 'time' => $time));
|
||||
} else {
|
||||
return to_assign(1, '备份文件可能已经损坏,请检查');
|
||||
}
|
||||
} else if (is_numeric($part) && is_numeric($start)) {
|
||||
$list = Session::get('backup_list');
|
||||
$part = (int) $part;
|
||||
$start = (int) $start;
|
||||
$start = $db->setFile($list)->import($start, $time, $part);
|
||||
if (false === $start) {
|
||||
return to_assign(1, '还原数据出错,请重试');
|
||||
} elseif (0 === $start) {
|
||||
if (isset($list[++$part])) {
|
||||
$data = array('part' => $part, 'start' => 0, 'time' => $time);
|
||||
return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面", $data);
|
||||
} else {
|
||||
Session::delete('backup_list');
|
||||
return to_assign(0, '还原数据成功');
|
||||
}
|
||||
} else {
|
||||
$data = array('part' => $part, 'start' => $start[0], 'time' => $time);
|
||||
if ($start[1]) {
|
||||
$rate = floor(100 * ($start[0] / $start[1]));
|
||||
return to_assign(0, "正在还原...卷{$part} ({$rate}%),请勿关闭当前页面", $data);
|
||||
} else {
|
||||
$data['gz'] = 1;
|
||||
return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面", $data);
|
||||
}
|
||||
return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "参数错误");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 删除备份文件
|
||||
*/
|
||||
public function del($time = 0, $lock = 0)
|
||||
{
|
||||
$db = new Backup();
|
||||
if ($lock == 1) {
|
||||
$fileinfo = $db->getFile();
|
||||
$lock = "{$fileinfo['filepath']}backup.lock";
|
||||
if (is_file($lock)) {
|
||||
$time = file_get_contents($lock);
|
||||
unlink($lock);
|
||||
}
|
||||
}
|
||||
if ($db->delFile((int) $time)) {
|
||||
add_log('delete');
|
||||
return to_assign(0, '删除成功');
|
||||
} else {
|
||||
return to_assign(0, '删除失败,请检查权限');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 下载备份文件
|
||||
*/
|
||||
public function downfile($time = 0, $part = 0)
|
||||
{
|
||||
$db = new Backup();
|
||||
add_log('down');
|
||||
$db->downloadFile((int) $time, $part - 1);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\DepartmentCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Department extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = Db::name('Department')
|
||||
->field('d.*,a.name as leader')
|
||||
->alias('d')
|
||||
->join('Admin a', 'a.id = d.leader_id', 'LEFT')
|
||||
->order('d.id asc')
|
||||
->select();
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加部门
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
if ($param['id'] > 0) {
|
||||
try {
|
||||
validate(DepartmentCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$department_array = get_department_son($param['id']);
|
||||
if (in_array($param['pid'], $department_array)) {
|
||||
return to_assign(1, '上级部门不能是该部门本身或其下属部门');
|
||||
} else {
|
||||
Db::name('Department')->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(DepartmentCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$did = Db::name('Department')->strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $did, $param);
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
$department = set_recursion(get_department());
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('Department')->where(['id' => $id])->find();
|
||||
$users = Db::name('Admin')->where(['did' => $id, 'status' => 1])->select();
|
||||
View::assign('users', $users);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('department', $department);
|
||||
View::assign('pid', $pid);
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$count = Db::name('Department')->where([['pid', '=', $id], ['status', '>=', 0]])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(1, "该部门下还有子部门,无法删除");
|
||||
}
|
||||
$users = Db::name('Admin')->where([['did', '=', $id], ['status', '>=', 0]])->count();
|
||||
if ($users > 0) {
|
||||
return to_assign(1, "该部门下还有员工,无法删除");
|
||||
}
|
||||
if (Db::name('Department')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\KnowledgeCateCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Kcate extends BaseController
|
||||
{
|
||||
//知识类别
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('KnowledgeCate')->order('create_time asc')->select();
|
||||
return to_assign(0, '', $cate);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function tags()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('KnowledgeTags')->order('id asc')->select();
|
||||
return to_assign(0, '', $cate);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//知识分类添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(KnowledgeCateCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$cate_array = admin_knowledge_cate_son($param['id']);
|
||||
if (in_array($param['pid'], $cate_array)) {
|
||||
return to_assign(1, '父级分类不能是该分类本身或其子分类');
|
||||
} else {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('KnowledgeCate')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(KnowledgeCateCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('KnowledgeCate')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
$cate = Db::name('KnowledgeCate')->order('id desc')->select()->toArray();
|
||||
$cates = set_recursion($cate);
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('KnowledgeCate')->where(['id' => $id])->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('pid', $pid);
|
||||
View::assign('cates', $cates);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除知识分类
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$cate_count = Db::name('KnowledgeCate')->where(["pid" => $id])->count();
|
||||
if ($cate_count > 0) {
|
||||
return to_assign(1, "该分类下还有子分类,无法删除");
|
||||
}
|
||||
$content_count = Db::name('Knowledge')->where(["cate_id" => $id])->count();
|
||||
if ($content_count > 0) {
|
||||
return to_assign(1, "该分类下还有文档,无法删除");
|
||||
}
|
||||
if (Db::name('KnowledgeCate')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Log extends BaseController
|
||||
{
|
||||
//管理员操作日志
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['name|rule_menu|param_id', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['action'])) {
|
||||
$where['action'] = $param['action'];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$content = DB::name('AdminLog')
|
||||
->field("id,uid,name,action,title,content,rule_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);
|
||||
if (is_array($param_array)) {
|
||||
$param_value = '';
|
||||
foreach ($param_array as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
$value = implode(',', $value);
|
||||
}
|
||||
$param_value .= $key . ':' . $value . ' | ';
|
||||
}
|
||||
$data['param'] = $param_value;
|
||||
} else {
|
||||
$data['param'] = $param_array;
|
||||
}
|
||||
$content->offsetSet($k, $data);
|
||||
}
|
||||
return table_assign(0, '', $content);
|
||||
} else {
|
||||
$type_action = get_config('log.type_action');
|
||||
View::assign('type_action', $type_action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 李志强
|
||||
* @author 李志强
|
||||
* @link https://www.yunzer.cn
|
||||
*/
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\ConfCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
class Mail extends BaseController
|
||||
{
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\NoteCateCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Ncate extends BaseController
|
||||
{
|
||||
//公告类别
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('NoteCate')->order('create_time asc')->select();
|
||||
return to_assign(0, '', $cate);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//公告类别添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(NoteCateCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$note_array = admin_note_cate_son($param['id']);
|
||||
if (in_array($param['pid'], $note_array)) {
|
||||
return to_assign(1, '父级分类不能是该分类本身或其子分类');
|
||||
} else {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('NoteCate')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(NoteCateCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('NoteCate')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
$cate = $cate = Db::name('NoteCate')->order('id desc')->select()->toArray();
|
||||
$cates = set_recursion($cate);
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('NoteCate')->where(['id' => $id])->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('pid', $pid);
|
||||
View::assign('cates', $cates);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//公告类别删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$cate_count = Db::name('NoteCate')->where(["pid" => $id])->count();
|
||||
if ($cate_count > 0) {
|
||||
return to_assign(1, "该分类下还有子分类,无法删除");
|
||||
}
|
||||
$content_count = Db::name('Note')->where(["cate_id" => $id])->count();
|
||||
if ($content_count > 0) {
|
||||
return to_assign(1, "该分类下还有公告,无法删除");
|
||||
}
|
||||
if (Db::name('NoteCate')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\validate\NoteCheck;
|
||||
use app\base\BaseController;
|
||||
use app\model\Note as NoteList;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Note extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['a.title|a.content', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['a.delete_time', '=', 0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$note = NoteList::where($where)
|
||||
->field('a.*,c.title as cate_title')
|
||||
->alias('a')
|
||||
->join('NoteCate c', 'a.cate_id = c.id', 'LEFT')
|
||||
->order('a.create_time desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$item->start_time = empty($item->start_time) ? '-' : date('Y-m-d', $item->start_time);
|
||||
$item->end_time = empty($item->end_time) ? '-' : date('Y-m-d', $item->end_time);
|
||||
});
|
||||
return table_assign(0, '', $note);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
//markdown数据处理
|
||||
if (isset($param['table-align'])) {
|
||||
unset($param['table-align']);
|
||||
}
|
||||
if (isset($param['docContent-html-code'])) {
|
||||
$param['content'] = $param['docContent-html-code'];
|
||||
$param['md_content'] = $param['docContent-markdown-doc'];
|
||||
unset($param['docContent-html-code']);
|
||||
unset($param['docContent-markdown-doc']);
|
||||
}
|
||||
if (isset($param['ueditorcontent'])) {
|
||||
$param['content'] = $param['ueditorcontent'];
|
||||
$param['md_content'] = '';
|
||||
}
|
||||
|
||||
$param['start_time'] = isset($param['start_time']) ? strtotime(urldecode($param['start_time'])) : 0;
|
||||
$param['end_time'] = isset($param['end_time']) ? strtotime(urldecode($param['end_time'])) : 0;
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(NoteCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = NoteList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(NoteCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$sid = NoteList::strict(false)->field(true)->insertGetId($param);
|
||||
if ($sid) {
|
||||
add_log('add', $sid, $param);
|
||||
$users = Db::name('Admin')->where(['status' => 1])->column('id');
|
||||
sendMessage($users, 1, ['title' => $param['title'], 'from_uid' => $this->uid, 'action_id' => $sid]);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$note = Db::name('Note')->where(['id' => $id])->find();
|
||||
View::assign('note', $note);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$id = empty(get_params('id')) ? 0 : get_params('id');
|
||||
$note = Db::name('Note')->where(['id' => $id])->find();
|
||||
View::assign('note', $note);
|
||||
return view();
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$data['delete_time'] = time();
|
||||
$data['id'] = $id;
|
||||
if (Db::name('Note')->update($data) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\PositionCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Position extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select()->toArray();
|
||||
foreach ($list as &$val) {
|
||||
$groupId = Db::name('PositionGroup')->where(['pid' => $val['id']])->column('group_id');
|
||||
$groupName = Db::name('AdminGroup')->where('id', 'in', $groupId)->column('title');
|
||||
$val['groupName'] = implode(',', $groupName);
|
||||
}
|
||||
$res['data'] = $list;
|
||||
return table_assign(0, '', $res);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(PositionCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
Db::name('Position')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
Db::name('PositionGroup')->where(['pid' => $param['id']])->delete();
|
||||
foreach ($param['group_id'] as $k => $v) {
|
||||
$data[$k] = [
|
||||
'pid' => $param['id'],
|
||||
'group_id' => $v,
|
||||
'create_time' => time(),
|
||||
];
|
||||
}
|
||||
Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
|
||||
add_log('edit', $param['id'], $param);
|
||||
//清除菜单\权限缓存
|
||||
clear_cache('adminMenu');
|
||||
clear_cache('adminRules');
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
} catch (\Exception $e) {
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return to_assign(1, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(PositionCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
$uid = Db::name('Position')->strict(false)->field(true)->insertGetId($param);
|
||||
foreach ($param['group_id'] as $k => $v) {
|
||||
$data[$k] = [
|
||||
'pid' => $uid,
|
||||
'group_id' => $v,
|
||||
'create_time' => time(),
|
||||
];
|
||||
}
|
||||
Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
|
||||
add_log('add', $uid, $param);
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
} catch (\Exception $e) {
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return to_assign(1, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray();
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('Position')->where(['id' => $id])->find();
|
||||
$detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id');
|
||||
foreach ($group as &$val) {
|
||||
if (in_array($val['id'], $detail['group_id'])) {
|
||||
$val['checked'] = 1;
|
||||
} else {
|
||||
$val['checked'] = 0;
|
||||
}
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('group', $group);
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$id = get_params('id');
|
||||
$group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray();
|
||||
$detail = Db::name('Position')->where(['id' => $id])->find();
|
||||
$detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id');
|
||||
foreach ($group as &$val) {
|
||||
if (in_array($val['id'], $detail['group_id'])) {
|
||||
$val['checked'] = 1;
|
||||
} else {
|
||||
$val['checked'] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$rule = Db::name('AdminRule')->order('sort asc,id asc')->select()->toArray();
|
||||
$user_groups = Db::name('PositionGroup')
|
||||
->alias('a')
|
||||
->join("AdminGroup g", "a.group_id=g.id", 'LEFT')
|
||||
->where("a.pid='{$id}' and g.status='1'")
|
||||
->select()
|
||||
->toArray();
|
||||
$groups = $user_groups ?: [];
|
||||
|
||||
$rules = [];
|
||||
foreach ($groups as $g) {
|
||||
$rules = array_merge($rules, explode(',', trim($g['rules'], ',')));
|
||||
}
|
||||
$rules = array_unique($rules);
|
||||
|
||||
$role_rule = create_tree_list(0, $rule, $rules);
|
||||
View::assign('role_rule', $role_rule);
|
||||
View::assign('detail', $detail);
|
||||
View::assign('group', $group);
|
||||
add_log('view', $id);
|
||||
return view();
|
||||
}
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
if ($id == 1) {
|
||||
return to_assign(0, "超级岗位,不能删除");
|
||||
}
|
||||
$data['status'] = '-1';
|
||||
$data['id'] = $id;
|
||||
$data['update_time'] = time();
|
||||
if (Db::name('Position')->update($data) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\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()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$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(0, '', $group);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
$ruleData = isset($param['rule']) ? $param['rule'] : 0;
|
||||
$param['rules'] = implode(',', $ruleData);
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(GroupCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
//为了系统安全id为1的系统所有者管理组不允许修改
|
||||
if ($param['id'] == 1) {
|
||||
return to_assign(1, '为了系统安全,该管理组不允许修改');
|
||||
}
|
||||
Db::name('AdminGroup')->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(1, $e->getError());
|
||||
}
|
||||
$gid = Db::name('AdminGroup')->strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $gid, $param);
|
||||
}
|
||||
//清除菜单\权限缓存
|
||||
clear_cache('adminMenu');
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$rule = admin_rule();
|
||||
if ($id > 0) {
|
||||
$rules = admin_group_info($id);
|
||||
$role_rule = create_tree_list(0, $rule, $rules);
|
||||
$role = Db::name('AdminGroup')->where(['id' => $id])->find();
|
||||
View::assign('role', $role);
|
||||
} else {
|
||||
$role_rule = create_tree_list(0, $rule, []);
|
||||
}
|
||||
View::assign('role_rule', $role_rule);
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
if ($id == 1) {
|
||||
return to_assign(1, "该组是系统所有者,无法删除");
|
||||
}
|
||||
if (Db::name('AdminGroup')->delete($id) !== false) {
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\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()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$rule = Db::name('adminRule')->order('sort asc,id asc')->select();
|
||||
return to_assign(0, '', $rule);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
$param['src'] = preg_replace('# #', '', $param['src']);
|
||||
if ($param['id'] > 0) {
|
||||
try {
|
||||
validate(RuleCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
Db::name('AdminRule')->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} else {
|
||||
try {
|
||||
validate(RuleCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$rid = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($param);
|
||||
//自动为系统所有者管理组分配新增的节点
|
||||
// $groups = Db::name('AdminGroup')->select();
|
||||
// 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);
|
||||
// }
|
||||
//自动为系统所有人分配新增的节点
|
||||
$groups = Db::name('AdminGroup')->select();
|
||||
foreach ($groups as $group) {
|
||||
$newGroup['id'] = $group['id'];
|
||||
$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();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('AdminRule')->where('id', $id)->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('pid', $pid);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$count = Db::name('AdminRule')->where(["pid" => $id])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(1, "该节点下还有子菜单,无法删除");
|
||||
}
|
||||
if (Db::name('AdminRule')->delete($id) !== false) {
|
||||
clear_cache('adminRules');
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Setting extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$install = false;
|
||||
if (file_exists(CMS_ROOT . 'app/install')) {
|
||||
$install = true;
|
||||
}
|
||||
View::assign('install', $install);
|
||||
$conf = Db::name('Config')->where('id', 1)->find();
|
||||
$config = [];
|
||||
if ($conf['content']) {
|
||||
$config = unserialize($conf['content']);
|
||||
}
|
||||
View::assign('config', $config);
|
||||
View::assign('TP_VERSION', \think\facade\App::version());
|
||||
return View();
|
||||
}
|
||||
|
||||
public function errorShow()
|
||||
{
|
||||
echo '错误';
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\TaskCateCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Tcate extends BaseController
|
||||
{
|
||||
//任务类别
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('TaskCate')->order('sort desc')->select();
|
||||
return to_assign(0, '', $cate);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//任务类别添加
|
||||
public function add()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(TaskCateCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$data['update_time'] = time();
|
||||
$res = Db::name('TaskCate')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(TaskCateCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('TaskCate')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//任务类别设置
|
||||
public function check()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$res = Db::name('TaskCate')->strict(false)->field('id,status')->update($param);
|
||||
if ($res) {
|
||||
if ($param['status'] == 0) {
|
||||
add_log('disable', $param['id'], $param);
|
||||
} else if ($param['status'] == 1) {
|
||||
add_log('recover', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(0, '错误的请求');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,346 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Admin as AdminList;
|
||||
use app\admin\validate\AdminCheck;
|
||||
use avatars\MDAvatars;
|
||||
use Overtrue\Pinyin\Pinyin;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class User extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|username|name|nickname|mobile|desc', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['status', '<', 2];
|
||||
if (isset($param['status']) && $param['status'] != '') {
|
||||
$where[] = ['status', '=', $param['status']];
|
||||
}
|
||||
if (!empty($param['type'])) {
|
||||
$where[] = ['type', '=', $param['type']];
|
||||
}
|
||||
if (!empty($param['did'])) {
|
||||
$department_array = get_department_son($param['did']);
|
||||
$where[] = ['did', 'in', $department_array];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$admin = AdminList::where($where)
|
||||
->order('id desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$item->department = Db::name('Department')->where(['id' => $item->did])->value('title');
|
||||
$item->position = Db::name('Position')->where(['id' => $item->position_id])->value('title');
|
||||
$item->entry_time = empty($item->entry_time) ? '-' : date('Y-m-d', $item->entry_time);
|
||||
$item->last_login_time = empty($item->last_login_time) ? '-' : date('Y-m-d H:i', $item->last_login_time);
|
||||
$item->last_login_ip = empty($item->last_login_ip) ? '-' : $item->last_login_ip;
|
||||
});
|
||||
return table_assign(0, '', $admin);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
$param['entry_time'] = strtotime($param['entry_time']);
|
||||
$param['nickname'] = $param['name'];
|
||||
$pinyin = new Pinyin();
|
||||
$username = $pinyin->name($param['name'], PINYIN_UMLAUT_V);
|
||||
$param['username'] = implode('', $username);
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$count = Db::name('Admin')->where([['username', 'like', $param['username'] . '%'], ['id', '<>', $param['id']]])->count();
|
||||
if ($count > 0) {
|
||||
$param['username'] = implode('', $username) . $count;
|
||||
}
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
Db::name('Admin')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
if (!isset($param['thumb']) || $param['thumb'] == '') {
|
||||
$char = mb_substr($param['name'], 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');
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
} catch (\Exception $e) {
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return to_assign(1, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
} else {
|
||||
$count = Db::name('Admin')->where([['username', 'like', $param['username'] . '%']])->count();
|
||||
if ($count > 0) {
|
||||
$param['username'] = implode('', $username) . $count;
|
||||
}
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['salt'] = set_salt(20);
|
||||
$param['pwd'] = set_password($param['reg_pwd'], $param['salt']);
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
$uid = Db::name('Admin')->strict(false)->field(true)->insertGetId($param);
|
||||
if (!isset($param['thumb']) || $param['thumb'] == '') {
|
||||
$char = mb_substr($param['name'], 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(1, '提交失败:' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$department = set_recursion(get_department());
|
||||
$position = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select();
|
||||
if ($id > 0) {
|
||||
$detail = get_admin($id);
|
||||
View::assign('detail', $detail);
|
||||
} else {
|
||||
//初始化密码
|
||||
$reg_pwd = set_salt(6);
|
||||
View::assign('reg_pwd', $reg_pwd);
|
||||
}
|
||||
View::assign('department', $department);
|
||||
View::assign('position', $position);
|
||||
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();
|
||||
return $path;
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$id = get_params('id');
|
||||
$detail = get_admin($id);
|
||||
//查询所有菜单和权限节点
|
||||
$menu = Db::name('AdminRule')->where(['menu' => 1])->order('sort asc,id asc')->select()->toArray();
|
||||
$rule = Db::name('AdminRule')->order('sort asc,id asc')->select()->toArray();
|
||||
|
||||
//查询用户拥有的查单和节点
|
||||
$user_groups = Db::name('PositionGroup')
|
||||
->alias('a')
|
||||
->join("AdminGroup g", "a.group_id=g.id", 'LEFT')
|
||||
->where([['a.pid', '=', $detail["position_id"]], ['g.status', '=', 1]])
|
||||
->select()
|
||||
->toArray();
|
||||
$groups = $user_groups ?: [];
|
||||
|
||||
$rules = [];
|
||||
foreach ($groups as $g) {
|
||||
$rules = array_merge($rules, explode(',', trim($g['rules'], ',')));
|
||||
}
|
||||
$rules = array_unique($rules);
|
||||
|
||||
//数据嵌套
|
||||
$role_rule = create_tree_list(0, $rule, $rules);
|
||||
|
||||
View::assign('role_rule', $role_rule);
|
||||
View::assign('detail', $detail);
|
||||
add_log('view', get_params('id'));
|
||||
return view();
|
||||
}
|
||||
|
||||
//禁用,恢复
|
||||
public function set()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$type = get_params("type");
|
||||
$ids = get_params("ids");
|
||||
$idArray = explode(',', $ids);
|
||||
$list = [];
|
||||
foreach ($idArray as $key => $val) {
|
||||
if ($val == 1) {
|
||||
continue;
|
||||
}
|
||||
$list[] = [
|
||||
'status' => $type,
|
||||
'id' => $val,
|
||||
'update_time' => time(),
|
||||
];
|
||||
}
|
||||
foreach ($list as $key => $v) {
|
||||
if (Db::name('Admin')->update($v) !== false) {
|
||||
if ($type == 0) {
|
||||
add_log('disable', $v['id']);
|
||||
} else if ($type == 1) {
|
||||
add_log('recover', $v['id']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return to_assign(0, '操作成功');
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//重置密码
|
||||
public function reset()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$id = get_params("id");
|
||||
if ($id == 1) {
|
||||
return to_assign(1, '该账号是超级管理员,不允许重置');
|
||||
}
|
||||
$new_pwd = set_salt(6);
|
||||
$salt = set_salt(20);
|
||||
$data = [
|
||||
'reg_pwd' => $new_pwd,
|
||||
'salt' => $salt,
|
||||
'pwd' => set_password($new_pwd, $salt),
|
||||
'id' => $id,
|
||||
'update_time' => time(),
|
||||
];
|
||||
if (Db::name('Admin')->update($data) !== false) {
|
||||
add_log('reset', $id);
|
||||
return to_assign(0, '操作成功');
|
||||
} else {
|
||||
return to_assign(1, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//获取员工数据
|
||||
public function getuserinfo() {
|
||||
try {
|
||||
// 查询数据
|
||||
$list = Db::name('Admin')
|
||||
->field('id, nickname') // 选择所需字段
|
||||
->where('status', 1) // 增加条件,status 值为 1
|
||||
->order('id desc') // 按 id 倒序排序
|
||||
->select(); // 获取数据
|
||||
|
||||
// 返回成功响应
|
||||
return json([
|
||||
'code' => 1, // 成功状态码
|
||||
'msg' => '获取成功', // 提示信息
|
||||
'data' => $list // 数据展示
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
// 捕获异常并返回错误信息
|
||||
return json([
|
||||
'code' => 0, // 失败状态码
|
||||
'msg' => '获取失败: ' . $e->getMessage(), // 错误信息
|
||||
'data' => [] // 空数据
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\admin\validate\WorkCateCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Wcate extends BaseController
|
||||
{
|
||||
//工作类别
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('WorkCate')->order('id asc')->select();
|
||||
return to_assign(0, '', $cate);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//工作类别添加
|
||||
public function add()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(WorkCateCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$data['update_time'] = time();
|
||||
$res = Db::name('WorkCate')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(WorkCateCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('WorkCate')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//工作类别设置
|
||||
public function check()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$res = Db::name('WorkCate')->strict(false)->field('id,status')->update($param);
|
||||
if ($res) {
|
||||
if ($param['status'] == 0) {
|
||||
add_log('disable', $param['id'], $param);
|
||||
} else if ($param['status'] == 1) {
|
||||
add_log('recover', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(0, '错误的请求');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
// 这是系统自动生成的event定义文件
|
||||
return [
|
||||
|
||||
];
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
\app\home\middleware\Install::class,
|
||||
];
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\home\middleware;
|
||||
|
||||
class Install
|
||||
{
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
if (!is_installed()) {
|
||||
return $request->isAjax() ? to_assign(1, '请先完成系统安装引导') : redirect((string) url('/install/index'));
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class AdminCheck extends Validate
|
||||
{
|
||||
protected $regex = ['checkUser' => '/^[A-Za-z]{1}[A-Za-z0-9_-]{4,19}$/'];
|
||||
|
||||
protected $rule = [
|
||||
'name' => 'require|chs',
|
||||
'username' => 'require|regex:checkUser|unique:admin',
|
||||
'mobile' => 'require|mobile|unique:admin',
|
||||
'reg_pwd' => 'require|min:6',
|
||||
'did' => 'require',
|
||||
'position_id' => 'require',
|
||||
'type' => 'require',
|
||||
'entry_time' => 'require',
|
||||
'id' => 'require',
|
||||
'pwd' => 'require|min:6|confirm',
|
||||
'status' => 'require|checkStatus:-1,1',
|
||||
'old_pwd' => 'require|different:pwd',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '员工姓名不能为空',
|
||||
'name.chs' => '员工姓名只能是汉字',
|
||||
'username.require' => '登录账号不能为空',
|
||||
'username.regex' => '登录账号必须是以字母开头,只能包含字母数字下划线和减号,5到20位',
|
||||
'username.unique' => '同样的登录账号已经存在,建议增加数字,如:xxx123',
|
||||
'mobile.require' => '手机不能为空',
|
||||
'mobile.mobile' => '手机格式错误',
|
||||
'mobile.unique' => '同样的手机号码已经存在,请检查一下是否被离职或者禁用员工占用',
|
||||
'reg_pwd.require' => '密码不能为空',
|
||||
'reg_pwd.min' => '密码至少要6个字符',
|
||||
'did.require' => '请选择所在部门',
|
||||
'position_id.require' => '请选择职位',
|
||||
'type.require' => '请选择员工类型',
|
||||
'entry_time.require' => '请选择入职时间',
|
||||
'id.require' => '缺少更新条件',
|
||||
'pwd.require' => '密码不能为空',
|
||||
'pwd.min' => '密码至少要6个字符',
|
||||
'pwd.confirm' => '两次密码不一致',
|
||||
'old_pwd.require' => '请提供旧密码',
|
||||
'old_pwd.different' => '新密码不能和旧密码一样',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name', 'username', 'mobile', 'reg_pwd', 'did', 'position_id', 'type', 'entry_time'],
|
||||
'edit' => ['name', 'username', 'mobile', 'did', 'position_id', 'entry_time', 'id'],
|
||||
'editPwd' => ['old_pwd', 'pwd'],
|
||||
];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class ConfCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:config',
|
||||
'name' => 'require|lower|min:3|unique:config',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '配置名称不能为空',
|
||||
'title.unique' => '同样的配置名称已经存在',
|
||||
'name.require' => '配置标识不能为空',
|
||||
'name.lower' => '配置标识只能是小写字母',
|
||||
'name.min' => '配置标识至少需要2个小写字母',
|
||||
'name.unique' => '同样的配置标识已经存在',
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class DepartmentCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:department',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '部门名称不能为空',
|
||||
'title.unique' => '同样的部门名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class KnowledgeCateCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:knowledge_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class NoteCateCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:note_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
namespace app\admin\validate;
|
||||
use think\Validate;
|
||||
|
||||
class NoteCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:note',
|
||||
'id' => 'require',
|
||||
'status' => 'require'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '标题不能为空',
|
||||
'title.unique' => '同样的记录已经存在!',
|
||||
'id.require' => '缺少更新条件',
|
||||
'status.require' => '状态为必选',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title']
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class PositionCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:position',
|
||||
'work_price' => 'require|number',
|
||||
'group_id' => 'require',
|
||||
'id' => 'require'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '岗位名称不能为空',
|
||||
'title.unique' => '同样的岗位名称已经存在',
|
||||
'work_price.require' => '岗位工时单价不能为空',
|
||||
'work_price.number' => '岗位工时单价只能是整数',
|
||||
'group_id.require' => '至少要选择一个角色权限',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'work_price', 'group_id'],
|
||||
'edit' => ['title', 'work_price', 'group_id', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class RuleCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'name' => 'require',
|
||||
'menu' => 'require',
|
||||
'src' => 'unique:admin_rule',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '菜单节点名称不能为空',
|
||||
'src.unique' => '同样的菜单节点URL已经存在',
|
||||
'menu.require' => '是否是左侧菜单需要选择',
|
||||
'name.require' => '节点日志操作名称不能为空',
|
||||
'id.require' => '缺少更新条件'
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title', 'src', 'name', 'menu'],
|
||||
'edit' => ['id', 'title', 'src', 'name', 'menu']
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class TaskCateCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:task_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class WorkCateCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:work_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">配置项</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">配置名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入配置名称" lay-reqText="请输入配置名称" class="layui-input" {notempty name="$config.title"} value="{$config.title}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray">状态<font>*</font></td>
|
||||
<td>{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="$config.status" value="1"
|
||||
}checked{/eq}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {eq name="$config.status" value="0"
|
||||
}checked{/eq}>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
配置标识<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入配置标识" lay-reqText="请输入配置标识" autocomplete="off" class="layui-input" {notempty name="$config.name"} value="{$config.name}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align: top;">
|
||||
注意
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<span style ="color: red; font-size: 12px;">(注意:新增配置项以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的配置模板文件,然后根据需求修改对应的表单即可)</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/conf/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,121 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">邮箱配置</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">SMTP地址<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="smtp" lay-verify="required" autocomplete="off" placeholder="请输入SMTP服务器地址" lay-reqText="请输入SMTP服务器地址" class="layui-input" {notempty name="$config.smtp"} value="{$config.smtp}" {/notempty} style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">如:QQ邮箱的SMTP服务器地址是smtp.qq.com,163邮箱的SMTP服务器地址是smtp.163.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">协议端口号<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="smtp_port" lay-verify="required" autocomplete="off" placeholder="请输入端口" lay-reqText="请输入端口" class="layui-input" {notempty name="$config.smtp_port"} value="{$config.smtp_port}" {/notempty} style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">邮箱账户<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="smtp_user" autocomplete="off" lay-verify="required" placeholder="请输入邮箱用户名" lay-reqText="请输入邮箱用户名" class="layui-input" {notempty name="$config.smtp_user"} value="{$config.smtp_user}" {/notempty} style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">如:gougucms@qq.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">邮箱密码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="password" name="smtp_pwd" lay-verify="required" autocomplete="off" placeholder="请输入邮箱密码"
|
||||
class="layui-input" {notempty name="$config.smtp_pwd"} value="{$config.smtp_pwd}" {/notempty} 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-gray-2">发送人<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="from" autocomplete="off" lay-verify="required" placeholder="请输入要显示的发送者" lay-reqText="请输入要显示的发送者"
|
||||
class="layui-input" {notempty name="$config.from"} value="{$config.from}" {/notempty} style="width:240px; display: inline-block;">
|
||||
<span style="color:#999; font-size:12px;">用于展示给发送方,如:勾股CMS系统管理员</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">显示的邮箱<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="email" lay-verify="required" autocomplete="off" placeholder="请输入要显示的发送者邮箱" lay-reqText="请输入要显示的发送者邮箱"
|
||||
class="layui-input" {notempty name="$config.email"} value="{$config.email}" {/notempty} style="width:240px;display: inline-block;">
|
||||
<span style="color:#999;font-size:12px;">可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">邮件内容</td>
|
||||
<td>
|
||||
<textarea class="layui-textarea" name="template">{notempty name="$config.template"}{$config.template}{/notempty}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button lay-event="email" class="layui-btn">发送测试</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/conf/edit",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.page-content').on('click', '[lay-event="email"]', 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/email_test",
|
||||
data: { email: value },
|
||||
type: "post",
|
||||
beforeSend: function () {
|
||||
// 禁用按钮防止重复提交
|
||||
$("#email_to input").val('');
|
||||
},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layer.close(index);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
return false;
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,106 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>系统配置</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-conf">+ 添加配置项</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</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>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
tool = layui.tool,
|
||||
form = layui.form;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
title: '配置列表',
|
||||
url: "/admin/conf/index",
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[{
|
||||
field: 'id',
|
||||
width: 80,
|
||||
title: 'ID编号',
|
||||
align: 'center'
|
||||
},{
|
||||
field: 'title',
|
||||
width: 200,
|
||||
title: '配置名称'
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '配置标识(新增的模板文件名称需与标识名称一致)'
|
||||
},{
|
||||
field: 'status',
|
||||
width: 80,
|
||||
title: '状态',
|
||||
templet: '#status',
|
||||
align: 'center'
|
||||
}, {
|
||||
width: 160,
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
var html = '<div class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">修改</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit" >编辑配置</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
|
||||
return html;
|
||||
}
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add-conf').on('click', function(){
|
||||
tool.open('/admin/conf/add');
|
||||
});
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function(obj){
|
||||
var data = obj.data;
|
||||
if(obj.event === 'add'){
|
||||
tool.open('/admin/conf/add?id='+data.id);
|
||||
|
||||
}
|
||||
if(obj.event === 'edit'){
|
||||
tool.open('/admin/conf/edit?id='+data.id);
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete('/admin/conf/delete',{ id: obj.data.id },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
return;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,41 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">其他配置</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">开发者</td>
|
||||
<td>
|
||||
<input type="text" name="author" autocomplete="off" placeholder="请输入开发者" lay-reqText="请输入开发者" class="layui-input"{notempty name="$config.author"} value="{$config.author}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">开发版本号
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="version" autocomplete="off" placeholder="请输入版本号" lay-reqText="请输入版本号" class="layui-input" {notempty name="$config.version"} value="{$config.version}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" value="{$id}" name="id">
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/conf/edit",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,121 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">Token配置</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">Token签发组织</td>
|
||||
<td>
|
||||
<input type="text" name="iss" autocomplete="off" placeholder="请输入签发组织" lay-reqText="请输入签发组织" class="layui-input"{notempty name="$config.iss"} value="{$config.iss}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">Token签发作者
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="aud" autocomplete="off" placeholder="请输入签发作者" lay-reqText="请输入签发作者" class="layui-input" {notempty name="$config.aud"} value="{$config.aud}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">Token Secrect</td>
|
||||
<td>
|
||||
<input type="text" name="secrect" autocomplete="off" placeholder="请输入secrect" lay-reqText="请输入secrect" class="layui-input"{notempty name="$config.secrect"} value="{$config.secrect}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">Token过期时间
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="exptime" autocomplete="off" placeholder="请输入过期时间" lay-reqText="请输入过期时间" class="layui-input" {notempty name="$config.exptime"} value="{$config.exptime}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding:20px 0;">
|
||||
<span class="layui-btn layui-btn-sm" onclick="testLogin();">Api测试登录</span>
|
||||
<span class="layui-btn layui-btn-sm" onclick="testToken();">Token测试</span>
|
||||
</div>
|
||||
<div style="padding:20px; background-color:#f2f2f2;word-wrap:break-word">
|
||||
测试结果:
|
||||
<div id="res"></div>
|
||||
</div>
|
||||
<div style="padding: 20px 0">
|
||||
<input type="hidden" value="{$id}" name="id">
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/conf/edit",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkuZ291Z3VjbXMuY29tIiwiYXVkIjoiZ291Z3VjbXMiLCJpYXQiOjE2MjczMTY1MTgsImV4cCI6MTYyNzMyMDExOCwidWlkIjoxfQ.3soLDbwrEqn4EZtpD4h05FmvmMtJEh1LtE1vZ_ANcnI';
|
||||
function testToken(){
|
||||
$.ajax({
|
||||
headers: {
|
||||
Token: token
|
||||
},
|
||||
url: "/admin/api/index/demo",
|
||||
type: "get",
|
||||
success: function (res) {
|
||||
$('#res').html(JSON.stringify(res));
|
||||
if(res.code == 111){
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function testLogin(){
|
||||
var content='<form class="layui-form" style="width:400px"><div style="padding:10px 15px">\
|
||||
<p style="padding:10px 0">用户名:</p>\
|
||||
<p><input name="username" type="text" class="layui-input" value="hdm58"/></p>\
|
||||
<p style="padding:10px 0">密 码:</p>\
|
||||
<p><input name="password" type="password" class="layui-input" value="123456"/></p>\
|
||||
</div>\
|
||||
</form>';
|
||||
layer.open({
|
||||
type:1,
|
||||
title:'API测试用户登录',
|
||||
area:['432px','300px'],
|
||||
content:content,
|
||||
btnAlign: 'c',
|
||||
btn: ['登录'],
|
||||
yes: function(idx){
|
||||
var username = $('[name="username"]').val();
|
||||
var password = $('[name="password"]').val();
|
||||
if(username==''){
|
||||
layer.msg('请填写用户名');
|
||||
return;
|
||||
}
|
||||
if(password==''){
|
||||
layer.msg('请填写密码');
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
url: "/admin/api/index/login",
|
||||
type:'post',
|
||||
data:{username:username,password:password},
|
||||
success:function(res){
|
||||
$('#res').html(JSON.stringify(res));
|
||||
layer.msg(res.msg);
|
||||
if(res.code==1){
|
||||
token = res.data.token;
|
||||
layer.close(idx);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,122 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">系统配置</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">系统名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="admin_title" lay-verify="required" autocomplete="off" placeholder="请输入系统名称" lay-reqText="请输入系统名称" class="layui-input" {notempty name="$config.admin_title"} value="{$config.admin_title}" {/notempty}>
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray-2">公司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='{notempty name="$config.logo"}{$config.logo}{/notempty}' style="max-width: 100%; width: 100%;" />
|
||||
<input type="hidden" name="logo" {notempty name="$config.logo"} value="{$config.logo}" {/notempty}>
|
||||
</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-gray-2">网络域名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="domain" lay-verify="required" autocomplete="off" placeholder="请输入网络域名" lay-reqText="请输入网络域名" class="layui-input" {notempty name="$config.domain"} value="{$config.domain}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">平台名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入网站平台名称" lay-reqText="请输入平台名称" class="layui-input" {notempty name="$config.title"} value="{$config.title}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">ICP备案号</td>
|
||||
<td>
|
||||
<input type="text" name="icp" autocomplete="off" placeholder="请输入ICP备案号" class="layui-input" {notempty name="$config.icp"} value="{$config.icp}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">公安备案号</td>
|
||||
<td>
|
||||
<input type="text" name="beian" autocomplete="off" placeholder="请输入公安备案号" class="layui-input" {notempty name="$config.beian"} value="{$config.beian}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">版权信息</td>
|
||||
<td>
|
||||
<input type="text" name="copyright" autocomplete="off" placeholder="请输入版权信息" lay-reqText="请输入版权信息" class="layui-input"{notempty name="$config.copyright"} value="{$config.copyright}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">代码版本号<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" lay-verify="required" name="version" autocomplete="off" placeholder="请输入版本号" lay-reqText="请输入版本号" class="layui-input" {notempty name="$config.version"} value="{$config.version}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">SEO关键词<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="keywords" lay-verify="required" autocomplete="off" placeholder="多个关键词用“,”隔开" lay-reqText="请输入SEO关键字" class="layui-input" {notempty name="$config.keywords"} value="{$config.keywords}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">平台描述<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<textarea name="desc" lay-verify="required" placeholder="请输入平台描述" lay-reqText="请输入平台描述" class="layui-textarea">{notempty name="$config.desc"}{$config.desc} {/notempty}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">统计代码</td>
|
||||
<td colspan="5">
|
||||
<textarea name="code" placeholder="请输入完整的统计代码" class="layui-textarea">{notempty name="$config.code"} value={$config.code}{/notempty}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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>
|
||||
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
upload = layui.upload;
|
||||
|
||||
form.render();
|
||||
//logo上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1',
|
||||
url: "/api/index/upload",
|
||||
done: function (res) {
|
||||
//如果上传失败
|
||||
if (res.code == 1) {
|
||||
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) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/conf/edit",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,166 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>数据还原</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-tab layui-tab-brief layui-tab-big">
|
||||
<ul class="layui-tab-title">
|
||||
<li><a href="/admin/database/database">数据备份</a></li>
|
||||
<li class="layui-this"><a href="/admin/database/backuplist">数据还原</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<table cellspacing="0" cellpadding="0" border="0" class="layui-table">
|
||||
<tr style="background-color: #f5f5f5; text-align: center;">
|
||||
<th style=" text-align: center; font-weight: 800;"><span>文件名称</span></th>
|
||||
<th style=" text-align: center; font-weight: 800;"><span>文件格式</span></th>
|
||||
<th style=" text-align: center; font-weight: 800;"><span>分隔符</span></th>
|
||||
<th style=" text-align: center; font-weight: 800;"><span>文件总大小</span></th>
|
||||
<th style=" text-align: center; font-weight: 800;"><span>分卷总数</span></th>
|
||||
<th style=" text-align: center; font-weight: 800; width:200px"><span>操作</span></th>
|
||||
</tr>
|
||||
{empty name="list"}
|
||||
<tr>
|
||||
<td colspan="6" align="center">暂无备份数据</td>
|
||||
</tr>
|
||||
{/empty}
|
||||
{volist name="list" id="vo" key="k"}
|
||||
<tr style="background-color: #fafafa;">
|
||||
<td><strong>备份时间:{$vo.time}</strong>{if $vo.timespan == $lock_time}<span style="color:red; margin-left:20px;">该备份不是完整备份,请删除重新备份</span>{/if}</td>
|
||||
<td align="center"><span>.sql</span></td>
|
||||
<td align="center"><span>{$vo.data.compress}</span></td>
|
||||
<td align="center"><span>{:format_bytes($vo.data.size)}</span></td>
|
||||
<td align="center"><span>{$vo.data.part}</span></td>
|
||||
<td align="center">
|
||||
<div class="layui-btn-group" data-time='{$vo.timespan}'>
|
||||
{if $vo.timespan == $lock_time}
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="reset">清除不完整的备份</a>
|
||||
{else/}
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="import">数据还原</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">备份删除</a>
|
||||
{/if}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{for start="0" end="$vo.data.part" step="1"}
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
{:date("Ymd",$vo.timespan)}{$vo.data.compress}{:date("His",$vo.timespan)}{$vo.data.compress}{$i+1}.sql
|
||||
</td>
|
||||
<td align="center">
|
||||
<a class="layui-btn layui-btn-xs" href='/admin/database/downfile?time={$vo.data.time}&part={$i+1}'>下载备份(分卷{$i+1})</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/for}
|
||||
{/volist}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
function importData(data){
|
||||
if(data.code==0){
|
||||
console.log(data.msg);
|
||||
layer.closeAll();
|
||||
layer.msg(data.msg,{time: 200000});
|
||||
if($.isPlainObject(data.data)){
|
||||
$.ajax({
|
||||
url: "/admin/database/import",
|
||||
type:'get',
|
||||
data:{"part" : data.data.part, "start" : data.data.start,time:data.data.time},
|
||||
success: function (res) {
|
||||
importData(res);
|
||||
}
|
||||
})
|
||||
}else {
|
||||
layer.msg(data.msg);
|
||||
window.onbeforeunload = function(){ return null; }
|
||||
}
|
||||
} else {
|
||||
layer.msg(data.msg);
|
||||
}
|
||||
}
|
||||
//监听行工具事件
|
||||
$('[lay-event="import"]').on('click',function(){
|
||||
var time=$(this).parent().data('time');
|
||||
layer.confirm('确认要还原该备份吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
layer.msg("数据还原中...",{time: 200000});
|
||||
$.ajax({
|
||||
url: "/admin/database/import?time="+time,
|
||||
type:'get',
|
||||
success: function (res) {
|
||||
importData(res);
|
||||
}
|
||||
})
|
||||
window.onbeforeunload = function(){ return "正在还原数据库,请不要关闭!" }
|
||||
layer.close(index);
|
||||
});
|
||||
return false;
|
||||
})
|
||||
|
||||
$('[lay-event="del"]').on('click',function(){
|
||||
var time=$(this).parent().data('time');
|
||||
layer.confirm('确认要删除该备份吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/database/del",
|
||||
data: {'time':time},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},2000)
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
return false;
|
||||
})
|
||||
|
||||
$('[lay-event="reset"]').on('click',function(){
|
||||
var time=$(this).parent().data('time');
|
||||
layer.confirm('确认要清除该备份吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/database/del",
|
||||
data: {'time':time,'lock':1},
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},2000)
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
return false;
|
||||
})
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,220 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>数据备份</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-tab layui-tab-brief layui-tab-big">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this"><a href="/admin/database/database">数据备份</a></li>
|
||||
<li><a href="/admin/database/backuplist">数据还原</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<table class="layui-hide" id="backup" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-group">
|
||||
<span class="layui-btn layui-btn-sm layui-btn-normal" lay-event="backup">数据备份</span><span class="layui-btn layui-btn-sm" lay-event="optimize">数据表优化</span><span class="layui-btn layui-btn-danger layui-btn-sm" lay-event="repair">数据表修复</span>
|
||||
</div>
|
||||
<span id="dataTips" style="font-size:12px; margin-left:10px"></span>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
var tableIns = table.render({
|
||||
elem: '#backup',
|
||||
title: '数据备份',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: "/admin/database/database", //数据接口
|
||||
page: false,
|
||||
defaultToolbar: false,
|
||||
cols: [
|
||||
[ //表头
|
||||
{ type: 'checkbox' },
|
||||
{
|
||||
field: 'name',
|
||||
title: '数据表',
|
||||
width: 220
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
width: 120,
|
||||
templet: function (d) {
|
||||
return '<span id="table_' + d.name + '">-</span>';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'engine',
|
||||
title: '存储引擎',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'row_format',
|
||||
title: '行格式',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'rows',
|
||||
title: '行数',
|
||||
align: 'center',
|
||||
width: 100,
|
||||
}, {
|
||||
field: 'data_size',
|
||||
title: '字节数',
|
||||
align: 'center',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'data_length',
|
||||
title: '数据大小',
|
||||
align: 'center',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'comment',
|
||||
title: '数据表注释'
|
||||
}, {
|
||||
field: 'create_time',
|
||||
title: '创建时间',
|
||||
width: 160,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
],
|
||||
done: function (res, curr, count) {
|
||||
$('#dataTips').html(res.msg);
|
||||
}
|
||||
});
|
||||
|
||||
//递归备份表
|
||||
function backup(tab, status, table) {
|
||||
layer.closeAll();
|
||||
layer.msg("备份中...,请勿关闭本页面", { time: 200000 });
|
||||
$.get("/admin/database/backup", tab, function (data) {
|
||||
// console.log(data)
|
||||
if (data.code == 0) {
|
||||
showmsg(data.data.tab.table, data.msg);
|
||||
if (data.data.tab.start == 'ok') {
|
||||
layer.msg('备份完成');
|
||||
window.onbeforeunload = function () { return null }
|
||||
return;
|
||||
}
|
||||
backup(data.data.tab, tab.id != data.data.tab.id);
|
||||
} else {
|
||||
layer.msg('立即备份');
|
||||
}
|
||||
}, "json");
|
||||
}
|
||||
|
||||
//修改备份状态
|
||||
function showmsg(table, msg) {
|
||||
console.log(table);
|
||||
$("#table_" + table).addClass('span-color-2').html(msg);
|
||||
}
|
||||
//监听行工具事件
|
||||
table.on('toolbar(test)', function (obj) {
|
||||
var checkData = table.checkStatus(obj.config.id).data;
|
||||
var len = checkData.length;
|
||||
var tables = [];
|
||||
if (len == 0) {
|
||||
layer.msg('请先选择表');
|
||||
return false;
|
||||
}
|
||||
for (var i = 0; i < len; i++) {
|
||||
tables.push(checkData[i].name);
|
||||
}
|
||||
if (obj.event === 'backup') {
|
||||
layer.confirm('确认要备份选中的' + len + '个数据表吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/database/backup",
|
||||
type: 'post',
|
||||
data: { 'tables': tables },
|
||||
success: function (res) {
|
||||
if (res.code == 0) {
|
||||
layer.msg("开始备份,请不要关闭本页面!");
|
||||
window.onbeforeunload = function () { return "正在备份数据库,请不要关闭!" }
|
||||
backup(res.data.tab);
|
||||
}
|
||||
if (res.code == 2) {
|
||||
layer.confirm('检测到有一个备份任务未完成,请先清除未完成的备份', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/database/del",
|
||||
data: { 'lock': 1 },
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
} else if (obj.event === 'optimize') {
|
||||
layer.confirm('确认要优化选中的' + len + '个数据表吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/database/optimize",
|
||||
data: { 'tables': tables },
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
setTimeout(function () {
|
||||
location.reload();
|
||||
}, 2000)
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
} else if (obj.event === 'repair') {
|
||||
layer.confirm('确认要修复选中的' + len + '个数据表吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/admin/database/repair",
|
||||
data: { 'tables': tables },
|
||||
success: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
setTimeout(function () {
|
||||
location.reload();
|
||||
}, 2000)
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,86 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">部门架构</h3>
|
||||
{eq name="$id" value="0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">部门名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入部门名称" lay-reqText="请输入部门名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">上级部门<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择上级部门">
|
||||
<option value="0">作为顶级部门</option>
|
||||
{volist name="department" id="v"}
|
||||
<option value="{$v.id}" {eq name="$pid" value="$v.id"} selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">部门联系电话</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="phone" placeholder="请输入部门联系电话,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">部门名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入部门名称" lay-reqText="请输入部门名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">上级部门<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择上级部门">
|
||||
<option value="0">作为顶级部门</option>
|
||||
{volist name="department" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"} selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">部门负责人</td>
|
||||
<td>
|
||||
<select name="leader_id">
|
||||
<option value="0">请选择部门负责人</option>
|
||||
{volist name="users" id="v"}
|
||||
<option value="{$v.id}" {eq name="detail.leader_id" value="$v.id"} selected{/eq}>{$v.name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">部门联系电话</td>
|
||||
<td>
|
||||
<input type="text" name="phone" value="{$detail.phone}" placeholder="请输入部门联系电话,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/eq}
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/department/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,93 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>部门架构</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加部门</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','treeGrid'];
|
||||
function gouguInit() {
|
||||
var treeGrid = layui.treeGrid,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
ptable = treeGrid.render({
|
||||
id: 'treeTable'
|
||||
, elem: '#treeTable'
|
||||
, idField: 'id'
|
||||
, url: "/admin/department/index"
|
||||
, method :"get"
|
||||
, cellMinWidth: 80
|
||||
, treeId: 'id'//树形id字段名称
|
||||
, treeUpId: 'pid'//树形父id字段名称
|
||||
, treeShowName: 'title'//以树形式显示的字段
|
||||
, height: 'full-0'
|
||||
,isOpenDefault:true
|
||||
,heightRemove:[".dHead",24]//不计算的高度,表格设定的是固定高度,此项不生效
|
||||
, cols: [[
|
||||
{ field: 'id', width: 100, title: 'ID号', align: 'center' }
|
||||
, { field: 'pid', title: '上级部门ID',width: 120, align: 'center'}
|
||||
, { field: 'title', title: '部门名称'}
|
||||
, { field: 'leader', title: '部门负责人',width: 120, align: 'center'}
|
||||
, { field: 'phone', title: '部门电话',width: 160,}
|
||||
, { width:180, title: '操作', align: 'center', templet: function (d) {
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加下级部门</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
, page: false
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.main-page-content').on('click','.add-menu', function(){
|
||||
tool.open('/admin/department/add');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeGrid.on('tool(treeTable)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.open('/admin/department/add?pid='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/department/add?id='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/department/delete",{ id: obj.data.id },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,81 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">知识分类</h3>
|
||||
{eq name="$id" value="0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea">{$detail.desc}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
{/eq}
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/kcate/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,95 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>知识类型</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加分类</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</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>
|
||||
const moduleInit = ['tool','treeGrid'];
|
||||
function gouguInit() {
|
||||
var treeGrid = layui.treeGrid,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
ptable = treeGrid.render({
|
||||
id:'treeTable'
|
||||
,elem: '#treeTable'
|
||||
,idField:'id'
|
||||
,url: "/admin/kcate/index"
|
||||
,method :"get"
|
||||
,cellMinWidth: 100
|
||||
,treeId:'id'//树形id字段名称
|
||||
,treeUpId:'pid'//树形父id字段名称
|
||||
,treeShowName:'title'//以树形式显示的字段
|
||||
,heightRemove:[".dHead",24]//不计算的高度,表格设定的是固定高度,此项不生效
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序',align:'center', width:80}
|
||||
,{field:'title', edit:'text',width:240, title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', width:80, align:'center'}
|
||||
,{field:'desc', title: '描述', }
|
||||
,{width:160,title: '操作', align:'center',templet: function(d){
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
//,skin:'line'
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add-menu').on('click', function(){
|
||||
tool.open('/admin/kcate/add','900px');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeGrid.on('tool(treeTable)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.open('/admin/kcate/add?pid='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/kcate/add?id='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/kcate/delete",{ id: obj.data.id },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,95 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>知识类型</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加分类</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</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>
|
||||
const moduleInit = ['tool','treeGrid'];
|
||||
function gouguInit() {
|
||||
var treeGrid = layui.treeGrid,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
ptable = treeGrid.render({
|
||||
id:'treeTable'
|
||||
,elem: '#treeTable'
|
||||
,idField:'id'
|
||||
,url: "/admin/kcate/index"
|
||||
,method :"get"
|
||||
,cellMinWidth: 100
|
||||
,treeId:'id'//树形id字段名称
|
||||
,treeUpId:'pid'//树形父id字段名称
|
||||
,treeShowName:'title'//以树形式显示的字段
|
||||
,heightRemove:[".dHead",24]//不计算的高度,表格设定的是固定高度,此项不生效
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序',align:'center', width:80}
|
||||
,{field:'title', edit:'text',width:240, title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', width:80, align:'center'}
|
||||
,{field:'desc', title: '描述', }
|
||||
,{width:160,title: '操作', align:'center',templet: function(d){
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
//,skin:'line'
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add-menu').on('click', function(){
|
||||
tool.open('/admin/kcate/add','900px');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeGrid.on('tool(treeTable)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.open('/admin/kcate/add?pid='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/kcate/add?id='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/kcate/delete",{ id: obj.data.id },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,108 @@
|
||||
{extend name="../../base/view/common/base"/}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>操作日志</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<form class="layui-form layui-form-bar">
|
||||
<div class="layui-input-inline" style="width:300px;">
|
||||
<input type="text" name="keywords" placeholder="昵称/操作节点名称/操作数据ID" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
<select name="action">
|
||||
<option value="">请选择类型</option>
|
||||
{volist name="$type_action" id="vo"}
|
||||
<option value="{$vo}">{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
|
||||
</form>
|
||||
<div style="width:100%;">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
form = layui.form;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
title: '操作日志列表',
|
||||
url: "/admin/log/index", //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
height: 'full-112',
|
||||
cols: [
|
||||
[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 90
|
||||
}, {
|
||||
field: 'action',
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'content',
|
||||
title: '操作描述'
|
||||
}, {
|
||||
field: 'param_id',
|
||||
title: '操作数据ID',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'name',
|
||||
title: '操作用户',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'ip',
|
||||
title: 'IP地址',
|
||||
align: 'center',
|
||||
width: 150
|
||||
}, {
|
||||
field: 'create_time',
|
||||
title: '操作时间',
|
||||
fixed: 'right',
|
||||
align: 'center',
|
||||
width: 160
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
layui.pageTable.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords,
|
||||
action: data.field.action
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,72 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">公告分类</h3>
|
||||
{eq name="$id" value="0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序,数字" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/eq}
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/ncate/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,96 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>公告类型</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加分类</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</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>
|
||||
const moduleInit = ['tool','treeGrid'];
|
||||
function gouguInit() {
|
||||
var treeGrid = layui.treeGrid,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
ptable = treeGrid.render({
|
||||
id:'treeTable'
|
||||
,elem: '#treeTable'
|
||||
,idField:'id'
|
||||
,url: "/admin/ncate/index"
|
||||
,method :"get"
|
||||
,cellMinWidth: 100
|
||||
,treeId:'id'//树形id字段名称
|
||||
,treeUpId:'pid'//树形父id字段名称
|
||||
,treeShowName:'title'//以树形式显示的字段
|
||||
,isOpenDefault:true
|
||||
,heightRemove:[".dHead",24]//不计算的高度,表格设定的是固定高度,此项不生效
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序', align:'center', style:'cursor: pointer;', width:80}
|
||||
,{field:'title', title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', width:80, align:'center'}
|
||||
,{width:160,title: '操作', align:'center',templet: function(d){
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
//,skin:'line'
|
||||
});
|
||||
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add-menu').on('click', function(){
|
||||
tool.open('/admin/ncate/add');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeGrid.on('tool(treeTable)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.open('/admin/ncate/add?pid='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/ncate/add?id='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/ncate/delete",{ id: obj.data.id },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,113 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
{eq name="$id" value="0"}
|
||||
<h3 class="h3-title">新增公告</h3>
|
||||
{else/}
|
||||
<h3 class="h3-title">编辑公告</h3>
|
||||
{/eq}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">公告标题<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" lay-reqText="请输入公告标题" placeholder="请输入公告标题" class="layui-input"
|
||||
{notempty name="$note.title" }value="{$note.title}" {/notempty}>
|
||||
</td>
|
||||
<td class="layui-td-gray">公告分类<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
|
||||
<option value="">请选择分类</option>
|
||||
{notempty name="$note.cate_id"}
|
||||
{volist name=":set_recursion(admin_note_cate())" id="v"}
|
||||
<option value="{$v.id}" {eq name="$note.cate_id" value="$v.id" }selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
{else/}
|
||||
{volist name=":set_recursion(admin_note_cate())" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
{/notempty}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">展示期间<span style="color: red">*</span></td>
|
||||
<td id="date">
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="start_time" name="start_time" readonly lay-verify="required" lay-reqText="请选择公告展示开始时间" placeholder="请选择时间" class="layui-input" {notempty name="$note.start_time" }value="{$note.start_time | date='Y-m-d'}" {/notempty}>
|
||||
</div>
|
||||
-
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="end_time" name="end_time" readonly lay-verify="required" lay-reqText="请选择公告展示结束时间" placeholder="请选择时间" class="layui-input" {notempty name="$note.end_time" }value="{$note.end_time | date='Y-m-d'}" {/notempty}>
|
||||
</div>
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" class="layui-input" {notempty
|
||||
name="$note.sort" }value="{$note.sort}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top; text-align:left;" colspan="4">公告内容<span style="color: red">*</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<div style="margin-top:-2px; margin-right:2px">
|
||||
<textarea id="mdContent" style="display:none;">{notempty name="$note.md_content" }{$note.md_content|raw}{/notempty}</textarea>
|
||||
<div id="docContent"></div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<tr>
|
||||
<td class="layui-td-gray">关联链接</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="src" placeholder="请输入链接" class="layui-input" {notempty
|
||||
name="$note.src" }value="{$note.src}" {/notempty}>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pt-3">
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<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>
|
||||
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
editor = layui.editormd,
|
||||
laydate = layui.laydate;
|
||||
|
||||
form.render();
|
||||
var edit = editor.render('docContent', {
|
||||
markdown: $('#mdContent').val(),
|
||||
imageUploadURL: "/api/index/md_upload",
|
||||
lineNumbers: false,
|
||||
toolbarIcons: function () {
|
||||
return [
|
||||
"undo", "redo","bold", "del", "italic", "quote","h1", "h2", "h3", "h4", "h5",
|
||||
"list-ul", "list-ol", "hr","link", "reference-link", "image", "code", "code-block", "table","watch", "fullscreen"
|
||||
];
|
||||
},
|
||||
height:window.innerHeight - 350
|
||||
});
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#date',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/note/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>企业公告</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add">+ 添加公告</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="barDemo">
|
||||
<div class="layui-btn-group"><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</span><span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span><span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span></div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','editormd'];
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
tool = layui.tool,
|
||||
form = layui.form;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
title: '公告列表',
|
||||
url: "/admin/note/index", //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
height: 'full-104',
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: '编号ID',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = 'N' + d.id;
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: 'sort',
|
||||
title: '排序',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'cate_title',
|
||||
title: '公告分类',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '公告标题'
|
||||
}, {
|
||||
field: 'cate_title',
|
||||
title: '公告展示期间',
|
||||
align: 'center',
|
||||
width: 200,
|
||||
templet: function (d) {
|
||||
var html = d.start_time + ' ~ ' + d.end_time;
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 136,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add').on('click', function () {
|
||||
tool.open('/admin/note/add');
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.open('/admin/note/view?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/note/add?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定删除该公告吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/note/delete", { id: obj.data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,33 @@
|
||||
<div class="page-content p-4">
|
||||
<h3 class="h3-title">公告详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">公告标题</td>
|
||||
<td colspan="3">{$note.title}</td>
|
||||
<td class="layui-td-gray">公告分类</td>
|
||||
<td>
|
||||
{volist name=":set_recursion(get_note_cate())" id="v"}
|
||||
{eq name="$note.cate_id" value="$v.id" }{$v.title}{/eq}
|
||||
{/volist}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">展示期间</td>
|
||||
<td>{$note.start_time | date='Y-m-d'} - {$note.end_time | date='Y-m-d'}</td>
|
||||
<td class="layui-td-gray">关联链接</td>
|
||||
<td>{$note.src}</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>{$note.sort}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">公告内容</td>
|
||||
<td colspan="5"><div class="md-content-content">{$note.content|raw}</div></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<script>
|
||||
function openInit(layui) {
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,98 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">岗位职称</h3>
|
||||
{if condition="$id eq 0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">岗位名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入岗位名称" lay-reqText="请输入岗位名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">岗位工时单价(元)<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="work_price" lay-verify="required|number" placeholder="请输入岗位工时单价" lay-reqText="请输入岗位工时单价" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">状态<font>*</font></td>
|
||||
<td colspan="3">
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限角色<font>*</font></td>
|
||||
<td colspan="3">
|
||||
{volist name="$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-gray">岗位备注</td>
|
||||
<td colspan="3">
|
||||
<textarea name="remark" placeholder="请输入岗位备注" class="layui-textarea"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">岗位名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入岗位名称" lay-reqText="请输入岗位名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">岗位工时单价(元)<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="work_price" value="{$detail.work_price}" lay-verify="required|number" placeholder="请输入岗位工时单价" lay-reqText="请输入岗位工时单价" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">状态<font>*</font></td>
|
||||
<td colspan="3">
|
||||
<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1"}checked{/eq}>
|
||||
<input type="radio" name="status" value="0" title="禁止" {eq name="$detail.status" value="0"}checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限角色<font>*</font></td>
|
||||
<td colspan="3">
|
||||
{volist name="$group" id="v"}
|
||||
<input type="checkbox" name="group_id[]" title="{$v.title}" value="{$v.id}" {eq name="$v.checked" value="1" }checked{/eq} lay-skin="primary">
|
||||
{/volist}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">岗位备注</td>
|
||||
<td colspan="3">
|
||||
<textarea name="remark" placeholder="请输入岗位备注" class="layui-textarea">{$detail.remark}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/if}
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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>
|
||||
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/position/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,122 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>岗位职称</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add">+ 添加岗位</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</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="barDemo">
|
||||
<div class="layui-btn-group"><button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">详情</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
table = layui.table;
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
title: '岗位列表',
|
||||
url: "/admin/position/index", //数据接口
|
||||
page: false, //开启分页
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'title',
|
||||
title: '岗位名称',
|
||||
align: 'center',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'groupName',
|
||||
title: '权限角色',
|
||||
width: 200
|
||||
}, {
|
||||
field: 'remark',
|
||||
title: '备注'
|
||||
}, {
|
||||
field: 'work_price',
|
||||
title: '岗位工时单价(元)',
|
||||
align: 'center',
|
||||
width: 132
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
toolbar: '#status',
|
||||
align: 'center',
|
||||
width: 60
|
||||
}, {
|
||||
field: 'right',
|
||||
title: '操作',
|
||||
toolbar: '#barDemo',
|
||||
width: 132,
|
||||
align: 'center'
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add').on('click', function () {
|
||||
tool.open('/admin/position/add');
|
||||
});
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.open('/admin/position/view?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/position/add?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
if (data.id == 1) {
|
||||
layer.msg('超级岗位不能删除');
|
||||
return;
|
||||
}
|
||||
layer.confirm('您确定要删除该岗位', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/position/delete", { id: obj.data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,80 @@
|
||||
<style>
|
||||
.left-note{font-weight:800; vertical-align:top; padding-top:28px!important; text-align:center}
|
||||
.left-note .layui-form-checkbox span{background-color: #bbbbbb!important;}
|
||||
.left-note .layui-form-checkbox:hover span{background-color: #808080;}
|
||||
|
||||
.layui-form-checked.layui-checkbox-disabled i{background-color:#ababab!important;color: #ffffff!important;border-color:#ababab!important;}
|
||||
.layui-form-checked.layui-checkbox-disabled[lay-skin=primary] i{background-color:#ababab!important;}
|
||||
.right-note .layui-checkbox-disabled span {color: #808080!important;}
|
||||
</style>
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">岗位信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">岗位名称</td>
|
||||
<td>
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">岗位工时单价</td>
|
||||
<td>
|
||||
{$detail.work_price}
|
||||
</td>
|
||||
<td class="layui-td-gray">状态</td>
|
||||
<td>
|
||||
{eq name="$detail.status" value="1" }正常{/eq}
|
||||
{eq name="$detail.status" value="0" }禁止登录{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">用户角色</td>
|
||||
<td colspan="5">
|
||||
{volist name="$group" id="v"}
|
||||
{eq name="$v.checked" value="1" }{$v.title},{/eq}
|
||||
{/volist}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">岗位备注</td>
|
||||
<td colspan="5">
|
||||
{$detail.remark}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3 class="h3-title" style="padding-top:15px;">岗位权限</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
{volist name="role_rule" id="vo"}
|
||||
<tr>
|
||||
<td style="font-weight:800; text-align:center;">
|
||||
<input type="checkbox" disabled value="{$vo.id}" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
|
||||
</td>
|
||||
{notempty name="vo.children"}
|
||||
<td>
|
||||
<div style="padding:0 0 0 10px;">
|
||||
{volist name="vo.children" key="k" id="voo"}
|
||||
<div class="checkbox16" style="padding:10px 0;">
|
||||
<input type="checkbox" disabled lay-filter="rule" name="rule[]" value="{$voo.id}" lay-skin="primary" title="{$voo.title}" {eq name="$voo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{notempty name="voo.children"}
|
||||
<div style="padding:0 0 3px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
|
||||
{volist name="voo.children" id="vooo"}
|
||||
<div class="layui-input-inline" style="margin-right:10px;">
|
||||
<input type="checkbox" disabled data-rule="{$voo.id}" name="rule[]" value="{$vooo.id}" lay-skin="primary" title="{$vooo.title}" {eq name="$vooo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
{/notempty}
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
{/notempty}
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form;
|
||||
form.render();
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,143 @@
|
||||
<style>
|
||||
.left-note{font-weight:800; vertical-align:top; padding-top:28px!important; text-align:center}
|
||||
.left-note .layui-form-checkbox span{background-color: #969696;}
|
||||
.left-note .layui-form-checkbox:hover span{background-color: #808080;}
|
||||
|
||||
.left-note .layui-form-checked span, .left-note .layui-form-checked:hover span { background-color: #5fb878;}
|
||||
.checkbox14 .layui-form-checkbox span{font-size:15px;font-weight:800;}
|
||||
.right-note .layui-checkbox-disabled span {color: #666666!important;}
|
||||
</style>
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">权限角色</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">角色名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input class="layui-input" type="text" name="title" lay-verify="required" lay-reqText="请输入角色名称" {notempty name="$role.title"
|
||||
}value="{$role.title}" {/notempty} placeholder="请输入角色名称" autocomplete="off" />
|
||||
</td>
|
||||
<td class="layui-td-gray">状态<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-gray-2">权限配置说明<font>*</font></td>
|
||||
<td colspan="3"><strong class="red">注意:如果右侧子级权限有节点被勾选了,左侧的顶级权限就必须勾选,否则无法查看右侧的子级菜单。</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<table style="width:100%" id="rule">
|
||||
<tr>
|
||||
<td style="text-align:center; background-color:#f8f8f8; width:160px;">选择可操作的顶级权限 <font style="color:red">↓</font></td>
|
||||
<td style="text-align:left; background-color:#f8f8f8;">选择可操作的子级权限 <font style="color:red">↓</font></td>
|
||||
</tr>
|
||||
{volist name="role_rule" id="vo"}
|
||||
<tr>
|
||||
<td class="left-note">
|
||||
<input type="checkbox" name="rule[]" value="{$vo.id}" title="{$vo.title}" class="aaa" {eq name="$vo.checked" value="true" }checked{/eq}>
|
||||
</td>
|
||||
{notempty name="vo.children"}
|
||||
<td class="right-note">
|
||||
<div style="padding:0 0 0 10px;">
|
||||
{volist name="vo.children" key="k" id="voo"}
|
||||
<div class="checkbox15" style="padding:10px 0;">
|
||||
<input type="checkbox" lay-filter="rule" name="rule[]" value="{$voo.id}" lay-skin="primary" title="{$voo.title}" {eq name="$voo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{notempty name="voo.children"}
|
||||
<div style="padding:0 0 3px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
|
||||
{volist name="voo.children" id="vooo"}
|
||||
<div class="layui-input-inline" style="margin-right:10px;">
|
||||
<input type="checkbox" data-rule="{$voo.id}" name="rule[]" value="{$vooo.id}" lay-skin="primary" title="{$vooo.title}" {eq name="$vooo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{notempty name="vooo.children"}
|
||||
<div style="padding:0 0 3px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
|
||||
{volist name="vooo.children" id="voooo"}
|
||||
<div class="layui-input-inline" style="margin-right:10px;">
|
||||
<input type="checkbox" data-rule="{$vooo.id}" name="rule[]" value="{$voooo.id}" lay-skin="primary" title="{$voooo.title}" {eq name="$voooo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
{/notempty}
|
||||
{/volist}
|
||||
</div>
|
||||
{/notempty}
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
{/notempty}
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" 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">
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
setTimeout(function(){
|
||||
tool.close();
|
||||
},500);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/role/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
|
||||
//监听多选框点击事件 通过 lay-filter="menu"来监听
|
||||
form.on('checkbox(menu)', function (data) {
|
||||
let val = data.value;
|
||||
if(data.elem.checked){
|
||||
//判断当前多选框是选中还是取消选中
|
||||
$("input[data-menu='"+val+"']").prop("checked", true);//true:选中 false:不选中
|
||||
}
|
||||
else{
|
||||
$("input[data-menu='"+val+"']").prop("checked", false);
|
||||
}
|
||||
form.render();//实时渲染选中和不选中的样式
|
||||
});
|
||||
|
||||
//监听多选框点击事件 通过 lay-filter="rule"来监听
|
||||
form.on('checkbox(rule)', function (data) {
|
||||
let val = data.value;
|
||||
if(data.elem.checked){
|
||||
//判断当前多选框是选中还是取消选中
|
||||
$("input[data-rule='"+val+"']").prop("checked", true);//true:选中 false:不选中
|
||||
}
|
||||
else{
|
||||
$("input[data-rule='"+val+"']").prop("checked", false);
|
||||
}
|
||||
form.render();//实时渲染选中和不选中的样式
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,104 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>权限角色</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<form class="layui-form layui-form-bar">
|
||||
<div class="layui-input-inline" style="width:300px;">
|
||||
<input type="text" name="keywords" placeholder="名称/备注" class="layui-input" autocomplete="off" />
|
||||
</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>
|
||||
</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">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加权限组</button>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
tool = layui.tool;
|
||||
form = layui.form;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: "/admin/role/index", //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
defaultToolbar: false,
|
||||
cols: [[ //表头
|
||||
{ field: 'id', title: 'ID号', align: 'center', width: 80 }
|
||||
, { field: 'title', title: '权限组名称', width: 200 }
|
||||
, { field: 'desc', title: '备注' }
|
||||
, { field: 'status', title: '状态', toolbar: '#status', align: 'center', width: 80 }
|
||||
, {
|
||||
width: 100, title: '操作', align: 'center', templet: function (d) {
|
||||
var html = '<div class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
table.on('toolbar(test)', function (obj) {
|
||||
if (obj.event === "add") {
|
||||
tool.open("/admin/role/add");
|
||||
return;
|
||||
}
|
||||
});
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === "edit") {
|
||||
tool.open("/admin/role/add?id=" + obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm("确定要删除该权限角色吗?", { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/role/delete", { id: obj.data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
layui.pageTable.reload({
|
||||
where: { keywords: data.field.keywords },
|
||||
page: { curr: 1 }
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">功能菜单/节点</h3>
|
||||
{if condition="$id eq 0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">父级菜单/节点<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级菜单/节点">
|
||||
<option value="0">作为顶级菜单/节点</option>
|
||||
{volist name=":set_recursion(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-gray-3">菜单排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="0" placeholder="请输入数字,越小越靠前" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">菜单/节点名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入菜单/节点名称" lay-reqText="请输入菜单/节点名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">菜单/节点URL</td>
|
||||
<td>
|
||||
<input type="text" name="src" placeholder="请输入菜单/节点URL,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">操作日志名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入操作日志名称" lay-reqText="请输入操作日志名称" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">是否左侧菜单<font>*</font></td>
|
||||
<td>
|
||||
<input type="radio" name="menu" value="1" title="是">
|
||||
<input type="radio" name="menu" value="2" title="不是">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">左侧图标</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="icon" style="width:150px; display:inline" placeholder="请输入图标,可空" autocomplete="off" class="layui-input">
|
||||
如:icon-jichuguanli<a href="{__METE__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">父级菜单/节点<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级菜单/节点">
|
||||
<option value="0">作为顶级节点</option>
|
||||
{volist name=":set_recursion(admin_rule())" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title} </option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray-3">菜单排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入数字,越小越靠前" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">菜单/节点名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入菜单/节点名称" lay-reqText="请输入菜单/节点名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">菜单/节点URL</td>
|
||||
<td>
|
||||
<input type="text" name="src" value="{$detail.src}" placeholder="请输入菜单/节点URL,可空" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">操作日志名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name" value="{$detail.name}" lay-verify="required" placeholder="请输入操作日志名称" lay-reqText="请输入操作日志名称" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">是否左侧菜单<font>*</font></td>
|
||||
<td>
|
||||
<input type="radio" name="menu" value="1" title="是" {eq name="$detail.menu" value="1"} checked{/eq}>
|
||||
<input type="radio" name="menu" value="2" title="不是" {eq name="$detail.menu" value="2"} checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">左侧图标</td>
|
||||
<td colspan="3">
|
||||
<input style="width:150px; display:inline" type="text" name="icon" value="{$detail.icon}" placeholder="请输入图标,可空" autocomplete="off" class="layui-input">
|
||||
如:icon-jichuguanli<a href="{__METE__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/if}
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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>
|
||||
<!-- /主体 -->
|
||||
<script>
|
||||
function openInit() {
|
||||
let form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
form.render();
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/rule/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,105 @@
|
||||
{extend name="../../base/view/common/base"/}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>菜单节点</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加菜单/节点</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var ptable = null, treeGrid = null,rightpage=null, layer = null, tableId = "treeTable";
|
||||
const moduleInit = ['tool','treeGrid'];
|
||||
function gouguInit() {
|
||||
treeGrid = layui.treeGrid;
|
||||
tool = layui.tool;
|
||||
layer = layui.layer;
|
||||
ptable = treeGrid.render({
|
||||
id: tableId
|
||||
, elem: '#' + tableId
|
||||
, idField: 'id'
|
||||
, url: "/admin/rule/index"
|
||||
, method :"get"
|
||||
, cellMinWidth: 180
|
||||
, treeId: 'id'//树形id字段名称
|
||||
, treeUpId: 'pid'//树形父id字段名称
|
||||
, treeShowName: 'title'//以树形式显示的字段
|
||||
,heightRemove:[".dHead",24]//不计算的高度,表格设定的是固定高度,此项不生效
|
||||
,height:'100%'
|
||||
, cols: [[
|
||||
{ field: 'id', width: 80, title: 'ID号', align: 'center'}
|
||||
, { field: 'sort', width: 60, title: '排序',align: 'center'}
|
||||
,{field:'icon',title: '菜单图标',width: 80, align: 'center' ,templet: function(d){
|
||||
var html='<strong class="iconfont '+d.icon+'"></strong>';
|
||||
return html;
|
||||
}}
|
||||
, { field: 'title', width: 150, title: '菜单/节点名称'}
|
||||
, { field: 'pid', title: '父ID', width: 80, align: 'center' }
|
||||
, { field: 'src', title: 'URL链接'}
|
||||
, { field: 'menu', width: 90, title: '是否菜单',align: 'center', templet: function (d) {
|
||||
var html = '<span style="color:#fbbc05">否</span>';
|
||||
if(d.menu=='1'){
|
||||
html = '<span style="color:#12bb37">是</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {field: 'name', width: 90, title: '日志名称',align: 'center'}
|
||||
, {width: 200, title: '操作', align: 'center'
|
||||
, templet: function (d) {
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子菜单/节点</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
, page: false
|
||||
});
|
||||
//表头工具栏事件
|
||||
$('.add-menu').on('click',function(){
|
||||
tool.open('/admin/rule/add');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeGrid.on('tool(' + tableId + ')', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.open('/admin/rule/add?pid='+obj.data.id);
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.open('/admin/rule/add?id='+obj.data.id);
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
}
|
||||
}
|
||||
tool.delete("/admin/rule/delete",{ id: obj.data.id },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
return;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,131 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a><cite>系统设置</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
<div class="sub-menu" style="width: 200px;">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="menu-bar">
|
||||
<div class="menu-bar-content">
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main-bg-content">
|
||||
<div class="layui-card">
|
||||
<div class="table-title">系统信息</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">系统名称</td>
|
||||
<td>
|
||||
{notempty name="$config.admin_title"}{$config.admin_title}{/notempty}
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray-2">LOGO</td>
|
||||
<td rowspan="3" style="width: 240px;">
|
||||
<div class="layui-upload" style="width: 240px;">
|
||||
<img src='{notempty name="$config.logo"}{$config.logo}{/notempty}' style="max-width: 100%; width: 100%;" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">网站域名</td>
|
||||
<td>
|
||||
{notempty name="$config.domain"}{$config.domain}{/notempty}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">网站名称</td>
|
||||
<td>
|
||||
{notempty name="$config.title"}{$config.title}{/notempty}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">ICP备案号</td>
|
||||
<td>
|
||||
{notempty name="$config.icp"}{$config.icp}{/notempty}
|
||||
</td>
|
||||
<td class="layui-td-gray">公安备案号</td>
|
||||
<td>
|
||||
{notempty name="$config.beian"}{$config.beian}{/notempty}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">版权信息</td>
|
||||
<td>
|
||||
{notempty name="$config.copyright"}{$config.copyright}{/notempty}
|
||||
</td>
|
||||
<td class="layui-td-gray">代码版本号
|
||||
</td>
|
||||
<td>
|
||||
{notempty name="$config.version"}{$config.version}{/notempty}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">简介</td>
|
||||
<td colspan="3">
|
||||
{notempty name="$config.desc"}{$config.desc} {/notempty}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="table-title">服务器信息</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table" lay-skin="" lay-size="sm">
|
||||
{if condition="($install == true)"}
|
||||
<tr>
|
||||
<td colspan="4" style="color: #E94335; background-color:#f5f5f5">提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。</td>
|
||||
</tr>
|
||||
{/if}
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">服务器系统</td>
|
||||
<td>{:get_system_info('os')}</td>
|
||||
<td class="layui-td-gray-2">PHP版本</td>
|
||||
<td>{:get_system_info('php')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">上传限制</td>
|
||||
<td>{:get_system_info('upload_max_filesize')}</td>
|
||||
<td class="layui-td-gray-2">执行限制</td>
|
||||
<td>{:get_system_info('max_execution_time')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">ThinkPHP</td>
|
||||
<td colspan="3">{$TP_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:10px"
|
||||
href="https://www.kancloud.cn/manual/thinkphp6_0" target="_blank">TP6文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">Layui</td>
|
||||
<td colspan="3">{:LAYUI_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:10px"
|
||||
href="https://www.layui.site/doc/" target="_blank">Layui文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">江苏美天科技</td>
|
||||
<td colspan="3">{:CMS_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:10px"
|
||||
href="https://blog.gougucms.com/home/book/detail/bid/7.html" target="_blank">江苏美天科技文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">BUG反馈</td>
|
||||
<td colspan="3"><a href="mailto:hdm58@qq.com" target="_blank">hdm58@qq.com</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">QQ交流群</td>
|
||||
<td colspan="3">搜Q群:24641076,或点击 <a href="https://jq.qq.com/?_wv=1027&k=pxshRv6I" target="_blank" rel="nofollow"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="gougucms交流群" title="gougucms交流群" style="vertical-align:middle"></a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">同系开源软件</td>
|
||||
<td colspan="3"><a class="layui-badge layui-bg-blue" style="margin-right:16px" href="https://gitee.com/gougucms/gougucms" target="_blank">勾股CMS</a><a class="layui-badge layui-bg-blue" style="margin-right:16px" href="https://gitee.com/gougucms/blog" target="_blank">勾股BLOG</a><a class="layui-badge layui-bg-blue" style="margin-right:16px" href="https://gitee.com/gougucms/office" target="_blank">勾股OA</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
@@ -0,0 +1,133 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>任务类型</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-new">+ 添加类别</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table=layui.table,
|
||||
tool=layui.tool,
|
||||
layer=layui.layer;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,title:'任务类型列表'
|
||||
,url: "/admin/tcate/index"
|
||||
,method :"get"
|
||||
,page: false //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 200
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '类别名称'}
|
||||
,{field:'sort',title: '排序'}
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span>正常</span>';
|
||||
var html2='<span style="color:#FF5722">禁用</span>';
|
||||
if(d.status==1){
|
||||
return html1;
|
||||
}
|
||||
else{
|
||||
return html2;
|
||||
}
|
||||
}}
|
||||
,{width:100,title: '操作', align:'center',templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
addExpense(obj.data.id,obj.data.title);
|
||||
}
|
||||
if(obj.event === 'disable'){
|
||||
layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/tcate/check",{ id: obj.data.id, status: 0 },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'open'){
|
||||
layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/tcate/check",{ id: obj.data.id, status: 1 },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('.main-page-content').on('click','.add-new',function(){
|
||||
addExpense(0,'');
|
||||
});
|
||||
|
||||
function addExpense(id,val){
|
||||
var title = '新增类别';
|
||||
if(id>0){
|
||||
title = '编辑类别';
|
||||
}
|
||||
layer.prompt({
|
||||
title: title,
|
||||
value: val,
|
||||
yes: function(index, layero) {
|
||||
// 获取文本框输入的值
|
||||
var value = layero.find(".layui-layer-input").val();
|
||||
if (value) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
layer.close(index);
|
||||
}
|
||||
tool.post("/admin/tcate/add",{id: id, title: value,},callback);
|
||||
} else {
|
||||
layer.msg('请填写类别标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,259 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
{if condition="$id eq 0"}
|
||||
<h3 class="h3-title">添加员工信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工姓名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入员工姓名" lay-reqText="请输入员工姓名"
|
||||
autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">手机号码<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-gray">初始密码</td>
|
||||
<td>
|
||||
{$reg_pwd}
|
||||
<input type="hidden" name="reg_pwd" value="{$reg_pwd}" lay-verify="required">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">所在部门<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<select name="did" lay-verify="required" lay-reqText="请选择所属部门">
|
||||
<option value="">请选择所属部门</option>
|
||||
{volist name="department" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">岗位职称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<select name="position_id" lay-verify="required" lay-reqText="请选择岗位职称">
|
||||
<option value="">请选择岗位职称</option>
|
||||
{volist name="position" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray-2">头像<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/home/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-gray">入职日期<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="entry_time" name="entry_time" readonly lay-verify="required"
|
||||
placeholder="请选择入职日期" lay-reqText="请选择入职日期" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">员工性别<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男">
|
||||
<input type="radio" name="sex" value="2" title="女">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工类型<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="type" value="3" title="实习">
|
||||
<input type="radio" name="type" value="2" title="试用">
|
||||
<input type="radio" name="type" value="1" title="正式">
|
||||
</td>
|
||||
<td class="layui-td-gray">电子邮箱<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="email" value="" lay-verify="required" placeholder="请输入电子邮箱" lay-reqText="请输入电子邮箱" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">账号状态</td>
|
||||
<td colspan="5">
|
||||
<input type="radio" name="status" value="0" title="禁止登录">
|
||||
<input type="radio" name="status" value="1" title="正常" checked>
|
||||
<input type="radio" name="status" value="2" title="离职">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工简介</td>
|
||||
<td colspan="7">
|
||||
<textarea name="desc" placeholder="请输入员工简介" class="layui-textarea"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<h3 class="h3-title">编辑员工信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">登录账号</td>
|
||||
<td>
|
||||
{$detail.username}
|
||||
</td>
|
||||
<td class="layui-td-gray">初始密码</td>
|
||||
<td>
|
||||
{empty name="$detail.reg_pwd"}
|
||||
密码已重置
|
||||
{else/}
|
||||
{$detail.reg_pwd}
|
||||
{/empty}
|
||||
</td>
|
||||
<td class="layui-td-gray">账号状态</td>
|
||||
<td>
|
||||
{eq name="$detail.status" value="0"}<span style="color:#FF5722">禁止登录</span>{/eq}
|
||||
{eq name="$detail.status" value="1"}<span style="color:#009688">正常</span>{/eq}
|
||||
{eq name="$detail.status" value="2"}<span style="color:#FFB800">已离职</span>{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工姓名<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="name" value="{$detail.name}" lay-verify="required" placeholder="请输入员工姓名"
|
||||
lay-reqText="请输入员工姓名" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">手机号码<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="mobile" value="{$detail.mobile}" lay-verify="required" placeholder="可使用手机号码登录"
|
||||
lay-reqText="请输入手机" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray">头像<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="{$detail.thumb}" height="100" style="max-width: 100%; width: 100%;" />
|
||||
<input type="hidden" name="thumb" value="{$detail.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-gray">所在部门<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<select name="did" lay-verify="required" lay-reqText="请选择所属部门">
|
||||
<option value="">请选择所属部门</option>
|
||||
{volist name="department" id="v"}
|
||||
<option value="{$v.id}" {eq name="$v.id" value="$detail.did" }selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">岗位职称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<select name="position_id" lay-verify="required" lay-reqText="请选择岗位职称">
|
||||
<option value="">请选择岗位职称</option>
|
||||
{volist name="position" id="v"}
|
||||
<option value="{$v.id}" {eq name="$v.id" value="$detail.position_id" }selected{/eq}>{$v.title}
|
||||
</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">入职日期<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="entry_time" value="{$detail.entry_time|time_format=###,'Y-m-d'}"
|
||||
name="entry_time" readonly lay-verify="required" placeholder="请选择入职日期" lay-reqText="请选择入职日期"
|
||||
autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">员工性别<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1" }checked{/eq}>
|
||||
<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2" }checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工类型<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="type" value="3" title="实习" {eq name="$detail.type" value="3" }checked{/eq}>
|
||||
<input type="radio" name="type" value="2" title="试用" {eq name="$detail.type" value="2" }checked{/eq}>
|
||||
<input type="radio" name="type" value="1" title="正式" {eq name="$detail.type" value="1" }checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">电子邮箱<font>*</font>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="email" value="{$detail.email}" lay-verify="required" placeholder="请输入电子邮箱" lay-reqText="请输入电子邮箱" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工简介</td>
|
||||
<td colspan="7">
|
||||
<textarea name="desc" placeholder="请输入员工简介" class="layui-textarea">{$detail.desc}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/if}
|
||||
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" value="{$id}" name="id">
|
||||
<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>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
laydate = layui.laydate,
|
||||
upload = layui.upload;
|
||||
|
||||
form.render();
|
||||
//日期选择
|
||||
laydate.render({
|
||||
elem: '#entry_time',
|
||||
max: 7,
|
||||
showBottom: false
|
||||
});
|
||||
//头像上传
|
||||
var uploadInst = upload.render({
|
||||
elem: "#test1",
|
||||
url: "/api/index/upload",
|
||||
done: function (e) {
|
||||
//如果上传失败
|
||||
if (e.code == 1) {
|
||||
return layer.msg('上传失败');
|
||||
}
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', e.data.filepath);
|
||||
$('#demo1 img').attr('src', e.data.filepath);
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/admin/user/add", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,338 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>企业员工</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.layui-tree-entry{font-size:14px;}
|
||||
.layui-tree-set{padding:2px 0}
|
||||
.layui-tree-iconClick .layui-icon{color:#1E9FFF}
|
||||
.layui-tree-icon {height: 13px;line-height: 13px; width: 13px; text-align: center; border: 1px solid #1E9FFF; color:#1E9FFF}
|
||||
.layui-tree-line .layui-tree-set .layui-tree-set:after{top:18px;}
|
||||
.tree-left{width:200px; position:absolute; height:100%; top:0; left:0; border-right:1px solid #eeeeee; padding:0 10px;}
|
||||
.tree-left h3{font-size:16px; height:30px; margin-top:20px; padding-left:10px; font-weight:800}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="tree-left">
|
||||
<h3>企业组织架构</h3>
|
||||
<div id="depament"></div>
|
||||
</div>
|
||||
<div class="body-table" style="margin-left:220px;">
|
||||
<form class="layui-form layui-form-bar">
|
||||
<div class="layui-input-inline" style="width:136px">
|
||||
<select name="status">
|
||||
<option value="">选择员工状态</option>
|
||||
<option value="1">正常状态</option>
|
||||
<option value="0">禁止登录</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:136px">
|
||||
<select name="type">
|
||||
<option value="">选择员工类型</option>
|
||||
<option value="1">正式员工</option>
|
||||
<option value="2">试用员工</option>
|
||||
<option value="3">实习员工</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:240px">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,如:ID/姓名/手机号码" class="layui-input" autocomplete="off" />
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="thumb">
|
||||
<img src="{{d.thumb}}" width="30" height="30" />
|
||||
</script>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add"><i class="layui-icon"></i>添加员工</button>
|
||||
<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="disable"><i class="layui-icon">ဆ</i>禁止登录</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="recovery"><i class="layui-icon"></i>恢复正常</button>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var tree = layui.tree,
|
||||
table = layui.table,
|
||||
tool = layui.tool,
|
||||
form = layui.form;
|
||||
|
||||
var treeRender = function(res){
|
||||
//仅节点左侧图标控制收缩
|
||||
tree.render({
|
||||
elem: '#depament',
|
||||
data: res.trees,
|
||||
onlyIconControl: true, //是否仅允许节点左侧图标控制展开收缩
|
||||
click: function(obj){
|
||||
//layer.msg(JSON.stringify(obj.data));
|
||||
layui.pageTable.reload({
|
||||
where: {did: obj.data.id}
|
||||
,page:{curr:1}
|
||||
});
|
||||
$('[name="keywords"]').val('');
|
||||
$('[name="status"]').val('');
|
||||
$('[name="type"]').val('');
|
||||
layui.form.render('select');
|
||||
}
|
||||
});
|
||||
}
|
||||
tool.get("/api/index/get_department_tree",{},treeRender);
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
title: '员工列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
url: "/admin/user/index", //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
defaultToolbar: false,
|
||||
height: 'full-112',
|
||||
cols: [
|
||||
[
|
||||
{type:'checkbox',fixed:'left'},
|
||||
{
|
||||
field: 'id',
|
||||
title: '员工号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-badge layui-bg-green">正常</span>';
|
||||
if(d.status == 2){
|
||||
html = '<span class="layui-badge layui-bg-orange">已离职</span>'
|
||||
}
|
||||
else if(d.status == 0){
|
||||
html = '<span class="layui-badge">被禁用</span>'
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'type',
|
||||
title: '员工类型',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span style="color:#393D49">正式员工</span>';
|
||||
if(d.type == 2){
|
||||
html = '<span style="color:#01AAED">试用员工</span>'
|
||||
}
|
||||
else if(d.type == 3){
|
||||
html = '<span style="color:#5FB878">实 习 生</span>'
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: 'username',
|
||||
title: '登录账号',
|
||||
width: 120
|
||||
}, {
|
||||
field: 'thumb',
|
||||
title: '头像',
|
||||
toolbar: '#thumb',
|
||||
align: 'center',
|
||||
width: 60
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '用户姓名',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'mobile',
|
||||
title: '手机号码',
|
||||
align: 'center',
|
||||
width: 120
|
||||
},{
|
||||
field: 'sex',
|
||||
title: '性别',
|
||||
align: 'center',
|
||||
width: 50,
|
||||
templet: function (d) {
|
||||
var html = '未知';
|
||||
if(d.sex == 1){
|
||||
html = '男'
|
||||
}
|
||||
else if(d.sex == 2){
|
||||
html = '女'
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'department',
|
||||
title: '所在部门',
|
||||
align: 'center',
|
||||
width: 110
|
||||
}, {
|
||||
field: 'position',
|
||||
title: '岗位职称',
|
||||
align: 'center',
|
||||
width: 110
|
||||
}, {
|
||||
field: 'entry_time',
|
||||
title: '入职日期',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'login_num',
|
||||
title: '累计登录',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'last_login_time',
|
||||
title: '最后登录时间',
|
||||
align: 'center',
|
||||
minWidth: 136
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 160,
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
var btn1 = '<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">详情</span>';
|
||||
var btn2 = '<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
|
||||
var btn3 = '<span class="layui-btn layui-btn-xs layui-btn-warm" lay-event="copy">复制密码</span>';
|
||||
var btn4 = '<span class="layui-btn layui-btn-xs layui-btn-danger" lay-event="psw">重置密码</span>';
|
||||
if(d.reg_pwd == ''){
|
||||
html = '<div class="layui-btn-group">'+btn1+btn2+btn4+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
table.on('toolbar(test)', function(obj){
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = checkStatus.data;
|
||||
if (obj.event === 'add') {
|
||||
tool.open("/admin/user/add");
|
||||
return;
|
||||
}
|
||||
if(data.length==0){
|
||||
layer.msg('请选择要操作的员工');
|
||||
return false;
|
||||
}
|
||||
var uidArray=[],msg='是否执行该操作?',type=0;
|
||||
for(var i=0;i<data.length;i++){
|
||||
uidArray.push(data[i].id);
|
||||
}
|
||||
switch(obj.event){
|
||||
case 'disable':
|
||||
msg = '您确定要把选中的员工设为禁止登录?';
|
||||
type = 0;
|
||||
break;
|
||||
case 'recovery':
|
||||
msg = '您确定要把选中的员工恢复正常?';
|
||||
type = 1;
|
||||
break;
|
||||
};
|
||||
|
||||
layer.confirm(msg, {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/user/set",{ ids: uidArray.join(','), type: type },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(test)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.open('/admin/user/view?id='+data.id);
|
||||
return;
|
||||
}
|
||||
if(obj.event === 'edit'){
|
||||
tool.open('/admin/user/add?id='+data.id);
|
||||
}
|
||||
else if (obj.event === 'copy') {
|
||||
copyToClip(data.reg_pwd);
|
||||
return;
|
||||
}
|
||||
else if (obj.event === 'psw') {
|
||||
layer.confirm('确定要重设该用户的密码?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/user/reset",{id: data.id},callback);
|
||||
layer.close(index);
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
layui.pageTable.reload({
|
||||
where: {
|
||||
keywords: data.field.keywords,
|
||||
status: data.field.status,
|
||||
type: data.field.type
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//拷贝密码
|
||||
function copyToClip(content) {
|
||||
var save = function(e){
|
||||
e.clipboardData.setData('text/plain', content);
|
||||
e.preventDefault();
|
||||
}
|
||||
document.addEventListener('copy', save);
|
||||
document.execCommand('copy');
|
||||
document.removeEventListener('copy',save);
|
||||
if (content != '') {
|
||||
layer.msg('复制成功');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,161 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">员工信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">登录账号</td>
|
||||
<td>
|
||||
{$detail.username}
|
||||
</td>
|
||||
<td class="layui-td-gray">员工状态</td>
|
||||
<td>
|
||||
{eq name="$detail.status" value="0"}<span style="color:#FF5722">禁止登录</span>{/eq}
|
||||
{eq name="$detail.status" value="1"}<span style="color:#009688">正常</span>{/eq}
|
||||
{eq name="$detail.status" value="2"}<span style="color:#FFB800">已离职</span>{/eq}
|
||||
{empty name="$detail.reg_pwd"}
|
||||
,密码已重置
|
||||
<span class="layui-btn layui-btn-normal layui-btn-xs" data-note="rest" data-val="{$detail.id}">重设新密码</span>
|
||||
{else/}
|
||||
,默认密码:{$detail.reg_pwd}
|
||||
<span class="layui-btn layui-btn-normal layui-btn-xs" data-note="copy" data-val="{$detail.reg_pwd}">复制初始密码</span>
|
||||
{/empty}
|
||||
</td>
|
||||
<td rowspan="3" class="layui-td-gray">头像</td>
|
||||
<td rowspan="3" valign="top" style="width: 100px;">
|
||||
<div class="layui-upload">
|
||||
<img src="{$detail.thumb}" style="width:100px; height:100px; max-width:100%" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工姓名</td>
|
||||
<td>
|
||||
{$detail.name}
|
||||
</td>
|
||||
<td class="layui-td-gray">性别</td>
|
||||
<td>
|
||||
{eq name="$detail.sex" value="0"}未知{/eq}
|
||||
{eq name="$detail.sex" value="1"}男{/eq}
|
||||
{eq name="$detail.sex" value="2"}女{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">手机号码</td>
|
||||
<td>
|
||||
{$detail.mobile}
|
||||
</td>
|
||||
<td class="layui-td-gray">电子邮箱</td>
|
||||
<td>
|
||||
{$detail.email}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">所在部门</td>
|
||||
<td>{$detail.department}</td>
|
||||
<td class="layui-td-gray">岗位职称</td>
|
||||
<td>{$detail.position}</td>
|
||||
<td class="layui-td-gray">入职日期</td>
|
||||
<td>
|
||||
{$detail.entry_time | date='Y-m-d'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工类型</td>
|
||||
<td>
|
||||
{eq name="$detail.type" value="3"}<span style="color:#5FB878">实 习 生</span>{/eq}
|
||||
{eq name="$detail.type" value="2"}<span style="color:#01AAED">试用员工</span>{/eq}
|
||||
{eq name="$detail.type" value="1"}<span style="color:#393D49">正式员工</span>{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">最后登录时间</td>
|
||||
<td>
|
||||
{$detail.last_login_time}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">累计登录次数</td>
|
||||
<td>
|
||||
{$detail.login_num}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工简介</td>
|
||||
<td colspan="7">
|
||||
{$detail.desc}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3 class="h3-title" style="padding-top:15px;">用户权限</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
{volist name="role_rule" id="vo"}
|
||||
<tr>
|
||||
<td style="font-weight:800; text-align:center;">
|
||||
<input type="checkbox" disabled value="{$vo.id}" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
|
||||
</td>
|
||||
{notempty name="vo.children"}
|
||||
<td>
|
||||
<div style="padding:0 0 0 10px;">
|
||||
{volist name="vo.children" key="k" id="voo"}
|
||||
<div class="checkbox16" style="padding:10px 0;">
|
||||
<input type="checkbox" disabled lay-filter="rule" name="rule[]" value="{$voo.id}" lay-skin="primary" title="{$voo.title}" {eq name="$voo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{notempty name="voo.children"}
|
||||
<div style="padding:0 0 3px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
|
||||
{volist name="voo.children" id="vooo"}
|
||||
<div class="layui-input-inline" style="margin-right:10px;">
|
||||
<input type="checkbox" disabled data-rule="{$voo.id}" name="rule[]" value="{$vooo.id}" lay-skin="primary" title="{$vooo.title}" {eq name="$vooo.checked" value="true" }checked{/eq}>
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
{/notempty}
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
{/notempty}
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</form>
|
||||
<script>
|
||||
function openInit() {
|
||||
var form = layui.form,layer = layui.layer,tool=layui.tool;
|
||||
|
||||
form.render();
|
||||
//重设密码
|
||||
$('[data-note="rest"]').on('click',function(){
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要重设该用户的密码?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function(e){
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},2000);
|
||||
}
|
||||
}
|
||||
tool.post('/admin/admin/reset_psw',{id: id},callback);
|
||||
layer.close(index);
|
||||
});
|
||||
})
|
||||
|
||||
//拷贝密码
|
||||
$('[data-note="copy"]').on('click',function(){
|
||||
let val = $(this).data('val');
|
||||
if (navigator.clipboard) {
|
||||
navigator.clipboard.writeText(content);
|
||||
} else {
|
||||
var copy_textarea = document.createElement('textarea');
|
||||
copy_textarea.style.position = 'fixed';
|
||||
copy_textarea.style.clip = 'rect(0 0 0 0)';
|
||||
copy_textarea.style.top = '10px';
|
||||
copy_textarea.value = content;
|
||||
document.body.appendChild(copy_textarea);
|
||||
copy_textarea.select();
|
||||
document.execCommand('copy', true);
|
||||
document.body.removeChild(copy_textarea);
|
||||
}
|
||||
if (content != '') {
|
||||
layer.msg('复制成功');
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,132 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/home/user/setting">信息设置</a>
|
||||
<a><cite>工作类型</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="main-content">
|
||||
{include file="../../base/view/common/submenu" /}
|
||||
<div class="main-page-content">
|
||||
<div class="layui-form-bar">
|
||||
<button class="layui-btn layui-btn-sm add-new">+ 添加类别</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table=layui.table,
|
||||
tool=layui.tool,
|
||||
layer=layui.layer;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,title:'工作类别列表'
|
||||
,url: "/admin/wcate/index"
|
||||
,method :"get"
|
||||
,page: false //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 200
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '类别名称'}
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span>正常</span>';
|
||||
var html2='<span style="color:#FF5722">禁用</span>';
|
||||
if(d.status==1){
|
||||
return html1;
|
||||
}
|
||||
else{
|
||||
return html2;
|
||||
}
|
||||
}}
|
||||
,{width:100,title: '操作', align:'center',templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
addExpense(obj.data.id,obj.data.title);
|
||||
}
|
||||
if(obj.event === 'disable'){
|
||||
layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/wcate/check",{ id: obj.data.id, status: 0 },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'open'){
|
||||
layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/admin/wcate/check",{ id: obj.data.id, status: 1 },callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('.main-page-content').on('click','.add-new',function(){
|
||||
addExpense(0,'');
|
||||
});
|
||||
|
||||
function addExpense(id,val){
|
||||
var title = '新增类别';
|
||||
if(id>0){
|
||||
title = '编辑类别';
|
||||
}
|
||||
layer.prompt({
|
||||
title: title,
|
||||
value: val,
|
||||
yes: function(index, layero) {
|
||||
// 获取文本框输入的值
|
||||
var value = layero.find(".layui-layer-input").val();
|
||||
if (value) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
layer.close(index);
|
||||
}
|
||||
tool.post("/admin/wcate/add",{id: id, title: value,},callback);
|
||||
} else {
|
||||
layer.msg('请填写类别标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
Reference in New Issue
Block a user