first commit
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
use think\facade\Db;
|
||||
|
||||
//获取服务器信息
|
||||
function get_system_info($key)
|
||||
{
|
||||
$system = [
|
||||
'os' => PHP_OS,
|
||||
'php' => PHP_VERSION,
|
||||
'upload_max_filesize' => get_cfg_var("upload_max_filesize") ? get_cfg_var("upload_max_filesize") : "不允许上传附件",
|
||||
'max_execution_time' => get_cfg_var("max_execution_time") . "秒 ",
|
||||
];
|
||||
if (empty($key)) {
|
||||
return $system;
|
||||
} else {
|
||||
return $system[$key];
|
||||
}
|
||||
}
|
||||
|
||||
//假期类型
|
||||
function get_leaves_types($id=0)
|
||||
{
|
||||
$types_array = ['未设置','事假','年假','调休假','病假','婚假','丧假','产假','陪产假','其他'];
|
||||
if($id==0){
|
||||
return $types_array;
|
||||
}
|
||||
else{
|
||||
$news_array=[];
|
||||
foreach($types_array as $key => $value){
|
||||
if($key>0){
|
||||
$news_array[]=array(
|
||||
'id'=>$key,
|
||||
'title'=>$value,
|
||||
);
|
||||
}
|
||||
}
|
||||
return $news_array;
|
||||
}
|
||||
}
|
||||
|
||||
//根据假期类型读取名称
|
||||
function leaves_types_name($types=0)
|
||||
{
|
||||
$types_array = get_leaves_types();
|
||||
return $types_array[$types];
|
||||
}
|
||||
|
||||
//读取后台菜单列表
|
||||
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_module()
|
||||
{
|
||||
$group = Db::name('AdminModule')->order('id asc')->select()->toArray();
|
||||
return $group;
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
declare (strict_types = 1);
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\api\BaseController;
|
||||
use think\facade\Db;
|
||||
|
||||
class api extends BaseController
|
||||
{
|
||||
//首页公告
|
||||
public function get_note_list()
|
||||
{
|
||||
$list = Db::name('Note')
|
||||
->field('a.id,a.title,a.create_time,c.title as cate_title')
|
||||
->alias('a')
|
||||
->join('note_cate c', 'a.cate_id = c.id')
|
||||
->where(['a.status' => 1,'a.delete_time' => 0])
|
||||
->order('a.end_time desc,a.sort desc,a.create_time desc')
|
||||
->limit(8)
|
||||
->select()->toArray();
|
||||
foreach ($list as $key => $val) {
|
||||
$list[$key]['create_time'] = date('Y-m-d H:i', $val['create_time']);
|
||||
}
|
||||
$res['data'] = $list;
|
||||
return table_assign(0, '', $res);
|
||||
}
|
||||
|
||||
//首页知识列表
|
||||
public function get_article_list()
|
||||
{
|
||||
$prefix = get_config('database.connections.mysql.prefix');//判断是否安装了文章模块
|
||||
$exist = Db::query('show tables like "'.$prefix.'article"');
|
||||
$res['data'] = [];
|
||||
if($exist){
|
||||
$list = Db::name('Article')
|
||||
->field('a.id,a.title,a.create_time,a.read,c.title as cate_title')
|
||||
->alias('a')
|
||||
->join('article_cate c', 'a.cate_id = c.id')
|
||||
->where(['a.delete_time' => 0])
|
||||
->order('a.id desc')
|
||||
->limit(8)
|
||||
->select()->toArray();
|
||||
foreach ($list as $key => $val) {
|
||||
$list[$key]['create_time'] = date('Y-m-d H:i', $val['create_time']);
|
||||
}
|
||||
$res['data'] = $list;
|
||||
}
|
||||
return table_assign(0, '', $res);
|
||||
}
|
||||
|
||||
// 初始历史操作记录数据
|
||||
public function initAdminLog(){
|
||||
$second_time = time() - 86400;
|
||||
$startDate = date('Y-m-d',$second_time);
|
||||
$data = [];
|
||||
for ($i = 0; $i < 365; $i++) {
|
||||
$year = date('Y', strtotime($startDate . ' -' . $i . ' days'));
|
||||
$date = date('Y-m-d', strtotime($startDate . ' -' . $i . ' days'));
|
||||
$begin_second=strtotime($date. " 00:00:00");
|
||||
$end_second=strtotime($date. " 23:59:59");
|
||||
$count = Db::name('AdminLogCount')->where('date', $date)->count();
|
||||
if($count>0){
|
||||
continue;
|
||||
}
|
||||
$data[] = [
|
||||
'year' => $year,
|
||||
'date' => $date,
|
||||
'num' => Db::name('AdminLog')->whereBetween('create_time', "$begin_second,$end_second")->count(),
|
||||
'create_time' => time()
|
||||
];
|
||||
// 分批插入,避免数据量过大
|
||||
if (count($data) >= 100) {
|
||||
Db::name('AdminLogCount')->insertAll($data);
|
||||
$data = [];
|
||||
}
|
||||
}
|
||||
// 插入剩余数据
|
||||
if (!empty($data)) {
|
||||
Db::name('AdminLogCount')->insertAll($data);
|
||||
}
|
||||
//return to_assign();
|
||||
}
|
||||
//获取最近访问记录
|
||||
public function get_last_data()
|
||||
{
|
||||
$first_time = time();
|
||||
$second_time = $first_time - 86400;
|
||||
|
||||
$begin_first = strtotime(date('Y-m-d', $first_time) . " 00:00:00");
|
||||
$end_first = strtotime(date('Y-m-d', $first_time) . " 23:59:59");
|
||||
|
||||
$begin_second = strtotime(date('Y-m-d', $second_time) . " 00:00:00");
|
||||
$end_second = strtotime(date('Y-m-d', $second_time) . " 23:59:59");
|
||||
|
||||
//当天
|
||||
$data_first = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_first,$end_first")->select();
|
||||
//昨天
|
||||
$data_second = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_second,$end_second")->select();
|
||||
return to_assign(0, '', ['data_first' => hour_document($data_first), 'data_second' => hour_document($data_second)]);
|
||||
}
|
||||
|
||||
//获取访问记录
|
||||
public function get_view_data()
|
||||
{
|
||||
$first_time = time();
|
||||
$second_time = $first_time - 86400;
|
||||
$three_time = $first_time - 86400 * 365;
|
||||
|
||||
$begin_first = strtotime(date('Y-m-d', $first_time) . " 00:00:00");
|
||||
$end_first = strtotime(date('Y-m-d', $first_time) . " 23:59:59");
|
||||
|
||||
$begin_time = date('Y-m-d', $three_time);
|
||||
$end_time = date('Y-m-d', $second_time);
|
||||
|
||||
$last_count = Db::name('AdminLogCount')->where('date', $end_time)->count();
|
||||
if($last_count==0){
|
||||
//如果不存在生成记录
|
||||
$this->initAdminLog();
|
||||
}
|
||||
//当天
|
||||
$today_count = Db::name('AdminLog')->whereBetween('create_time', "$begin_first,$end_first")->count();
|
||||
//一年
|
||||
$data_three = Db::name('AdminLogCount')->field('date,num')->order('date asc')->whereBetween('date', "$begin_time,$end_time")->column('num', 'date');
|
||||
$today = date('Y-m-d');
|
||||
$data_three[$today] = $today_count;
|
||||
return to_assign(0, '', ['data_three' => $data_three]);
|
||||
}
|
||||
|
||||
//获取员工活跃数据
|
||||
public function get_view_log()
|
||||
{
|
||||
$times = strtotime("-30 day");
|
||||
$where = [];
|
||||
$where[] = ['uid','<>',1];
|
||||
$where[] = ['create_time', '>', $times];
|
||||
$list = Db::name('AdminLog')->field("id,uid")->where($where)->select();
|
||||
$logs = array();
|
||||
foreach ($list as $key => $value) {
|
||||
$uid = $value['uid'];
|
||||
if (empty($logs[$uid])) {
|
||||
$logs[$uid]['count'] = 1;
|
||||
$logs[$uid]['name'] = Db::name('Admin')->where('id',$uid)->value('name');
|
||||
} else {
|
||||
$logs[$uid]['count'] += 1;
|
||||
}
|
||||
}
|
||||
$counts = array_column($logs, 'count');
|
||||
array_multisort($counts, SORT_DESC, $logs);
|
||||
//攫取前10
|
||||
$data_logs = array_slice($logs, 0, 10);
|
||||
return to_assign(0, '', ['data_logs' => $data_logs]);
|
||||
}
|
||||
|
||||
public function areaJson($type)
|
||||
{
|
||||
if($type=='province'){
|
||||
$data = Db::name('Area')->where(['level'=>1,'status'=>1])->column('name', 'id');
|
||||
}
|
||||
if($type=='city'){
|
||||
$data = Db::name('Area')->where(['level'=>2,'status'=>1])->column('name', 'id');
|
||||
}
|
||||
if($type=='district'){
|
||||
$data = Db::name('Area')->where(['level'=>3,'status'=>1])->column('name', 'id');
|
||||
}
|
||||
if($type=='all'){
|
||||
$area = Db::name('Area')->field('id,pid,name')->select()->toArray();
|
||||
$data = generateTree($area);
|
||||
}
|
||||
// 导出为 JSON 格式
|
||||
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
return $json;
|
||||
/*
|
||||
输出Json文件
|
||||
// 设置响应头
|
||||
header('Content-Type: application/json');
|
||||
header('Content-Disposition: attachment; filename="oa_area.json"');
|
||||
// 输出 JSON 数据
|
||||
echo $json;
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\api\BaseController;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Approve extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$department = $this->did;
|
||||
$module = Db::name('FlowModule')->where(['status'=>1])->select()->toArray();
|
||||
$whereOr = [];
|
||||
if($this->uid>1){
|
||||
$map1=[
|
||||
['department_ids', '=', '']
|
||||
];
|
||||
$map2=[
|
||||
['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")]
|
||||
];
|
||||
$whereOr =[$map1,$map2];
|
||||
}
|
||||
|
||||
foreach ($module as &$row) {
|
||||
// 处理每一行数据
|
||||
$row['list'] = Db::name('FlowCate')
|
||||
->where([['module_id','=',$row['id']],['status','=',1],['is_list','=',1]])
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})
|
||||
->select()->toArray();
|
||||
}
|
||||
View::assign('module', $module);
|
||||
return view();
|
||||
}
|
||||
|
||||
public function get_list($where,$param)
|
||||
{
|
||||
$tables = Db::name('FlowCate')->field('name,check_table')->where('status',1)->select()->toArray();
|
||||
$prefix = get_config('database.connections.mysql.prefix');
|
||||
$sqlParts = [];
|
||||
$sqlCounts = [];
|
||||
$fortable =[];
|
||||
foreach ($tables as $table) {
|
||||
$dbname = $table['check_table'];
|
||||
if(in_array($dbname,$fortable)){
|
||||
continue;
|
||||
}
|
||||
$check_name = $table['name'];
|
||||
$tableName = $prefix.$dbname;
|
||||
$sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,'{$check_name}' as invoice_type,'{$check_name}' as types FROM {$tableName} WHERE {$where}";
|
||||
if($dbname=='invoice' || $dbname=='ticket'){
|
||||
$sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,invoice_type,'{$check_name}' as types FROM {$tableName} WHERE {$where}";
|
||||
}
|
||||
if($dbname=='approve'){
|
||||
$sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,'{$check_name}' as invoice_type,types FROM {$tableName} WHERE {$where}";
|
||||
}
|
||||
$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$where}";
|
||||
// 查询数据库中是否存在该数据表
|
||||
$is_table = Db::query("SHOW TABLES LIKE '{$tableName}'");
|
||||
// 判断查询结果
|
||||
if (!empty($is_table)) {
|
||||
$sqlParts[] = $sqlPart;
|
||||
$sqlCounts[] = $sqlCount;
|
||||
$fortable[] = $table['check_table'];
|
||||
}
|
||||
}
|
||||
|
||||
// 使用implode将各个部分用UNION ALL连接起来
|
||||
$unionSql = implode(" UNION ALL ", $sqlParts);
|
||||
|
||||
$totalCount = 0;
|
||||
foreach ($sqlCounts as $sql) {
|
||||
$count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组
|
||||
$totalCount += $count;
|
||||
}
|
||||
// 添加排序和分页逻辑
|
||||
$page = isset($param['page']) ? $param['page'] : 1;
|
||||
$pageSize = $param['limit'];
|
||||
$offset = ($page - 1) * $pageSize;
|
||||
|
||||
// 注意:不同的数据库分页语法可能有所不同,这里以MySQL为例
|
||||
$finalSql = $unionSql . " ORDER BY create_time DESC LIMIT {$offset}, {$pageSize}";
|
||||
|
||||
// 执行查询
|
||||
$result = Db::query($finalSql);
|
||||
// 处理结果
|
||||
foreach ($result as &$row) {
|
||||
// 处理每一行数据
|
||||
$row['create_time'] = date('Y-m-d H:i:s',$row['create_time']);
|
||||
$row['admin_name'] = Db::name('Admin')->where('id',$row['admin_id'])->value('name');
|
||||
$row['department'] = Db::name('Department')->where('id',$row['did'])->value('title');
|
||||
$row['check_status_str'] = check_status_name($row['check_status']);
|
||||
if($row['check_status']==1 && !empty($row['check_uids'])){
|
||||
$check_users = Db::name('Admin')->where('id','in',$row['check_uids'])->column('name');
|
||||
$row['check_users'] = implode(',',$check_users);
|
||||
}
|
||||
else{
|
||||
$row['check_users']='-';
|
||||
}
|
||||
if(!empty($row['check_copy_uids'])){
|
||||
$check_copy_users = Db::name('Admin')->where('id','in',$row['check_copy_uids'])->column('name');
|
||||
$row['check_copy_users'] = implode(',',$check_copy_users);
|
||||
}
|
||||
else{
|
||||
$row['check_copy_users']='-';
|
||||
}
|
||||
|
||||
$check_name=$row['check_name'];
|
||||
if($row['table_name'] == 'invoice' || $row['table_name']=='ticket'){
|
||||
if($row['invoice_type']==0){
|
||||
$check_name=$row['table_name'].'a';
|
||||
}
|
||||
else{
|
||||
$check_name=$row['table_name'];
|
||||
}
|
||||
}
|
||||
if($row['table_name'] == 'approve'){
|
||||
$check_name='approve_'.$row['types'];
|
||||
}
|
||||
$flow_cate = Db::name('FlowCate')->where('name',$check_name)->find();
|
||||
$row['types_name'] = $flow_cate['title'];
|
||||
$row['view_url'] = $flow_cate['view_url'];
|
||||
$row['add_url'] = $flow_cate['add_url'];
|
||||
}
|
||||
$list=array(
|
||||
'data'=>$result,
|
||||
'total'=>$totalCount
|
||||
);
|
||||
return $list;
|
||||
}
|
||||
|
||||
|
||||
//我申请的
|
||||
public function mylist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$status = isset($param['status']) ? $param['status'] : 0;
|
||||
$uid = $this->uid;
|
||||
$where = "delete_time = 0";
|
||||
if($status == 1){
|
||||
$where.= " AND check_status < 2";
|
||||
}
|
||||
if($status == 2){
|
||||
$where.= " AND check_status = 2";
|
||||
}
|
||||
if($status == 3){
|
||||
$where.= " AND check_status > 2";
|
||||
}
|
||||
$where.= ' AND admin_id = '.$uid;
|
||||
//关联抄送人
|
||||
//$where.= " AND FIND_IN_SET('{$uid}',check_copy_uids)";
|
||||
//关联审核人
|
||||
//$where.= " AND (FIND_IN_SET('{$uid}',check_uids) or FIND_IN_SET('{$uid}',check_history_uids))";
|
||||
$list = $this->get_list($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function checklist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$uid = $this->uid;
|
||||
$status = isset($param['status']) ? $param['status'] : 0;
|
||||
$where = "delete_time = 0";
|
||||
if($status == 0){
|
||||
$where.= " AND (FIND_IN_SET('{$uid}',check_uids) or FIND_IN_SET('{$uid}',check_history_uids))";
|
||||
}
|
||||
if($status == 1){
|
||||
$where.= " AND FIND_IN_SET('{$uid}',check_uids)";
|
||||
}
|
||||
if($status == 2){
|
||||
$where.= " AND FIND_IN_SET('{$uid}',check_history_uids)";
|
||||
}
|
||||
$list = $this->get_list($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function copylist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$status = isset($param['status']) ? $param['status'] : 0;
|
||||
$uid = $this->uid;
|
||||
$where = "delete_time = 0";
|
||||
if($status == 1){
|
||||
$where.= " AND check_status < 2";
|
||||
}
|
||||
if($status == 2){
|
||||
$where.= " AND check_status = 2";
|
||||
}
|
||||
if($status == 3){
|
||||
$where.= " AND check_status > 2";
|
||||
}
|
||||
//关联抄送人
|
||||
$where.= " AND FIND_IN_SET('{$uid}', check_copy_uids) > 0";
|
||||
$list = $this->get_list($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//全部审批
|
||||
public function all()
|
||||
{
|
||||
$auth_approve = isAuth($this->uid,'office_admin','conf_1');
|
||||
if (request()->isAjax()) {
|
||||
if($auth_approve==0){
|
||||
return to_assign(1, '无权限访问');
|
||||
}
|
||||
$param = get_params();
|
||||
$status = isset($param['status']) ? $param['status'] : 0;
|
||||
$uid = $this->uid;
|
||||
$where = "delete_time = 0";
|
||||
if($status == 1){
|
||||
$where.= " AND check_status < 2";
|
||||
}
|
||||
if($status == 2){
|
||||
$where.= " AND check_status = 2";
|
||||
}
|
||||
if($status == 3){
|
||||
$where.= " AND check_status > 2";
|
||||
}
|
||||
if(!empty($param['uid'])){
|
||||
$where.= ' AND admin_id = '.$param['uid'];
|
||||
}
|
||||
$list = $this->get_list($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
if($auth_approve==0){
|
||||
throw new \think\exception\HttpException(405, '无权限访问');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use backup\Backup;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Area extends BaseController
|
||||
{
|
||||
//数据表列表
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$area = Db::name('Area')->select();
|
||||
$list = generateTree($area);
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
$db = new Backup();
|
||||
$is_area = $db->check_table('area');
|
||||
View::assign('is_area', $is_area);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//新增/编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
if (request()->isAjax()) {
|
||||
$param['level'] = 1;
|
||||
if($pid > 0){
|
||||
$level = Db::name('Area')->where('id', $pid)->value('level');
|
||||
$param['level'] = $level+1;
|
||||
}
|
||||
if ($param['id'] > 0) {
|
||||
Db::name('Area')->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} else {
|
||||
$param['create_time'] = time();
|
||||
$rid = Db::name('Area')->strict(false)->field(true)->insertGetId($param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('Area')->where('id', $id)->find();
|
||||
$detail['pname'] = Db::name('Area')->where('id', $detail['pid'])->value('name');
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
$pname='';
|
||||
if($pid>0){
|
||||
$pname = Db::name('Area')->where('id', $pid)->value('name');
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('pid', $pid);
|
||||
View::assign('pname', $pname);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//设置
|
||||
public function set()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$db = new Backup();
|
||||
$is_area = $db->check_table('area');
|
||||
if($is_area==0){
|
||||
$oa_area = file_get_contents(CMS_ROOT . '/public/static/home/file/oa_area.sql');
|
||||
$res = $db->run_sql($oa_area);
|
||||
if($res){
|
||||
add_log('import', 0, []);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1, '数据写入失败,请联系官方!');
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (request()->isDelete()) {
|
||||
$params = get_params();
|
||||
$log_type = 'recovery';
|
||||
if($params['status']==0){
|
||||
$count = Db::name('Area')->where(["pid" => $params['id']])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(1, "该记录下还有子记录,无法禁用");
|
||||
}
|
||||
$log_type = 'disable';
|
||||
}
|
||||
if (Db::name('Area')->where(["id" => $params['id']])->update(['status'=>$params['status']]) !== false) {
|
||||
add_log($log_type, $params['id'], []);
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\validate\EnterpriseCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Cate extends BaseController
|
||||
{
|
||||
|
||||
//企业主体
|
||||
public function enterprise()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$enterprise = Db::name('Enterprise')->order('create_time asc')->select();
|
||||
return to_assign(0, '', $enterprise);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//企业主体新建编辑
|
||||
public function enterprise_add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(EnterpriseCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('Enterprise')->strict(false)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(EnterpriseCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('Enterprise')->strict(false)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('Enterprise')->where(['id' => $id])->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//企业主体设置
|
||||
public function enterprise_check()
|
||||
{
|
||||
$param = get_params();
|
||||
$res = Db::name('Enterprise')->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('recovery', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
//书签链接
|
||||
public function links()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$links = Db::name('Links')->where('delete_time',0)->order('sort desc')->select();
|
||||
return to_assign(0, '', $links);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//书签链接新建编辑
|
||||
public function links_add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('Links')->strict(false)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('Links')->strict(false)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('Links')->where(['id' => $id])->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//书签链接删除
|
||||
public function links_del()
|
||||
{
|
||||
$param = get_params();
|
||||
$param['delete_time'] = time();
|
||||
$res = Db::name('Links')->strict(false)->field('id,delete_time')->update($param);
|
||||
if ($res) {
|
||||
add_log('delete', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\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];
|
||||
$list = Db::name('Config')->where($where)->select();
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加/编辑配置项
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
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()
|
||||
{
|
||||
$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, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
//编辑配置信息
|
||||
public function edit()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$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();
|
||||
$module = strtolower(app('http')->getName());
|
||||
$class = strtolower(app('request')->controller());
|
||||
$action = strtolower(app('request')->action());
|
||||
$template = $module . '/view/' . $class . '/' . $conf['name'] . '.html';
|
||||
$config = [];
|
||||
if ($conf['content']) {
|
||||
$config = unserialize($conf['content']);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('config', $config);
|
||||
if (isTemplate($template)) {
|
||||
return view($conf['name']);
|
||||
} else {
|
||||
return view('../../base/view/common/errortemplate', ['file' => $template]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class dataauth extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = Db::name('DataAuth')->select();
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//编辑配置信息
|
||||
public function edit()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('DataAuth')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = $this->auth_detail($id);
|
||||
$module = strtolower(app('http')->getName());
|
||||
$class = strtolower(app('request')->controller());
|
||||
$action = strtolower(app('request')->action());
|
||||
$template = $module . '/view/' . $class . '/' . $detail['name'] . '.html';
|
||||
View::assign('detail', $detail);
|
||||
if (isTemplate($template)) {
|
||||
return view($detail['name']);
|
||||
} else {
|
||||
return view('../../base/view/common/errortemplate', ['file' => $template]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function auth_detail($id)
|
||||
{
|
||||
$detail = Db::name('DataAuth')->where('id',$id)->find();
|
||||
// 日常办公
|
||||
if($detail['name'] =='office_admin'){
|
||||
$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
|
||||
$detail['conf_1_str'] = implode(',', $conf_1_str);
|
||||
$conf_3_str = Db::name('Admin')->where('id', 'in', $detail['conf_3'])->column('name');
|
||||
$detail['conf_3_str'] = implode(',', $conf_3_str);
|
||||
}
|
||||
if($detail['name'] =='finance_admin'){
|
||||
$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
|
||||
$detail['conf_1_str'] = implode(',', $conf_1_str);
|
||||
$conf_2_str = Db::name('Admin')->where('id', 'in', $detail['conf_2'])->column('name');
|
||||
$detail['conf_2_str'] = implode(',', $conf_2_str);
|
||||
$conf_3_str = Db::name('Admin')->where('id', 'in', $detail['conf_3'])->column('name');
|
||||
$detail['conf_3_str'] = implode(',', $conf_3_str);
|
||||
$conf_4_str = Db::name('Admin')->where('id', 'in', $detail['conf_4'])->column('name');
|
||||
$detail['conf_4_str'] = implode(',', $conf_4_str);
|
||||
$conf_5_str = Db::name('Admin')->where('id', 'in', $detail['conf_5'])->column('name');
|
||||
$detail['conf_5_str'] = implode(',', $conf_5_str);
|
||||
}
|
||||
if($detail['name'] =='customer_admin'){
|
||||
$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
|
||||
$detail['conf_1_str'] = implode(',', $conf_1_str);
|
||||
}
|
||||
if($detail['name'] =='contract_admin'){
|
||||
$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
|
||||
$detail['conf_1_str'] = implode(',', $conf_1_str);
|
||||
}
|
||||
if($detail['name'] =='project_admin'){
|
||||
$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
|
||||
$detail['conf_1_str'] = implode(',', $conf_1_str);
|
||||
}
|
||||
if($detail['name'] =='disk_admin'){
|
||||
$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
|
||||
$detail['conf_1_str'] = implode(',', $conf_1_str);
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,230 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use backup\Backup;
|
||||
use think\facade\Session;
|
||||
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']);
|
||||
if(strpos($v['name'],'admin_log')){
|
||||
unset($list[$k]);
|
||||
}
|
||||
}
|
||||
// 提示信息
|
||||
$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,194 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\File;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Files extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
$fileext = ['','jpg,jpeg,png,gif','mpg,mp4,mpeg,avi,wmv,mov,flv,m4v','mp3,wav,wma,flac,midi','doc,docx,xls,xlsx,ppt,pptx,txt,pdf','zip,rar,7z,gz,tar'];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['f.name|g.title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (isset($param['group_id']) && $param['group_id']!='') {
|
||||
$where[] = ['f.group_id','=',$param['group_id']];
|
||||
}
|
||||
if (!empty($param['tab'])) {
|
||||
$where[] = ['f.fileext','in',$fileext[$param['tab']]];
|
||||
}
|
||||
$where[] = ['f.delete_time','=',0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = DB::name('File')
|
||||
->field("f.*,a.name as admin_name,g.title as group_title")
|
||||
->alias('f')
|
||||
->join('Admin a', 'f.admin_id = a.id','left')
|
||||
->join('FileGroup g', 'f.group_id = g.id','left')
|
||||
->order('f.create_time desc')
|
||||
->where($where)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function($item, $key){
|
||||
if(empty($item['thumbpath'])){
|
||||
$item['thumbpath'] = $item['filepath'];
|
||||
}
|
||||
$item['create_time'] = date('Y-m-d H:i:s', $item['create_time']);
|
||||
return $item;
|
||||
});
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
if (Db::name('File')->where('id',$param['id'])->update(['name'=>$param['title']]) !== false) {
|
||||
add_log('edit', $param['id'], []);
|
||||
return to_assign(0, "操作成功");
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//移动
|
||||
public function move()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$group_id = get_params("group_id");
|
||||
$ids = get_params("ids");
|
||||
$idArray = explode(',', strval($ids));
|
||||
$list = [];
|
||||
foreach ($idArray as $key => $val) {
|
||||
$list[] = [
|
||||
'id' => $val,
|
||||
'group_id' => $group_id,
|
||||
'update_time' => time()
|
||||
];
|
||||
}
|
||||
if(!empty($list)){
|
||||
$model = new File();
|
||||
foreach ($list as $item) {
|
||||
$model->update($item);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$ids = get_params("ids");
|
||||
$idArray = explode(',', strval($ids));
|
||||
$list = [];
|
||||
foreach ($idArray as $key => $val) {
|
||||
$list[] = [
|
||||
'id' => $val,
|
||||
'delete_time' => time()
|
||||
];
|
||||
}
|
||||
if(!empty($list)){
|
||||
$model = new File();
|
||||
foreach ($list as $item) {
|
||||
$model->update($item);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//获取分组
|
||||
public function get_group()
|
||||
{
|
||||
$list = Db::name('FileGroup')->where([['delete_time','=',0]])->select()->toArray();
|
||||
return to_assign(0, '',$list);
|
||||
}
|
||||
//添加&编辑
|
||||
public function add_group()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
if($param['title'] == '全部' || $param['title']=='未分组'){
|
||||
return to_assign(1, '该分组名称已经存在');
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$count = Db::name('FileGroup')->where([['id','<>',$param['id']],['delete_time','=',0],['title','=',$param['title']]])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(1, '该分组名称已经存在');
|
||||
}
|
||||
$res = Db::name('FileGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
if($res!=false){
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign(0,'编辑成功',$param['id']);
|
||||
}else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
} else {
|
||||
$count = Db::name('FileGroup')->where([['delete_time','=',0],['title','=',$param['title']]])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(1, '该分组名称已经存在');
|
||||
}
|
||||
$gid = Db::name('FileGroup')->strict(false)->field(true)->insertGetId($param);
|
||||
if($gid!=false){
|
||||
add_log('add', $gid, $param);
|
||||
return to_assign(0,'添加成功',$gid);
|
||||
}else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function del_group()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$id = get_params("ids");
|
||||
$count = Db::name('File')->where(["group_id" => $id])->count();
|
||||
if ($count > 0) {
|
||||
return to_assign(1, "该分组还存在文件,请去除文件或者转移文件后再删除");
|
||||
}
|
||||
if (Db::name('FileGroup')->delete($id) !== false) {
|
||||
add_log('delete', $id, []);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,467 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\AdminLog;
|
||||
use app\user\validate\AdminCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$mobile = is_mobile();
|
||||
if($mobile){
|
||||
return redirect('/qiye/index/index');
|
||||
}
|
||||
$admin = Db::name('Admin')->where('id',$this->uid)->find();
|
||||
if (get_cache('menu' . $this->uid)) {
|
||||
$list = get_cache('menu' . $this->uid);
|
||||
} else {
|
||||
$adminGroup = Db::name('PositionGroup')->where(['pid' => $admin['position_id']])->column('group_id');
|
||||
$adminMenu = Db::name('AdminGroup')->where('id', 'in', $adminGroup)->column('rules');
|
||||
$adminMenus = [];
|
||||
foreach ($adminMenu as $k => $v) {
|
||||
$v = explode(',', $v);
|
||||
$adminMenus = array_merge($adminMenus, $v);
|
||||
}
|
||||
$menu = Db::name('AdminRule')->where(['menu' => 1, 'status' => 1])->where('id', 'in', $adminMenus)->order('sort asc,id asc')->select()->toArray();
|
||||
$list = list_to_tree($menu);
|
||||
\think\facade\Cache::tag('adminMenu')->set('menu' . $this->uid, $list);
|
||||
}
|
||||
View::assign('menu', $list);
|
||||
View::assign('admin',$admin);
|
||||
View::assign('system',get_system_config('system'));
|
||||
View::assign('web',get_system_config('web'));
|
||||
return View();
|
||||
}
|
||||
|
||||
public function main()
|
||||
{
|
||||
$install = false;
|
||||
if (file_exists(CMS_ROOT . 'app/install')) {
|
||||
$install = true;
|
||||
}
|
||||
$uid = $this->uid;
|
||||
$dids = get_role_departments($uid);
|
||||
$total = [];
|
||||
|
||||
$whereFinance= array();
|
||||
$whereFinanceOr = array();
|
||||
$whereFinance[] = ['delete_time', '=', 0];
|
||||
$whereFinance[] = ['check_status', '=', 2];
|
||||
$whereFinancerOr[] =['admin_id', '=', $uid];
|
||||
if(!empty($dids)){
|
||||
$whereFinancerOr[] =['did', 'in', $dids];
|
||||
}
|
||||
|
||||
$total[] = array(
|
||||
'name' => '报销总数',
|
||||
'num' => Db::name('Expense')->where($whereFinance)
|
||||
->where(function ($query) use($whereFinancerOr) {
|
||||
$query->whereOr($whereFinancerOr);
|
||||
})
|
||||
->count()
|
||||
);
|
||||
$total[] = array(
|
||||
'name' => '开票总数',
|
||||
'num' => Db::name('Invoice')->where($whereFinance)
|
||||
->where(function ($query) use($whereFinancerOr) {
|
||||
$query->whereOr($whereFinancerOr);
|
||||
})
|
||||
->count()
|
||||
);
|
||||
$total[] = array(
|
||||
'name' => '收票总数',
|
||||
'num' => Db::name('Ticket')->where($whereFinance)
|
||||
->where(function ($query) use($whereFinancerOr) {
|
||||
$query->whereOr($whereFinancerOr);
|
||||
})
|
||||
->count()
|
||||
);
|
||||
|
||||
$whereHandle = [];
|
||||
$whereHandle[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereHandle[] = ['delete_time', '=', 0];
|
||||
$handle=[];
|
||||
|
||||
$handle[] = array(
|
||||
'name' => '待审公文',
|
||||
'num' => Db::name('OfficialDocs')->where($whereHandle)->count(),
|
||||
'id' => 182,
|
||||
'url' => '/adm/official/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待审用章',
|
||||
'num' => Db::name('Seal')->where($whereHandle)->count(),
|
||||
'id' => 176,
|
||||
'url' => '/adm/seal/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待审销售合同',
|
||||
'num' => Db::name('Contract')->where($whereHandle)->count(),
|
||||
'id' => 319,
|
||||
'url' => '/contract/contract/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待审采购合同',
|
||||
'num' => Db::name('Purchase')->where($whereHandle)->count(),
|
||||
'id' => 323,
|
||||
'url' => '/contract/purchase/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待审报销',
|
||||
'num' => Db::name('Expense')->where($whereHandle)->count(),
|
||||
'id' => 218,
|
||||
'url' => '/finance/expense/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待审发票',
|
||||
'num' => Db::name('Invoice')->where($whereHandle)->where([['invoice_type','>',0]])->count(),
|
||||
'id' => 238,
|
||||
'url' => '/finance/invoice/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待审收票',
|
||||
'num' => Db::name('ticket')->where($whereHandle)->where([['invoice_type','>',0]])->count(),
|
||||
'id' => 242,
|
||||
'url' => '/finance/ticket/datalist',
|
||||
);
|
||||
$handle[] = array(
|
||||
'name' => '待完成任务',
|
||||
'num' => Db::name('ProjectTask')->where([['director_uid', '=', $uid],['status', '<', 3],['delete_time', '=', 0]])->count(),
|
||||
'id' => 348,
|
||||
'url' => '/project/task/datalist',
|
||||
);
|
||||
|
||||
$whereCustomer = array();
|
||||
$whereCustomerOr = array();
|
||||
$whereCustomer[] = ['delete_time', '=', 0];
|
||||
$whereCustomerOr[] =['belong_uid', '=', $uid];
|
||||
if(!empty($dids)){
|
||||
$whereCustomerOr[] =['belong_did', 'in', $dids];
|
||||
}
|
||||
$whereCustomerOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
|
||||
$customerCount = Db::name('Customer')->where($whereCustomer)
|
||||
->where(function ($query) use($whereCustomerOr) {
|
||||
$query->whereOr($whereCustomerOr);
|
||||
})
|
||||
->count();
|
||||
$total[] = array(
|
||||
'name' => '客户总数',
|
||||
'num' => $customerCount,
|
||||
);
|
||||
|
||||
$whereContract = array();
|
||||
$whereContractOr = array();
|
||||
$whereContract[] = ['delete_time', '=', 0];
|
||||
$whereContractOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
if(!empty($dids)){
|
||||
$whereContractOr[] =['did', 'in', $dids];
|
||||
}
|
||||
|
||||
$contractCount = Db::name('Contract')->where($whereContract)
|
||||
->where(function ($query) use($whereContractOr) {
|
||||
$query->whereOr($whereContractOr);
|
||||
})
|
||||
->count();
|
||||
$total[] = array(
|
||||
'name' => '销售合同',
|
||||
'num' => $contractCount,
|
||||
);
|
||||
|
||||
$purchaseCount = Db::name('Purchase')->where($whereContract)
|
||||
->where(function ($query) use($whereContractOr) {
|
||||
$query->whereOr($whereContractOr);
|
||||
})
|
||||
->count();
|
||||
$total[] = array(
|
||||
'name' => '采购合同',
|
||||
'num' => $purchaseCount,
|
||||
);
|
||||
|
||||
$project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id');
|
||||
$whereProject = [];
|
||||
$whereProject[] = ['delete_time', '=', 0];
|
||||
$whereProject[] = ['id', 'in', $project_ids];
|
||||
$projectCount = Db::name('Project')->where($whereProject)->count();
|
||||
|
||||
$whereOr = array();
|
||||
$map1 = [];
|
||||
$map2 = [];
|
||||
$map3 = [];
|
||||
$map4 = [];
|
||||
$map1[] = ['admin_id', '=', $uid];
|
||||
$map2[] = ['director_uid', '=', $uid];
|
||||
$map3[] = ['', 'exp', Db::raw("FIND_IN_SET({$uid},assist_admin_ids)")];
|
||||
$map4[] = ['project_id', 'in', $project_ids];
|
||||
|
||||
$whereOr =[$map1,$map2,$map3];
|
||||
$taskCount = Db::name('ProjectTask')
|
||||
->where(function ($query) use ($whereOr) {
|
||||
if (!empty($whereOr))
|
||||
$query->whereOr($whereOr);
|
||||
})
|
||||
->where([['delete_time', '=', 0]])->count();
|
||||
|
||||
$total[] = array(
|
||||
'name' => '项目总数',
|
||||
'num' => $projectCount,
|
||||
);
|
||||
$total[] = array(
|
||||
'name' => '任务总数',
|
||||
'num' => $taskCount,
|
||||
);
|
||||
|
||||
$todue=[];
|
||||
$delay_day = valueAuth('contract_admin','conf_10');
|
||||
if(empty($delay_day)){
|
||||
$delay_day = 30;
|
||||
}
|
||||
$delay_time = time()+$delay_day*60*60*24;
|
||||
$mapContract = array();
|
||||
$mapContractOr = array();
|
||||
$mapContract[] = ['delete_time', '=', 0];
|
||||
$mapContract[] = ['check_status', '=', 2];
|
||||
$mapContract[] = ['end_time','<',$delay_time];
|
||||
$mapContractOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$mapContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
if(!empty($dids)){
|
||||
$mapContractOr[] =['did', 'in', $dids];
|
||||
}
|
||||
|
||||
$todue[] = array(
|
||||
'name' => '快到期的销售合同',
|
||||
'num' => Db::name('Contract')->where($mapContract)
|
||||
->where(function ($query) use($mapContractOr) {
|
||||
$query->whereOr($mapContractOr);
|
||||
})->count(),
|
||||
'id' => 319,
|
||||
'url' => '/contract/contract/datalist',
|
||||
);
|
||||
$todue[] = array(
|
||||
'name' => '快到期的采购合同',
|
||||
'num' => Db::name('Purchase')->where($mapContract)
|
||||
->where(function ($query) use($mapContractOr) {
|
||||
$query->whereOr($mapContractOr);
|
||||
})->count(),
|
||||
'id' => 323,
|
||||
'url' => '/contract/purchase/datalist',
|
||||
);
|
||||
$delay_day_b = valueAuth('project_admin','conf_10');
|
||||
if(empty($delay_day_b)){
|
||||
$delay_day_b = 3;
|
||||
}
|
||||
$delay_day_b_time = time()+$delay_day_b*60*60*24;
|
||||
$todue[] = array(
|
||||
'name' => '快到期的项目',
|
||||
'num' => Db::name('Project')->where($whereProject)->where([['status','<',3],['end_time','<',$delay_day_b_time]])->count(),
|
||||
'id' => 343,
|
||||
'url' => '/project/index/datalist',
|
||||
);
|
||||
$todue[] = array(
|
||||
'name' => '快到期的任务',
|
||||
'num' => Db::name('ProjectTask')
|
||||
->where(function ($query) use ($whereOr) {
|
||||
if (!empty($whereOr))
|
||||
$query->whereOr($whereOr);
|
||||
})
|
||||
->where([['delete_time', '=', 0],['status','<',3],['end_time','<',$delay_day_b_time]])->count(),
|
||||
'id' => 348,
|
||||
'url' => '/project/task/datalist',
|
||||
);
|
||||
|
||||
$position_id = Db::name('Admin')->where('id',$uid)->value('position_id');
|
||||
$adminGroup = Db::name('PositionGroup')->where(['pid' => $position_id])->column('group_id');
|
||||
$adminLayout = Db::name('AdminGroup')->where('id', 'in', $adminGroup)->column('layouts');
|
||||
$adminLayouts = [];
|
||||
foreach ($adminLayout as $k => $v) {
|
||||
$v = explode(',', $v);
|
||||
$adminLayouts = array_merge($adminLayouts, $v);
|
||||
}
|
||||
$layouts = get_config('layout');
|
||||
$layout_selected = [];
|
||||
foreach ($layouts as $key =>$vo) {
|
||||
if (!empty($adminLayouts) and in_array($vo['id'], $adminLayouts)) {
|
||||
$layout_selected[] = $vo;
|
||||
}
|
||||
}
|
||||
View::assign('layout_selected',$layout_selected);
|
||||
View::assign('total', $total);
|
||||
View::assign('handle', $handle);
|
||||
View::assign('todue', $todue);
|
||||
View::assign('install', $install);
|
||||
View::assign('TP_VERSION', \think\facade\App::version());
|
||||
return View();
|
||||
}
|
||||
|
||||
//权限不足
|
||||
public function role()
|
||||
{
|
||||
return View('../../base/view/common/roletemplate');
|
||||
}
|
||||
//通讯录
|
||||
public function contacts_book()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
$whereOr = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['did'])) {
|
||||
$admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id');
|
||||
$map1=[
|
||||
['a.id','in',$admin_array],
|
||||
];
|
||||
$map2=[
|
||||
['a.did', '=', $param['did']],
|
||||
];
|
||||
$whereOr =[$map1,$map2];
|
||||
}
|
||||
$where[] = ['a.status', '=', 1];
|
||||
$where[] = ['a.id', '>', 1];
|
||||
$admin = \app\user\model\Admin::alias('a')
|
||||
->with('departments')
|
||||
->field('a.*,p.title as position,d.title as department')
|
||||
->join('Department d', 'd.id = a.did','left')
|
||||
->join('Position p', 'p.id = a.position_id','left')
|
||||
->where($where)
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})
|
||||
->paginate(intval($this->pageSize))
|
||||
->order('a.id desc')
|
||||
->each(function ($item, $key) {
|
||||
//遍历次要部门数据
|
||||
$departments = $item->departments->toArray();
|
||||
if(empty($departments)){
|
||||
$item->departments = '-';
|
||||
}
|
||||
else{
|
||||
$item->departments = split_array_field($departments,'title');
|
||||
}
|
||||
if($item->is_hide ==1){
|
||||
$item->mobile = hidetel($item->mobile);
|
||||
$item->email = hidetel($item->email);
|
||||
}
|
||||
$item->entry_time = empty($item->entry_time) ? '-' : to_date($item->entry_time,'Y-m-d',);
|
||||
});
|
||||
return table_assign(0, '', $admin);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//修改个人信息
|
||||
public function edit_personal()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$uid = $this->uid;
|
||||
Db::name('Admin')->where(['id' => $uid])->strict(false)->field(true)->update($param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
View::assign('admin',get_admin($this->uid));
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//修改密码
|
||||
public function edit_password()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(AdminCheck::class)->scene('editPwd')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$uid = $this->uid;
|
||||
|
||||
$admin = Db::name('Admin')->where(['id' => $uid])->find();
|
||||
$old_psw = set_password($param['old_pwd'], $admin['salt']);
|
||||
if ($admin['pwd'] != $old_psw) {
|
||||
return to_assign(1, '旧密码错误');
|
||||
}
|
||||
|
||||
$salt = set_salt(20);
|
||||
$new_pwd = set_password($param['pwd'], $salt);
|
||||
$data = [
|
||||
'reg_pwd' => '',
|
||||
'salt' => $salt,
|
||||
'pwd' => $new_pwd,
|
||||
'update_time' => time(),
|
||||
];
|
||||
Db::name('Admin')->where(['id' => $uid])->strict(false)->field(true)->update($data);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
View::assign('admin',get_admin($this->uid));
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//系统操作日志
|
||||
public function log_list()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$log = new AdminLog();
|
||||
$content = $log->get_log_list($param);
|
||||
return table_assign(0, '', $content);
|
||||
}else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//设置theme
|
||||
public function set_theme()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
Db::name('Admin')->where('id',$this->uid)->update(['theme'=>$param['theme']]);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1,'操作错误');
|
||||
}
|
||||
}
|
||||
|
||||
//办公工具
|
||||
public function get_links()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$links = Db::name('Links')->where('delete_time',0)->order('sort desc')->select();
|
||||
return to_assign(0, '', $links);
|
||||
}else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\Leaves as LeavesModel;
|
||||
use app\home\validate\LeavesValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Leaves extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new LeavesModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where=[];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if(!empty($param['start_date'])){
|
||||
$param['start_date'] = strtotime($param['start_date']);
|
||||
}
|
||||
if(!empty($param['end_date'])){
|
||||
$param['end_date'] = strtotime($param['end_date']);
|
||||
if($param['end_date']<$param['start_date']){
|
||||
return to_assign(1, '结束时间不能小于开始时间');
|
||||
}
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$this->model->edit($param);
|
||||
}
|
||||
else {
|
||||
$param['admin_id'] = $this->uid;
|
||||
$param['did'] = $this->did;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/add_qingjia');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('create_user', get_admin($detail['admin_id']));
|
||||
$detail['types_name'] = leaves_types_name($detail['types']);
|
||||
View::assign('detail', $detail);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/view_qingjia');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = $param['id'];
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\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[] = ['u.name|a.param_id|a.uid', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['action'])) {
|
||||
$where[] = ['a.action','=',$param['action']];
|
||||
}
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = DB::name('AdminLog')
|
||||
->field("a.*,u.name")
|
||||
->alias('a')
|
||||
->join('Admin u', 'a.uid = u.id')
|
||||
->order('a.create_time desc')
|
||||
->where($where)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function($item, $key){
|
||||
$item['content'] = $item['name']. $item['action'] . '了' . $item['subject'];
|
||||
$item['create_time'] = date('Y-m-d H:i:s', $item['create_time']);
|
||||
$param_array = json_decode($item['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;
|
||||
}
|
||||
$item['param'] = implode(' & ',$param_value);
|
||||
}
|
||||
else{
|
||||
$item['param'] = $param_array;
|
||||
}
|
||||
return $item;
|
||||
});
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
$type_action = get_config('log.type_action');
|
||||
View::assign('type_action', $type_action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\home\validate\UserCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
|
||||
class Login
|
||||
{
|
||||
//登录
|
||||
public function index()
|
||||
{
|
||||
$wxwork = is_wxwork();
|
||||
$mobile = is_mobile();
|
||||
if($wxwork){
|
||||
return redirect('/qiye/login/login');
|
||||
}
|
||||
if($mobile){
|
||||
return redirect('/qiye/login/index');
|
||||
}
|
||||
return View();
|
||||
}
|
||||
//提交登录
|
||||
public function login_submit()
|
||||
{
|
||||
$param = get_params();
|
||||
try {
|
||||
validate(UserCheck::class)->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
|
||||
$admin = Db::name('Admin')->where(['username' => $param['username'],'delete_time' => 0])->find();
|
||||
if (empty($admin)) {
|
||||
$admin = Db::name('Admin')->where(['mobile' => $param['username'],'delete_time' => 0])->find();
|
||||
if (empty($admin)) {
|
||||
return to_assign(1, '用户名或手机号码错误');
|
||||
}
|
||||
}
|
||||
$param['pwd'] = set_password($param['password'], $admin['salt']);
|
||||
if ($admin['pwd'] !== $param['pwd']) {
|
||||
return to_assign(1, '用户或密码错误');
|
||||
}
|
||||
if ($admin['status'] != 1) {
|
||||
return to_assign(1, '该用户禁止登录,请与管理者联系');
|
||||
}
|
||||
$data = [
|
||||
'is_lock' => 0,
|
||||
'last_login_time' => time(),
|
||||
'last_login_ip' => request()->ip(),
|
||||
'login_num' => $admin['login_num'] + 1,
|
||||
];
|
||||
Db::name('admin')->where(['id' => $admin['id']])->update($data);
|
||||
$session_admin = get_config('app.session_admin');
|
||||
Session::set($session_admin, $admin['id']);
|
||||
$token = make_token();
|
||||
set_cache($token, $admin, 7200);
|
||||
$admin['token'] = $token;
|
||||
$logdata = [
|
||||
'uid' => $admin['id'],
|
||||
'type' => 'login',
|
||||
'action' => '登录',
|
||||
'subject' => '系统',
|
||||
'param_id'=>$admin['id'],
|
||||
'param'=>'[]',
|
||||
'ip' => request()->ip(),
|
||||
'create_time' => time()
|
||||
];
|
||||
Db::name('AdminLog')->strict(false)->field(true)->insert($logdata);
|
||||
return to_assign(0, '登录成功', ['uid' => $admin['id']]);
|
||||
}
|
||||
|
||||
//退出登录
|
||||
public function login_out()
|
||||
{
|
||||
$session_admin = get_config('app.session_admin');
|
||||
Session::delete($session_admin);
|
||||
return to_assign(0, "退出成功");
|
||||
}
|
||||
|
||||
//锁屏
|
||||
public function lock()
|
||||
{
|
||||
$session_admin = get_config('app.session_admin');
|
||||
$admin_id= Session::get($session_admin);
|
||||
$admin = Db::name('admin')->where(['id' => $admin_id])->find();
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
if($param['lock_password'] == ''){
|
||||
return to_assign(1, '请输入登录密码解锁');
|
||||
}
|
||||
if(empty($admin)){
|
||||
return to_assign(2, '登录超时,请重新登录');
|
||||
}
|
||||
$pwd = set_password($param['lock_password'], $admin['salt']);
|
||||
if ($admin['pwd'] !== $pwd) {
|
||||
return to_assign(1, '密码错误');
|
||||
}
|
||||
else{
|
||||
Db::name('admin')->where('id',$admin['id'])->update(['is_lock'=>0]);
|
||||
return to_assign(0, '解锁成功', ['uid' => $admin['id']]);
|
||||
}
|
||||
}
|
||||
Db::name('admin')->where('id',$admin['id'])->update(['is_lock'=>1]);
|
||||
return View();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,552 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\Message as MessageList;
|
||||
use app\home\model\Msg as MsgList;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Message extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
protected $model2;
|
||||
public function __construct() {
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new MessageList();
|
||||
$this->model2 = new MsgList();
|
||||
}
|
||||
//收件箱
|
||||
public function inbox()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = [];
|
||||
$where[] = ['to_uid', '=', $this->uid];
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['read'])) {
|
||||
if($param['read']==1){
|
||||
$where[] = ['read_time', '=', 0];
|
||||
}else{
|
||||
$where[] = ['read_time', '>', 0];
|
||||
}
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
if($param['types']==1){
|
||||
$where[] = ['from_uid', '=', 0];
|
||||
}else{
|
||||
$where[] = ['from_uid', '>', 0];
|
||||
}
|
||||
}
|
||||
//按发送时间检索
|
||||
if (!empty($param['range_time'])) {
|
||||
$range_time =explode('~', $param['range_time']);
|
||||
$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
|
||||
}
|
||||
$list = $this->model2->datalist($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$count = [
|
||||
'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
|
||||
'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
|
||||
'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
|
||||
'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
|
||||
'rubbish' => $a+$b
|
||||
];
|
||||
View::assign('count', $count);
|
||||
View::assign('action', $this->action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//星标信息
|
||||
public function star()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = [];
|
||||
$where[] = ['to_uid', '=', $this->uid];
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$where[] = ['is_star', '=', 1];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['read'])) {
|
||||
if($param['read']==1){
|
||||
$where[] = ['read_time', '=', 0];
|
||||
}else{
|
||||
$where[] = ['read_time', '>', 0];
|
||||
}
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
if($param['types']==1){
|
||||
$where[] = ['from_uid', '=', 0];
|
||||
}else{
|
||||
$where[] = ['from_uid', '>', 0];
|
||||
}
|
||||
}
|
||||
//按发送时间检索
|
||||
if (!empty($param['range_time'])) {
|
||||
$range_time =explode('~', $param['range_time']);
|
||||
$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
|
||||
}
|
||||
$list = $this->model2->datalist($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$count = [
|
||||
'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
|
||||
'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
|
||||
'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
|
||||
'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
|
||||
'rubbish' => $a+$b
|
||||
];
|
||||
View::assign('count', $count);
|
||||
View::assign('action', $this->action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//发件箱
|
||||
public function sendbox()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = [];
|
||||
if (!empty($param['keywords'])) {
|
||||
$map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['from_uid', '=', $this->uid];
|
||||
$where[] = ['is_draft', '=', 1];
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
//按发送时间检索
|
||||
if (!empty($param['range_time'])) {
|
||||
$range_time =explode('~', $param['range_time']);
|
||||
$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
|
||||
}
|
||||
$list = $this->model->datalist($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$count = [
|
||||
'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
|
||||
'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
|
||||
'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
|
||||
'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
|
||||
'rubbish' => $a+$b
|
||||
];
|
||||
View::assign('count', $count);
|
||||
View::assign('action', $this->action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//草稿箱
|
||||
public function draft()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = [];
|
||||
if (!empty($param['keywords'])) {
|
||||
$map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['from_uid', '=', $this->uid];
|
||||
$where[] = ['is_draft', '=', 2];
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
//按发送时间检索
|
||||
if (!empty($param['range_time'])) {
|
||||
$range_time =explode('~', $param['range_time']);
|
||||
$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
|
||||
}
|
||||
$list = $this->model->datalist($where,$param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$count = [
|
||||
'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
|
||||
'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
|
||||
'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
|
||||
'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
|
||||
'rubbish' => $a+$b
|
||||
];
|
||||
View::assign('count', $count);
|
||||
View::assign('action', $this->action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//垃圾箱
|
||||
public function rubbish()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$uid = $this->uid;
|
||||
$where = "delete_time > 0";
|
||||
$where.= " AND clear_time = 0";
|
||||
if (!empty($param['keywords'])) {
|
||||
$where.= " AND title like '%" . $param['keywords'] . "%'";
|
||||
}
|
||||
$sqlParts = [];
|
||||
$sqlCounts = [];
|
||||
$tables=['message','msg'];
|
||||
$prefix = get_config('database.connections.mysql.prefix');
|
||||
foreach ($tables as $table) {
|
||||
$tableName = $prefix.$table;
|
||||
if($table=='message'){
|
||||
$wherea= $where.' AND from_uid = '.$uid;
|
||||
// 假设每个表都有相同的列结构,这里只是简单示例
|
||||
$sqlPart = "SELECT id,title,from_uid,send_time,'{$table}' as table_name FROM {$tableName} WHERE {$wherea}";
|
||||
$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$wherea}";
|
||||
}
|
||||
else{
|
||||
$whereb= $where.' AND to_uid = '.$uid;
|
||||
$sqlPart = "SELECT id,title,from_uid,create_time as send_time,'{$table}' as table_name FROM {$tableName} WHERE {$whereb}";
|
||||
$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$whereb}";
|
||||
}
|
||||
|
||||
// 查询数据库中是否存在该数据表
|
||||
$is_table = Db::query("SHOW TABLES LIKE '{$tableName}'");
|
||||
// 判断查询结果
|
||||
if (!empty($is_table)) {
|
||||
$sqlParts[] = $sqlPart;
|
||||
$sqlCounts[] = $sqlCount;
|
||||
}
|
||||
}
|
||||
// 使用implode将各个部分用UNION ALL连接起来
|
||||
$unionSql = implode(" UNION ALL ", $sqlParts);
|
||||
|
||||
$totalCount = 0;
|
||||
foreach ($sqlCounts as $sql) {
|
||||
$count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组
|
||||
$totalCount += $count;
|
||||
}
|
||||
// 添加排序和分页逻辑
|
||||
// 假设每页显示10条记录,当前页码为$page(需要预先定义或获取)
|
||||
$pageSize = $param['limit'];
|
||||
$page = 1; // 示例页码
|
||||
$offset = ($page - 1) * $pageSize;
|
||||
|
||||
// 注意:不同的数据库分页语法可能有所不同,这里以MySQL为例
|
||||
$finalSql = $unionSql . " ORDER BY send_time DESC LIMIT {$offset}, {$pageSize}";
|
||||
|
||||
// 执行查询
|
||||
$result = Db::query($finalSql);
|
||||
// 处理结果
|
||||
foreach ($result as &$row) {
|
||||
// 处理每一行数据
|
||||
$row['types'] = 0;
|
||||
$row['sourse'] = '发件箱';
|
||||
if($row['send_time'] == 0){
|
||||
$row['sourse'] = '草稿箱';
|
||||
$row['types'] = 1;
|
||||
$row['send_time'] = '-';
|
||||
}
|
||||
else{
|
||||
if($row['table_name'] == 'msg'){
|
||||
$row['sourse'] = '收件箱';
|
||||
$row['types'] = 2;
|
||||
}
|
||||
$row['send_time'] = date('Y-m-d H:i:s',$row['send_time']);
|
||||
}
|
||||
if(!empty($row['from_uid'])){
|
||||
$row['from_name'] = Db::name('Admin')->where('id','=',$row['from_uid'])->value('name');
|
||||
}
|
||||
else{
|
||||
$row['from_name']='-';
|
||||
}
|
||||
}
|
||||
$list=array(
|
||||
'data'=>$result,
|
||||
'total'=>$totalCount
|
||||
);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
|
||||
$count = [
|
||||
'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
|
||||
'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
|
||||
'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
|
||||
'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
|
||||
'rubbish' => $a+$b
|
||||
];
|
||||
View::assign('count', $count);
|
||||
View::assign('action', $this->action);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//新增&编辑信息
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$msg_id = 0;
|
||||
if ($id > 0) {
|
||||
$detail = $this->model->detail($id);
|
||||
if (empty($detail)) {
|
||||
throw new \think\exception\HttpException(404, '找不到记录');
|
||||
}
|
||||
if ($detail['from_uid'] != $this->uid) {
|
||||
throw new \think\exception\HttpException(406, '无权限编辑');
|
||||
}
|
||||
if($detail['msg_id']>0){
|
||||
$msg_id = $detail['msg_id'];
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('msg_id', $msg_id);
|
||||
return view();
|
||||
}
|
||||
|
||||
//查看发件箱、草稿箱消息
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->detail($id);
|
||||
if (empty($detail)) {
|
||||
throw new \think\exception\HttpException(404, '找不到记录');
|
||||
}
|
||||
if ($detail['from_uid'] != $this->uid) {
|
||||
throw new \think\exception\HttpException(406, '无权限查看');
|
||||
}
|
||||
//已读回执
|
||||
if($detail['send_time']>0){
|
||||
$read_user_ids= msgList::where([['message_id','=',$id],['read_time','>',0]])->column('to_uid');
|
||||
$read_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $read_user_ids)->column('name');
|
||||
$detail['read_user_names'] = implode(',',$read_users);
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
//删除发件、草稿
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$ids = empty($param['ids']) ? 0 : $param['ids'];
|
||||
$idArray = explode(',', $ids);
|
||||
foreach ($idArray as $key => $val) {
|
||||
MessageList::where(['id' => $val])->update(['delete_time' => time()]);
|
||||
add_log('delete', $val,[],'消息');
|
||||
}
|
||||
return to_assign(0, '操作成功');
|
||||
}
|
||||
|
||||
//保存消息
|
||||
public function save()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = empty($param['id']) ? 0 : $param['id'];
|
||||
//接受人类型判断
|
||||
if ($param['types'] == 1 && empty($param['uids'])) {
|
||||
return to_assign(1, '收件人员不能为空');
|
||||
}
|
||||
if ($param['types'] == 2 && empty($param['dids'])) {
|
||||
return to_assign(1, '收件部门不能为空');
|
||||
}
|
||||
if ($param['types'] == 3 && empty($param['pids'])) {
|
||||
return to_assign(1, '收件岗位不能为空');
|
||||
}
|
||||
if ($param['types'] == 4) {
|
||||
$param['uids'] = '';
|
||||
$param['dids'] = '';
|
||||
$param['pids'] = '';
|
||||
$param['copy_uids'] = '';
|
||||
}
|
||||
$res = false;
|
||||
if ($id > 0) {
|
||||
//编辑信息的情况
|
||||
$param['update_time'] = time();
|
||||
$res = MessageList::strict(false)->field(true)->update($param);
|
||||
} else {
|
||||
//新增信息的情况
|
||||
$param['create_time'] = time();
|
||||
$param['update_time'] = time();
|
||||
$param['from_uid'] = $this->uid;
|
||||
$res = MessageList::strict(false)->field(true)->insertGetId($param);
|
||||
}
|
||||
if ($res !== false) {
|
||||
if ($id > 0) {
|
||||
$mid = $id;
|
||||
} else {
|
||||
$mid = $res;
|
||||
}
|
||||
add_log('save',$mid,$param,'消息');
|
||||
if($param['is_draft'] == 1){
|
||||
$res = $this->model->send($mid);
|
||||
if ($res!==false) {
|
||||
return to_assign(0, '发送成功');
|
||||
} else {
|
||||
return to_assign(1, '发送失败');
|
||||
}
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '保存成功', $mid);
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
//发送消息
|
||||
public function send_message($id)
|
||||
{
|
||||
//查询要发的消息
|
||||
$msg = MessageList::where(['id' => $id])->find();
|
||||
if (!empty($msg)) {
|
||||
$res = $this->model->send($id);
|
||||
if ($res!==false) {
|
||||
return to_assign(0, '发送成功');
|
||||
} else {
|
||||
return to_assign(1, '发送失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '发送失败,找不到要发送的内容');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//查看收件箱消息
|
||||
public function read($id )
|
||||
{
|
||||
$detail = $this->model2->detail($id);
|
||||
if (empty($detail)) {
|
||||
throw new \think\exception\HttpException(406, '找不到记录');
|
||||
}
|
||||
if ($detail['to_uid'] != $this->uid) {
|
||||
throw new \think\exception\HttpException(406, '找不到记录');
|
||||
}
|
||||
MsgList::where(['id' => $id])->update(['read_time' => time()]);
|
||||
if($detail['message_id']>0){
|
||||
View::assign('message', $this->model->detail($detail['message_id']));
|
||||
}
|
||||
$detail['from_uname'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
|
||||
//回复信息
|
||||
public function reply()
|
||||
{
|
||||
$param = get_params();
|
||||
$msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
|
||||
$detail = $this->model2->detail($msg_id);
|
||||
if (empty($detail)) {
|
||||
throw new \think\exception\HttpException(404, '找不到记录');
|
||||
}
|
||||
if ($detail['to_uid'] != $this->uid) {
|
||||
throw new \think\exception\HttpException(406, '无权限回复');
|
||||
}
|
||||
$detail['from_name'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
//转发信息
|
||||
public function resend()
|
||||
{
|
||||
$param = get_params();
|
||||
$msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
|
||||
$detail = $this->model2->detail($msg_id);
|
||||
if (empty($detail)) {
|
||||
throw new \think\exception\HttpException(404, '找不到记录');
|
||||
}
|
||||
if ($detail['to_uid'] != $this->uid) {
|
||||
throw new \think\exception\HttpException(406, '无权限回复');
|
||||
}
|
||||
$detail['from_name'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
//状态修改
|
||||
public function check()
|
||||
{
|
||||
$param = get_params();
|
||||
$type = empty($param['type']) ? 0 : $param['type'];
|
||||
$ids = empty($param['ids']) ? 0 : $param['ids'];
|
||||
$idArray = explode(',', $ids);
|
||||
foreach ($idArray as $key => $val) {
|
||||
if ($type==1) { //设置信息为已读
|
||||
MsgList::where(['id' => $val])->update(['read_time' => time()]);
|
||||
add_log('view', $val,[],'消息');
|
||||
}
|
||||
else if ($type==2) { //信息进入垃圾箱
|
||||
MsgList::where(['id' => $val])->update(['delete_time' => time()]);
|
||||
add_log('delete', $val,[],'消息');
|
||||
}
|
||||
else if ($type==3) { //信息从垃圾箱恢复
|
||||
MsgList::where(['id' => $val])->update(['delete_time' => 0]);
|
||||
add_log('recovery', $val,[],'消息');
|
||||
}
|
||||
else if ($type==4) { //信息彻底删除
|
||||
MsgList::where(['id' => $val])->update(['clear_time' => 0]);
|
||||
add_log('clear', $val,[],'消息');
|
||||
}
|
||||
else if ($type==5) { //星标信息
|
||||
MsgList::where(['id' => $val])->update(['is_star' => 1]);
|
||||
add_log('star', $val,[],'消息');
|
||||
}
|
||||
else if ($type==6) { //取消星标信息
|
||||
MsgList::where(['id' => $val])->update(['is_star' => 0]);
|
||||
add_log('unstar', $val,[],'消息');
|
||||
}
|
||||
}
|
||||
return to_assign(0, '操作成功');
|
||||
}
|
||||
|
||||
//还原消息
|
||||
public function recovery()
|
||||
{
|
||||
$param = get_params();
|
||||
$table = empty($param['table']) ? '' : $param['table'];
|
||||
$ids = empty($param['ids']) ? 0 : $param['ids'];
|
||||
$idArray = explode(',', $ids);
|
||||
foreach ($idArray as $key => $val) {
|
||||
Db::name($table)->update(['id' => $val,'delete_time' => 0]);
|
||||
add_log('recovery', $val,[],'消息');
|
||||
}
|
||||
return to_assign(0, '操作成功');
|
||||
}
|
||||
//清除消息
|
||||
public function clear()
|
||||
{
|
||||
$param = get_params();
|
||||
$table = empty($param['table']) ? '' : $param['table'];
|
||||
$ids = empty($param['ids']) ? 0 : $param['ids'];
|
||||
$idArray = explode(',', $ids);
|
||||
foreach ($idArray as $key => $val) {
|
||||
Db::name($table)->update(['id' => $val,'clear_time' => time()]);
|
||||
add_log('clear', $val,[],'消息');
|
||||
}
|
||||
return to_assign(0, '操作成功');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\validate\ModuleCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Module extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$module = Db::name('AdminModule')->select();
|
||||
return to_assign(0, '', $module);
|
||||
} else {
|
||||
$sys_module = Db::name('AdminModule')->select()->toArray();
|
||||
View::assign('sys_module', $sys_module);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//新增/编辑模块
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限新增或编辑模块!');
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ModuleCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
Db::name('AdminModule')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} else {
|
||||
try {
|
||||
validate(ModuleCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$mid = Db::name('AdminModule')->strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $mid, $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$module=[];
|
||||
if ($id > 0) {
|
||||
$module = Db::name('AdminModule')->where(['id' => $id])->find();
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('module', $module);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//安装模块
|
||||
public function install()
|
||||
{
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限安装模块!');
|
||||
}
|
||||
$param = get_params();
|
||||
$name = $param['name'];
|
||||
$data = curl_post('https://www.gougucms.com/home/get_module/module',['name'=>$name]);
|
||||
$json_data = json_decode($data, true);
|
||||
if($json_data['code'] == 1){
|
||||
return to_assign(1,$json_data['msg']);
|
||||
}
|
||||
$detail = $json_data['data'];
|
||||
$rule = unserialize($detail['rule']);
|
||||
if(empty($rule)){
|
||||
return to_assign(1,'找不到该模块的信息');
|
||||
}
|
||||
$prefix = get_config('database.connections.mysql.prefix');
|
||||
|
||||
$insert = [];
|
||||
$insert['title'] = $detail['title'];
|
||||
$insert['name'] = $detail['name'];
|
||||
$insert['type'] = $detail['type'];
|
||||
$insert['sourse'] = $detail['sourse'];
|
||||
$insert['create_time'] = time();
|
||||
try {
|
||||
validate(ModuleCheck::class)->scene('add')->check($insert);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
//sql语句
|
||||
$sql_file = CMS_ROOT . '/app/'.$name.'/config/install.sql';
|
||||
$sql_array = [];
|
||||
if(file_exists($sql_file)){
|
||||
$sql = file_get_contents($sql_file);
|
||||
$sql_array = preg_split("/;[\r\n]+/", str_replace("oa_", $prefix, $sql));
|
||||
}
|
||||
//var_dump($sql_array);exit;
|
||||
Db::startTrans();
|
||||
try {
|
||||
// 导入sql数据并创建表
|
||||
if(!empty($sql_array)){
|
||||
foreach ($sql_array as $k => $v) {
|
||||
if (!empty($v)) {
|
||||
Db::execute($v);
|
||||
}
|
||||
}
|
||||
}
|
||||
//如果安装过该模块,删除原来的菜单信息
|
||||
Db::name('AdminRule')->where('module',$name)->delete();
|
||||
$sort = Db::name('AdminRule')->where('pid',0)->max('sort');
|
||||
$this->add_rule($rule,0,$sort+1);
|
||||
$mid = Db::name('AdminModule')->strict(false)->field(true)->insertGetId($insert);
|
||||
|
||||
Db::commit();
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
//回滚事务
|
||||
Db::rollback();
|
||||
return to_assign(1,'捕获到异常'.$e->getMessage());
|
||||
}
|
||||
|
||||
//更新超级管理员的权限节点
|
||||
$rules = Db::name('AdminRule')->column('id');
|
||||
$admin_rules = implode(',',$rules);
|
||||
$res = Db::name('AdminGroup')->strict(false)->where('id',1)->update(['rules'=>$admin_rules,'update_time'=>time()]);
|
||||
if($res!==false){
|
||||
// 删除后台节点缓存
|
||||
clear_cache('adminRules');
|
||||
add_log('install', $mid, $insert);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
//递归插入菜单数据
|
||||
protected function add_rule($data, $pid=0,$sort=0)
|
||||
{
|
||||
foreach($data as $k => $v)
|
||||
{
|
||||
$rule=[
|
||||
'title' => $v['title'],
|
||||
'name' => $v['name'],
|
||||
'src' => $v['src'],
|
||||
'module' => $v['module'],
|
||||
'menu' => $v['menu'],
|
||||
'icon' => $v['icon'],
|
||||
'pid' => $pid,
|
||||
'sort' => $sort,
|
||||
'create_time' => time()
|
||||
];
|
||||
$new_id = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($rule);
|
||||
if(!empty($v['son'] && $new_id)){
|
||||
$this->add_rule($v['son'],$new_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限删除模块!');
|
||||
}
|
||||
$param = get_params();
|
||||
$module = Db::name('AdminModule')->where('id',$param['id'])->find();
|
||||
if($module['type'] == 1){
|
||||
return to_assign(1,'系统模块不能删除');
|
||||
}
|
||||
$param['update_time']= time();
|
||||
$res = Db::name('AdminModule')->where('id',$param['id'])->delete();
|
||||
if($res!==false){
|
||||
add_log('delete', $module['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
//卸载
|
||||
public function uninstall()
|
||||
{
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限卸载模块!');
|
||||
}
|
||||
$param = get_params();
|
||||
$module = Db::name('AdminModule')->where('name',$param['name'])->find();
|
||||
if($module['type'] == 1){
|
||||
return to_assign(1,'系统模块不能卸载');
|
||||
}
|
||||
$param['update_time']= time();
|
||||
$res = Db::name('AdminModule')->where('name',$param['name'])->update(['status'=>0]);
|
||||
if($res!==false){
|
||||
Db::name('AdminRule')->strict(false)->where('module',$module['name'])->update(['status'=>0]);
|
||||
// 删除后台节点缓存
|
||||
clear_cache('adminRules');
|
||||
add_log('uninstall', $module['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
//恢复
|
||||
public function recovery()
|
||||
{
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限恢复模块!');
|
||||
}
|
||||
$param = get_params();
|
||||
$module = Db::name('AdminModule')->where('name',$param['name'])->find();
|
||||
$param['update_time']= time();
|
||||
$res = Db::name('AdminModule')->where('name',$param['name'])->update(['status'=>1]);
|
||||
if($res!==false){
|
||||
Db::name('AdminRule')->strict(false)->where('module',$module['name'])->update(['status'=>1]);
|
||||
// 删除后台节点缓存
|
||||
clear_cache('adminRules');
|
||||
add_log('recovery', $module['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//数据权限列表
|
||||
public function data_auth()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$auth = Db::name('DataAuth')->select();
|
||||
return to_assign(0, '', $auth);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//数据权限详情
|
||||
public function data_auth_detail()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('DataAuth')->strict(false)->field(true)->update($param);
|
||||
return to_assign();
|
||||
} else {
|
||||
$detail = Db::name('DataAuth')->where('name',$param['name'])->find();
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\Outs as OutsModel;
|
||||
use app\home\validate\OutsValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Outs extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new OutsModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where=[];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if(!empty($param['start_date'])){
|
||||
$param['start_date'] = strtotime($param['start_date']);
|
||||
}
|
||||
if(!empty($param['end_date'])){
|
||||
$param['end_date'] = strtotime($param['end_date']);
|
||||
if($param['end_date']<$param['start_date']){
|
||||
return to_assign(1, '结束时间不能小于开始时间');
|
||||
}
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
$param['admin_id'] = $this->uid;
|
||||
$param['did'] = $this->did;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/add_waichu');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('create_user', get_admin($detail['admin_id']));
|
||||
View::assign('detail', $detail);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/view_waichu');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\Overtimes as OvertimesModel;
|
||||
use app\home\validate\OvertimesValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Overtimes extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new OvertimesModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where=[];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if(!empty($param['start_date'])){
|
||||
$param['start_date'] = strtotime($param['start_date']);
|
||||
}
|
||||
if(!empty($param['end_date'])){
|
||||
$param['end_date'] = strtotime($param['end_date']);
|
||||
if($param['end_date']<$param['start_date']){
|
||||
return to_assign(1, '结束时间不能小于开始时间');
|
||||
}
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
$param['admin_id'] = $this->uid;
|
||||
$param['did'] = $this->did;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/add_jiaban');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('create_user', get_admin($detail['admin_id']));
|
||||
View::assign('detail', $detail);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/view_jiaban');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\AdminGroup;
|
||||
use app\home\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'] . '%'];
|
||||
}
|
||||
$list = Db::name('AdminGroup')->where($where)->order('create_time asc')->select();
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$ruleData = isset($param['rule']) ? $param['rule'] : '';
|
||||
$layoutData = isset($param['layout']) ? $param['layout'] : '';
|
||||
$menuData = isset($param['mobile_menu']) ? $param['mobile_menu'] : '';
|
||||
$barData = isset($param['mobile_bar']) ? $param['mobile_bar'] : '';
|
||||
if($ruleData==0){
|
||||
return to_assign(1, '权限节点至少选择一个');
|
||||
}
|
||||
if($layoutData==0){
|
||||
return to_assign(1, '首页展示模块至少选择一个');
|
||||
}
|
||||
$param['rules'] = implode(',', $ruleData);
|
||||
$param['layouts'] = implode(',', $layoutData);
|
||||
if(empty($menuData)){
|
||||
$param['mobile_menu'] = '';
|
||||
}
|
||||
else{
|
||||
$param['mobile_menu'] = implode(',', $menuData);
|
||||
}
|
||||
if(empty($barData)){
|
||||
$param['mobile_bar'] = '';
|
||||
}
|
||||
else{
|
||||
$param['mobile_bar'] = implode(',', $barData);
|
||||
}
|
||||
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');
|
||||
clear_cache('MobileRules');
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$rule = admin_rule();
|
||||
$layouts = get_config('layout');
|
||||
$mobile_bar = Db::name('MobileBar')->where([['status','=',1]])->field('id,url,title,icon')->select()->toArray();
|
||||
$mobile_menu = Db::name('MobileTypes')->where(['status'=>1])->select()->toArray();
|
||||
|
||||
|
||||
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);
|
||||
|
||||
$layout_selected = explode(',', $role['layouts']);
|
||||
foreach ($layouts as $key =>&$vo) {
|
||||
if (!empty($layout_selected) and in_array($vo['id'], $layout_selected)) {
|
||||
$vo['checked'] = true;
|
||||
} else {
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
}
|
||||
|
||||
$mobile_bar_selected = explode(',', $role['mobile_bar']);
|
||||
foreach ($mobile_bar as $key =>&$vo) {
|
||||
if (!empty($mobile_bar_selected) and in_array($vo['id'], $mobile_bar_selected)) {
|
||||
$vo['checked'] = true;
|
||||
} else {
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
}
|
||||
|
||||
$mobile_menu_selected = explode(',', $role['mobile_menu']);
|
||||
foreach ($mobile_menu as &$row) {
|
||||
$list = Db::name('MobileMenu')->where([['types','=',$row['id']],['status','=',1]])->select()->toArray();
|
||||
foreach ($list as $key =>&$vo) {
|
||||
if (!empty($mobile_menu_selected) and in_array($vo['id'], $mobile_menu_selected)) {
|
||||
$vo['checked'] = true;
|
||||
} else {
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
}
|
||||
$row['list'] = $list;
|
||||
}
|
||||
|
||||
} else {
|
||||
$role_rule = create_tree_list(0, $rule, []);
|
||||
foreach ($layouts as $key =>&$vo) {
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
|
||||
foreach ($mobile_bar as $key =>&$vo) {
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
|
||||
foreach ($mobile_menu as &$row) {
|
||||
$list = Db::name('MobileMenu')->where([['types','=',$row['id']],['status','=',1]])->select()->toArray();
|
||||
foreach ($list as $key =>&$vo) {
|
||||
$vo['checked'] = false;
|
||||
}
|
||||
$row['list'] = $list;
|
||||
}
|
||||
}
|
||||
View::assign('role_rule', $role_rule);
|
||||
View::assign('layout', $layouts);
|
||||
View::assign('mobile_bar', $mobile_bar);
|
||||
View::assign('mobile_menu', $mobile_menu);
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
if ($id == 1) {
|
||||
return to_assign(1, "该组是系统所有者,无法删除");
|
||||
}
|
||||
$count = Db::name('PositionGroup')->where(["group_id" => $id])->count();
|
||||
if ($count > 0) {
|
||||
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,110 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\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')
|
||||
->field('a.*,m.title as module_title')
|
||||
->alias('a')
|
||||
->leftJoin('adminModule m', 'a.module = m.name')
|
||||
->order('a.sort asc,a.id asc')
|
||||
->select();
|
||||
$list = generateTree($rule);
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$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);
|
||||
//自动为系统超级管理员角色组分配新增的节点
|
||||
$group = Db::name('AdminGroup')->find(1);
|
||||
if (!empty($group)) {
|
||||
$newGroup['id'] = 1;
|
||||
$newGroup['rules'] = $group['rules'] . ',' . $rid;
|
||||
Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup);
|
||||
add_log('add', $rid, $param);
|
||||
}
|
||||
}
|
||||
// 删除后台节点缓存
|
||||
clear_cache('adminRules');
|
||||
return to_assign();
|
||||
} 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,80 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Task extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$module = Db::name('TimingTask')->where(['delete_time' => 0])->select();
|
||||
return to_assign(0, '', $module);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//新增/编辑模块
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有系统超级管理员才有权限新增或编辑定时任务!');
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
Db::name('TimingTask')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} else {
|
||||
$tid = Db::name('TimingTask')->strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $tid, $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$task=[];
|
||||
if ($id > 0) {
|
||||
$task = Db::name('TimingTask')->where(['id' => $id])->find();
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('task', $task);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if($this->uid!=1){
|
||||
return to_assign(1,'只有超级管理员才有权限删除定时任务!');
|
||||
}
|
||||
$param = get_params();
|
||||
$res = Db::name('TimingTask')->where('id',$param['id'])->update(['delete_time'=>time()]);
|
||||
if($res!==false){
|
||||
add_log('delete', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(1,'操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\Template as TemplateModel;
|
||||
use app\home\validate\TemplateValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Template extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new TemplateModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where=[];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(TemplateValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(TemplateValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$copyid = isset($param['copyid']) ? $param['copyid'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
if ($copyid>0) {
|
||||
$detail = $this->model->getById($copyid);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('copyid', $copyid);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//设置
|
||||
public function set()
|
||||
{
|
||||
$param = get_params();
|
||||
$res = $this->model::field('id,status')->update($param);
|
||||
if ($res) {
|
||||
if($param['status'] == 0){
|
||||
add_log('disable', $param['id'], $param);
|
||||
}
|
||||
else if($param['status'] == 1){
|
||||
add_log('recovery', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\home\model\Trips as TripsModel;
|
||||
use app\home\validate\tripsValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Trips extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new TripsModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where=[];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if(!empty($param['start_date'])){
|
||||
$param['start_date'] = strtotime($param['start_date']);
|
||||
}
|
||||
if(!empty($param['end_date'])){
|
||||
$param['end_date'] = strtotime($param['end_date']);
|
||||
if($param['end_date']<$param['start_date']){
|
||||
return to_assign(1, '结束时间不能小于开始时间');
|
||||
}
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
$param['admin_id'] = $this->uid;
|
||||
$param['did'] = $this->did;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/add_chuchai');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('create_user', get_admin($detail['admin_id']));
|
||||
View::assign('detail', $detail);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/approve/view_chuchai');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
return [
|
||||
'listen' => [
|
||||
//注册监听类
|
||||
'SendMessage' => ['app\listener\SendMessage'],
|
||||
],
|
||||
//'subscribe' => ['app\subscribe\Message'],
|
||||
];
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
//验证勾股OA是否完成安装
|
||||
\app\home\middleware\Install::class,
|
||||
];
|
||||
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\home\middleware;
|
||||
use systematic\Systematic;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
|
||||
class Install
|
||||
{
|
||||
protected $module = '';
|
||||
protected $controller = '';
|
||||
protected $action = '';
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
if (!is_installed()) {
|
||||
return $request->isAjax() ? to_assign(1, '请先完成系统安装引导') : redirect((string) url('/install/index'));
|
||||
}
|
||||
$module = strtolower(app('http')->getName());
|
||||
$this->module = $module;
|
||||
$param = $request->param();
|
||||
$logtype = isset($param['logtype'])?$param['logtype']:'';
|
||||
$module_son = isset($param['module_son'])?$param['module_son']:'';
|
||||
$module_old = [];
|
||||
if($module_son!='' && ($logtype != 'add' || $logtype != 'delete')){
|
||||
$module_old = Db::name($module_son)->where('id',$param['id'])->find();
|
||||
}
|
||||
//return $next($request);
|
||||
//获取响应,获取响应之前的代码为前置中间件,
|
||||
//do songthing
|
||||
//----------以上部分为前置中间件--------------
|
||||
|
||||
$response=$next($request);
|
||||
|
||||
//----------以下部分为后置中间件--------------
|
||||
//获取响应之后的为后置中间件的执行内容
|
||||
|
||||
$this->controller = strtolower($request->controller());
|
||||
$this->action = strtolower($request->action());
|
||||
//获取返回的HTTPCode
|
||||
//$code = $response->getCode();
|
||||
$responseData = $response->getData();
|
||||
if(isset($responseData['code']) && $responseData['code'] == 0){
|
||||
if(isset($responseData['datas'])){
|
||||
$logData = $responseData['datas'];
|
||||
}
|
||||
else{
|
||||
$logData = $responseData['data'];
|
||||
}
|
||||
$log_conf = get_config('log');
|
||||
$type_action = $log_conf['type_action'];
|
||||
if(isset($logData['logtype']) && isset($logData['id']) && isset($type_action[$logData['logtype']])){
|
||||
$logData['type_title'] = $type_action[$logData['logtype']];
|
||||
$moduleLogData = [];
|
||||
if($module_son!='' && isset($log_conf[$this->module])){
|
||||
$log_conf_module = $log_conf[$this->module];
|
||||
$module_field_key = $log_conf_module[$module_son];
|
||||
$module_new = Db::name($module_son)->where('id',$logData['id'])->find();
|
||||
$param_id = $module_new['id'];
|
||||
$param_son_id = 0;
|
||||
if($module_son!=$this->module){
|
||||
$param_id = $module_new[$this->module.'_id'];
|
||||
$param_son_id = $module_new['id'];
|
||||
}
|
||||
else{
|
||||
$module_son = '';
|
||||
}
|
||||
if(isset($module_field_key)){
|
||||
$moduleLogData = [
|
||||
'param_id'=>$param_id,
|
||||
'module_son'=>$module_son,
|
||||
'param_son_id'=>$param_son_id,
|
||||
'old'=>$module_old,
|
||||
'new'=>$module_new,
|
||||
'key'=>$module_field_key
|
||||
];
|
||||
}
|
||||
}
|
||||
$this->addLog($logData,$moduleLogData);
|
||||
}
|
||||
}
|
||||
|
||||
//这里回调本身返回response对象
|
||||
return $response;
|
||||
}
|
||||
/*
|
||||
public function end(\think\Response $response){
|
||||
|
||||
dump($response->getData());
|
||||
exit;
|
||||
|
||||
//dump($response->header());
|
||||
}
|
||||
*/
|
||||
|
||||
protected function addLog($logData = [],$moduleLogData=[])
|
||||
{
|
||||
$session_admin = get_config('app.session_admin');
|
||||
$uid = Session::get($session_admin);
|
||||
$data = [
|
||||
'uid' => $uid,
|
||||
'type' => $logData['logtype'],
|
||||
'action' => $logData['type_title'],
|
||||
'param_id' => $logData['id'],
|
||||
'param' => json_encode($logData),
|
||||
'module' => $this->module,
|
||||
'controller' => $this->controller,
|
||||
'function' => $this->action,
|
||||
'ip' => app('request')->ip(),
|
||||
'create_time' => time(),
|
||||
'subject' => '系统'
|
||||
];
|
||||
if(isset($logData['subject']) && $logData['subject'] != ''){
|
||||
$data['subject'] = $logData['subject'];
|
||||
}
|
||||
else{
|
||||
$rule = $data['module'] . '/' . $data['controller'] . '/' . $data['function'];
|
||||
$rule_menu = Db::name('AdminRule')->where(array('src' => $rule))->find();
|
||||
if($rule_menu){
|
||||
$data['subject'] = $rule_menu['name'];
|
||||
}
|
||||
}
|
||||
Db::name('AdminLog')->strict(false)->field(true)->insert($data);
|
||||
if(!empty($moduleLogData)){
|
||||
$GOUGU = new Systematic();
|
||||
$GOUGU->moduleLog($uid,$logData['logtype'],$this->module,$moduleLogData);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class AdminGroup extends Model
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
namespace app\home\model;
|
||||
|
||||
use think\Model;
|
||||
use think\facade\Db;
|
||||
use dateset\Dateset;
|
||||
|
||||
class AdminLog extends Model
|
||||
{
|
||||
public function get_log_list($param = [])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.pages') : $param['limit'];
|
||||
$list = Db::name('AdminLog')
|
||||
->field("a.id,a.uid,a.type,a.subject,a.action,a.create_time,u.name")
|
||||
->alias('a')
|
||||
->join('Admin u', 'a.uid = u.id')
|
||||
->order('a.create_time desc')
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function($item, $key){
|
||||
$item['content'] = $item['name']. $item['action'] . '了' . $item['subject'];
|
||||
$item['times'] = (new Dateset())->time_trans($item['create_time']);
|
||||
return $item;
|
||||
});
|
||||
return $list;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
// 关键字模型
|
||||
class File extends Model
|
||||
{
|
||||
protected $autoWriteTimestamp=false;
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\home\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Leaves extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param,'请假申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param,'请假申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
|
||||
$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
|
||||
$info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name');
|
||||
$info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title');
|
||||
if(!empty($info['file_ids'])){
|
||||
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
|
||||
$info['file_array'] = $file_array;
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\model;
|
||||
|
||||
use think\Model;
|
||||
use think\facade\Db;
|
||||
|
||||
class Message extends Model
|
||||
{
|
||||
/**
|
||||
* 获取发件箱分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$item->send_time_str = empty($item->send_time) ? '草稿' : date('Y-m-d H:i:s', $item->send_time);
|
||||
if(empty($item->uids)){
|
||||
$item->to_name = '-';
|
||||
}
|
||||
else{
|
||||
$to_name = Db::name('Admin')->where([['id','in',$item->uids]])->column('name');
|
||||
$item->to_name = implode(',',$to_name);
|
||||
}
|
||||
if(empty($item->dids)){
|
||||
$item->to_department = '-';
|
||||
}
|
||||
else{
|
||||
$to_department = Db::name('Department')->where([['id','in',$item->dids]])->column('title');
|
||||
$item->to_department = implode(',',$to_department);
|
||||
}
|
||||
if(empty($item->pids)){
|
||||
$item->to_position = '-';
|
||||
}
|
||||
else{
|
||||
$to_position = Db::name('Position')->where([['id','in',$item->pids]])->column('title');
|
||||
$item->to_position = implode(',',$to_position);
|
||||
}
|
||||
if(empty($item->copy_uids)){
|
||||
$item->copy_names = '-';
|
||||
}
|
||||
else{
|
||||
$copy_name = Db::name('Admin')->where([['id','in',$item->copy_uids]])->column('name');
|
||||
$item->copy_names = implode(',',$copy_name);
|
||||
}
|
||||
$item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
//发件箱消息详情
|
||||
public function detail($id)
|
||||
{
|
||||
$detail = self::find($id);
|
||||
if(!empty($detail)){
|
||||
if ($detail['types'] == 1) { //人员
|
||||
$users = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['uids'])->column('name');
|
||||
$detail['unames'] = implode(',',$users);
|
||||
} elseif ($detail['types'] == 2) { //部门
|
||||
$departments = Db::name('Department')->where('id', 'in', $detail['dids'])->column('title');
|
||||
$detail['dnames'] = implode(',',$departments);
|
||||
} elseif ($detail['types'] == 3) { //角色
|
||||
$positions = Db::name('Position')->where('id', 'in', $detail['pids'])->column('title');
|
||||
$detail['pnames'] = implode(',',$positions);
|
||||
}
|
||||
$copy_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['copy_uids'])->column('name');
|
||||
$detail['copy_names'] = implode(',',$copy_users);
|
||||
//消息附件
|
||||
$file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['file_ids']]])->select()->toArray();
|
||||
$detail['file_array'] = $file_array;
|
||||
//引用消息附件
|
||||
if($detail['msg_id']>0){
|
||||
$from_msg = Db::name('Msg')->field('content,file_ids,template,action_id')->where(['id' => $detail['msg_id']])->find();
|
||||
$detail['from_template'] = $from_msg['template'];
|
||||
$detail['from_action_id'] = $from_msg['action_id'];
|
||||
$detail['from_content'] = $from_msg['content'];
|
||||
$detail['from_file_ids'] = $from_msg['file_ids'];
|
||||
$detail['from_file_array'] = Db::name('File')->order('create_time desc')->where([['id','in',$detail['from_file_ids']]])->select()->toArray();
|
||||
}
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
|
||||
//发送消息
|
||||
public function send($id)
|
||||
{
|
||||
//查询要发的消息
|
||||
$msg = self::find($id);
|
||||
$users = [];
|
||||
//查询全部收件人
|
||||
if ($msg['types'] == 1) { //人员
|
||||
$users = Db::name('Admin')->where('status', 1)->where('id', 'in', $msg['uids'])->column('id');
|
||||
} elseif ($msg['types'] == 2) { //部门
|
||||
$users = Db::name('Admin')->where('status', 1)->where('did', 'in', $msg['dids'])->column('id');
|
||||
} elseif ($msg['types'] == 3) { //角色
|
||||
$users = Db::name('Admin')->where('status', 1)->where('position_id', 'in', $msg['pids'])->column('id');
|
||||
} elseif ($msg['types'] == 4) { //全部
|
||||
$users = Db::name('Admin')->where('status', 1)->column('id');
|
||||
}
|
||||
if(!empty($msg['copy_uids'])){
|
||||
$copy_uids = explode(',',$msg['copy_uids']);
|
||||
$users_tem = array_merge($users,$copy_uids);
|
||||
$users = array_unique($users_tem);
|
||||
}
|
||||
//组合要发的消息
|
||||
$send_data = [];
|
||||
foreach ($users as $key => $value) {
|
||||
if ($value == $msg['from_uid']) {
|
||||
continue;
|
||||
}
|
||||
$send_data[] = array(
|
||||
'message_id' => $msg['id'],//来源发件箱关联id
|
||||
'to_uid' => $value,//接收人
|
||||
'msg_id' => $msg['msg_id'],//转发或回复消息关联id
|
||||
'title' => $msg['title'],
|
||||
'content' => $msg['content'],
|
||||
'file_ids' => $msg['file_ids'],
|
||||
'from_uid' => $msg['from_uid'],//发送人
|
||||
'create_time' => time()
|
||||
);
|
||||
}
|
||||
$res = Db::name('Msg')->strict(false)->field(true)->insertAll($send_data);
|
||||
if ($res!==false) {
|
||||
//草稿消息变成已发消息
|
||||
self::where(['id' => $msg['id']])->update(['is_draft' => '1', 'send_time' => time(), 'update_time' => time()]);
|
||||
add_log('send',$msg['id'],[],'消息');
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\model;
|
||||
|
||||
use think\Model;
|
||||
use think\facade\Db;
|
||||
|
||||
class Msg extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$item->from_name = '系统';
|
||||
$item->thumb = '/static/home/images/icon.png';
|
||||
$item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s');
|
||||
if($item->from_uid>0){
|
||||
$from_name = Db::name('Admin')->where('id',$item->from_uid)->find();
|
||||
$item->from_name = $from_name['name'];
|
||||
$item->thumb = $from_name['thumb'];
|
||||
}
|
||||
if(!empty($item->uids)){
|
||||
$to_name = Db::name('Admin')->where(['id','in',$item->uids])->column('name');
|
||||
$item->to_name = implode(',',$to_name);
|
||||
}
|
||||
else{
|
||||
$item->to_name = '-';
|
||||
}
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
//消息详情
|
||||
public function detail($id)
|
||||
{
|
||||
$detail = self::find($id);
|
||||
if(!empty($detail)){
|
||||
//消息附件
|
||||
$file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['file_ids']]])->select()->toArray();
|
||||
$detail['file_array'] = $file_array;
|
||||
//引用消息附件
|
||||
if($detail['msg_id']>0){
|
||||
$from_msg = Db::name('Msg')->find($detail['msg_id']);
|
||||
if(!empty($from_msg)){
|
||||
$detail['from_template'] = $from_msg['template'];
|
||||
$detail['from_action_id'] = $from_msg['action_id'];
|
||||
$detail['from_content'] = $from_msg['content'];
|
||||
$detail['from_file_ids'] = $from_msg['file_ids'];
|
||||
$from_file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['from_file_ids']]])->select()->toArray();
|
||||
$detail['from_file_array'] = $from_file_array;
|
||||
}
|
||||
}
|
||||
$detail['create_time'] = to_date($detail['create_time'],'Y-m-d H:i:s');
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\home\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Outs extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param,'外出申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param,'外出申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
|
||||
$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
|
||||
$info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name');
|
||||
$info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title');
|
||||
if(!empty($info['file_ids'])){
|
||||
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
|
||||
$info['file_array'] = $file_array;
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\home\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Overtimes extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param,'加班申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param,'加班申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
|
||||
$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
|
||||
$info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name');
|
||||
$info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title');
|
||||
if(!empty($info['file_ids'])){
|
||||
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
|
||||
$info['file_array'] = $file_array;
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\home\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Template extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
$item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Trips extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param,'出差申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param,'出差申请');
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
|
||||
$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
|
||||
$info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name');
|
||||
$info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title');
|
||||
if(!empty($info['file_ids'])){
|
||||
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
|
||||
$info['file_array'] = $file_array;
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class ConfCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:config',
|
||||
'name' => 'require|unique:config',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '配置名称不能为空',
|
||||
'title.unique' => '同样的配置名称已经存在',
|
||||
'name.require' => '配置标识不能为空',
|
||||
'name.unique' => '同样的配置标识已经存在',
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class EnterpriseCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:enterprise',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\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,40 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class ModuleCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:admin_module',
|
||||
'name' => 'require|lower|min:2|unique:admin_module',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '模块名称不能为空',
|
||||
'title.unique' => '同样的模块名称已经存在',
|
||||
'name.require' => '模块标识不能为空',
|
||||
'name.lower' => '模块目录只能是小写字母',
|
||||
'name.min' => '模块目录至少需要2个小写字母',
|
||||
'name.unique' => '同样的模块目录已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title','name'],
|
||||
'edit' => ['id','title','name'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\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,52 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class TemplateValidate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('Template')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
protected function checkOneName($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('Template')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'title' => 'require|checkOne',
|
||||
'name' => 'require|alphaDash|checkOneName',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.checkOne' => '同样的名称已经存在',
|
||||
'name.checkOne' => '同样的标识已经存在',
|
||||
'name.alphaDash' => '标识只能是小写字母',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title','name'],
|
||||
'edit' => ['title','name', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\home\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class UserCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'username' => 'require',
|
||||
'password' => 'require',
|
||||
'captcha' => 'require|captcha',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'username.require' => '用户名不能为空',
|
||||
'password.require' => '密码不能为空',
|
||||
'captcha.require' => '验证码不能为空',
|
||||
'captcha.captcha' => '验证码不正确',
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
|
||||
<ul class="layui-tab-title" style="border:none;">
|
||||
<li class="layui-this">全部</li>
|
||||
<li>待审批</li>
|
||||
<li>审批通过</li>
|
||||
<li>审批拒绝</li>
|
||||
</ul>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
|
||||
<div class="layui-input-inline" style="width:200px">
|
||||
<input type="text" name="uname" value="" placeholder="请选择员工" readonly class="layui-input picker-admin" autocomplete="off" />
|
||||
<input type="text" name="uid" value="0" style="display:none" />
|
||||
<input type="hidden" name="status" value="0" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<h3 class="h3-title" style="height:28px;">我申请的审批</h3>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker','tablePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus, tool = layui.tool ,element=layui.element;
|
||||
|
||||
element.on('tab(tab)', function(data){
|
||||
$('[name="status"]').val(data.index);
|
||||
$('[lay-filter="table-search"]').click();
|
||||
return false;
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: false
|
||||
,defaultToolbar: false
|
||||
,title:'全部审批列表'
|
||||
,url: "/home/approve/all"
|
||||
,page: true //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-154'
|
||||
,cols: [[
|
||||
{field:'types_name',title: '审批类型',width:100, align:'center'}
|
||||
,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
|
||||
var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
|
||||
return html;
|
||||
}}
|
||||
,{field:'admin_name',title: '申请人',width:90,align:'center'}
|
||||
,{field:'create_time',title: '申请时间',width:150,align:'center'}
|
||||
,{field:'department',title: '所属部门',width:120,align:'center'}
|
||||
,{field:'check_users',title: '当前审批人'}
|
||||
,{field:'check_copy_users',title: '抄送人员',width:150}
|
||||
,{width:60,title: '操作', align:'center',templet: function(d){
|
||||
var btn='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
|
||||
return btn;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,62 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
|
||||
<ul class="layui-tab-title" style="border:none;">
|
||||
<li class="layui-this">全部</li>
|
||||
<li>待我审批</li>
|
||||
<li>我已审批</li>
|
||||
</ul>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<h3 class="h3-title" style="height:28px;">我处理的审批</h3>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool ,element=layui.element;
|
||||
|
||||
element.on('tab(tab)', function(data){
|
||||
layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,defaultToolbar: false
|
||||
,title:'审批列表'
|
||||
,url: "/home/approve/checklist"
|
||||
,page: true //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-92'
|
||||
,cols: [[
|
||||
{field:'types_name',title: '审批类型',width:100, align:'center'}
|
||||
,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
|
||||
var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
|
||||
return html;
|
||||
}}
|
||||
,{field:'admin_name',title: '申请人',width:90,align:'center'}
|
||||
,{field:'create_time',title: '申请时间',width:150,align:'center'}
|
||||
,{field:'department',title: '所属部门',width:120,align:'center'}
|
||||
,{field:'check_users',title: '当前审批人'}
|
||||
,{field:'check_copy_users',title: '抄送人员',width:150}
|
||||
,{width:60,title: '操作', align:'center',templet: function(d){
|
||||
var btn='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
|
||||
return btn;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,63 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
|
||||
<ul class="layui-tab-title" style="border:none;">
|
||||
<li class="layui-this">全部</li>
|
||||
<li>待审批</li>
|
||||
<li>审批通过</li>
|
||||
<li>审批拒绝</li>
|
||||
</ul>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<h3 class="h3-title" style="height:28px;">抄送给我的审批</h3>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool ,element=layui.element;
|
||||
|
||||
element.on('tab(tab)', function(data){
|
||||
layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,defaultToolbar: false
|
||||
,title:'审批列表'
|
||||
,url: "/home/approve/copylist"
|
||||
,page: true //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-92'
|
||||
,cols: [[
|
||||
{field:'types_name',title: '审批类型',width:100, align:'center'}
|
||||
,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
|
||||
var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
|
||||
return html;
|
||||
}}
|
||||
,{field:'admin_name',title: '申请人',width:90,align:'center'}
|
||||
,{field:'create_time',title: '申请时间',width:150,align:'center'}
|
||||
,{field:'department',title: '所属部门',width:120,align:'center'}
|
||||
,{field:'check_users',title: '当前审批人'}
|
||||
,{field:'check_copy_users',title: '抄送人员',width:150}
|
||||
,{width:60,title: '操作', align:'center',templet: function(d){
|
||||
var btn='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
|
||||
return btn;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,89 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.body-card{background-color:#fff; border:1px solid #eee;}
|
||||
.card-header{height:44px; line-height:44px; text-indent:12px}
|
||||
.square .layui-col-md2{border: 1px solid #f5f5f5; border-left:0; cursor:pointer;}
|
||||
.square .layui-col-md2 div{padding:12px 0; height:72px; text-align:center; background-color:#fff; color:#666;}
|
||||
.square .layui-col-md2 i{font-size:28px; font-weight:800; display:block; padding-bottom:3px; color:#4285f4}
|
||||
.square .layui-col-md2:nth-child(6n){border-right:0;}
|
||||
.square .layui-col-md2:nth-child(n+7){margin-top: -1px;}
|
||||
.square .layui-col-md2 div:hover{color:#4285f4; background-color:#fafafa}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="body-card">
|
||||
<div class="card-header" style="border-bottom:1px solid #eee;"><h3 class="h3-title">审批新申请</h3></div>
|
||||
{volist name="module" id="v" offset="0"}
|
||||
{notempty name="$v.list"}
|
||||
<div class="card-header"><strong>{$v.title}</strong></div>
|
||||
<div class="square">
|
||||
<div class="layui-row">
|
||||
{volist name="$v.list" id="vo"}
|
||||
<div class="layui-col-md2 side-a" data-href="{$vo.add_url}" title="{$vo.title}"><div><i class="iconfont {$vo.icon}"></i>{$vo.title}</div></div>
|
||||
{/volist}
|
||||
</div>
|
||||
</div>
|
||||
{/notempty}
|
||||
{/volist}
|
||||
<div style="padding:16px 0; text-align:center; color:#ffb800">
|
||||
如果是【日常办公数据管理员】,可查看全体员工的审批申请记录,去查<a href="javascript:;" data-href="/home/approve/all" class="side-a">『全部审批』</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<h3 class="h3-title" style="height:28px;">审批列表</h3>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool ,element=layui.element;
|
||||
|
||||
element.on('tab(tab)', function(data){
|
||||
layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,defaultToolbar: false
|
||||
,title:'审批列表'
|
||||
,url: "/oa/approve/index"
|
||||
,page: true //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'types_name',title: '审批类型',width:100, align:'center'}
|
||||
,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
|
||||
var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
|
||||
return html;
|
||||
}}
|
||||
,{field:'admin_name',title: '申请人',width:90,align:'center'}
|
||||
,{field:'create_time',title: '申请时间',width:150,align:'center'}
|
||||
,{field:'department',title: '所属部门',width:120,align:'center'}
|
||||
,{field:'check_users',title: '当前审批人'}
|
||||
,{width:60,title: '操作', align:'center',templet: function(d){
|
||||
var btn='<a class="layui-btn layui-btn-xs" lay-event="view">详情</a>';
|
||||
return btn;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'view'){
|
||||
tool.side('/adm/'+obj.data.table_name+'/view?id='+obj.data.id);
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,71 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
|
||||
<ul class="layui-tab-title" style="border:none;">
|
||||
<li class="layui-this">全部</li>
|
||||
<li>待审批</li>
|
||||
<li>审批通过</li>
|
||||
<li>审批拒绝</li>
|
||||
</ul>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<h3 class="h3-title" style="height:28px;">我申请的审批</h3>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool ,element=layui.element;
|
||||
|
||||
element.on('tab(tab)', function(data){
|
||||
layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,defaultToolbar: false
|
||||
,title:'审批列表'
|
||||
,url: "/home/approve/mylist"
|
||||
,page: true //开启分页
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-92'
|
||||
,cols: [[
|
||||
{field:'types_name',title: '审批类型',width:100, align:'center'}
|
||||
,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
|
||||
var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
|
||||
return html;
|
||||
}}
|
||||
,{field:'admin_name',title: '申请人',width:90,align:'center'}
|
||||
,{field:'create_time',title: '申请时间',width:150,align:'center'}
|
||||
,{field:'department',title: '所属部门',width:120,align:'center'}
|
||||
,{field:'check_users',title: '当前审批人'}
|
||||
,{field:'check_copy_users',title: '抄送人员',width:150}
|
||||
,{width:90,title: '操作', align:'center',templet: function(d){
|
||||
var btn0='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-xs side-a" data-href="'+d.add_url+'?id='+d.id+'">编辑</a>';
|
||||
var html='';
|
||||
if(d.check_status==0 ||d.check_status ==4){
|
||||
html='<div class="layui-btn-group">'+btn0+btn1+'</div>';
|
||||
}
|
||||
else{
|
||||
html=btn0;
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,86 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">省市区</h3>
|
||||
{if condition="$id eq 0"}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">父级省市区<font>*</font></td>
|
||||
<td>{$pname|default='顶级城市'}</td>
|
||||
<td class="layui-td-gray-2">省市区名称<font>*</font></td>
|
||||
<td><input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入省市区名称" lay-reqText="请输入省市区名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">省市区简称<font>*</font></td>
|
||||
<td><input type="text" name="shortname" lay-verify="required" placeholder="请输入省市区简称" lay-reqText="请输入省市区简称" autocomplete="off" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">经度<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="longitude" placeholder="请输入经度" lay-verify="required" lay-reqText="请输入经度" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">纬度<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="latitude" placeholder="请输入纬度" lay-verify="required" lay-reqText="请输入纬度" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td><input type="text" name="sort" value="0" placeholder="请输入数字,越大越靠前" autocomplete="off" class="layui-input"></td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">父级菜单/节点<font>*</font></td>
|
||||
<td>{$detail.pname|default='顶级城市'}</td>
|
||||
<td class="layui-td-gray-2">省市区名称<font>*</font></td>
|
||||
<td><input type="text" name="name" value="{$detail.name}" lay-verify="required" autocomplete="off" placeholder="请输入省市区名称" lay-reqText="请输入省市区名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">省市区简称<font>*</font></td>
|
||||
<td><input type="text" name="shortname" value="{$detail.shortname}" lay-verify="required" placeholder="请输入省市区简称" lay-reqText="请输入省市区简称" autocomplete="off" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">经度<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="longitude" value="{$detail.longitude}" placeholder="请输入经度" lay-verify="required" lay-reqText="请输入经度" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">纬度<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="latitude" value="{$detail.latitude}" placeholder="请输入纬度" lay-verify="required" lay-reqText="请输入纬度" autocomplete="off" 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>
|
||||
{/if}
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<input type="hidden" name="pid" value="{$pid}">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
parent.location.reload();
|
||||
},1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/area/add", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,158 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
{eq name="is_area" value="0"}
|
||||
<div class="gg-form-bar border" style="padding-bottom:12px;">
|
||||
<span class="red">全国城市数据还未导入,请点击按钮导入</span> <button class="layui-btn layui-btn-sm import-area">导入省市区数据</button>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="gg-form-bar border-t border-x" style="padding-bottom:0;">
|
||||
<div class="layui-input-inline" style="width: 120px;"><h3>全国省市区</h3></div>
|
||||
<div class="layui-input-inline" style="width: 360px;">
|
||||
<div class="layui-btn-group" >
|
||||
<a href="/home/api/areaJson?type=province" class="layui-btn layui-bg-blue" target="_blank">导出省</a>
|
||||
<a href="/home/api/areaJson?type=city" class="layui-btn layui-bg-blue" target="_blank">导出市</a>
|
||||
<a href="/home/api/areaJson?type=district" class="layui-btn layui-bg-blue" target="_blank">导出区</a>
|
||||
<a href="/home/api/areaJson?type=all" class="layui-btn layui-bg-blue" target="_blank">导出树形省市区</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-input-inline layui-form" id="areaSelect" style="margin:0">
|
||||
<div class="layui-input-inline" style="width: 200px;">
|
||||
<select name="province" class="province-select" data-value="440000" lay-filter="province-1">
|
||||
<option value="">请选择省</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 200px;">
|
||||
<select name="city" class="city-select" data-value="440100" lay-filter="city-1">
|
||||
<option value="">请选择市</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 200px;">
|
||||
<select name="district" class="district-select" data-value="440106" lay-filter="county-1">
|
||||
<option value="">请选择区</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
{/eq}
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','areaSelect'];
|
||||
function gouguInit() {
|
||||
var treeTable = layui.treeTable, tool = layui.tool,areaSelect = layui.areaSelect;
|
||||
areaSelect.render({
|
||||
elem: '#areaSelect',
|
||||
change: function (res) {
|
||||
//选择结果
|
||||
console.log(res);
|
||||
}
|
||||
});
|
||||
|
||||
layui.trees = treeTable.render({
|
||||
elem: '#treeTable'
|
||||
,url: "/home/area/datalist"
|
||||
,tree: { // treeTable 特定属性集
|
||||
customName: {name:'name'},
|
||||
data: {},
|
||||
view: {showIcon:false},
|
||||
async: {},
|
||||
callback: {}
|
||||
}
|
||||
, cellMinWidth: 80
|
||||
, cols: [[
|
||||
{ field: 'id', width: 80, title: 'ID号', align: 'center' }
|
||||
, { field: 'sort', width: 60, title: '排序', align: 'center' }
|
||||
, { field: 'name', width: 200, title: '名称' }
|
||||
, { field: 'pid', title: '父ID', width: 80, align: 'center' }
|
||||
, { field: 'shortname', width: 100, title: '简称' }
|
||||
, { field: 'longitude', title: '经度' }
|
||||
, { field: 'latitude', title: '纬度' }
|
||||
, { field: 'level', title: '级别', width: 80, align: 'center'}
|
||||
, {
|
||||
field: 'status', width: 100, title: '是否开启', align: 'center', templet: function (d) {
|
||||
var html = '<span style="color:#fbbc05">禁用</span>';
|
||||
if (d.status == '1') {
|
||||
html = '<span style="color:#12bb37">开启</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {
|
||||
width: 188, 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="disable">禁用</button>';
|
||||
if(d.status==0){
|
||||
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-xs" lay-event="recovery">启用</button>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
, page: false
|
||||
});
|
||||
//表头工具栏事件
|
||||
$('.add-area').on('click', function () {
|
||||
tool.side("/home/area/add");
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeTable.on('tool(treeTable)', function (obj) {
|
||||
console.log(obj);
|
||||
if (obj.event === 'add') {
|
||||
tool.side('/home/area/add?pid=' + obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side('/home/area/add?id=' + obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'disable') {
|
||||
layer.confirm('确定要禁用吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/home/area/set", { id: obj.data.id,status:0}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if (obj.event === 'recovery') {
|
||||
layer.confirm('确定要禁用吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/home/area/set", { id: obj.data.id,status:1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('.import-area').on('click', function () {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
//location.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/home/area/set", {id:0}, callback);
|
||||
return;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,146 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加车辆类型</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'
|
||||
,defaultToolbar: false
|
||||
,title:'车辆类型列表'
|
||||
,url: "/home/cate/car_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '车辆名称'}
|
||||
,{field:'name',title: '车牌号码'}
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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,obj.data.name);
|
||||
}
|
||||
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("/home/cate/car_cate_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("/home/cate/car_cate_check", { id: obj.data.id,status: 1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',function(){
|
||||
addExpense(0,'','');
|
||||
});
|
||||
|
||||
function addExpense(id,title,name){
|
||||
var biaoti = '新增车辆';
|
||||
if(id>0){
|
||||
biaoti = '编辑车辆';
|
||||
}
|
||||
|
||||
layer.open({
|
||||
type: 1
|
||||
,title: biaoti
|
||||
,area: '368px;'
|
||||
,id: 'LAY_module' //设定一个id,防止重复弹出
|
||||
,btn: ['确定', '取消']
|
||||
,btnAlign: 'c'
|
||||
,content: '<div style="padding-top:15px;">\
|
||||
<div class="layui-form-item">\
|
||||
<label class="layui-form-label">车辆名称</label>\
|
||||
<div class="layui-input-inline">\
|
||||
<input type="hidden" name="id" value="'+id+'">\
|
||||
<input type="text" name="title" autocomplete="off" value="'+title+'" placeholder="请输入车辆名称" class="layui-input">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-form-item">\
|
||||
<label class="layui-form-label">车牌号码</label>\
|
||||
<div class="layui-input-inline">\
|
||||
<input type="text" name="name" autocomplete="off" value="'+name+'" placeholder="请输入车牌号码" class="layui-input">\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>'
|
||||
,yes: function(index){
|
||||
let id = $('#LAY_module').find('[name="id"]').val();
|
||||
let title = $('#LAY_module').find('[name="title"]').val();
|
||||
let name = $('#LAY_module').find('[name="name"]').val();
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
layer.close(index);
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/car_cate_add", {
|
||||
id: id,
|
||||
title: title,
|
||||
name: name
|
||||
}, callback);
|
||||
}
|
||||
,btn2: function(){
|
||||
layer.closeAll();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加费用类型</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'
|
||||
,defaultToolbar: false
|
||||
,title:'费用类型列表'
|
||||
,url: "/home/cate/cost_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,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 class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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("/home/cate/cost_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, 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("/home/cate/cost_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',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();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/cost_cate_add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类别标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,96 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加企业主体</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'
|
||||
,defaultToolbar: false
|
||||
,title:'企业主体列表'
|
||||
,url: "/home/cate/enterprise"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '企业主体名称',width:300}
|
||||
,{field:'city',title: '所在城市',width:150, align:'center'}
|
||||
,{field:'address',title: '详细地址'}
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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'){
|
||||
tool.side('/home/cate/enterprise_add/id/'+obj.data.id);
|
||||
}
|
||||
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("/home/cate/enterprise_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("/home/cate/enterprise_check", { id: obj.data.id,status: 1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
tool.side('/home/cate/enterprise_add');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,108 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">企业主体</h3>
|
||||
{if condition="$id eq 0"}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">企业名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="" lay-verify="required" lay-reqText="请完善企业名称" placeholder="请完善企业名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">所在城市<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="city" value="" lay-verify="required" lay-reqText="请完善所在城市" placeholder="请完善所在城市" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">详细地址<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="address" value="" lay-verify="required" lay-reqText="请完善详细地址" placeholder="请完善详细地址" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">纳税人识别号<font>*</font></td>
|
||||
<td><input type="text" name="tax_num" value="" lay-verify="required" lay-reqText="请完善纳税人识别号" placeholder="请完善纳税人识别号" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">开户银行</td>
|
||||
<td>
|
||||
<input type="text" name="bank" value="" placeholder="请完善开户银行" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">银行帐号</td>
|
||||
<td><input type="text" name="bank_sn" value="" placeholder="请完善银行帐号" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">备注信息</td>
|
||||
<td colspan="3">
|
||||
<textarea name="remark" placeholder="请输入描述" class="layui-textarea" style="height: 120px;"></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" lay-reqText="请完善企业名称" placeholder="请完善企业名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">所在城市<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="city" value="{$detail.city}" lay-verify="required" lay-reqText="请完善所在城市" placeholder="请完善所在城市" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">详细地址<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="address" value="{$detail.address}" lay-verify="required" lay-reqText="请完善详细地址" placeholder="请完善详细地址" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">纳税人识别号<font>*</font></td>
|
||||
<td><input type="text" name="tax_num" value="{$detail.tax_num}" lay-verify="required" lay-reqText="请完善纳税人识别号" placeholder="请完善纳税人识别号" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">开户银行</td>
|
||||
<td>
|
||||
<input type="text" name="bank" value="{$detail.bank}" placeholder="请完善开户银行" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">银行帐号</td>
|
||||
<td><input type="text" name="bank_sn" value="{$detail.bank_sn}" placeholder="请完善银行帐号" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">备注信息</td>
|
||||
<td colspan="3">
|
||||
<textarea name="remark" placeholder="请输入描述" class="layui-textarea" style="height: 120px;">{$detail.remark}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/if}
|
||||
<div class="pt-4">
|
||||
<input type="hidden" value="{$id}" name="id">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交保存</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听发送
|
||||
form.on('submit(webform)', function(data){
|
||||
$.ajax({
|
||||
url: "/home/cate/enterprise_add",
|
||||
type:'post',
|
||||
data:data.field,
|
||||
success:function(e){
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加报销类别</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'
|
||||
,defaultToolbar: false
|
||||
,title:'报销类别列表'
|
||||
,url: "/home/cate/expense_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,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 class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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("/home/cate/expense_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, 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("/home/cate/expense_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',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();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/expense_cate_add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类别标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,102 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加审批类型</button>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,defaultToolbar: false
|
||||
,title:'审批模块列表'
|
||||
,url: "/home/cate/flow_type"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '名称',width:120}
|
||||
,{field:'department',title: '应用部门'}
|
||||
,{field:'name',title: '标识',width:150}
|
||||
,{field:'icon',title: '图标',width:220,templet: function(d){
|
||||
var html='<strong class="iconfont '+d.icon+'"></strong> '+d.icon;
|
||||
return html;
|
||||
}}
|
||||
,{field:'type_name', title: '所属分类',width:90,align:'center'}
|
||||
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
|
||||
var html1='<span class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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'){
|
||||
tool.side("/home/cate/flow_type_add?id="+obj.data.id);
|
||||
}
|
||||
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("/home/cate/flow_type_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("/home/cate/flow_type_check", { id: obj.data.id,status: 1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',function(){
|
||||
tool.side("/home/cate/flow_type_add");
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,123 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">审批类型</h3>
|
||||
{eq name="$id" value="0"}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">所属分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="type" lay-verify="required" lay-reqText="请选择所属分类">
|
||||
<option value="">--请选择--</option>
|
||||
{volist name="$type" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" autocomplete="off" placeholder="请输入审批类型名称" lay-verify="required" lay-reqText="请输入审批类型名称" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">标识<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name" placeholder="请输入审批类型标识" value="" autocomplete="off" lay-verify="required" lay-reqText="请输入审批类型标识" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">图标<font>*</font></td>
|
||||
<td>
|
||||
<input style="width:200px; display:inline" class="layui-input" type="text" name="icon" value="" placeholder="请输入审批类型图标" lay-verify="required" lay-reqText="请输入审批类型图标" >
|
||||
如:icon-jichupeizhi<a href="{__GOUGU__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">应用部门</td>
|
||||
<td colspan="3">
|
||||
<div class="layui-input-inline" style="width:360px;">
|
||||
<select id="department_ids" name="department_ids" xm-selected="" xm-select="select1" xm-select-skin="default"></select>
|
||||
</div>
|
||||
<span style="color: red; font-size: 12px;">(如果不选,默认是全公司)</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<span style="color: red; font-size: 12px;">注意:新增审批类型以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的审批类型模板文件,然后根据需求修改对应的表单即可。</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">所属分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="type" lay-verify="required" lay-reqText="请选择所属分类">
|
||||
<option value="">--请选择--</option>
|
||||
{volist name="$type" id="vo"}
|
||||
<option value="{$vo.id}" {eq name="$detail.type" value="$vo.id"}selected=""{/eq}>{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" placeholder="请输入审批类型名称" lay-verify="required" lay-reqText="请输入审批类型名称" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">标识<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name" placeholder="请输入审批类型标识" value="{$detail.name}" autocomplete="off" lay-verify="required" lay-reqText="请输入审批类型标识" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">图标<font>*</font></td>
|
||||
<td>
|
||||
<input style="width:200px; display:inline" class="layui-input" type="text" name="icon" value="{$detail.icon}" placeholder="请输入审批类型图标" lay-verify="required" lay-reqText="请输入审批类型图标" >
|
||||
<strong class="iconfont {$detail.icon}"></strong><a href="{__GOUGU__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">应用部门</td>
|
||||
<td colspan="3">
|
||||
<div class="layui-input-inline" style="width:360px;">
|
||||
<select id="department_ids" name="department_ids" xm-selected="{$detail.department_ids}" xm-select="select1" xm-select-skin="default"></select>
|
||||
</div>
|
||||
<span style="color: red; font-size: 12px;">(如果不选,默认是全公司)</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/eq}
|
||||
<div class="pt-4">
|
||||
<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>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','formSelects'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,formSelects=layui.formSelects;
|
||||
//选择应用部门
|
||||
var selcted = $('#department_ids').attr('xm-selected');
|
||||
formSelects.data('select1', 'server', {
|
||||
url: '/api/index/get_department_select',
|
||||
keyword: selcted,
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/flow_type_add", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加行业类型</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'
|
||||
,defaultToolbar: false
|
||||
,title:'工作类型列表'
|
||||
,url: "/home/cate/industry_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,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 class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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("/home/cate/industry_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, 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("/home/cate/industry_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',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();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/industry_cate_add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类型标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,78 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加办公工具</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'
|
||||
,defaultToolbar: false
|
||||
,title:'办公工具列表'
|
||||
,url: "/home/cate/links"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '书签名称',width:300}
|
||||
,{field:'url',title: '链接地址'}
|
||||
,{field:'target', title: '是否新窗口打开',width:120,align:'center',templet: function(d){
|
||||
var html1='<span class="green">是</span>';
|
||||
var html2='<span class="yellow">否</span>';
|
||||
if(d.target==1){
|
||||
return html1;
|
||||
}
|
||||
else{
|
||||
return html2;
|
||||
}
|
||||
}}
|
||||
,{field:'sort',title: '排序',width:100,align:'center'}
|
||||
,{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="del">删除</a>';
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
tool.side('/home/cate/links_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) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/links_del", { id: obj.data.id,status: 1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
tool.side('/home/cate/links_add');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,59 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">办公工具</h3>
|
||||
<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|default=''}" lay-verify="required" lay-reqText="请完善工具名称" placeholder="请完善工具名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray">链接地址<font>*</font></td>
|
||||
<td><input type="text" name="url" value="{$detail.url|default=''}" lay-verify="required" lay-reqText="请完善链接地址" placeholder="请完善链接地址" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">是否新窗口打开<font>*</font></td>
|
||||
<td>
|
||||
{empty name="$detail"}
|
||||
<input type="radio" name="target" value="1" title="是" checked>
|
||||
<input type="radio" name="target" value="0" title="否" >
|
||||
{else/}
|
||||
<input type="radio" name="target" value="1" title="是" {eq name="$detail.target" value="1"} checked{/eq}>
|
||||
<input type="radio" name="target" value="0" title="否" {eq name="$detail.target" value="0"} checked{/eq}>
|
||||
{/empty}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">排序</td>
|
||||
<td><input type="text" name="sort" value="{$detail.sort|default=''}" lay-verify="number" class="layui-input"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-3">
|
||||
<input type="hidden" value="{$detail.id|default=0}" name="id">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交保存</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听发送
|
||||
form.on('submit(webform)', function(data){
|
||||
$.ajax({
|
||||
url: "/home/cate/links_add",
|
||||
type:'post',
|
||||
data:data.field,
|
||||
success:function(e){
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加印章类型</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'
|
||||
,defaultToolbar: false
|
||||
,title:'印章类型列表'
|
||||
,url: "/home/cate/seal_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,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 class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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("/home/cate/seal_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, 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("/home/cate/seal_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',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();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/seal_cate_add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类别标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加服务类型</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'
|
||||
,defaultToolbar: false
|
||||
,title:'工作类型列表'
|
||||
,url: "/home/cate/services_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,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 class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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("/home/cate/services_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, 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("/home/cate/services_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',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();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/services_cate_add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类型标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加工作类型</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'
|
||||
,defaultToolbar: false
|
||||
,title:'工作类型列表'
|
||||
,url: "/home/cate/work_cate"
|
||||
,page: false
|
||||
,cellMinWidth: 80
|
||||
,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 class="green">正常</span>';
|
||||
var html2='<span class="yellow">禁用</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("/home/cate/work_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, 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("/home/cate/work_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',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();
|
||||
}
|
||||
}
|
||||
tool.post("/home/cate/work_cate_add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类别标题');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,68 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">配置项</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">配置名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}" />
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入配置名称" lay-reqText="请输入配置名称" class="layui-input" value="{$config.title|default=''}">
|
||||
</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" value="{$config.name|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<span class="red">注意:新增配置项以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的配置模板文件,然后根据需求修改对应的表单即可。</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/conf/add", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,118 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">邮箱配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">SMTP地址<font>*</font></td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<input type="text" name="smtp" lay-verify="required" autocomplete="off" placeholder="请输入SMTP服务器地址" lay-reqText="请输入SMTP服务器地址" class="layui-input" value="{$config.smtp|default=''}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px; margin-left:5px">如: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" value="{$config.smtp_port|default=''}" style="width:240px;display: inline-block;"><span style="color:#999; font-size:12px; margin-left:5px">如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">邮箱账户<font>*</font></td>
|
||||
<td><input type="text" name="smtp_user" autocomplete="off" lay-verify="required" placeholder="请输入邮箱用户名" lay-reqText="请输入邮箱用户名" class="layui-input" value="{$config.smtp_user|default=''}"style="width:240px;display: inline-block;"><span style="color:#999; font-size:12px; margin-left:5px">如:gougucms@qq.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">邮箱密码<font>*</font></td>
|
||||
<td><input type="password" name="smtp_pwd" lay-verify="required" autocomplete="off" placeholder="请输入邮箱密码" class="layui-input" value="{$config.smtp_pwd|default=''}" style="width:240px;display: inline-block;"><span style="color:#999; font-size:12px; margin-left:5px">不一定是登录密码,如QQ邮箱的是第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="layui-td-gray">发送人<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="from" autocomplete="off" lay-verify="required" placeholder="请输入要显示的发送者" lay-reqText="请输入要显示的发送者" class="layui-input" value="{$config.from|default=''}" style="width:240px; display: inline-block;">
|
||||
<span style="color:#999; font-size:12px; margin-left:5px">用于展示给发送方,如:勾股CMS系统管理员</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">显示的邮箱<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="email" lay-verify="required" autocomplete="off" placeholder="请输入要显示的发送者邮箱" lay-reqText="请输入要显示的发送者邮箱" class="layui-input" value="{$config.email|default=''}" style="width:240px;display: inline-block;">
|
||||
<span style="color:#999; font-size:12px; margin-left:5px">可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">邮件模板</td>
|
||||
<td><textarea name="template" placeholder="" class="layui-textarea" id="container">{$config.template|default=''}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<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>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool', 'tinymce'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool, tinymce = layui.tinymce;
|
||||
|
||||
var edit = tinymce.render({
|
||||
selector: "#container",
|
||||
height: 320
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
data.field.template = tinyMCE.editors['container'].getContent();
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/conf/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
|
||||
$('body').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: "/api/index/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>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,107 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="conf" lay-filter="conf"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="status">
|
||||
<i class="layui-icon {{# if(d.status == 1){ }}green layui-icon-ok{{# } else { }}red 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: '#conf',
|
||||
title: '配置列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: false,
|
||||
url: "/home/conf/index",
|
||||
cellMinWidth: 80,
|
||||
page: false, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[{
|
||||
field: 'id',
|
||||
width: 80,
|
||||
title: 'ID编号',
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'title',
|
||||
width: 200,
|
||||
title: '配置名称'
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '配置标识<span class="red">(新增的模板文件名称需与标识名称一致)</span>'
|
||||
}, {
|
||||
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;
|
||||
}
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
table.on('toolbar(conf)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.side("/home/conf/add");
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(conf)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'add') {
|
||||
tool.side('/home/conf/add?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side('/home/conf/edit?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'del') {
|
||||
if(obj.data.id == 1){
|
||||
layer.msg('系统配置不支持删除');
|
||||
return false;
|
||||
}
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
obj.del();
|
||||
layer.close(index);
|
||||
}
|
||||
}
|
||||
tool.delete("/home/conf/delete", { id: obj.data.id }, callback);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,46 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">其他配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">开发者</td>
|
||||
<td>
|
||||
<input type="hidden" value="{$id}" name="id">
|
||||
<input type="text" name="author" autocomplete="off" placeholder="请输入开发者" lay-reqText="请输入开发者" class="layui-input" value="{$config.author|default=''}">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">开发版本号</td>
|
||||
<td><input type="text" name="version" autocomplete="off" placeholder="请输入版本号" lay-reqText="请输入版本号" class="layui-input" value="{$config.version|default=''}"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/conf/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,127 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">系统配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">左侧菜单模式</td>
|
||||
<td>
|
||||
{empty name="$config.menu_mode"}
|
||||
<input type="radio" name="menu_mode" value="classical" title="经典模式" checked>
|
||||
<input type="radio" name="menu_mode" value="expand" title="展开模式" >
|
||||
{else/}
|
||||
<input type="radio" name="menu_mode" value="classical" title="经典模式" {eq name="$config.menu_mode" value="classical"}checked{/eq}>
|
||||
<input type="radio" name="menu_mode" value="expand" title="展开模式" {eq name="$config.menu_mode" value="expand"}checked{/eq}>
|
||||
{/empty}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">上传附件限制(MB)<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" lay-verify="required|number" name="upload_max_filesize" autocomplete="off" placeholder="请输入上传附件限制" lay-reqText="请输入上传附件限制" class="layui-input" value="{$config.upload_max_filesize|default='50'}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">开启新消息声音提醒</td>
|
||||
<td>
|
||||
{empty name="$config.msg_sound"}
|
||||
<input type="radio" name="msg_sound" value="1" title="开启" checked>
|
||||
<input type="radio" name="msg_sound" value="2" title="不开启">
|
||||
{else/}
|
||||
<input type="radio" name="msg_sound" value="1" title="开启" {eq name="$config.msg_sound" value="1"}checked{/eq}>
|
||||
<input type="radio" name="msg_sound" value="2" title="不开启" {eq name="$config.msg_sound" value="2"}checked{/eq}>
|
||||
{/empty}
|
||||
</td>
|
||||
<td class="layui-td-gray-3">开启系统页面水印</td>
|
||||
<td>
|
||||
{empty name="$config.watermark"}
|
||||
<input type="radio" name="watermark" value="1" title="开启" checked>
|
||||
<input type="radio" name="watermark" value="2" title="不开启">
|
||||
{else/}
|
||||
<input type="radio" name="watermark" value="1" title="开启" {eq name="$config.watermark" value="1"}checked{/eq}>
|
||||
<input type="radio" name="watermark" value="2" title="不开启" {eq name="$config.watermark" value="2"}checked{/eq}>
|
||||
{/empty}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">隐藏工作台广告<font>*</font></td>
|
||||
<td colspan="3">
|
||||
{empty name="$config.qrcode"}
|
||||
<input type="radio" name="qrcode" value="1" title="隐藏">
|
||||
<input type="radio" name="qrcode" value="2" title="不隐藏" checked>
|
||||
{else/}
|
||||
<input type="radio" name="qrcode" value="1" title="隐藏" {eq name="$config.qrcode" value="1"}checked{/eq}>
|
||||
<input type="radio" name="qrcode" value="2" title="不隐藏" {eq name="$config.qrcode" value="2"}checked{/eq}>
|
||||
{/empty}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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" value="{$config.version|default='1.0.0'}">
|
||||
</td>
|
||||
<td class="layui-td-gray">版权信息</td>
|
||||
<td>
|
||||
<input type="text" name="copyright" autocomplete="off" placeholder="请输入版权信息" lay-reqText="请输入版权信息" readonly class="layui-input" value="{$config.copyright|default='勾股OA'}">
|
||||
</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>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool, upload = layui.upload;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
parent.parent.location.reload();
|
||||
},1000)
|
||||
}
|
||||
}
|
||||
tool.post("/home/conf/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
|
||||
//logo上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#uploadBtn',
|
||||
url: "/api/index/upload",
|
||||
done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#logo input').attr('value', res.data.filepath);
|
||||
$('#logo img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var uploadInst2 = upload.render({
|
||||
elem: '#uploadBtn2',
|
||||
url: "/api/index/upload",
|
||||
done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#smalllogo input').attr('value', res.data.filepath);
|
||||
$('#smalllogo img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,127 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">TOKEN配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">Token签发组织</td>
|
||||
<td>
|
||||
<input type="hidden" value="{$id}" name="id">
|
||||
<input type="text" name="iss" autocomplete="off" placeholder="请输入签发组织" lay-reqText="请输入签发组织" class="layui-input" value="{$config.iss|default=''}">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">Token签发作者</td>
|
||||
<td>
|
||||
<input type="text" name="aud" autocomplete="off" placeholder="请输入签发作者" lay-reqText="请输入签发作者" class="layui-input" value="{$config.aud|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">Token Secrect</td>
|
||||
<td>
|
||||
<input type="text" name="secrect" autocomplete="off" placeholder="请输入secrect" lay-reqText="请输入secrect" class="layui-input" value="{$config.secrect|default=''}">
|
||||
</td>
|
||||
<td class="layui-td-gray">Token过期时间</td>
|
||||
<td>
|
||||
<input type="text" name="exptime" autocomplete="off" placeholder="请输入过期时间" lay-reqText="请输入过期时间" class="layui-input" value="{$config.exptime|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
|
||||
<div style="padding:30px 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:12px 0;word-wrap:break-word">
|
||||
<p class="red">先点击登录,在点击测试,会有好的结果哦!</p>
|
||||
测试结果:
|
||||
<div id="res"></div>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/conf/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkuZ291Z3VjbXMuY29tIiwiYXVkIjoiZ291Z3VjbXMiLCJpYXQiOjE2MjczMTY1MTgsImV4cCI6MTYyNzMyMDExOCwidWlkIjoxfQ.3soLDbwrEqn4EZtpD4h05FmvmMtJEh1LtE1vZ_ANcnI';
|
||||
function testToken() {
|
||||
$.ajax({
|
||||
headers: {
|
||||
Token: token
|
||||
},
|
||||
url: "/api/demo/test",
|
||||
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="admin"/></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: "/api/demo/login",
|
||||
type: 'post',
|
||||
data: { username: username, password: password },
|
||||
success: function (res) {
|
||||
$('#res').html(JSON.stringify(res));
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
token = res.data.token;
|
||||
layer.close(idx);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,122 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">信息配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">系统名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<input type="text" name="admin_title" lay-verify="required" autocomplete="off" placeholder="请输入系统名称" lay-reqText="请输入系统名称" class="layui-input" value="{$config.admin_title|default=''}">
|
||||
</td>
|
||||
<td class="layui-td-gray">系统域名<font>*</font></td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="domain" lay-verify="required" autocomplete="off" class="layui-input" placeholder="请输入系统域名" lay-reqText="请输入系统域名" value="{$config.domain|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">ICP备案号</td>
|
||||
<td>
|
||||
<input type="text" name="icp" autocomplete="off" placeholder="请输入ICP备案号" class="layui-input" value="{$config.icp|default=''}">
|
||||
</td>
|
||||
<td class="layui-td-gray" rowspan="3">系统大LOGO</td>
|
||||
<td rowspan="3" style="width: 200px;">
|
||||
<div class="layui-upload" style="width: 200px;">
|
||||
<div class="layui-upload-list" id="logo" style="width: 100%; height:64px; overflow: hidden;">
|
||||
<img src="{$config.logo|default='/static/home/images/syslogo.png'}" style="max-width: 100%; height: 64px;" />
|
||||
<input type="hidden" name="logo" value="{$config.logo|default='/static/home/images/syslogo.png'}">
|
||||
</div>
|
||||
<button type="button" class="layui-btn" style="width: 100%;" id="uploadBtn">上传LOGO</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="layui-td-gray" rowspan="3">系统小LOGO</td>
|
||||
<td rowspan="3" style="width: 180px;">
|
||||
<div class="layui-upload" style="width: 180px;">
|
||||
<div class="layui-upload-list" id="smalllogo" style="width: 100%; height:64px; overflow: hidden; text-align:center;">
|
||||
<img src="{$config.small_logo|default='/static/home/images/syslogo_small.png'}" style="max-width: 100%; height: 64px;" />
|
||||
<input type="hidden" name="small_logo" value="{$config.small_logo|default='/static/home/images/syslogo_small.png'}">
|
||||
</div>
|
||||
<button type="button" class="layui-btn" style="width: 100%;" id="uploadBtn2">上传LOGO</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">公安备案号</td>
|
||||
<td>
|
||||
<input type="text" name="beian" autocomplete="off" placeholder="请输入公安备案号" class="layui-input" value="{$config.beian|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">系统关键词<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="keywords" lay-verify="required" autocomplete="off" placeholder="多个关键词用“,”隔开" lay-reqText="请输入系统关键字" class="layui-input" value="{$config.keywords|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">系统描述<font>*</font>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<textarea name="desc" lay-verify="required" placeholder="请输入系统描述" lay-reqText="请输入系统描述" class="layui-textarea">{$config.desc|default=''}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pt-3">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool, upload = layui.upload;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
parent.parent.location.reload();
|
||||
},1000)
|
||||
}
|
||||
}
|
||||
tool.post("/home/conf/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
|
||||
//logo上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#uploadBtn',
|
||||
url: "/api/index/upload",
|
||||
done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#logo input').attr('value', res.data.filepath);
|
||||
$('#logo img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var uploadInst2 = upload.render({
|
||||
elem: '#uploadBtn2',
|
||||
url: "/api/index/upload",
|
||||
done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#smalllogo input').attr('value', res.data.filepath);
|
||||
$('#smalllogo img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,120 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">模块配置及数据权限配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td colspan="8" class="red" style="line-height:1.8">
|
||||
<p><strong>模块使用说明:</strong></p>
|
||||
<p>{$detail.desc}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限名称</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td>{$detail.name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">合同管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_1" value="{$detail.conf_1}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">合同编号自动生成</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_2" value="1" title="开启" {eq name="$detail.conf_2" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_2" value="0" title="不开启" {eq name="$detail.conf_2" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">是否开启关联客户<br>[销售合同]</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_3" value="1" title="关联" {eq name="$detail.conf_3" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_3" value="0" title="不关联" {eq name="$detail.conf_3" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">是否开启关联产品<br>[销售合同]</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_4" value="1" title="关联" {eq name="$detail.conf_4" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_4" value="0" title="不关联" {eq name="$detail.conf_4" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">是否开启关联服务<br>[销售合同]</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_5" value="1" title="关联" {eq name="$detail.conf_5" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_5" value="0" title="不关联" {eq name="$detail.conf_5" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">是否开启关联供应商<br>[采购合同]</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_6" value="1" title="关联" {eq name="$detail.conf_6" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_6" value="0" title="不关联" {eq name="$detail.conf_6" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">是否开启关联采购品<br>[采购合同]</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_7" value="1" title="关联" {eq name="$detail.conf_7" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_7" value="0" title="不关联" {eq name="$detail.conf_7" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_7</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同到期前N天提醒</td>
|
||||
<td><input type="text" name="conf_10" value="{$detail.conf_10|default='30'}" lay-verify="required|number" lay-reqText="请输入合同到期前N天提醒" class="layui-input"></td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_10</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/dataauth/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,82 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">模块配置及数据权限配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td colspan="8" class="red" style="line-height:1.8">
|
||||
<p><strong>模块使用说明:</strong></p>
|
||||
<p>{$detail.desc}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限名称</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td>{$detail.name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">客户管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_1" value="{$detail.conf_1}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">每天可获取公客数</td>
|
||||
<td><input name="conf_2" value="{$detail.conf_2}" lay-verify="required|number" lay-reqText="请输入每天获取最大公客数" placeholder="输入每天每人可获取最大公客数" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">说明</td>
|
||||
<td colspan="3" class="red">如:10,当日超过该数量,该员工就不能在抢客宝里面抢客或者从公海里领取客户,等到第二天自动恢复。</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">员工客户数量限制</td>
|
||||
<td><input name="conf_3" value="{$detail.conf_3}" lay-verify="required|number" lay-reqText="请输入员工客户数量限制" placeholder="请输入员工客户数量限制" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">说明</td>
|
||||
<td colspan="3" class="red">如:100,超过该数量,该员工就不能录入或者不能从公海领取客户,必须把自已的客户移到公海里,不超过该数量才能新增。</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/dataauth/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,60 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">模块配置及数据权限配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td colspan="8" class="red" style="line-height:1.8">
|
||||
<p><strong>模块使用说明:</strong></p>
|
||||
<p>{$detail.desc}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限名称</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td>{$detail.name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">知识网盘数据管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_1" value="{$detail.conf_1}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_1</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/dataauth/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,115 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">模块配置及数据权限配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td colspan="4" class="red" style="line-height:1.8">
|
||||
<p><strong>模块使用说明:</strong></p>
|
||||
<p>{$detail.desc}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限名称</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td>{$detail.name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">报销管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择报销管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_1" value="{$detail.conf_1}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">发票管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_2_str" value="{$detail.conf_2_str|default=''}" readonly placeholder="请选择发票管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_2" value="{$detail.conf_2}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">回款管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_3_str" value="{$detail.conf_3_str|default=''}" readonly placeholder="请选择到回款理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_3" value="{$detail.conf_3}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">付款管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_4_str" value="{$detail.conf_4_str|default=''}" readonly placeholder="请选择付款管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_4" value="{$detail.conf_4}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">借支管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_5_str" value="{$detail.conf_5_str|default=''}" readonly placeholder="请选择借支管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_5" value="{$detail.conf_5}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">借支编号自动生成</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_9" value="1" title="开启" {eq name="$detail.conf_9" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_9" value="0" title="不开启" {eq name="$detail.conf_9" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_9</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">报销编号自动生成</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_10" value="1" title="开启" {eq name="$detail.conf_10" value="1"}checked{/eq}>
|
||||
<input type="radio" name="conf_10" value="0" title="不开启" {eq name="$detail.conf_10" value="0"}checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_10</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/dataauth/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,72 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="conf" lay-filter="conf"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>模块配置及数据权限配置</h3>
|
||||
</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: '#conf',
|
||||
title: '配置列表',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: false,
|
||||
url: "/home/dataauth/index",
|
||||
cellMinWidth: 80,
|
||||
page: false, //开启分页
|
||||
limit: 20,
|
||||
cols: [
|
||||
[{
|
||||
field: 'id',
|
||||
width: 80,
|
||||
title: 'ID编号',
|
||||
align: 'center'
|
||||
}, {
|
||||
field: 'title',
|
||||
width: 200,
|
||||
title: '权限名称'
|
||||
}, {
|
||||
field: 'name',
|
||||
width: 200,
|
||||
title: '权限标识'
|
||||
}, {
|
||||
field: 'desc',
|
||||
minWidth: 300,
|
||||
title: '描述'
|
||||
}, {
|
||||
width: 100,
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
var html = '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit" >编辑配置</button>';
|
||||
return html;
|
||||
}
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
//监听行工具事件
|
||||
table.on('tool(conf)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
tool.side('/home/dataauth/edit?id=' + data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,80 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">模块配置及数据权限配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td colspan="8" class="red" style="line-height:1.8">
|
||||
<p><strong>模块使用说明:</strong></p>
|
||||
<p>{$detail.desc}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限名称</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td>{$detail.name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">日常办公数据管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_1" value="{$detail.conf_1}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">工作记录工时调整、删除权限设置</td>
|
||||
<td>
|
||||
<input type="radio" name="conf_2" value="1" title="不开放" {eq name="$detail.conf_2" value="1"} checked{/eq}>
|
||||
<input type="radio" name="conf_2" value="2" title="开放给员工自己" {eq name="$detail.conf_2" value="2"} checked{/eq}>
|
||||
<input type="radio" name="conf_2" value="3" title="开放给部门负责人" {eq name="$detail.conf_2" value="3"} checked{/eq}>
|
||||
<input type="radio" name="conf_2" value="4" title="开放给日常办公数据管理员" {eq name="$detail.conf_2" value="4"} checked{/eq}>
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">人事管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_3_str" value="{$detail.conf_3_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_3" value="{$detail.conf_3}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_3</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/dataauth/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,66 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">模块配置及数据权限配置</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td colspan="4" class="red" style="line-height:1.8">
|
||||
<p><strong>模块使用说明:</strong></p>
|
||||
<p>{$detail.desc}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">权限名称</td>
|
||||
<td>
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
{$detail.title}
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td>{$detail.name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">项目管理员</td>
|
||||
<td>
|
||||
<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="conf_1" value="{$detail.conf_1}">
|
||||
</td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目任务到期<br>前N天提醒</td>
|
||||
<td><input type="text" name="conf_10" value="{$detail.conf_10|default='3'}" lay-verify="required|number" lay-reqText="请输入合同到期前N天提醒" class="layui-input"></td>
|
||||
<td class="layui-td-gray">权限标识</td>
|
||||
<td style="width:100px;">conf_10</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','oaPicker'];
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/home/dataauth/edit", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,152 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="gg-form-bar border-t border-x">
|
||||
<h3 class="pb-3">数据还原</h3>
|
||||
</div>
|
||||
<table cellspacing="0" cellpadding="0" border="0" class="layui-table layui-table-form">
|
||||
<tr style="background-color:#FAFAFA">
|
||||
<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:222px"><span>操作</span></th>
|
||||
</tr>
|
||||
{empty name="list"}
|
||||
<tr>
|
||||
<td colspan="6" align="center" style="padding:20px 0; color:#999">暂无备份数据</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='/home/database/downfile?time={$vo.data.time}&part={$i+1}'>下载备份(分卷{$i+1})</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/for}
|
||||
{/volist}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
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: "/home/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: "/home/database/import?time=" + time,
|
||||
type: 'post',
|
||||
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: "/home/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: "/home/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,201 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="backup" lay-filter="backup"></table>
|
||||
</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>
|
||||
</div>
|
||||
<span id="dataTips" style="font-size:12px; margin-left:10px"></span>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
function gouguInit() {
|
||||
var table = layui.table, form = layui.form;
|
||||
var tableIns = table.render({
|
||||
elem: '#backup',
|
||||
title: '数据备份',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: false,
|
||||
url: "/home/database/database", //数据接口
|
||||
page: false,
|
||||
cols: [
|
||||
[ //表头
|
||||
{ type: 'checkbox' },
|
||||
{
|
||||
field: 'name',
|
||||
title: '数据表',
|
||||
width: 200
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
width: 100,
|
||||
templet: function (d) {
|
||||
return '<span id="table_' + d.name + '">-</span>';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'engine',
|
||||
title: '存储引擎',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'row_format',
|
||||
title: '行格式',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'rows',
|
||||
title: '行数',
|
||||
align: 'center',
|
||||
width: 60,
|
||||
}, {
|
||||
field: 'data_size',
|
||||
title: '字节数',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
field: 'data_length',
|
||||
title: '数据大小',
|
||||
align: 'center',
|
||||
width: 80
|
||||
}, {
|
||||
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("/home/database/backup", tab, function (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(backup)', 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('系统自带的备份功能仅是辅助工具,建议使用第三方专业的工具备份更安全!<br>确认要备份选中的' + len + '个数据表吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function (index) {
|
||||
$.ajax({
|
||||
url: "/home/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: "/home/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: "/home/database/optimize",
|
||||
type: 'post',
|
||||
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: "/home/database/repair",
|
||||
type: 'post',
|
||||
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,468 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
body { display: flex; overflow: hidden; height: 100vh; }
|
||||
::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
|
||||
::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1; }
|
||||
.layui-tab{margin:0;}
|
||||
.container { display: flex; flex: 1; flex-direction: column; overflow: hidden; padding:12px;}
|
||||
.file-container { display: flex; flex: 1; flex-direction: column; overflow: hidden; border-radius: 2px; background: #ffffff; box-shadow: rgba(0, 0, 0, 0.05) 0 1px 2px 0; }
|
||||
.file-item {display: flex; flex: 1; justify-content: space-between; overflow: hidden; }
|
||||
.file-header {padding-top: 4px; }
|
||||
|
||||
/** 分组 **/
|
||||
.file-item .group { position: relative; display: flex; flex-direction: column; padding-top: 8px; width: 200px; border-right: 1px solid #f6f6f6; }
|
||||
.file-item .group ul::-webkit-scrollbar { display: block; }
|
||||
.file-item .group ul { flex: 1; overflow: hidden; overflow-y: auto; }
|
||||
.file-item .group ul li {display: flex; align-items: center; justify-content: space-between; cursor:pointer; padding: 0 12px; height: 38px; font-size: 13px; color: #666666; }
|
||||
.file-item .group ul li i.iconfont{ margin-right:8px; font-size:24px; color:#E1AF1A; font-weight:800;}
|
||||
.file-item .group ul li > span { display: flex; flex: 1; overflow: hidden; margin-right: 0.5rem; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.file-item .group ul li.active { background: #edefff; }
|
||||
.file-item .group ul li:hover { background: #f5f7fa; }
|
||||
.file-item .group ul li .dropdown:hover dl { display: block; }
|
||||
.file-item .group ul li .dropdown dl { position: absolute; top: 36px; right: -15px; z-index: 10000; display: none; padding: 5px 0; width: 88px; border-radius: 2px; text-align: center; background-color: #ffffff; box-shadow: #cccccc 0 0 10px; }
|
||||
.file-item .group ul li .dropdown dl dd { height: 32px; line-height: 32px; }
|
||||
.file-item .group ul li .dropdown dl dd:hover { color: #4a5dff; background-color: #edefff; }
|
||||
.file-item .group ul li .dropdown dl::before { position: absolute; top: -16px; left: 44px; z-index: 12; display: block; padding: 0; width: 0; height: 0; border-top: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 8px solid #ffffff; border-left: 8px solid transparent; content: ""; box-sizing: content-box; }
|
||||
.file-item .group .footer { display: flex; align-items: center; justify-content: center; width: 100%; height: 50px; border-top: 1px solid #f2f2f2; border-right: 1px solid #f2f2f2; }
|
||||
|
||||
/** 菜单 **/
|
||||
.file-item .attach #move:hover { position: relative; opacity: 1; }
|
||||
.file-item .attach #move:hover .dropdown { display: block; background-color: #ffffff; }
|
||||
.file-item .attach .dropdown { position: absolute; top: 38px; z-index: 100000; display: none; padding: 5px 0; width: 150px; border: 1px solid #dddddd; text-align: left; background-color: #ffffff; line-height: 1.6; }
|
||||
.file-item .attach .dropdown em { font-size: 13px; font-weight: 400; color: #333333; font-style: normal; }
|
||||
.file-item .attach .dropdown em { display: block; clear: both; padding: 6px 20px; white-space: nowrap; }
|
||||
.file-item .attach .dropdown em:hover { background: #eeeeee; }
|
||||
.file-item .attach .dropdown em:first-child { font-size: 12px; color: #999999; }
|
||||
.file-item .attach .dropdown::before { position: absolute; top: -16px; left: 21px; z-index: 12; display: block; padding: 0; width: 0; height: 0; border-top: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 8px solid #ffffff; border-left: 8px solid transparent; content: ""; box-sizing: content-box; }
|
||||
.file-item .attach .dropdown::after { position: absolute; top: -18px; left: 20px; z-index: 10; display: block; padding: 0; width: 0; height: 0; border-top: 9px solid transparent; border-right: 9px solid transparent; border-bottom: 9px solid #cccccc; border-left: 9px solid transparent; content: ""; box-sizing: content-box; }
|
||||
|
||||
/** 文件 **/
|
||||
.file-item .attach { position: relative; display: flex; flex: 1; flex-direction: column; }
|
||||
.file-item .attach .header { display: flex; align-items: center; justify-content: space-between; padding:12px 15px; margin:0;}
|
||||
.file-item .attach .header .search{ display: flex; }
|
||||
.file-item .attach .header .search input { height: 30px; border-color: #eeeeee; border-top-right-radius: 0; border-bottom-right-radius: 0; }
|
||||
.file-item .attach .header .search button { border-color: #eeeeee; background: #f5f7fa; border-top-left-radius: 0; border-bottom-left-radius: 0; }
|
||||
.file-item .attach .header .search button:hover { background-color: #eeeeef; }
|
||||
.file-item .attach .subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
|
||||
.file-item .attach .subject:hover::-webkit-scrollbar { display: block; }
|
||||
.file-item .attach .subject ul { display: flex; flex-wrap: wrap; }
|
||||
.file-item .attach .subject ul li { position: relative; height: 120px; margin: 8px; padding: 8px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
|
||||
.file-item .attach .subject ul li:hover {border: 1px solid #dddddd; background-color:#f5f5f5;}
|
||||
.file-item .attach .subject ul li.on {border: 1px solid #ff5722; }
|
||||
.file-item .attach .subject ul li img { width: 50px; height: 50px; padding:25px;}
|
||||
.file-item .attach .subject ul li img.file-image { width: 100px; height: 100px; padding:0; border-radius: 2px; }
|
||||
.file-item .attach .subject ul li video { width: 100px; height: 100px; border-radius: 3px; }
|
||||
.file-item .attach .subject ul li p {overflow: hidden; margin: 5px 0 0; width: 98px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.file-item .attach .subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #dddddd; border-bottom:1px solid #dddddd; cursor:pointer;}
|
||||
.file-item .attach ul li .layui-btn-ctrl{position:absolute; top:0; right:0; opacity: 0;}
|
||||
.file-item .attach ul li:hover .layui-btn-ctrl{opacity: 1;}
|
||||
.file-item .attach .subject ul li:hover .file-check{display: block;}
|
||||
.file-item .attach .subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
|
||||
|
||||
.file-item .attach .footer { display: flex; align-items: center; justify-content: end; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
|
||||
|
||||
/** 无数据 **/
|
||||
.file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
|
||||
.file-item .empty i { font-size: 180px; }
|
||||
.file-item .empty p { width: 180px; text-align: center; }
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="container">
|
||||
<div class="file-container">
|
||||
<div class="file-header">
|
||||
<div class="layui-tabs layui-tab-brief" id="tab">
|
||||
<ul class="layui-tabs-header">
|
||||
<li class="layui-this" data-tab="0">全部</li>
|
||||
<li data-tab="1">图片</li>
|
||||
<li data-tab="2">视频</li>
|
||||
<li data-tab="3">音频</li>
|
||||
<li data-tab="4">文档</li>
|
||||
<li data-tab="5">压缩包</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-item">
|
||||
<!-- 分组 -->
|
||||
<div class="group">
|
||||
<ul id="group" class="groups">
|
||||
<li data-id="" class="active"><i class="iconfont icon-xiangmuguanli"></i><span>全部</span></li>
|
||||
<li data-id="0"><i class="iconfont icon-xiangmuguanli"></i><span>未分组</span></li>
|
||||
</ul>
|
||||
<div class="footer">
|
||||
<span class="layui-btn layui-btn-primary layui-btn-sm add-new">添加分组</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 文件 -->
|
||||
<div class="attach">
|
||||
<!-- 工具 -->
|
||||
<form class="layui-form" lay-filter="barsearchform" style="display:block; margin:0;padding:0;">
|
||||
<div class="header">
|
||||
<div class="layui-btn-group">
|
||||
<span class="layui-btn layui-btn-sm layui-btn-normal" id="fileUpload">上传文件</span>
|
||||
<span class="layui-btn layui-btn-sm layui-btn-danger" id="fileDelete">批量删除</span>
|
||||
<span class="layui-btn layui-btn-sm layui-btn-warm" id="fileMove">移动至 <i class="layui-icon layui-icon-triangle-d"></i></span>
|
||||
<span style="margin-left:36px;"><input type="checkbox" name="select_all" lay-filter="all" title="全选"></span>
|
||||
</div>
|
||||
|
||||
<div class="search">
|
||||
<input type="hidden" name="limit" value="44" />
|
||||
<input type="hidden" name="page" value="1" />
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<input type="hidden" name="group_id" value="" />
|
||||
<label><input type="text" name="keywords" placeholder="请输入名称" autocomplete="off" class="layui-input"></label>
|
||||
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<!-- 主体 -->
|
||||
<div class="subject">
|
||||
<ul id="filesBox"></ul>
|
||||
</div>
|
||||
<!-- 页脚 -->
|
||||
<div class="footer">
|
||||
<div id="laypage"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<h3 class="h3-title" style="height:28px;">审批列表</h3>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
{block name="copyright"}{/block}
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function isValidFileName(fileName) {
|
||||
const illegalChars = /[\\\/\*\:"<>|\?]/;
|
||||
return !illegalChars.test(fileName);
|
||||
}
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool ,form = layui.form,laypage = layui.laypage,upload = layui.upload, tabs = layui.tabs, dropdown=layui.dropdown;
|
||||
let fileGroup = [{id:0,title:'未分组'}];
|
||||
tabs.on('afterChange(tab)', function(data){
|
||||
$('[name="tab"]').val(data.index);
|
||||
$('[lay-filter="webform"]').click();
|
||||
return false;
|
||||
});
|
||||
|
||||
//监听多选框点击事件 通过 lay-filter="menu"来监听
|
||||
form.on('checkbox(all)', function (data) {
|
||||
let val = data.value;
|
||||
if(data.elem.checked){
|
||||
//判断当前多选框是选中还是取消选中
|
||||
$('#filesBox li').addClass('on');
|
||||
}
|
||||
else{
|
||||
$('#filesBox li').removeClass('on');
|
||||
}
|
||||
});
|
||||
|
||||
var uploadInst = upload.render({
|
||||
elem: '#fileUpload'
|
||||
,url: "/api/index/upload"
|
||||
, accept: 'file' //普通文件
|
||||
, exts: 'jpeg|jpg|png|gif|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z|txt|mp4|mp3|wav|psd|svg' //只允许上传文件
|
||||
, before: function (obj) {
|
||||
layer.msg('上传中...', { time: 3600000 });
|
||||
}
|
||||
,done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
$('[lay-filter="webform"]').click();
|
||||
}, error: function (index, upload) {
|
||||
layer.msg('上传失败');
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
add_group(0,'');
|
||||
});
|
||||
|
||||
$('#group').on('click','li',function(){
|
||||
let id=$(this).data('id');
|
||||
$(this).siblings().removeClass('active');
|
||||
$(this).addClass('active');
|
||||
$('[name="group_id"]').val(id);
|
||||
$('[lay-filter="webform"]').click();
|
||||
});
|
||||
|
||||
$('#fileDelete').on('click',function(){
|
||||
let select_array = [];
|
||||
$('#filesBox').find('li.on').each(function(index,item){
|
||||
select_array.push($(item).data('id'));
|
||||
})
|
||||
if(select_array.length<1){
|
||||
layer.msg('请先选择文件');
|
||||
}
|
||||
else{
|
||||
layer.confirm('确定要删除这些文件吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
$('[lay-filter="webform"]').click();
|
||||
}
|
||||
tool.delete("/home/files/delete", {ids:select_array.join(',')}, callback);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function add_group(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){
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.post("/home/files/add_group", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写分组名称');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var data = form.val('barsearchform');
|
||||
get_files(data);
|
||||
get_group();
|
||||
|
||||
function get_group(param){
|
||||
$.ajax({
|
||||
url:"/home/files/get_group",
|
||||
success:function(res){
|
||||
if(res.code==0){
|
||||
var group=res.data,item='';
|
||||
if(group.length>0){
|
||||
for(var a=0;a<group.length;a++){
|
||||
item+='<li data-id="'+group[a].id+'" data-title="'+group[a].title+'"><i class="iconfont icon-xiangmuguanli"></i><span>'+group[a].title+'</span><i class="layui-icon layui-icon-more-vertical dropdown-on"></i></li>';
|
||||
}
|
||||
$('#group').append(item);
|
||||
fileGroup = fileGroup.concat(group);
|
||||
// 自定义事件
|
||||
dropdown.render({
|
||||
elem: '.dropdown-on',
|
||||
trigger: 'hover',
|
||||
align: 'right',
|
||||
data: [{
|
||||
title: '重命名分组',
|
||||
id: 100
|
||||
},{
|
||||
title: '删除该分组',
|
||||
id: 101
|
||||
}],
|
||||
click: function(data, othis){
|
||||
let id = $(this.elem).parent().data('id');
|
||||
let title = $(this.elem).parent().data('title');
|
||||
if(data.id==100){
|
||||
add_group(id,title);
|
||||
}else{
|
||||
del_group(id);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
group.push({id:0,title:'未分组'});
|
||||
dropdown.render({
|
||||
elem: '#fileMove',
|
||||
data: group,
|
||||
click: function(obj){
|
||||
let select_array = [];
|
||||
$('#filesBox').find('li.on').each(function(index,item){
|
||||
select_array.push($(item).data('id'));
|
||||
})
|
||||
if(select_array.length<1){
|
||||
layer.msg('请先选择文件');
|
||||
}
|
||||
else{
|
||||
layer.confirm('确定要把选中的文件移动到『'+obj.title+'』分组吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
$('[lay-filter="webform"]').click();
|
||||
}
|
||||
tool.delete("/home/files/move", {group_id:obj.id,ids:select_array.join(',')}, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function del_group(id) {
|
||||
layer.confirm('确定要删除该分组吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
if(e.code==0){
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/home/files/del_group", {ids:id}, callback);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function get_files(param){
|
||||
var loadIndex = layer.load(0);
|
||||
$.ajax({
|
||||
url:"/home/files/index",
|
||||
data:param,
|
||||
complete:function(){
|
||||
setTimeout(function(){
|
||||
layer.close(loadIndex)
|
||||
}, 200);
|
||||
},
|
||||
success:function(res){
|
||||
$('[name="select_all"]').prop('checked', false);
|
||||
form.render('checkbox');
|
||||
if(res.code==0){
|
||||
laypage.render({
|
||||
elem: 'laypage',
|
||||
limit:param['limit'],
|
||||
curr:param['page'],
|
||||
count: res.count, // 数据总数
|
||||
jump: function(obj, first){
|
||||
console.log(obj.curr); // 得到当前页,以便向服务端请求对应页的数据。
|
||||
console.log(obj.limit); // 得到每页显示的条数
|
||||
// 首次不执行
|
||||
if(!first){
|
||||
var data = form.val('barsearchform');
|
||||
data['page'] = obj.curr;
|
||||
get_files(data);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var item=res.data,li='';
|
||||
if(item.length>0){
|
||||
for(var a=0;a<item.length;a++){
|
||||
let image = ['jpg','jpeg','png','gif'];
|
||||
let office = ['doc','docx','xls','xlsx','ppt','pptx'];
|
||||
let zip = ['zip','rar','7z','gz','tar'];
|
||||
let video = ['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'];
|
||||
let audio = ['mp3','wav','wma','flac','midi'];
|
||||
|
||||
let type = 0,ext="zip";
|
||||
// 判断元素是否在数组中
|
||||
let path='/static/home/images/icon/file.png';
|
||||
if (image.includes(item[a].fileext)) {
|
||||
path=item[a].thumbpath;
|
||||
type = 1;
|
||||
ext="image";
|
||||
}
|
||||
if (item[a].fileext == 'pdf'||item[a].fileext == 'txt') {
|
||||
type = 1;
|
||||
ext="pdf";
|
||||
path='/static/home/images/icon/'+item[a].fileext+'.png';
|
||||
}
|
||||
if (office.includes(item[a].fileext)) {
|
||||
type = 1;
|
||||
ext="office";
|
||||
path='/static/home/images/icon/'+item[a].fileext+'.png';
|
||||
}
|
||||
if (video.includes(item[a].fileext)) {
|
||||
type = 1;
|
||||
ext="video";
|
||||
path='/static/home/images/icon/video.png';
|
||||
}
|
||||
if (audio.includes(item[a].fileext)) {
|
||||
type = 1;
|
||||
ext="audio";
|
||||
path='/static/home/images/icon/audio.png';
|
||||
}
|
||||
if (zip.includes(item[a].fileext)) {
|
||||
type = 1;
|
||||
ext="zip";
|
||||
path='/static/home/images/icon/rar.png';
|
||||
}
|
||||
|
||||
ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="edit" data-id="'+item[a].id+'" data-fileid="'+item[a].id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
|
||||
|
||||
li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].fileext+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-items file-'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p><div class="layui-btn-ctrl">'+ctrl+'<span class="name-edit green" style="display:none;" data-id="'+item[a].id+'" data-fileid="'+item[a].id+'" id="fileEdit'+item[a].id+'" title="重命名"></span><span class="file-delete red" style="display:none;" data-id="'+item[a].id+'" data-fileid="'+item[a].id+'" id="fileDel'+item[a].id+'" title="删除"></span></div><div class="file-check">✔</div></li>';
|
||||
}
|
||||
$('#filesBox').html(li);
|
||||
$('#laypage').show();
|
||||
}
|
||||
else{
|
||||
$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件,赶紧去上传吧!</p></div>');
|
||||
$('#laypage').hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$('#filesBox').on('click','.file-check',function(){
|
||||
$(this).parent().toggleClass("on");
|
||||
})
|
||||
|
||||
$('#filesBox').on('click','.file-delete',function(){
|
||||
let id = $(this).parent().parent().data('id');
|
||||
layer.confirm('确定要删除该文件吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
$('[lay-filter="webform"]').click();
|
||||
}
|
||||
tool.delete("/home/files/delete", {ids:id}, callback);
|
||||
});
|
||||
})
|
||||
|
||||
$('#filesBox').on('click','.name-edit',function(){
|
||||
let id = $(this).parent().parent().data('id');
|
||||
let title = $(this).parent().parent().data('title');
|
||||
let ext = $(this).parent().parent().data('ext');
|
||||
layer.prompt({
|
||||
title: '重命名',
|
||||
value: title.replace(/\.[^.]+$/, ""),
|
||||
yes: function(index, layero) {
|
||||
// 获取文本框输入的值
|
||||
var value = layero.find(".layui-layer-input").val();
|
||||
if (value!='') {
|
||||
if(isValidFileName(value)==false){
|
||||
layer.msg('文件名不能包含下列任何字符:\/:*?".<>|');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
$('[lay-filter="webform"]').click();
|
||||
}
|
||||
tool.post("/home/files/edit", {id: id,title: value+'.'+ext}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写文件名称');
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function(data) {
|
||||
get_files(data.field);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,131 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.tree-left{width:200px; float:left; height:calc(100vh - 79px); overflow-y: auto; border:1px solid #eeeeee; border-right:0; background-color:#fbfbfb; padding:12px 12px 12px 5px;}
|
||||
.tree-left::-webkit-scrollbar {width: 0;}
|
||||
.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="tree-left">
|
||||
<h3>企业通讯录</h3>
|
||||
<div id="depament"></div>
|
||||
</div>
|
||||
<div class="body-table" style="margin-left:200px; overflow:hidden;">
|
||||
<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
|
||||
<div class="layui-input-inline" style="width:360px">
|
||||
<input type="text" name="keywords" placeholder="关键字,如:ID号/姓名/登录账号/手机号码/电子邮箱" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="thumb">
|
||||
<img src="{{d.thumb}}" width="30" height="30" />
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;
|
||||
$.ajax({
|
||||
url: "/api/index/get_department_tree",
|
||||
type:'get',
|
||||
success:function(res){
|
||||
//仅节点左侧图标控制收缩
|
||||
tree.render({
|
||||
elem: '#depament',
|
||||
data: res.trees,
|
||||
onlyIconControl: true, //是否仅允许节点左侧图标控制展开收缩
|
||||
click: function(obj){
|
||||
//layer.msg(JSON.stringify(obj.data));
|
||||
$('#depament').find('.layui-tree-main').removeClass('on');
|
||||
$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
|
||||
layui.pageTable.reload({
|
||||
where: {did: obj.data.id}
|
||||
,page:{curr:1}
|
||||
});
|
||||
$('[name="keywords"]').val('');
|
||||
layui.form.render('select');
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test',
|
||||
title: '通讯录',
|
||||
url: "/home/index/contacts_book", //数据接口
|
||||
height: 'full-114',
|
||||
cols: [
|
||||
[{
|
||||
field: 'thumb',
|
||||
title: '头像',
|
||||
toolbar: '#thumb',
|
||||
align: 'center',
|
||||
width: 60
|
||||
}, {
|
||||
field: 'name',
|
||||
title: '用户姓名',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'mobile',
|
||||
title: '手机号码',
|
||||
align: 'center',
|
||||
width: 120
|
||||
},{
|
||||
field: 'email',
|
||||
title: '电子邮箱'
|
||||
},{
|
||||
field: 'sex',
|
||||
title: '性别',
|
||||
align: 'center',
|
||||
width: 60,
|
||||
templet: function (d) {
|
||||
var html = '未知';
|
||||
if(d.sex == 1){
|
||||
html = '男'
|
||||
}
|
||||
else if(d.sex == 2){
|
||||
html = '女'
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'department',
|
||||
title: '所在部门',
|
||||
width: 120
|
||||
},{
|
||||
field: 'departments',
|
||||
title: '次要部门',
|
||||
width: 200
|
||||
}, {
|
||||
field: 'position',
|
||||
title: '岗位职称',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}, {
|
||||
field: 'entry_time',
|
||||
title: '入职日期',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}
|
||||
]
|
||||
]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,74 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
{notempty name="$admin.reg_pwd"}
|
||||
<div style="text-align:center; padding:20px 0; font-size:18px; color:#FF5722">初始化密码才能正常使用系统</div>
|
||||
{/notempty}
|
||||
<h3 class="pb-3">重置密码</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">旧密码<font>*</font></td>
|
||||
<td>
|
||||
<input type="password" lay-verify="required" name="old_pwd" placeholder="请输入旧密码" lay-reqText="请输入旧密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">用户名</td>
|
||||
<td>{$admin.username}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">新密码<font>*</font></td>
|
||||
<td>
|
||||
<input type="password" lay-verify="required" name="pwd" placeholder="请输入新密码" lay-reqText="请输入新密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">确认新密码<font>*</font></td>
|
||||
<td>
|
||||
<input type="password" lay-verify="required" name="pwd_confirm" placeholder="请再次输入新密码" lay-reqText="请再次输入新密码" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/home/index/edit_password",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
layer.msg('修改密码成功,使用新密码登录');
|
||||
//注销
|
||||
$.ajax({
|
||||
url: "/home/login/login_out.html",
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
parent.location.href = "/home/login/index.html"
|
||||
}, 2000)
|
||||
}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,108 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">修改个人信息</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">用户名</td>
|
||||
<td>{$admin.username}</td>
|
||||
<td class="layui-td-gray">姓名</td>
|
||||
<td>{$admin.name}</td>
|
||||
<td class="layui-td-gray" rowspan="4">头像</td>
|
||||
<td rowspan="4">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal" id="test1">上传头像</button>
|
||||
<div class="layui-upload-list" id="demo1">
|
||||
<img src="{$admin.thumb}" width="100" />
|
||||
<input type="hidden" name="thumb" value="{$admin.thumb}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">手机号码</td>
|
||||
<td>{$admin.mobile}</td>
|
||||
<td class="layui-td-gray">性别</td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男" {eq name="$admin.sex" value="1"} checked{/eq}>
|
||||
<input type="radio" name="sex" value="2" title="女" {eq name="$admin.sex" value="2"} checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">所在部门</td>
|
||||
<td>{$admin.department}</td>
|
||||
<td class="layui-td-gray">岗位职称</td>
|
||||
<td>{$admin.position}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">员工类型</td>
|
||||
<td>
|
||||
{eq name="$admin.type" value="3"}<span style="color:#5FB878">实 习 生</span>{/eq}
|
||||
{eq name="$admin.type" value="2"}<span style="color:#01AAED">试用员工</span>{/eq}
|
||||
{eq name="$admin.type" value="1"}<span style="color:#393D49">正式员工</span>{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray">入职日期</td>
|
||||
<td>
|
||||
{$admin.entry_time | date='Y-m-d'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">个人简介</td>
|
||||
<td colspan="5">
|
||||
<textarea name="desc" placeholder="请输入个人简介" class="layui-textarea">{$admin.desc|default=''}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,upload = layui.upload;
|
||||
//头像上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1',
|
||||
url: "/api/index/upload",
|
||||
done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.filepath);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
$.ajax({
|
||||
url: "/home/index/edit_personal",
|
||||
type: 'post',
|
||||
data: data.field,
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
layer.confirm('保存成功,关闭本页面吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
parent.layui.tool.tabClose();
|
||||
layer.close(index);
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,267 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<link rel="stylesheet" href="{__GOUGU__}/gougu/css/layout.css" media="all">
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="layui-layout-body">
|
||||
<div id="GouguApp">
|
||||
<div class="layui-layout gg-layout layout-menu-{$system.menu_mode|default='classical'}">
|
||||
<div class="layui-header">
|
||||
<!-- 头部区域 -->
|
||||
<div class="layui-layout-left">
|
||||
<span class="gg-head-item">
|
||||
<a href="javascript:;" gg-event="shrink" title="侧边伸缩"><i class="layui-icon layui-icon-shrink-right"></i></a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-cache">
|
||||
<a href="javascript:;" gg-event="cache" data-href="/api/index/cache_clear" title="清空缓存"><i class="layui-icon layui-icon-fonts-clear"></i></a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-home">
|
||||
<a href="https://www.gougucms.com/home/pages/detail/s/gouguoa.html" target="_blank" title="前台首页"><i class="layui-icon layui-icon-website"></i></a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-home">
|
||||
<a class="tab-a" data-href="/crud/crud/index" data-title="简单CRUD" title="简单CRUD"><i class="layui-icon layui-icon-template"></i></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-layout-right">
|
||||
<span class="gg-head-item gg-head-refresh">
|
||||
<a href="javascript:;" class="refreshThis" gg-event="refresh" title="刷新页面">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
</a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-screen" title="切换全屏">
|
||||
<a href="javascript:;" gg-event="screen" data-screen="full">
|
||||
<i class="fullScreen layui-icon layui-icon-screen-full"></i>
|
||||
</a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-set">
|
||||
<a href="javascript:;" id="theme" title="切换主题">
|
||||
<i class="layui-icon layui-icon-set"></i>
|
||||
</a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-set">
|
||||
<a href="/home/login/lock.html" title="锁屏">
|
||||
<i class="iconfont icon-suozhu" style="font-size:21px; font-weight:800"></i>
|
||||
</a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-message">
|
||||
<a href="javascript:;" data-href="/home/message/inbox" data-id="1000" data-title="消息中心" class="tab-a" title="消息中心">
|
||||
<i class="layui-icon layui-icon-notice"></i>
|
||||
<!-- 如果有新消息,则显示 -->
|
||||
<div class="gg-message-num" id="msgNum" style="display: none;"><span>0</span></div>
|
||||
</a>
|
||||
</span>
|
||||
<span class="gg-head-item gg-head-avatar">
|
||||
<ul class="layui-nav">
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">
|
||||
<img src="{$login_admin.thumb}" onerror="javascript:this.src='{__IMG__}/nonepic360x360.jpg';this.onerror=null;">
|
||||
<cite>{$login_admin.nickname}</cite>
|
||||
</a>
|
||||
<dl class="layui-nav-child" style="text-align: center; cursor: pointer;">
|
||||
<dd><a data-href="/home/index/edit_personal" data-id="1001" data-title="基本资料" class="tab-a">基本资料</a></dd>
|
||||
<dd><a data-href="/home/index/edit_password" data-id="1002" data-title="修改密码" class="tab-a">修改密码</a></dd>
|
||||
<hr>
|
||||
<dd gg-event="logout"><a>退出</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 侧边菜单 -->
|
||||
{empty name="$system.menu_mode"}
|
||||
{include file="/index/menu_classical" /}
|
||||
{else/}
|
||||
{if ($system.menu_mode == 'expand') }
|
||||
{include file="/index/menu_expand" /}
|
||||
{else/}
|
||||
{include file="/index/menu_classical" /}
|
||||
{/if}
|
||||
{/empty}
|
||||
<!-- 页面标签 -->
|
||||
<div id="pageTabs" class="page-tabs">
|
||||
<div class="layui-icon gg-tabs-control layui-icon-prev" gg-event="tabRollLeft"></div>
|
||||
<div class="layui-icon gg-tabs-control layui-icon-next" gg-event="tabRollRight"></div>
|
||||
<div class="layui-icon gg-tabs-control layui-icon-down">
|
||||
<ul class="layui-nav gg-tabs-select">
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;"></a>
|
||||
<dl class="layui-nav-child layui-anim-fadein">
|
||||
<dd gg-event="closeThisTabs"><a href="javascript:;">关闭当前</a></dd>
|
||||
<dd gg-event="closeOtherTabs"><a href="javascript:;">关闭其它</a></dd>
|
||||
<dd gg-event="closeAllTabs"><a href="javascript:;">关闭全部</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="layui-tab gg-admin-tab" lay-unauto lay-allowClose="true" lay-filter="gg-admin-tab">
|
||||
<ul class="layui-tab-title" id="pageTabUl">
|
||||
<li lay-id="0" lay-attr="view/home/index.html" class="layui-this"><i class="iconfont icon-xueshuguanli"></i></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 主体内容 -->
|
||||
<div class="layui-body" id="GouguAppBody">
|
||||
<div class="gg-tab-page layui-show" id="tabItem0" data-id="0">
|
||||
<iframe id="0" data-frameid="0" title="勾股OA" name="myiframe" src="{:url('/home/index/main')}" frameborder="0" data-timestamp="0" align="left" width="100%" height="100%" scrolling="yes"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 辅助元素,用于移动设备下遮罩 -->
|
||||
<div class="gg-body-shade" gg-event="shade"></div>
|
||||
<!-- 新消息通知 -->
|
||||
<div class="notification" style="display:none;">
|
||||
<audio id="msgSound"><source src="{__STATIC__}/home/file/msg.mp3" type="audio/mpeg"></audio>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /主体 -->
|
||||
{/block}
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const msg_sound = {$system.msg_sound|default=1};
|
||||
const watermark = {$system.watermark|default=1};
|
||||
const watermarkTxt = '{$admin.name|default="勾股OA"} {:substr($admin.mobile, -4)}';
|
||||
const moduleInit = ['tool','admin'];
|
||||
function gouguInit() {
|
||||
let admin = layui.admin;
|
||||
let tabs = admin.getCookie('gougutab');
|
||||
if(tabs && tabs!=''){
|
||||
let tab_parse = JSON.parse(tabs);
|
||||
let tab_id = tab_parse.tab_id,tab_array = tab_parse.tab_array;
|
||||
if(tab_array.length>0){
|
||||
for(let a=0; a<tab_array.length;a++){
|
||||
admin.tabTem(tab_array[a].id, tab_array[a].url,tab_array[a].title);
|
||||
}
|
||||
if(tab_id>0){
|
||||
admin.tabChange(tab_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
admin.loading();
|
||||
menuInit();
|
||||
if(watermark==1){
|
||||
createWatermark();
|
||||
}
|
||||
$('#GouguApp').on("click",'[gg-event="logout"]',function () {
|
||||
layer.confirm('确认注销登录吗?', { icon: 7, title: '警告' }, function (index) {
|
||||
//注销
|
||||
$.ajax({
|
||||
url: "/home/login/login_out",
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
location.href = "{:url('home/login/index')}"
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
layer.close(index);
|
||||
});
|
||||
});
|
||||
layui.dropdown.render({
|
||||
elem: '#theme',
|
||||
trigger: 'mousedown',
|
||||
align: 'center',
|
||||
data: [{
|
||||
title: '经典黑',
|
||||
theme: 'black'
|
||||
},{
|
||||
title: '简约白',
|
||||
theme: 'white'
|
||||
},{
|
||||
title: '海军蓝',
|
||||
theme: 'blue'
|
||||
}],
|
||||
click: function(data, othis){
|
||||
$.ajax({
|
||||
url: "/home/index/set_theme",
|
||||
data:{'theme':data.theme},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
parent.location.reload();
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
//轮循获取消息
|
||||
let msg_num = 0,msg_bool=false;
|
||||
const msgSound = document.getElementById("msgSound");
|
||||
$(document).ready(function(){
|
||||
$(document).one('click',function(){
|
||||
msg_bool = true;
|
||||
//console.log("页面被点击了");
|
||||
});
|
||||
});
|
||||
|
||||
$("#GouguAppBody").find('.gg-tab-page.layui-show iframe').on("load", function() {
|
||||
var iframeDocument = $(this).contents();
|
||||
iframeDocument.one('click',function(){
|
||||
msg_bool = true;
|
||||
//console.log("子页面被点击了");
|
||||
});
|
||||
});
|
||||
|
||||
var getStatus = setInterval(function () {
|
||||
$.ajax({
|
||||
url: "/api/index/get_msg",
|
||||
type:'post',
|
||||
success:function(e){
|
||||
if(e.code==0 && e.data!==''){
|
||||
if(e.data>0){
|
||||
$('#msgNum').show().find('span').html(e.data);
|
||||
if(e.data!=msg_num && msg_bool == true && msg_sound==1){
|
||||
msgSound.play();
|
||||
msg_num = e.data;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$('#msgNum').hide().find('span').html(0);
|
||||
}
|
||||
}else{
|
||||
layer.closeAll();
|
||||
}
|
||||
}
|
||||
})
|
||||
}, 10000);
|
||||
}
|
||||
|
||||
function createWatermark(){
|
||||
var canvas = document.createElement('canvas');
|
||||
canvas.width = 300;
|
||||
canvas.height = 200;
|
||||
var ctx = canvas.getContext('2d');
|
||||
ctx.font = '14px Arial';
|
||||
ctx.fillStyle = '#dddddd';
|
||||
ctx.textAlign = 'left';
|
||||
ctx.textBaseline = 'top';
|
||||
ctx.rotate(15 * Math.PI / 180);
|
||||
ctx.fillText(watermarkTxt, 20, 50);
|
||||
ctx.fillText(watermarkTxt, 180, 120);
|
||||
var dataURL = canvas.toDataURL('image/png');
|
||||
let node = document.createElement("div");
|
||||
node.style.pointerEvents = "none";
|
||||
node.style.position = "fixed";
|
||||
node.style.width = "100%";
|
||||
node.style.height = "100%";
|
||||
node.style.top = "0";
|
||||
node.style.left = "0";
|
||||
node.style.opacity = "0.36";
|
||||
node.style.zIndex = "998";
|
||||
node.style.background = 'url("' + dataURL + '") 0 0 repeat';
|
||||
// 将创建的元素插入body中,作为body的子元素
|
||||
document.body.appendChild(node);
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,37 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">员工动态<a data-title="员工动态" data-href="/home/index/log_list" class="pull-right tab-a" style="font-size:12px; margin-top:3px; float:right;">更多</a></div>
|
||||
<div class="layui-card-body">
|
||||
<ul class="layui-timeline" id="logs"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//动态
|
||||
function layoutAction() {
|
||||
$.ajax({
|
||||
url: "/home/index/log_list",
|
||||
type: 'get',
|
||||
data: {
|
||||
page: 1,
|
||||
limit: 20
|
||||
},
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
var html = '';
|
||||
$.each(e.data, function (key, value) {
|
||||
html += '<li class="layui-timeline-item">\
|
||||
<i class="layui-icon layui-timeline-axis"></i>\
|
||||
<div class="layui-timeline-content layui-text">\
|
||||
<div class="layui-timeline-title"><span title="'+ value.id + '">' + value.times + '</span>,' + value.content + '</div>\
|
||||
</div>\
|
||||
</li>';
|
||||
});
|
||||
$('#logs').html(html);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,35 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">办公审批<a href="javascript:;" data-href="/home/approve/index" class="side-a pull-right" style="font-size:12px; margin-top:3px; float:right;">去申请</a></div>
|
||||
<div class="layui-card-body layui-short-menu p-3">
|
||||
<ul class="layui-row layui-col-space12">
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="/home/approve/index" class="side-a">
|
||||
<i class="iconfont icon-kechengziyuanguanli"></i>
|
||||
<cite>审批申请</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="/home/approve/mylist" class="side-a">
|
||||
<i class="iconfont icon-jiaoshiguanli"></i>
|
||||
<cite>我申请的</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="/home/approve/checklist" class="side-a">
|
||||
<i class="iconfont icon-tuiguangguanli"></i>
|
||||
<cite>我处理的</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="/home/approve/copylist" class="side-a">
|
||||
<i class="iconfont icon-xueshengchengji"></i>
|
||||
<cite>抄送给我的</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,122 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div id="chartView" style="width: 100%;height:300px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var chartView;
|
||||
function layoutChartView() {
|
||||
chartView = echarts.init(document.getElementById('chartView'));
|
||||
$.ajax({
|
||||
url: "/home/api/get_last_data",
|
||||
type: 'get',
|
||||
data: {},
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
var data_first = e.data.data_first;
|
||||
var data_second = e.data.data_second;
|
||||
var myDate = new Date();
|
||||
var nowHour = myDate.getHours(); //获取当前小时数(0-23)
|
||||
var xData = [];
|
||||
var yData1 = [];
|
||||
var yData2 = [];
|
||||
$.each(data_first, function (key, value) {
|
||||
if (key <= nowHour) {
|
||||
yData1.push(value);
|
||||
}
|
||||
});
|
||||
$.each(data_second, function (key, value) {
|
||||
xData.push(setHour(key));
|
||||
yData2.push(value);
|
||||
});
|
||||
var ops = {
|
||||
title: {
|
||||
top: '12px',
|
||||
text: '今日与昨日员工活跃度',
|
||||
left: '6px',
|
||||
textStyle: {
|
||||
fontSize: '18',
|
||||
color: '#333',
|
||||
}
|
||||
},
|
||||
color: ["#1AAD19", "#1890FF"],
|
||||
grid: {
|
||||
left: '16px',
|
||||
right: '30px',
|
||||
bottom: '12px',
|
||||
top: '60px',
|
||||
containLabel: true
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'cross',
|
||||
crossStyle: {
|
||||
color: '#999'
|
||||
}
|
||||
}
|
||||
},
|
||||
toolbox: {
|
||||
show: true,
|
||||
},
|
||||
legend: {
|
||||
data: ["今日", "昨日"],
|
||||
top: '16px',
|
||||
},
|
||||
xAxis: [{
|
||||
type: "category",
|
||||
boundaryGap: !1,
|
||||
data: xData,
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
}
|
||||
},
|
||||
}],
|
||||
yAxis: [{
|
||||
type: "value",
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
}
|
||||
},
|
||||
}],
|
||||
series: [{
|
||||
name: "今日",
|
||||
type: "line",
|
||||
smooth: !0,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
areaStyle: {
|
||||
type: "default",
|
||||
opacity: 0.2
|
||||
}
|
||||
}
|
||||
},
|
||||
data: yData1
|
||||
}, {
|
||||
name: "昨日",
|
||||
type: "line",
|
||||
smooth: !0,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
areaStyle: {
|
||||
type: "default",
|
||||
opacity: 0.2
|
||||
}
|
||||
}
|
||||
},
|
||||
data: yData2
|
||||
}]
|
||||
}
|
||||
chartView.setOption(ops);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,86 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div id="chartYear" style="width: 100%;height:240px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var myChart;
|
||||
function layoutChartYear() {
|
||||
myChart = echarts.init(document.getElementById('chartYear'));
|
||||
$.ajax({
|
||||
url: "/home/api/get_view_data",
|
||||
type: 'get',
|
||||
data: {},
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
let archiveCalendar= e.data.data_three;
|
||||
is_log=1;
|
||||
//console.log(archiveCalendar);
|
||||
let option = {
|
||||
title: {
|
||||
top: '12px',
|
||||
text: '近一年员工活跃度',
|
||||
left: '8px',
|
||||
textStyle: {
|
||||
fontSize: '18',
|
||||
color: '#333',
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
padding: 6,
|
||||
formatter: function (obj) {
|
||||
var value = obj.value;
|
||||
return '<div style="font-size: 12px;">' + value[0] + '员工活跃度:' + value[1] + '</div>';
|
||||
}
|
||||
},
|
||||
visualMap: {
|
||||
min: 0,
|
||||
max: 300,
|
||||
show: false,
|
||||
inRange: {
|
||||
color: ['#fafafa', '#1AAD19']
|
||||
}
|
||||
},
|
||||
calendar: {
|
||||
top: 75,
|
||||
left: 52,
|
||||
right: 20,
|
||||
range: getRange(),
|
||||
cellSize: ['auto', 21],
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: '#aaa',
|
||||
type: 'dashed'
|
||||
}
|
||||
},
|
||||
itemStyle: {
|
||||
borderWidth: 0.5
|
||||
},
|
||||
yearLabel: { show: false },
|
||||
monthLabel: {
|
||||
nameMap: 'cn',
|
||||
fontSize: 12
|
||||
},
|
||||
dayLabel: {
|
||||
show: true,
|
||||
formatter: '{start} 1st',
|
||||
fontWeight: 'lighter',
|
||||
nameMap: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
|
||||
fontSize: 12
|
||||
}
|
||||
},
|
||||
series: [{
|
||||
type: 'heatmap',
|
||||
coordinateSystem: 'calendar',
|
||||
calendarIndex: 0,
|
||||
data: getDay(archiveCalendar)
|
||||
}]
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,19 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">待办事项</div>
|
||||
<div class="layui-card-body layui-matter-item p-3">
|
||||
<ul class="layui-row layui-col-space12">
|
||||
{volist name="$handle" id="vo"}
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="{$vo.url}" data-id="{$vo.id}" class="tab-a" data-title="{$vo.name}" style="background-color:#F8FAFF">
|
||||
<p>{$vo.name}</p>
|
||||
<p class="pt-3"><cite class="blue">{$vo.num}</cite></p>
|
||||
</a>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,16 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card panel-num">
|
||||
<table>
|
||||
<tr>
|
||||
{volist name="$total" id="vo"}
|
||||
<td>
|
||||
<div class="num-title">{$vo.name}</div>
|
||||
<div class="blue">{$vo.num}</div>
|
||||
</td>
|
||||
{/volist}
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,39 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">待办事项</div>
|
||||
<div class="layui-card-body layui-matter-item p-3">
|
||||
<ul class="layui-row layui-col-space12">
|
||||
{volist name="$handle" id="vo"}
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="{$vo.url}" data-id="{$vo.id}" class="tab-a" data-title="{$vo.name}" style="background-color:#F8FAFF">
|
||||
<p>{$vo.name}</p>
|
||||
<p class="pt-3"><cite class="blue">{$vo.num}</cite></p>
|
||||
</a>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">紧急事项</div>
|
||||
<div class="layui-card-body layui-matter-item p-3">
|
||||
<ul class="layui-row layui-col-space12">
|
||||
{volist name="$todue" id="vo"}
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" data-href="{$vo.url}" data-id="{$vo.id}" class="tab-a" data-title="{$vo.name}" style="background-color:#FFF9F8">
|
||||
<p>{$vo.name}</p>
|
||||
<p class="pt-3"><cite class="red">{$vo.num}</cite></p>
|
||||
</a>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,72 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card layui-right-bar" style="height:99px;">
|
||||
<ul class="p-3">
|
||||
<li class="layui-col-xs3" style="border-right:1px solid #eeeeee;">
|
||||
<a href="javascript:;" data-href="/home/index/contacts_book" data-id="2000" class="tab-a" data-title="通讯录">
|
||||
<i class="iconfont icon-huamingce"></i>
|
||||
<cite>通讯录</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs3" style="border-right:1px solid #eeeeee;">
|
||||
<a href="javascript:;" data-href="/oa/plan/calendar" data-id="100" class="tab-a" data-title="日程安排">
|
||||
<i class="iconfont icon-kaoshijihua"></i>
|
||||
<cite>日程安排</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs3" style="border-right:1px solid #eeeeee;">
|
||||
<a href="javascript:;" class="report-add">
|
||||
<i class="iconfont icon-rizhiguanli"></i>
|
||||
<cite>+工作汇报</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="layui-col-xs3">
|
||||
<a href="javascript:;" class="work-add">
|
||||
<i class="iconfont icon-renwujincheng"></i>
|
||||
<cite>+工作记录</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function layoutFastentry(tool,work,table){
|
||||
$('.work-add').on('click',function(){
|
||||
work.add(0,{'id':0});
|
||||
})
|
||||
$('.report-add').on('click',function(){
|
||||
var type=[{'id':1,'title':'日报'},{'id':2,'title':'周报'},{'id':3,'title':'月报'}];
|
||||
var tablereport;
|
||||
layer.open({
|
||||
title:'选择汇报类型',
|
||||
type:1,
|
||||
area:['360px','300px'],
|
||||
content:'<div style="width:325px; padding:15px 15px 0"><div id="selectType"></div></div>',
|
||||
success:function(){
|
||||
tablereport=table.render({
|
||||
elem: '#selectType',
|
||||
cols: [[ //标题栏
|
||||
{type:'radio',title: '选择'},
|
||||
{field: 'title', title: '汇报类型'}
|
||||
]],
|
||||
data: type
|
||||
});
|
||||
},
|
||||
btn:['确定'],
|
||||
yes: function(idx){
|
||||
var checkStatus = table.checkStatus(tablereport.config.id);
|
||||
var data = checkStatus.data;
|
||||
if(data.length>0){
|
||||
tool.side('/oa/work/add?types='+data[0].id);
|
||||
layer.close(idx);
|
||||
}
|
||||
else{
|
||||
layer.msg('请选择汇报类型');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,37 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">办公工具</div>
|
||||
<div class="layui-card-body">
|
||||
<div id="website" class="website"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//办公工具
|
||||
function layoutLinks() {
|
||||
$.ajax({
|
||||
url: "/home/index/get_links",
|
||||
type: 'post',
|
||||
data: {
|
||||
page:1,
|
||||
limit: 100
|
||||
},
|
||||
success: function(e) {
|
||||
if (e.code == 0) {
|
||||
var html = '';
|
||||
$.each(e.data, function(key, value) {
|
||||
if(value.target==1){
|
||||
html += '<a class="layui-btn layui-btn-primary layui-btn-sm layui-border" href="'+value.url+'" target="_blank">'+value.title+'</a>';
|
||||
}
|
||||
else{
|
||||
html += '<a class="layui-btn layui-btn-primary layui-btn-sm layui-border tab-a" data-href="'+value.url+'" data-id="99999'+value.id+'" data-title="'+value.title+'" href="javascript:;">'+value.title+'</a>';
|
||||
}
|
||||
});
|
||||
$('#website').html(html);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,25 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">公告列表</div>
|
||||
<div style="padding: 12px;">
|
||||
<table id="Note" lay-filter="Note" class="layui-hide" style="margin-top:0"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//公告
|
||||
function layoutNote(table){
|
||||
table.render({
|
||||
elem: '#Note'
|
||||
, url: "/home/api/get_note_list" //数据接口
|
||||
, page: false //开启分页
|
||||
, cols: [[ //表头
|
||||
{ field: 'cate_title', title: '公告分类', align: 'center','width': 90},
|
||||
{ field: 'title', title: '公告标题',templet: '<div><a data-href="/oa/note/view/id/{{d.id}}.html" class="side-a">{{d.title}}</a></div>'},
|
||||
{ field: 'create_time', title: '发布时间', align: 'center','width': 150}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,33 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">项目列表</div>
|
||||
<div style="padding: 12px;">
|
||||
<table id="Project" lay-filter="Project" class="layui-hide" style="margin-top:0"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//项目
|
||||
function layoutProject(table){
|
||||
table.render({
|
||||
elem: '#Project'
|
||||
, url: "/project/api/get_project?limit=10" //数据接口
|
||||
, page: false //开启分页
|
||||
, cols: [[ //表头
|
||||
{field: 'id', title: '项目编号', align: 'center','width': 90, templet: function (d) {
|
||||
return 'P' + d.id;
|
||||
}}
|
||||
,{ field: 'status', title: '项目状态', align: 'center', width: 90, templet: function (d) {
|
||||
var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
,{field: 'name', title: '项目名称',minWidth:240,templet: '<div><a data-href="/project/index/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'}
|
||||
,{field:'director_name',title: '负责人',width:80,align:'center'}
|
||||
,{ field:'range_time', title: '项目计划周期', align: 'center', width: 180}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,62 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">最活跃员工<span style="color:#999; font-size:14px; font-weight:400; margin-left:5px">最近30天前十的活跃度</span></div>
|
||||
<div class="layui-card-body">
|
||||
<div id="logChart" style="width: 100%; height:268px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//动态
|
||||
var logChart;
|
||||
function layoutRaking() {
|
||||
logChart = echarts.init(document.getElementById('logChart'));
|
||||
$.ajax({
|
||||
url: "/home/api/get_view_log",
|
||||
type: 'get',
|
||||
data: {},
|
||||
success: function (e) {
|
||||
if (e.code == 0) {
|
||||
var data_logs = e.data.data_logs;
|
||||
var logItem = [];
|
||||
$.each(data_logs, function (key, value) {
|
||||
let item = {
|
||||
value: value.count,
|
||||
name: value.name
|
||||
};
|
||||
logItem.push(item);
|
||||
});
|
||||
let optC = {
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: '{a} <br/>{b} :{d}%'
|
||||
},
|
||||
legend: {
|
||||
top: '1%',
|
||||
left: 'center'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '活跃度',
|
||||
type: 'pie',
|
||||
radius: '50%',
|
||||
center: ['50%', '60%'],
|
||||
data: logItem,
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
logChart.setOption(optC);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,68 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-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:#f8f8f8">提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。</td>
|
||||
</tr>
|
||||
{/if}
|
||||
<tr>
|
||||
<td class="info-td">服务器系统</td>
|
||||
<td>{:get_system_info('os')}</td>
|
||||
<td class="info-td">PHP版本</td>
|
||||
<td>{:get_system_info('php')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info-td">上传附件限制</td>
|
||||
<td>{:get_system_config('system','upload_max_filesize')}M / {:get_system_info('upload_max_filesize')}</td>
|
||||
<td class="info-td">执行时间限制</td>
|
||||
<td>{:get_system_info('max_execution_time')}</td>
|
||||
</tr>
|
||||
{eq name=":get_system_config('system','qrcode')" value="2"}
|
||||
<tr>
|
||||
<td class="info-td">勾股OA</td>
|
||||
<td colspan="3">{:CMS_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:8px"
|
||||
href="https://blog.gougucms.com/home/book/detail/bid/3.html" target="_blank">勾股OA文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info-td">ThinkPHP版本</td>
|
||||
<td colspan="3">{$TP_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:8px" href="https://doc.thinkphp.cn/v8_0/preface.html" target="_blank">TP8文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info-td">Layui版本</td>
|
||||
<td colspan="3">{:LAYUI_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:8px" href="https://layui.dev/docs/2/" target="_blank">Layui文档</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info-td">合作联系</td>
|
||||
<td colspan="3"><i class="iconfont icon-weixin green"></i>微信号:hdm588,业务合作、功能定制请备注</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info-td">QQ交流群</td>
|
||||
<td colspan="3">搜Q群:24641076(满),46924914(满),295256660<br>或点击 <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=vb-Jdu0e-7iAAxbqGczDg1xFjxbdBsip&authKey=lwlNHAZiUOK2Rua5B14KhfwoYcvpQtHnlWMAJAbQRhfg3YQOUVIFEmfxpbhcCQw%2F&noverify=0&group_code=295256660" target="_blank" rel="nofollow"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="gougucms交流群" title="点击链接加入群聊【勾股开源交流群】" style="vertical-align:middle"></a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info-td">同系列开源软件</td>
|
||||
<td colspan="3"><a class="layui-badge layui-bg-blue" style="margin-right:8px" href="https://gitee.com/gouguopen/gougucms" target="_blank">勾股CMS</a><a class="layui-badge layui-bg-blue" style="margin-right:8px" href="https://gitee.com/gouguopen/blog" target="_blank">勾股BLOG</a><a class="layui-badge layui-bg-blue" href="https://gitee.com/gouguopen/dev" target="_blank" style="margin-right:8px">勾股DEV</a><a class="layui-badge layui-bg-blue" href="https://gitee.com/gouguopen/guoguadmin" target="_blank">勾股ADMIN</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="color:#E94335; font-size:14px"><strong>腾讯云服务器,通过我们的代理购买低至 1 折,点击图片了解详情</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<a href="https://curl.qcloud.com/h3ibq5lX" target="_blank"><img src="https://blog.gougucms.com/storage/image/480x300.jpg" style="width:100%; max-width:100%; border-radius:6px; cursor:pointer;" align=center /></a>
|
||||
</td>
|
||||
</tr>
|
||||
{/eq}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function layoutSystem(){
|
||||
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,42 @@
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-title">任务列表</div>
|
||||
<div style="padding: 12px;">
|
||||
<table id="Task" lay-filter="Task" class="layui-hide" style="margin-top:0"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//任务
|
||||
function layoutTask(table){
|
||||
table.render({
|
||||
elem: '#Task'
|
||||
, url: "/project/api/get_task?limit=10" //数据接口
|
||||
, page: false //开启分页
|
||||
, cols: [[ //表头
|
||||
{field: 'id', title: '任务编号', width: 80, align: 'center', fixed: 'left', templet: function (d) {
|
||||
return 'T' + d.id;
|
||||
}}
|
||||
,{ field: 'status', title: '任务状态', align: 'center', width: 90, templet: function (d) {
|
||||
var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
,{field:'title',title: '任务主题', minWidth: 300,templet:function(d){
|
||||
var html = '<span class="layui-badge layui-bg-'+d.priority+'">'+d.priority_name+'</span> <a data-href="/project/task/view/id/'+d.id+'.html" class="side-a">'+d.title+'</a>';
|
||||
return html;
|
||||
}}
|
||||
,{field:'director_name',title: '负责人', align:'center',width: 80}
|
||||
,{field:'end_time',title: '预计结束日期', width: 150,templet:function(d){
|
||||
var html = d.end_time;
|
||||
if(d.delay>0){
|
||||
html+= '<span class="red ml-1" style="font-size:12px;">逾期'+d.delay+'天</span>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,88 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style type="text/css">
|
||||
.layui-card-body .layui-timeline-title {
|
||||
padding-bottom: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.layui-card-body .layui-timeline-item {
|
||||
padding-bottom: 5px;
|
||||
color:#323232;
|
||||
}
|
||||
|
||||
.layui-timeline-title span {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.panel-more {
|
||||
width: 100%;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.panel-more a {
|
||||
color: #0088FF
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><h3>员工动态</h3></div>
|
||||
<div class="layui-card-body">
|
||||
<ul class="layui-timeline" id="logs"></ul>
|
||||
<div class="panel-more"><a href="javascript:;">查看更多员工动态</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var page=1,limit=20;
|
||||
function getLogs() {
|
||||
$.ajax({
|
||||
url: "/home/index/log_list",
|
||||
type: 'post',
|
||||
data: {
|
||||
page:page,
|
||||
limit: limit
|
||||
},
|
||||
success: function(e) {
|
||||
if (e.code == 0) {
|
||||
var html = '';
|
||||
if(e.data.length>0){
|
||||
page++;
|
||||
$.each(e.data, function(key, value) {
|
||||
html += '<li class="layui-timeline-item">\
|
||||
<i class="layui-icon layui-timeline-axis"></i>\
|
||||
<div class="layui-timeline-content layui-text">\
|
||||
<div class="layui-timeline-title"><span title="'+value.id+'">'+value.times+'</span>,'+value.content+'</div>\
|
||||
</div>\
|
||||
</li>';
|
||||
});
|
||||
$('#logs').append(html);
|
||||
}else{
|
||||
$('.panel-more').remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
function gouguInit() {
|
||||
getLogs();
|
||||
$('.panel-more').on('click',function(){
|
||||
getLogs();
|
||||
})
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,226 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
|
||||
{block name="style"}
|
||||
<style type="text/css">
|
||||
.panel-num table {width: 100%;}
|
||||
.panel-num td {text-align: center; padding: 18px 0; border-left: 1px solid #f1f1f1; position: relative;}
|
||||
.panel-num td:nth-child(1) { border-left: none}
|
||||
.panel-num .num-title {padding-bottom: 9px; color: #999;}
|
||||
.panel-num .blue {font-size: 20px; font-weight: 300;}
|
||||
.panel-num td .badge {position: absolute;top: 0; right: 0;}
|
||||
.panel-num td .badge span { padding: 2px 4px; font-size: 12px; border-radius: 0 0 0 4px;}
|
||||
.dashboard-total td {border-top: 1px solid #f1f1f1}
|
||||
.dashboard-logs .layui-timeline-item {padding-bottom: 1px;}
|
||||
.info-td { width: 90px; text-align: right;background-color: #fafafa; color: #999; padding: 5px 3px;}
|
||||
.info-td {width: 90px; text-align: right;background-color: #fafafa; color: #999; padding: 5px 3px;}
|
||||
.layui-card-body .layui-timeline-title {padding-bottom: 0;font-size: 14px; margin-bottom:4px; color:#323232}
|
||||
.layui-card-body .layui-timeline-item {padding-bottom: 5px;}
|
||||
.layui-short-menu li { text-align: center;}
|
||||
.layui-short-menu li .iconfont {display: inline-block; font-weight:600; width: 100%; height: 58px; line-height: 58px; margin-bottom:5px; text-align: center;border-radius: 3px; font-size: 28px; background-color: #F8F8F8; color: #969696; transition: all .3s; -webkit-transition: all .3s;}
|
||||
.layui-short-menu li cite {color: #646464;}
|
||||
.layui-short-menu li:hover .iconfont{color: #1A75FF; background-color:#F2F8FF;}
|
||||
.layui-short-menu li:hover cite {color: #1A75FF;}
|
||||
.layui-matter-item li a{display: block; padding: 12px; background-color: #f8f8f8; color: #999; border-radius: 3px; transition: all .3s;-webkit-transition: all .3s;}
|
||||
.layui-matter-item li a:hover{background-color:#F2F8FF;}
|
||||
.layui-matter-item li cite {font-size: 24px;font-weight: 300;}
|
||||
|
||||
.layui-right-bar a{display: inline-block; width: 100%; height: 75px; text-align: center;border-radius: 3px; background-color: #F8F8F8; color: #969696; transition: all .3s; -webkit-transition: all .3s;}
|
||||
.layui-right-bar a .iconfont{display: inline-block; font-weight:600; width: 100%; height: 44px; line-height: 48px; text-align: center;font-size: 28px;}
|
||||
.layui-right-bar a:hover{color: #1A75FF; background-color:#F2F8FF;}
|
||||
.layui-card-title{padding:12px 12px 0}
|
||||
.website{padding-bottom:3px;}
|
||||
.website .layui-btn,.website .layui-btn+.layui-btn{margin:6px; font-size:13px;}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<div class="layui-row layui-col-space16">
|
||||
<div class="layui-col-md8">
|
||||
{volist name="$layout_selected" id="layout"}
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'count') }
|
||||
{include file="/index/layout_count" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'event') }
|
||||
{include file="/index/layout_event" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'note') }
|
||||
{include file="/index/layout_note" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'project') }
|
||||
{include file="/index/layout_project" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'task') }
|
||||
{include file="/index/layout_task" /}
|
||||
{/if}
|
||||
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'chartview') }
|
||||
{include file="/index/layout_chartview" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 1) AND ( $layout.name == 'chartyear') }
|
||||
{include file="/index/layout_chartyear" /}
|
||||
{/if}
|
||||
|
||||
{/volist}
|
||||
</div>
|
||||
<div class="layui-col-md4">
|
||||
{volist name="$layout_selected" id="layout"}
|
||||
|
||||
{if ( $layout.row == 2) AND ( $layout.name == 'fastentry') }
|
||||
{include file="/index/layout_fastentry" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 2) AND ( $layout.name == 'approve') }
|
||||
{include file="/index/layout_approve" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 2) AND ( $layout.name == 'links') }
|
||||
{include file="/index/layout_links" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 2) AND ( $layout.name == 'system') }
|
||||
{include file="/index/layout_system" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 2) AND ( $layout.name == 'ranking') }
|
||||
{include file="/index/layout_ranking" /}
|
||||
{/if}
|
||||
|
||||
{if ( $layout.row == 2) AND ( $layout.name == 'action') }
|
||||
{include file="/index/layout_action" /}
|
||||
{/if}
|
||||
|
||||
{/volist}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script src="{__GOUGU__}/third_party/echart/echarts.min.js"></script>
|
||||
<script>
|
||||
function getRange() {
|
||||
let today = new Date();
|
||||
let tYear = today.getFullYear();
|
||||
let tMonth = today.getMonth() + 1;
|
||||
let tDate = today.getDate();
|
||||
let dateFirst = tYear + "-" + tMonth + "-" + tDate;
|
||||
let datelast = (tYear - 1) + "-" + tMonth + "-" + tDate;
|
||||
let dataRange = [];
|
||||
dataRange.push(dateFirst);
|
||||
dataRange.push(datelast);
|
||||
return dataRange;
|
||||
}
|
||||
|
||||
function getDay(archiveCalendar) {
|
||||
var today = new Date();
|
||||
var dayArray = [];
|
||||
for (var i = 0; i < 366; i++) {
|
||||
var targetday_milliseconds = today.getTime() - 1000 * 60 * 60 * 24 * i;
|
||||
var date = new Date(targetday_milliseconds);
|
||||
dayArray.push(retunDay(date,archiveCalendar));
|
||||
}
|
||||
return dayArray;
|
||||
}
|
||||
|
||||
function retunDay(day,archiveCalendar) {
|
||||
var tYear = day.getFullYear();
|
||||
var tMonth = day.getMonth();
|
||||
var tDate = day.getDate();
|
||||
tMonth = tMonth + 1;
|
||||
if (tMonth.toString().length == 1) {
|
||||
tMonth = "0" + tMonth;
|
||||
}
|
||||
if (tDate.toString().length == 1) {
|
||||
tDate = "0" + tDate;
|
||||
}
|
||||
var dateStr = tYear + "-" + tMonth + "-" + tDate;
|
||||
var dateArray = [];
|
||||
dateArray.push(dateStr);
|
||||
if (archiveCalendar[dateStr]) {
|
||||
dateArray.push(archiveCalendar[dateStr]);
|
||||
}
|
||||
else {
|
||||
dateArray.push(0);
|
||||
}
|
||||
return dateArray;
|
||||
}
|
||||
|
||||
function setHour(num) {
|
||||
var str = num + ':00';
|
||||
if (num < 10) {
|
||||
str = '0' + num + ':00';
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
const moduleInit = ['tool','oaSchedule'];
|
||||
function gouguInit() {
|
||||
var tool = layui.tool,table = layui.table,work = layui.oaSchedule;
|
||||
|
||||
if(typeof layoutNote ==='function'){
|
||||
layoutNote(table);
|
||||
}
|
||||
|
||||
if(typeof layoutProject ==='function'){
|
||||
layoutProject(table);
|
||||
}
|
||||
|
||||
if(typeof layoutTask ==='function'){
|
||||
layoutTask(table);
|
||||
}
|
||||
|
||||
if(typeof layoutChartView ==='function'){
|
||||
layoutChartView();
|
||||
}
|
||||
|
||||
if(typeof layoutChartYear ==='function'){
|
||||
layoutChartYear();
|
||||
}
|
||||
|
||||
if(typeof layoutFastentry ==='function'){
|
||||
layoutFastentry(tool,work,table)
|
||||
}
|
||||
|
||||
if(typeof layoutLinks ==='function'){
|
||||
layoutLinks()
|
||||
}
|
||||
|
||||
if(typeof layoutSystem ==='function'){
|
||||
layoutSystem()
|
||||
}
|
||||
|
||||
if(typeof layoutRaking ==='function'){
|
||||
layoutRaking()
|
||||
}
|
||||
|
||||
if(typeof layoutAction ==='function'){
|
||||
layoutAction()
|
||||
}
|
||||
}
|
||||
|
||||
setTimeout(function () {
|
||||
window.onresize = function () {
|
||||
if(logChart){
|
||||
chartView.resize();
|
||||
}
|
||||
if(myChart){
|
||||
myChart.resize();
|
||||
}
|
||||
if(logChart){
|
||||
logChart.resize();
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,47 @@
|
||||
<div class="layui-side layui-side-menu layui-side-{$admin.theme}">
|
||||
<div class="layui-logo" gg-event="closeAllTabs">
|
||||
<img src="{$web.logo|default=''}" onerror="javascript:this.src='{__IMG__}/syslogo.png';this.onerror=null;" style="height: 40px;" class="syslogo">
|
||||
<img src="{$web.small_logo|default=''}" onerror="javascript:this.src='{__IMG__}/syslogo_small.png';this.onerror=null;" style="height: 40px;" class="logo">
|
||||
</div>
|
||||
|
||||
<ul id="menuList" class="layui-nav layui-nav-tree layui-inline" lay-shrink="all">
|
||||
<li class="layui-nav-item menu-li">
|
||||
<a href="javascript:;" class="side-menu-item layui-this" data-href="/home/index/main.html" data-id="0" style="padding-top:0; padding-bottom:0;"><i class="iconfont icon-xueshuguanli"></i> 工 作 台</a>
|
||||
</li>
|
||||
{foreach name="menu" item="a"}
|
||||
<li class="layui-nav-item menu-li">
|
||||
<a href="javascript:;" lay-tips="{$a.title}" lay-direction="2" data-id="{$a.id}" data-title="{$a.title}" data-href="/{$a.src}"><i class="iconfont {$a.icon}"></i> {$a.title}</a>
|
||||
{notempty name="$a.list"}
|
||||
<dl class="layui-nav-child">
|
||||
{foreach name="$a.list" item="b"}
|
||||
<dd>
|
||||
<a href="javascript:;" class="side-menu-item" data-id="{$b.id}" data-title="{$b.title}" data-href="/{$b.src}">{$b.title}</a>
|
||||
{notempty name="$b.list"}
|
||||
<dl class="layui-nav-child">
|
||||
{foreach name="$b.list" item="c"}
|
||||
<dd>
|
||||
<a href="javascript:;" class="side-menu-item" data-id="{$c.id}" data-title="{$c.title}" data-href="/{$c.src}">{$c.title}</a>
|
||||
{notempty name="$c.list"}
|
||||
<dl class="layui-nav-child">
|
||||
{foreach name="$c.list" item="d"}
|
||||
<dd><a href="javascript:;" class="side-menu-item" data-id="{$d.id}" data-title="{$d.title}" data-href="/{$d.src}">{$d.title}</a></dd>
|
||||
{/foreach}
|
||||
</dl>
|
||||
{/notempty}
|
||||
</dd>
|
||||
{/foreach}
|
||||
</dl>
|
||||
{/notempty}
|
||||
</dd>
|
||||
{/foreach}
|
||||
</dl>
|
||||
{/notempty}
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
<script>
|
||||
function menuInit() {
|
||||
|
||||
}
|
||||
</script>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user