作者 郭文星

首页信息展示

正在显示 59 个修改的文件 包含 4391 行增加294 行删除

要显示太多修改。

为保证性能只显示 59 of 59+ 个文件。

  1 +<?php
  2 +
  3 +namespace app\admin\controller;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Config;
  7 +use think\console\Input;
  8 +use think\Db;
  9 +use think\Exception;
  10 +
  11 +/**
  12 + * 在线命令管理
  13 + *
  14 + * @icon fa fa-circle-o
  15 + */
  16 +class Command extends Backend
  17 +{
  18 +
  19 + /**
  20 + * Command模型对象
  21 + */
  22 + protected $model = null;
  23 + protected $noNeedRight = ['get_controller_list', 'get_field_list'];
  24 +
  25 + public function _initialize()
  26 + {
  27 + parent::_initialize();
  28 + $this->model = new \app\admin\model\Command;
  29 + $this->view->assign("statusList", $this->model->getStatusList());
  30 + }
  31 +
  32 + /**
  33 + * 添加
  34 + */
  35 + public function add()
  36 + {
  37 +
  38 + $tableList = [];
  39 + $list = \think\Db::query("SHOW TABLES");
  40 + foreach ($list as $key => $row) {
  41 + $tableList[reset($row)] = reset($row);
  42 + }
  43 +
  44 + $this->view->assign("tableList", $tableList);
  45 + return $this->view->fetch();
  46 + }
  47 +
  48 + /**
  49 + * 获取字段列表
  50 + * @internal
  51 + */
  52 + public function get_field_list()
  53 + {
  54 + $dbname = Config::get('database.database');
  55 + $prefix = Config::get('database.prefix');
  56 + $table = $this->request->request('table');
  57 + //从数据库中获取表字段信息
  58 + $sql = "SELECT * FROM `information_schema`.`columns` "
  59 + . "WHERE TABLE_SCHEMA = ? AND table_name = ? "
  60 + . "ORDER BY ORDINAL_POSITION";
  61 + //加载主表的列
  62 + $columnList = Db::query($sql, [$dbname, $table]);
  63 + $fieldlist = [];
  64 + foreach ($columnList as $index => $item) {
  65 + $fieldlist[] = $item['COLUMN_NAME'];
  66 + }
  67 + $this->success("", null, ['fieldlist' => $fieldlist]);
  68 + }
  69 +
  70 + /**
  71 + * 获取控制器列表
  72 + * @internal
  73 + */
  74 + public function get_controller_list()
  75 + {
  76 + //搜索关键词,客户端输入以空格分开,这里接收为数组
  77 + $word = (array)$this->request->request("q_word/a");
  78 + $word = implode('', $word);
  79 +
  80 + $adminPath = dirname(__DIR__) . DS;
  81 + $controllerDir = $adminPath . 'controller' . DS;
  82 + $files = new \RecursiveIteratorIterator(
  83 + new \RecursiveDirectoryIterator($controllerDir), \RecursiveIteratorIterator::LEAVES_ONLY
  84 + );
  85 + $list = [];
  86 + foreach ($files as $name => $file) {
  87 + if (!$file->isDir()) {
  88 + $filePath = $file->getRealPath();
  89 + $name = str_replace($controllerDir, '', $filePath);
  90 + $name = str_replace(DS, "/", $name);
  91 + if (!preg_match("/(.*)\.php\$/", $name)) {
  92 + continue;
  93 + }
  94 + if (!$word || stripos($name, $word) !== false) {
  95 + $list[] = ['id' => $name, 'name' => $name];
  96 + }
  97 + }
  98 + }
  99 + $pageNumber = $this->request->request("pageNumber");
  100 + $pageSize = $this->request->request("pageSize");
  101 + return json(['list' => array_slice($list, ($pageNumber - 1) * $pageSize, $pageSize), 'total' => count($list)]);
  102 + }
  103 +
  104 + /**
  105 + * 详情
  106 + */
  107 + public function detail($ids)
  108 + {
  109 + $row = $this->model->get($ids);
  110 + if (!$row) {
  111 + $this->error(__('No Results were found'));
  112 + }
  113 + $this->view->assign("row", $row);
  114 + return $this->view->fetch();
  115 + }
  116 +
  117 + /**
  118 + * 执行
  119 + */
  120 + public function execute($ids)
  121 + {
  122 + $row = $this->model->get($ids);
  123 + if (!$row) {
  124 + $this->error(__('No Results were found'));
  125 + }
  126 + $result = $this->doexecute($row['type'], json_decode($row['params'], true));
  127 + $this->success("", null, ['result' => $result]);
  128 + }
  129 +
  130 + /**
  131 + * 生成命令
  132 + */
  133 + public function command($action = '')
  134 + {
  135 + $commandtype = $this->request->request("commandtype");
  136 + $params = $this->request->request();
  137 + $allowfields = [
  138 + 'crud' => 'table,controller,model,fields,force,local,delete,menu',
  139 + 'menu' => 'controller,delete,force',
  140 + 'min' => 'module,resource,optimize',
  141 + 'api' => 'url,module,output,template,force,title,author,class,language,addon',
  142 + ];
  143 + $argv = [];
  144 + $allowfields = isset($allowfields[$commandtype]) ? explode(',', $allowfields[$commandtype]) : [];
  145 + $allowfields = array_filter(array_intersect_key($params, array_flip($allowfields)));
  146 + if (isset($params['local']) && !$params['local']) {
  147 + $allowfields['local'] = $params['local'];
  148 + } else {
  149 + unset($allowfields['local']);
  150 + }
  151 + foreach ($allowfields as $key => $param) {
  152 + $argv[] = "--{$key}=" . (is_array($param) ? implode(',', $param) : $param);
  153 + }
  154 + if ($commandtype == 'crud') {
  155 + $extend = 'setcheckboxsuffix,enumradiosuffix,imagefield,filefield,intdatesuffix,switchsuffix,citysuffix,selectpagesuffix,selectpagessuffix,ignorefields,sortfield,editorsuffix,headingfilterfield,tagsuffix,jsonsuffix,fixedcolumns';
  156 + $extendArr = explode(',', $extend);
  157 + foreach ($params as $index => $item) {
  158 + if (in_array($index, $extendArr)) {
  159 + foreach (explode(',', $item) as $key => $value) {
  160 + if ($value) {
  161 + $argv[] = "--{$index}={$value}";
  162 + }
  163 + }
  164 + }
  165 + }
  166 + $isrelation = (int)$this->request->request('isrelation');
  167 + if ($isrelation && isset($params['relation'])) {
  168 + foreach ($params['relation'] as $index => $relation) {
  169 + foreach ($relation as $key => $value) {
  170 + $argv[] = "--{$key}=" . (is_array($value) ? implode(',', $value) : $value);
  171 + }
  172 + }
  173 + }
  174 + } else {
  175 + if ($commandtype == 'menu') {
  176 + if (isset($params['allcontroller']) && $params['allcontroller']) {
  177 + $argv[] = "--controller=all-controller";
  178 + } else {
  179 + foreach (explode(',', $params['controllerfile']) as $index => $param) {
  180 + if ($param) {
  181 + $argv[] = "--controller=" . substr($param, 0, -4);
  182 + }
  183 + }
  184 + }
  185 + } else {
  186 + if ($commandtype == 'min') {
  187 +
  188 + } else {
  189 + if ($commandtype == 'api') {
  190 +
  191 + } else {
  192 +
  193 + }
  194 + }
  195 + }
  196 + }
  197 + if ($action == 'execute') {
  198 + if (stripos(implode(' ', $argv), '--controller=all-controller') !== false) {
  199 + $this->error("只允许在命令行执行该命令,执行前请做好菜单规则备份!!!");
  200 + }
  201 + if (config('app_debug')) {
  202 + $result = $this->doexecute($commandtype, $argv);
  203 + $this->success("", null, ['result' => $result]);
  204 + } else {
  205 + $this->error("只允许在开发环境下执行命令");
  206 + }
  207 + } else {
  208 + $this->success("", null, ['command' => "php think {$commandtype} " . implode(' ', $argv)]);
  209 + }
  210 +
  211 + return;
  212 + }
  213 +
  214 + protected function doexecute($commandtype, $argv)
  215 + {
  216 + if (!config('app_debug')) {
  217 + $this->error("只允许在开发环境下执行命令");
  218 + }
  219 + if (preg_match("/([;\|&]+)/", implode(' ', $argv))) {
  220 + $this->error("不支持的命令参数");
  221 + }
  222 + $commandName = "\\app\\admin\\command\\" . ucfirst($commandtype);
  223 + $input = new Input($argv);
  224 + $output = new \addons\command\library\Output();
  225 + $command = new $commandName($commandtype);
  226 + $data = [
  227 + 'type' => $commandtype,
  228 + 'params' => json_encode($argv),
  229 + 'command' => "php think {$commandtype} " . implode(' ', $argv),
  230 + 'executetime' => time(),
  231 + ];
  232 + $this->model->save($data);
  233 + try {
  234 + $command->run($input, $output);
  235 + $result = implode("\n", $output->getMessage());
  236 + $this->model->status = 'successed';
  237 + } catch (Exception $e) {
  238 + $result = implode("\n", $output->getMessage()) . "\n";
  239 + $result .= $e->getMessage();
  240 + $this->model->status = 'failured';
  241 + }
  242 + $result = trim($result);
  243 + $this->model->content = $result;
  244 + $this->model->save();
  245 + return $result;
  246 + }
  247 +
  248 +}
@@ -23,62 +23,76 @@ class Dashboard extends Backend @@ -23,62 +23,76 @@ class Dashboard extends Backend
23 */ 23 */
24 public function index() 24 public function index()
25 { 25 {
26 - try {  
27 - \think\Db::execute("SET @@sql_mode='';");  
28 - } catch (\Exception $e) { 26 + //项目总览
  27 + $project_overview_chart=Db::name("project")
  28 + ->field("project_name as name,all_working_hours as value")
  29 + ->select();
  30 + //查询所有项目的工作时长
  31 + $project_overview=Db::name("project")
  32 + ->alias("a")
  33 + ->join("user b","a.user_id=b.id")
  34 + ->field("a.*,b.username")
  35 + ->order("all_working_hours desc")
  36 + ->limit(4)
  37 + ->select();
  38 + $project=Db::name("project")
  39 + ->alias("a")
  40 + ->join("user b","a.user_id=b.id")
  41 + ->field("a.*,b.username")
  42 + ->order("all_working_hours desc")
  43 + ->limit(4)
  44 + ->select();
29 45
30 - }  
31 - $column = [];  
32 - $starttime = Date::unixtime('day', -6);  
33 - $endtime = Date::unixtime('day', 0, 'end');  
34 - $joinlist = Db("user")->where('jointime', 'between time', [$starttime, $endtime])  
35 - ->field('jointime, status, COUNT(*) AS nums, DATE_FORMAT(FROM_UNIXTIME(jointime), "%Y-%m-%d") AS join_date')  
36 - ->group('join_date') 46 + $quick_entrance=Db::name("project")
  47 + ->alias("a")
  48 + ->join("user b","a.user_id=b.id")
  49 + ->field("a.*,b.username")
  50 + ->order("id desc")
  51 + ->limit(8)
37 ->select(); 52 ->select();
38 - for ($time = $starttime; $time <= $endtime;) {  
39 - $column[] = date("Y-m-d", $time);  
40 - $time += 86400;  
41 - }  
42 - $userlist = array_fill_keys($column, 0);  
43 - foreach ($joinlist as $k => $v) {  
44 - $userlist[$v['join_date']] = $v['nums'];  
45 - }  
46 53
47 - $dbTableList = Db::query("SHOW TABLE STATUS");  
48 - $addonList = get_addon_list();  
49 - $totalworkingaddon = 0;  
50 - $totaladdon = count($addonList);  
51 - foreach ($addonList as $index => $item) {  
52 - if ($item['state']) {  
53 - $totalworkingaddon += 1;  
54 - }  
55 - } 54 + //工时统计
  55 + $project_statistics=Db::name("project")
  56 + ->order("all_working_hours desc")
  57 + ->field("project_name as name,all_working_hours,starttime")
  58 + ->select();
  59 + $department_statistics=Db::name("department")
  60 + ->alias("a")
  61 + ->join("project b","b.department_id=a.id")
  62 + ->order("all_working_hours desc")
  63 + ->group("a.id")
  64 + ->field("a.name, ROUND(SUM(all_working_hours), 2) as all_working_hours,starttime")
  65 + ->select();
  66 + $admin_statistics=Db::name("user")
  67 + ->alias("a")
  68 + ->join("project b","b.user_id=a.id")
  69 + ->order("all_working_hours desc")
  70 + ->field("username as name,ROUND(SUM(all_working_hours), 2) as all_working_hours,starttime")
  71 + ->group("a.id")
  72 + ->select();
  73 + $work_hour_statistics=[
  74 + 'project_statistics'=>$project_statistics,
  75 + 'department_statistics'=>$department_statistics,
  76 + 'admin_statistics'=>$admin_statistics,
  77 + ];
56 $this->view->assign([ 78 $this->view->assign([
57 - 'totaluser' => User::count(),  
58 - 'totaladdon' => $totaladdon,  
59 - 'totaladmin' => Admin::count(),  
60 - 'totalcategory' => \app\common\model\Category::count(),  
61 - 'todayusersignup' => User::whereTime('jointime', 'today')->count(),  
62 - 'todayuserlogin' => User::whereTime('logintime', 'today')->count(),  
63 - 'sevendau' => User::whereTime('jointime|logintime|prevtime', '-7 days')->count(),  
64 - 'thirtydau' => User::whereTime('jointime|logintime|prevtime', '-30 days')->count(),  
65 - 'threednu' => User::whereTime('jointime', '-3 days')->count(),  
66 - 'sevendnu' => User::whereTime('jointime', '-7 days')->count(),  
67 - 'dbtablenums' => count($dbTableList),  
68 - 'dbsize' => array_sum(array_map(function ($item) {  
69 - return $item['Data_length'] + $item['Index_length'];  
70 - }, $dbTableList)),  
71 - 'totalworkingaddon' => $totalworkingaddon,  
72 - 'attachmentnums' => Attachment::count(),  
73 - 'attachmentsize' => Attachment::sum('filesize'),  
74 - 'picturenums' => Attachment::where('mimetype', 'like', 'image/%')->count(),  
75 - 'picturesize' => Attachment::where('mimetype', 'like', 'image/%')->sum('filesize'), 79 + "project_overview"=>$project_overview,
  80 + "quick_entrance"=>$quick_entrance,
  81 + "project"=>$project,
  82 + "work_hour_statistics"=>$work_hour_statistics,
  83 + "project_overview_chart"=>$project_overview_chart
76 ]); 84 ]);
77 -  
78 - $this->assignconfig('column', array_keys($userlist));  
79 - $this->assignconfig('userdata', array_values($userlist));  
80 -  
81 return $this->view->fetch(); 85 return $this->view->fetch();
82 } 86 }
83 - 87 + public function projectinfo($id){
  88 + $row=Db::name('project')
  89 + ->alias("a")
  90 + ->join("department b","a.department_id=b.id")
  91 + ->join("user c","a.user_id=c.id")
  92 + ->field("a.id,project_name,image,a.createtime,a.starttime,a.endtime,a.all_working_hours,b.name as department_name, c.username")
  93 + ->where("a.id",$id)
  94 + ->find();
  95 + $this->view->assign("row", $row);
  96 + return $this->view->fetch();
  97 + }
84 } 98 }
  1 +<?php
  2 +
  3 +namespace app\admin\controller;
  4 +
  5 +use app\common\controller\Backend;
  6 +use fast\Tree;
  7 +use think\Db;
  8 +use think\exception\PDOException;
  9 +use think\exception\ValidateException;
  10 +
  11 +/**
  12 + * 部门管理
  13 + *
  14 + * @icon fa fa-circle-o
  15 + */
  16 +class Department extends Backend
  17 +{
  18 +
  19 + /**
  20 + * Depart模型对象
  21 + * @var \app\admin\model\Depart
  22 + */
  23 + protected $model = null;
  24 + protected $noNeedRight = ['tree'];
  25 +
  26 + public function _initialize()
  27 + {
  28 + parent::_initialize();
  29 + $this->model = new \app\admin\model\Department();
  30 +
  31 + $tree = Tree::instance();
  32 + $tree->init(collection($this->model->order('id asc')->select())->toArray(), 'pid');
  33 + $this->categorylist = $tree->getTreeList($tree->getTreeArray(0), 'name');
  34 + $categorydata = [0 => ['name' => __('None')]];
  35 + foreach ($this->categorylist as $k => $v) {
  36 + $categorydata[$v['id']] = $v;
  37 + }
  38 +
  39 + $this->view->assign("parentList", $categorydata);
  40 + }
  41 +
  42 + public function tree()
  43 + {
  44 + $id = $this->request->get('id');
  45 + $departModel = new \app\admin\model\Department();
  46 + $departList = $departModel->where(['pid' => ($id == '#' ? 0 : $id)])->select();
  47 +
  48 + $chanelList = [];
  49 + if ($id == '#') {
  50 + $text = "全部";
  51 + $chanelList[-1] = ['id' => -1, 'type' => 'total', 'text' => $text, 'parent' => "#"];
  52 + }
  53 +
  54 + foreach ($departList as $k => $v) {
  55 + $departModel = new \app\admin\model\Department();
  56 + if ($departModel->where(['pid' => $v->id])->find()) {
  57 + $children = true;
  58 + } else {
  59 + $children = false;
  60 + }
  61 +
  62 + $chanelList[$v->id] = ['id' => $v->id, 'text' => $v->name, 'type' => "folder", 'children' => $children, 'parent' => empty($v->pid) ? "#" : $v->pid, 'state' => ['opened' => false]];
  63 + }
  64 +
  65 + $chanelList = array_values($chanelList);
  66 +
  67 + return json($chanelList);
  68 + }
  69 +
  70 +
  71 + /**
  72 + * 查看
  73 + */
  74 + public function index()
  75 + {
  76 + //设置过滤方法
  77 + $this->request->filter(['strip_tags']);
  78 + if ($this->request->isAjax()) {
  79 + $search = $this->request->request("search");
  80 + $type = $this->request->request("type");
  81 +
  82 + //构造父类select列表选项数据
  83 + $list = [];
  84 +
  85 + foreach ($this->categorylist as $k => $v) {
  86 + if ($search) {
  87 + if ($v['type'] == $type && stripos($v['name'], $search) !== false || stripos($v['nickname'], $search) !== false) {
  88 + if ($type == "all" || $type == null) {
  89 + $list = $this->categorylist;
  90 + } else {
  91 + $list[] = $v;
  92 + }
  93 + }
  94 + } else {
  95 + if ($type == "all" || $type == null) {
  96 + $list = $this->categorylist;
  97 + } elseif ($v['type'] == $type) {
  98 + $list[] = $v;
  99 + }
  100 + }
  101 + }
  102 + $total = count($list);
  103 + $result = array("total" => $total, "rows" => $list);
  104 +
  105 + return json($result);
  106 + }
  107 + return $this->view->fetch();
  108 + }
  109 +
  110 +
  111 + /**
  112 + * 编辑
  113 + */
  114 + public function edit($ids = null)
  115 + {
  116 + $row = $this->model->get($ids);
  117 + if (!$row) {
  118 + $this->error(__('No Results were found'));
  119 + }
  120 + $adminIds = $this->getDataLimitAdminIds();
  121 + if (is_array($adminIds)) {
  122 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  123 + $this->error(__('You have no permission'));
  124 + }
  125 + }
  126 + if ($this->request->isPost()) {
  127 + $this->token();
  128 + $params = $this->request->post("row/a");
  129 + if ($params) {
  130 + $params = $this->preExcludeFields($params);
  131 +
  132 + if ($params['pid'] != $row['pid']) {
  133 + $childrenIds = Tree::instance()->init(collection(\app\admin\model\Department::select())->toArray())->getChildrenIds($row['id'], true);
  134 + if (in_array($params['pid'], $childrenIds)) {
  135 + $this->error(__('上级部门不能是它的子部门或它自己'));
  136 + }
  137 + }
  138 +
  139 + try {
  140 + //是否采用模型验证
  141 + if ($this->modelValidate) {
  142 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  143 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  144 + $row->validate($validate);
  145 + }
  146 + $result = $row->allowField(true)->save($params);
  147 + if ($result !== false) {
  148 + $this->success();
  149 + } else {
  150 + $this->error($row->getError());
  151 + }
  152 + } catch (\think\exception\PDOException $e) {
  153 + $this->error($e->getMessage());
  154 + } catch (\think\Exception $e) {
  155 + $this->error($e->getMessage());
  156 + }
  157 + }
  158 + $this->error(__('Parameter %s can not be empty', ''));
  159 + }
  160 + $this->view->assign("row", $row);
  161 + return $this->view->fetch();
  162 + }
  163 +
  164 +
  165 +
  166 +
  167 + //根据部门id获取所有子部门
  168 + public function getDepartIdById($id = 6)
  169 + {
  170 + $array = Db::name('department')->select();
  171 + //第一步 构造数据
  172 + $items = array();
  173 + foreach ($array as $value) {
  174 + $items[$value['id']] = $value;
  175 + }
  176 + //第二部 遍历数据 生成树状结构
  177 + $tree = array();
  178 + foreach ($items as $key => $value) {
  179 + if (isset($items[$value['pid']])) {
  180 + $items[$value['pid']]['son'][] = &$items[$key];
  181 + } else {
  182 + $tree[] = &$items[$key];
  183 + }
  184 + }
  185 + return $tree;
  186 + }
  187 +
  188 +
  189 +//递归获取所有的子分类的ID
  190 + function get_all_child($id = 6, $array = [])
  191 + {
  192 +
  193 + $arr = array();
  194 + if (!$array) {
  195 + $array = Db::name('department')->select();
  196 + $arr[] = (int)$id;
  197 + }
  198 +
  199 +
  200 + foreach ($array as $v) {
  201 + if ($v['pid'] == $id) {
  202 + $arr[] = $v['id'];
  203 + $arr = array_merge($arr, $this->get_all_child($v['id'], $array));
  204 + };
  205 + };
  206 + return $arr;
  207 + }
  208 +
  209 + public function send($openid, $name, $code)
  210 + {
  211 + $data = [
  212 + 'first' => ['value' => '水库警告', 'color' => '#000000'],
  213 + 'keyword1' => ['value' => $name, 'color' => '#000000'],
  214 + 'keyword2' => ['value' => date('Y-m-d H:i', time()), 'color' => '#000000'],
  215 + 'keyword3' => ['value' => '水位超过预警!', 'color' => '#000000'],
  216 + 'remark' => ['value' => '设备监测到水位超过预警值,请及时处理', 'color' => '#000000'],
  217 + ];
  218 + $template_id = '001';
  219 + $uri = 'https://www.ynzhsk.cn/index/index/updateWxtemplate?code=' . $code . '&openid=' . $openid;
  220 + $text = \addons\weixin\library\WechatTemplateService::sendTemplateOrApp($openid, $template_id, $data, $uri);
  221 + return $text;
  222 + }
  223 +
  224 + /**
  225 + * 根据部门id查询自己及其子级有水库ids
  226 + */
  227 + public function getSKIds()
  228 + {
  229 + $param = $this->request->param();
  230 + $arr = [];
  231 + if (!empty($param['depart_id'])) {
  232 + $arr = get_all_next_depart_ids($param['depart_id']);
  233 + }
  234 + $this->success('', null, implode(",", $arr));
  235 + }
  236 +
  237 +
  238 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller;
  4 +
  5 +use app\common\controller\Backend;
  6 +use fast\Tree;
  7 +use think\Db;
  8 +use think\exception\PDOException;
  9 +use think\exception\ValidateException;
  10 +
  11 +/**
  12 + * 项目管理
  13 + *
  14 + * @icon fa fa-circle-o
  15 + */
  16 +class Project extends Backend
  17 +{
  18 +
  19 + /**
  20 + * Project模型对象
  21 + * @var \app\admin\model\Project
  22 + */
  23 + protected $model = null;
  24 +
  25 + public function _initialize()
  26 + {
  27 + parent::_initialize();
  28 + $this->model = new \app\admin\model\Project;
  29 +
  30 + parent::_initialize();
  31 + $this->Departmentmodel = new \app\admin\model\Department();
  32 +
  33 + $tree = Tree::instance();
  34 + $tree->init(collection( $this->Departmentmodel->order('id asc')->select())->toArray(), 'pid');
  35 + $this->categorylist = $tree->getTreeList($tree->getTreeArray(0), 'name');
  36 + $categorydata = [0 => ['name' => __('None')]];
  37 + foreach ($this->categorylist as $k => $v) {
  38 + $categorydata[$v['id']] = $v;
  39 + }
  40 +
  41 + $this->view->assign("parentList", $categorydata);
  42 +
  43 + }
  44 +
  45 +
  46 +
  47 + /**
  48 + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
  49 + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
  50 + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  51 + */
  52 +
  53 +
  54 + /**
  55 + * 查看
  56 + */
  57 + public function index()
  58 + {
  59 + //当前是否为关联查询
  60 + $this->relationSearch = true;
  61 + //设置过滤方法
  62 + $this->request->filter(['strip_tags', 'trim']);
  63 + if ($this->request->isAjax()) {
  64 + //如果发送的来源是Selectpage,则转发到Selectpage
  65 + if ($this->request->request('keyField')) {
  66 + return $this->selectpage();
  67 + }
  68 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  69 +
  70 + $list = $this->model
  71 + ->with(['department','user'])
  72 + ->where($where)
  73 + ->order($sort, $order)
  74 + ->paginate($limit);
  75 +
  76 + foreach ($list as $row) {
  77 + $row->visible(['id','project_name','image','createtime','starttime','endtime']);
  78 + $row->visible(['department']);
  79 + $row->getRelation('department')->visible(['name']);
  80 + $row->visible(['user']);
  81 + $row->getRelation('user')->visible(['username']);
  82 + }
  83 +
  84 + $result = array("total" => $list->total(), "rows" => $list->items());
  85 +
  86 + return json($result);
  87 + }
  88 + return $this->view->fetch();
  89 + }
  90 + /**
  91 + * 添加
  92 + *
  93 + * @return string
  94 + * @throws \think\Exception
  95 + */
  96 + public function add()
  97 + {
  98 + if (false === $this->request->isPost()) {
  99 + return $this->view->fetch();
  100 + }
  101 + $params = $this->request->post('row/a');
  102 + if (empty($params)) {
  103 + $this->error(__('Parameter %s can not be empty', ''));
  104 + }
  105 + $params = $this->preExcludeFields($params);
  106 +
  107 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  108 + $params[$this->dataLimitField] = $this->auth->id;
  109 + }
  110 + $result = false;
  111 + Db::startTrans();
  112 + try {
  113 + //是否采用模型验证
  114 + if ($this->modelValidate) {
  115 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  116 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  117 + $this->model->validateFailException()->validate($validate);
  118 + }
  119 + $result = $this->model->allowField(true)->save($params);
  120 + Db::commit();
  121 + } catch (ValidateException|PDOException|Exception $e) {
  122 + Db::rollback();
  123 + $this->error($e->getMessage());
  124 + }
  125 + if ($result === false) {
  126 + $this->error(__('No rows were inserted'));
  127 + }
  128 + $this->success();
  129 + }
  130 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 工时管理
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class Workinghours extends Backend
  13 +{
  14 +
  15 + /**
  16 + * Workinghours模型对象
  17 + * @var \app\admin\model\Workinghours
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\Workinghours;
  25 +
  26 + }
  27 +
  28 +
  29 +
  30 + /**
  31 + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
  32 + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
  33 + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  34 + */
  35 +
  36 +
  37 + /**
  38 + * 查看
  39 + */
  40 + public function index()
  41 + {
  42 + //当前是否为关联查询
  43 + $this->relationSearch = true;
  44 + //设置过滤方法
  45 + $this->request->filter(['strip_tags', 'trim']);
  46 + if ($this->request->isAjax()) {
  47 + //如果发送的来源是Selectpage,则转发到Selectpage
  48 + if ($this->request->request('keyField')) {
  49 + return $this->selectpage();
  50 + }
  51 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  52 +
  53 + $list = $this->model
  54 + ->with(['user','project'])
  55 + ->where($where)
  56 + ->order($sort, $order)
  57 + ->paginate($limit);
  58 +
  59 + foreach ($list as $row) {
  60 + $row->visible(['id','content','working_hours','createtime','reporttime']);
  61 + $row->visible(['user']);
  62 + $row->getRelation('user')->visible(['username']);
  63 + $row->visible(['project']);
  64 + $row->getRelation('project')->visible(['project_name']);
  65 + }
  66 +
  67 + $result = array("total" => $list->total(), "rows" => $list->items());
  68 +
  69 + return json($result);
  70 + }
  71 + return $this->view->fetch();
  72 + }
  73 +
  74 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 表格完整示例
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 在使用Bootstrap-table中的常用方式,更多使用方式可查看:http://bootstrap-table.wenzhixin.net.cn/zh-cn/
  12 + */
  13 +class Bootstraptable extends Backend
  14 +{
  15 + /**
  16 + * @var \app\admin\model\AdminLog
  17 + */
  18 + protected $model = null;
  19 + /**
  20 + * 无需鉴权的方法(需登录)
  21 + * @var array
  22 + */
  23 + protected $noNeedRight = ['start', 'pause', 'change', 'detail', 'cxselect', 'searchlist', 'selectpage'];
  24 +
  25 + /**
  26 + * 快捷搜索的字段
  27 + * @var string
  28 + */
  29 + protected $searchFields = 'id,title,url';
  30 +
  31 + public function _initialize()
  32 + {
  33 + parent::_initialize();
  34 + $this->model = model('AdminLog');
  35 + }
  36 +
  37 + /**
  38 + * 查看
  39 + */
  40 + public function index()
  41 + {
  42 + if ($this->request->isAjax()) {
  43 + list($where, $sort, $order, $offset, $limit) = $this->buildparams(null);
  44 + $list = $this->model
  45 + ->where($where)
  46 + ->order($sort, $order)
  47 + ->limit($offset, $limit)
  48 + ->paginate($limit);
  49 + $result = array("total" => $list->total(), "rows" => $list->items(), "extend" => ['money' => mt_rand(100000, 999999), 'price' => 200]);
  50 +
  51 + return json($result);
  52 + }
  53 + return $this->view->fetch();
  54 + }
  55 +
  56 + /**
  57 + * 详情
  58 + */
  59 + public function detail($ids)
  60 + {
  61 + $row = $this->model->get(['id' => $ids]);
  62 + if (!$row) {
  63 + $this->error(__('No Results were found'));
  64 + }
  65 + if ($this->request->isAjax()) {
  66 + $this->success("Ajax请求成功", null, ['id' => $ids]);
  67 + }
  68 + $this->view->assign("row", $row->toArray());
  69 + return $this->view->fetch();
  70 + }
  71 +
  72 + /**
  73 + * 启用
  74 + */
  75 + public function start($ids = '')
  76 + {
  77 + $this->success("模拟启动成功");
  78 + }
  79 +
  80 + /**
  81 + * 暂停
  82 + */
  83 + public function pause($ids = '')
  84 + {
  85 + $this->success("模拟暂停成功");
  86 + }
  87 +
  88 + /**
  89 + * 切换
  90 + */
  91 + public function change($ids = '')
  92 + {
  93 + //你需要在此做具体的操作逻辑
  94 +
  95 + $this->success("模拟切换成功");
  96 + }
  97 +
  98 + /**
  99 + * 联动搜索
  100 + */
  101 + public function cxselect()
  102 + {
  103 + $type = $this->request->get('type');
  104 + $group_id = $this->request->get('group_id');
  105 + $list = null;
  106 + if ($group_id !== '') {
  107 + if ($type == 'group') {
  108 + $groupIds = $this->auth->getChildrenGroupIds(true);
  109 + $list = \app\admin\model\AuthGroup::where('id', 'in', $groupIds)->field('id as value, name')->select();
  110 + } else {
  111 + $adminIds = \app\admin\model\AuthGroupAccess::where('group_id', 'in', $group_id)->column('uid');
  112 + $list = \app\admin\model\Admin::where('id', 'in', $adminIds)->field('id as value, username AS name')->select();
  113 + }
  114 + }
  115 + $this->success('', null, $list);
  116 + }
  117 +
  118 + /**
  119 + * 搜索下拉列表
  120 + */
  121 + public function searchlist()
  122 + {
  123 + $result = $this->model->limit(10)->select();
  124 + $searchlist = [];
  125 + foreach ($result as $key => $value) {
  126 + $searchlist[] = ['id' => $value['url'], 'name' => $value['url']];
  127 + }
  128 + $data = ['searchlist' => $searchlist];
  129 + $this->success('', null, $data);
  130 + }
  131 +
  132 + public function selectpage()
  133 + {
  134 + $this->model = new \app\admin\model\AdminLog;
  135 + return parent::selectpage();
  136 + }
  137 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 彩色角标
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 在JS端控制角标的显示与隐藏,请注意左侧菜单栏角标的数值变化
  12 + */
  13 +class Colorbadge extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 控制器间跳转
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark FastAdmin支持在控制器间跳转,点击后将切换到另外一个TAB中,无需刷新当前页面
  12 + */
  13 +class Controllerjump extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\admin\model\AdminLog;
  6 +use app\common\controller\Backend;
  7 +
  8 +/**
  9 + * 自定义表单示例
  10 + *
  11 + * @icon fa fa-table
  12 + * @remark FastAdmin支持在控制器间跳转,点击后将切换到另外一个TAB中,无需刷新当前页面
  13 + */
  14 +class Customform extends Backend
  15 +{
  16 + protected $model = null;
  17 +
  18 + public function _initialize()
  19 + {
  20 + parent::_initialize();
  21 + $this->model = model('AdminLog');
  22 + }
  23 +
  24 + public function index()
  25 + {
  26 + if ($this->request->isPost()) {
  27 + $this->success("提交成功", null, ['data' => json_encode($this->request->post("row/a"), JSON_UNESCAPED_UNICODE)]);
  28 + }
  29 + return $this->view->fetch();
  30 + }
  31 +
  32 + public function get_title_list()
  33 + {
  34 + $query = $this->request->get("query");
  35 + $suggestions = AdminLog::where('title', 'like', '%' . $query . '%')->limit(10)->column("title");
  36 + $result = [
  37 + 'query' => $query,
  38 + 'suggestions' => $suggestions
  39 + ];
  40 + return json($result);
  41 + }
  42 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 自定义搜索
  9 + *
  10 + * @icon fa fa-search
  11 + * @remark 自定义列表的搜索
  12 + */
  13 +class Customsearch extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + $ipList = $this->model->whereTime('createtime', '-37 days')->group("ip")->column("ip,ip as aa");
  22 + $this->view->assign("ipList", $ipList);
  23 + }
  24 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 多级联动
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark FastAdmin使用了jQuery-cxselect实现多级联动,更多文档请参考https://github.com/karsonzhang/cxSelect
  12 + */
  13 +class Cxselect extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 统计图表示例
  9 + *
  10 + * @icon fa fa-charts
  11 + * @remark 展示在FastAdmin中使用Echarts展示丰富多彩的统计图表
  12 + */
  13 +class Echarts extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 +
  29 + return $this->view->fetch();
  30 + }
  31 +
  32 + /**
  33 + * 详情
  34 + */
  35 + public function detail($ids)
  36 + {
  37 + $row = $this->model->get(['id' => $ids]);
  38 + if (!$row) {
  39 + $this->error(__('No Results were found'));
  40 + }
  41 + $this->view->assign("row", $row->toArray());
  42 + return $this->view->fetch();
  43 + }
  44 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 多表格示例
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 当一个页面上存在多个Bootstrap-table时该如何控制按钮和表格
  12 + */
  13 +class Multitable extends Backend
  14 +{
  15 + protected $model = null;
  16 + protected $noNeedRight = ['table1', 'table2'];
  17 +
  18 + public function _initialize()
  19 + {
  20 + parent::_initialize();
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 + $this->loadlang('general/attachment');
  29 + $this->loadlang('general/crontab');
  30 + return $this->view->fetch();
  31 + }
  32 +
  33 + public function table1()
  34 + {
  35 + $this->model = model('Attachment');
  36 + //设置过滤方法
  37 + $this->request->filter(['strip_tags']);
  38 + if ($this->request->isAjax()) {
  39 + //如果发送的来源是Selectpage,则转发到Selectpage
  40 + if ($this->request->request('keyField')) {
  41 + return $this->selectpage();
  42 + }
  43 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  44 + $total = $this->model
  45 + ->where($where)
  46 + ->field('id,filename,filesize,imagewidth,imageheight,mimetype')
  47 + ->order($sort, $order)
  48 + ->count();
  49 +
  50 + $list = $this->model
  51 + ->where($where)
  52 + ->field('id,filename,filesize,imagewidth,imageheight,mimetype')
  53 + ->order($sort, $order)
  54 + ->limit($offset, $limit)
  55 + ->select();
  56 +
  57 + $result = array("total" => $total, "rows" => $list);
  58 +
  59 + return json($result);
  60 + }
  61 + return $this->view->fetch('index');
  62 + }
  63 +
  64 + public function table2()
  65 + {
  66 + $this->model = model('AdminLog');
  67 + //设置过滤方法
  68 + $this->request->filter(['strip_tags']);
  69 + if ($this->request->isAjax()) {
  70 + //如果发送的来源是Selectpage,则转发到Selectpage
  71 + if ($this->request->request('keyField')) {
  72 + return $this->selectpage();
  73 + }
  74 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  75 + $total = $this->model
  76 + ->where($where)
  77 + ->order($sort, $order)
  78 + ->count();
  79 +
  80 + $list = $this->model
  81 + ->where($where)
  82 + ->order($sort, $order)
  83 + ->limit($offset, $limit)
  84 + ->select();
  85 +
  86 + $result = array("total" => $total, "rows" => $list);
  87 +
  88 + return json($result);
  89 + }
  90 + return $this->view->fetch('index');
  91 + }
  92 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 关联模型
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 当使用到关联模型时需要重载index方法
  12 + */
  13 +class Relationmodel extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 + $this->relationSearch = true;
  29 + $this->searchFields = "admin.username,id";
  30 + if ($this->request->isAjax()) {
  31 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  32 + $list = $this->model
  33 + ->with("admin")
  34 + ->where($where)
  35 + ->order($sort, $order)
  36 + ->paginate($limit);
  37 +
  38 + $result = array("total" => $list->total(), "rows" => $list->items());
  39 +
  40 + return json($result);
  41 + }
  42 + return $this->view->fetch();
  43 + }
  44 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 表格联动
  9 + * 点击左侧日志列表,右侧的表格数据会显示指定管理员的日志列表
  10 + * @icon fa fa-table
  11 + */
  12 +class Tablelink extends Backend
  13 +{
  14 + protected $model = null;
  15 + protected $noNeedRight = ['table1', 'table2'];
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 +
  24 + public function table1()
  25 + {
  26 + $this->model = model('Admin');
  27 + //设置过滤方法
  28 + $this->request->filter(['strip_tags']);
  29 + if ($this->request->isAjax()) {
  30 + //如果发送的来源是Selectpage,则转发到Selectpage
  31 + if ($this->request->request('keyField')) {
  32 + return $this->selectpage();
  33 + }
  34 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  35 + $total = $this->model
  36 + ->where($where)
  37 + ->field('id,username')
  38 + ->order($sort, $order)
  39 + ->count();
  40 +
  41 + $list = $this->model
  42 + ->where($where)
  43 + ->field('id,username')
  44 + ->order($sort, $order)
  45 + ->limit($offset, $limit)
  46 + ->select();
  47 +
  48 + $result = array("total" => $total, "rows" => $list);
  49 +
  50 + return json($result);
  51 + }
  52 + return $this->view->fetch('index');
  53 + }
  54 +
  55 + public function table2()
  56 + {
  57 + $this->model = model('AdminLog');
  58 + //设置过滤方法
  59 + $this->request->filter(['strip_tags']);
  60 + if ($this->request->isAjax()) {
  61 + //如果发送的来源是Selectpage,则转发到Selectpage
  62 + if ($this->request->request('keyField')) {
  63 + return $this->selectpage();
  64 + }
  65 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  66 + $total = $this->model
  67 + ->where($where)
  68 + ->order($sort, $order)
  69 + ->count();
  70 +
  71 + $list = $this->model
  72 + ->where($where)
  73 + ->order($sort, $order)
  74 + ->limit($offset, $limit)
  75 + ->select();
  76 +
  77 + $result = array("total" => $total, "rows" => $list);
  78 +
  79 + return json($result);
  80 + }
  81 + return $this->view->fetch('index');
  82 + }
  83 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 表格模板示例
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 可以通过使用表格模板将表格中的行渲染成一样的展现方式,基于此功能可以任意定制自己想要的展示列表
  12 + */
  13 +class Tabletemplate extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 + if ($this->request->isAjax()) {
  29 + list($where, $sort, $order, $offset, $limit) = $this->buildparams(null);
  30 + $total = $this->model
  31 + ->where($where)
  32 + ->order($sort, $order)
  33 + ->count();
  34 + $list = $this->model
  35 + ->where($where)
  36 + ->order($sort, $order)
  37 + ->limit($offset, $limit)
  38 + ->select();
  39 + $result = array("total" => $total, "rows" => $list);
  40 +
  41 + return json($result);
  42 + }
  43 + return $this->view->fetch();
  44 + }
  45 +
  46 + /**
  47 + * 详情
  48 + */
  49 + public function detail($ids)
  50 + {
  51 + $row = $this->model->get(['id' => $ids]);
  52 + if (!$row) {
  53 + $this->error(__('No Results were found'));
  54 + }
  55 + $this->view->assign("row", $row->toArray());
  56 + return $this->view->fetch();
  57 + }
  58 +}
  1 +<?php
  2 +
  3 +return [
  4 + 'Id' => 'ID',
  5 + 'Type' => '类型',
  6 + 'Params' => '参数',
  7 + 'Command' => '命令',
  8 + 'Content' => '返回结果',
  9 + 'Executetime' => '执行时间',
  10 + 'Createtime' => '创建时间',
  11 + 'Updatetime' => '更新时间',
  12 + 'Execute again' => '再次执行',
  13 + 'Successed' => '成功',
  14 + 'Failured' => '失败',
  15 + 'Status' => '状态'
  16 +];
@@ -47,4 +47,13 @@ return [ @@ -47,4 +47,13 @@ return [
47 'Timezone' => '时区', 47 'Timezone' => '时区',
48 'Language' => '语言', 48 'Language' => '语言',
49 'View more' => '查看更多', 49 'View more' => '查看更多',
  50 + 'Project_name' => '项目名称',
  51 + 'Image' => '项目图片',
  52 + 'Department_id' => '所属部门',
  53 + 'All_working_hours' => '总用工时',
  54 + 'User_id' => '负责人',
  55 + 'Starttime' => '开始时间',
  56 + 'Endtime' => '结束时间',
  57 + 'Department_name' => '所属部门',
  58 + 'Username' => '负责人'
50 ]; 59 ];
  1 +<?php
  2 +
  3 +return [
  4 + 'Id' => 'ID',
  5 + 'Name' => '部门名称',
  6 + 'Pid' => '上级部门',
  7 + 'Createtime' => '创建时间'
  8 +];
  1 +<?php
  2 +
  3 +return [
  4 + 'Id' => 'ID',
  5 + 'Project_name' => '项目名称',
  6 + 'Image' => '项目图片',
  7 + 'Createtime' => '创建时间',
  8 + 'Department_id' => '所属部门',
  9 + 'User_id' => '负责人',
  10 + 'Starttime' => '开始时间',
  11 + 'Endtime' => '结束时间',
  12 + 'Department.name' => '部门名称',
  13 + 'User.username' => '用户名'
  14 +];
  1 +<?php
  2 +
  3 +return [
  4 + 'Id' => 'ID',
  5 + 'Content' => '内容',
  6 + 'Working_hours' => '工时',
  7 + 'Project_id' => '项目',
  8 + 'User_id' => '上报人员',
  9 + 'Createtime' => '创建时间',
  10 + 'Reporttime' => '上报时间',
  11 + 'User.username' => '用户名',
  12 + 'Project.project_name' => '项目名称'
  13 +];
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class Area extends Model
  8 +{
  9 +
  10 + // 开启自动写入时间戳字段
  11 + protected $autoWriteTimestamp = false;
  12 + // 定义时间戳字段名
  13 + protected $createTime = false;
  14 + protected $updateTime = false;
  15 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class Command extends Model
  8 +{
  9 + // 表名
  10 + protected $name = 'command';
  11 +
  12 + // 自动写入时间戳字段
  13 + protected $autoWriteTimestamp = 'int';
  14 +
  15 + // 定义时间戳字段名
  16 + protected $createTime = 'createtime';
  17 + protected $updateTime = 'updatetime';
  18 +
  19 + // 追加属性
  20 + protected $append = [
  21 + 'executetime_text',
  22 + 'type_text',
  23 + 'status_text'
  24 + ];
  25 +
  26 +
  27 + public function getStatusList()
  28 + {
  29 + return ['successed' => __('Successed'), 'failured' => __('Failured')];
  30 + }
  31 +
  32 +
  33 + public function getExecutetimeTextAttr($value, $data)
  34 + {
  35 + $value = $value ? $value : $data['executetime'];
  36 + return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  37 + }
  38 +
  39 + public function getTypeTextAttr($value, $data)
  40 + {
  41 + $value = $value ? $value : $data['type'];
  42 + $list = ['crud' => '一键生成CRUD', 'menu' => '一键生成菜单', 'min' => '一键压缩打包', 'api' => '一键生成文档'];
  43 + return $list[$value] ?? '';
  44 + }
  45 +
  46 + public function getStatusTextAttr($value, $data)
  47 + {
  48 + $value = $value ? $value : $data['status'];
  49 + $list = $this->getStatusList();
  50 + return $list[$value] ?? '';
  51 + }
  52 +
  53 + protected function setExecutetimeAttr($value)
  54 + {
  55 + return $value && !is_numeric($value) ? strtotime($value) : $value;
  56 + }
  57 +
  58 +
  59 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +
  8 +class Department extends Model
  9 +{
  10 +
  11 +
  12 +
  13 +
  14 +
  15 + // 表名
  16 + protected $name = 'department';
  17 +
  18 + // 自动写入时间戳字段
  19 + protected $autoWriteTimestamp = 'integer';
  20 +
  21 + // 定义时间戳字段名
  22 + protected $createTime = 'createtime';
  23 + protected $updateTime = false;
  24 + protected $deleteTime = false;
  25 +
  26 + // 追加属性
  27 + protected $append = [
  28 +
  29 + ];
  30 +
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +
  37 +
  38 +
  39 +
  40 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +
  8 +class Project extends Model
  9 +{
  10 +
  11 +
  12 +
  13 +
  14 +
  15 + // 表名
  16 + protected $name = 'project';
  17 +
  18 + // 自动写入时间戳字段
  19 + protected $autoWriteTimestamp = 'integer';
  20 +
  21 + // 定义时间戳字段名
  22 + protected $createTime = 'createtime';
  23 + protected $updateTime = false;
  24 + protected $deleteTime = false;
  25 +
  26 + // 追加属性
  27 + protected $append = [
  28 + 'starttime_text',
  29 + 'endtime_text'
  30 + ];
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +
  37 + public function getStarttimeTextAttr($value, $data)
  38 + {
  39 + $value = $value ? $value : (isset($data['starttime']) ? $data['starttime'] : '');
  40 + return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  41 + }
  42 +
  43 +
  44 + public function getEndtimeTextAttr($value, $data)
  45 + {
  46 + $value = $value ? $value : (isset($data['endtime']) ? $data['endtime'] : '');
  47 + return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  48 + }
  49 +
  50 + protected function setStarttimeAttr($value)
  51 + {
  52 + return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
  53 + }
  54 +
  55 + protected function setEndtimeAttr($value)
  56 + {
  57 + return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
  58 + }
  59 +
  60 +
  61 + public function department()
  62 + {
  63 + return $this->belongsTo('Department', 'department_id', 'id', [], 'LEFT')->setEagerlyType(0);
  64 + }
  65 +
  66 +
  67 + public function user()
  68 + {
  69 + return $this->belongsTo('User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0);
  70 + }
  71 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +
  8 +class Workinghours extends Model
  9 +{
  10 +
  11 +
  12 +
  13 +
  14 +
  15 + // 表名
  16 + protected $name = 'workinghours';
  17 +
  18 + // 自动写入时间戳字段
  19 + protected $autoWriteTimestamp = 'integer';
  20 +
  21 + // 定义时间戳字段名
  22 + protected $createTime = 'createtime';
  23 + protected $updateTime = false;
  24 + protected $deleteTime = false;
  25 +
  26 + // 追加属性
  27 + protected $append = [
  28 + 'reporttime_text'
  29 + ];
  30 +
  31 +
  32 +
  33 +
  34 +
  35 +
  36 + public function getReporttimeTextAttr($value, $data)
  37 + {
  38 + $value = $value ? $value : (isset($data['reporttime']) ? $data['reporttime'] : '');
  39 + return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  40 + }
  41 +
  42 + protected function setReporttimeAttr($value)
  43 + {
  44 + return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
  45 + }
  46 +
  47 +
  48 + public function user()
  49 + {
  50 + return $this->belongsTo('User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0);
  51 + }
  52 +
  53 +
  54 + public function project()
  55 + {
  56 + return $this->belongsTo('Project', 'project_id', 'id', [], 'LEFT')->setEagerlyType(0);
  57 + }
  58 +}
  1 +<?php
  2 +
  3 +namespace app\admin\validate;
  4 +
  5 +use think\Validate;
  6 +
  7 +class Command extends Validate
  8 +{
  9 + /**
  10 + * 验证规则
  11 + */
  12 + protected $rule = [
  13 + ];
  14 + /**
  15 + * 提示消息
  16 + */
  17 + protected $message = [
  18 + ];
  19 + /**
  20 + * 验证场景
  21 + */
  22 + protected $scene = [
  23 + 'add' => [],
  24 + 'edit' => [],
  25 + ];
  26 +
  27 +}
  1 +<?php
  2 +
  3 +namespace app\admin\validate;
  4 +
  5 +use think\Validate;
  6 +
  7 +class Department extends Validate
  8 +{
  9 + /**
  10 + * 验证规则
  11 + */
  12 + protected $rule = [
  13 + ];
  14 + /**
  15 + * 提示消息
  16 + */
  17 + protected $message = [
  18 + ];
  19 + /**
  20 + * 验证场景
  21 + */
  22 + protected $scene = [
  23 + 'add' => [],
  24 + 'edit' => [],
  25 + ];
  26 +
  27 +}
  1 +<?php
  2 +
  3 +namespace app\admin\validate;
  4 +
  5 +use think\Validate;
  6 +
  7 +class Project extends Validate
  8 +{
  9 + /**
  10 + * 验证规则
  11 + */
  12 + protected $rule = [
  13 + ];
  14 + /**
  15 + * 提示消息
  16 + */
  17 + protected $message = [
  18 + ];
  19 + /**
  20 + * 验证场景
  21 + */
  22 + protected $scene = [
  23 + 'add' => [],
  24 + 'edit' => [],
  25 + ];
  26 +
  27 +}
  1 +<?php
  2 +
  3 +namespace app\admin\validate;
  4 +
  5 +use think\Validate;
  6 +
  7 +class Workinghours extends Validate
  8 +{
  9 + /**
  10 + * 验证规则
  11 + */
  12 + protected $rule = [
  13 + ];
  14 + /**
  15 + * 提示消息
  16 + */
  17 + protected $message = [
  18 + ];
  19 + /**
  20 + * 验证场景
  21 + */
  22 + protected $scene = [
  23 + 'add' => [],
  24 + 'edit' => [],
  25 + ];
  26 +
  27 +}
  1 +<style>
  2 + .relation-item {margin-top:10px;}
  3 + legend {padding-bottom:5px;font-size:14px;font-weight:600;}
  4 + label {font-weight:normal;}
  5 + .form-control{padding:6px 8px;}
  6 + #extend-zone .col-xs-2 {margin-top:10px;padding-right:0;}
  7 + #extend-zone .col-xs-2:nth-child(6n+0) {padding-right:15px;}
  8 +</style>
  9 +<div class="panel panel-default panel-intro">
  10 + <div class="panel-heading">
  11 + <ul class="nav nav-tabs">
  12 + <li class="active"><a href="#crud" data-toggle="tab">{:__('一键生成CRUD')}</a></li>
  13 + <li><a href="#menu" data-toggle="tab">{:__('一键生成菜单')}</a></li>
  14 + <li><a href="#min" data-toggle="tab">{:__('一键压缩打包')}</a></li>
  15 + <li><a href="#api" data-toggle="tab">{:__('一键生成API文档')}</a></li>
  16 + </ul>
  17 + </div>
  18 + <div class="panel-body">
  19 + <div id="myTabContent" class="tab-content">
  20 + <div class="tab-pane fade active in" id="crud">
  21 + <div class="row">
  22 + <div class="col-xs-12">
  23 + <form role="form">
  24 + <input type="hidden" name="commandtype" value="crud" />
  25 + <div class="form-group">
  26 + <div class="row">
  27 + <div class="col-xs-3">
  28 + <input checked="" name="isrelation" type="hidden" value="0">
  29 + <label class="control-label" data-toggle="tooltip" title="当前只支持生成1对1关联模型,选中后请配置关联表和字段">
  30 + <input name="isrelation" type="checkbox" value="1">
  31 + 关联模型
  32 + </label>
  33 + </div>
  34 + <div class="col-xs-3">
  35 + <input checked="" name="local" type="hidden" value="1">
  36 + <label class="control-label" data-toggle="tooltip" title="默认模型生成在application/admin/model目录下,选中后将生成在application/common/model目录下">
  37 + <input name="local" type="checkbox" value="0"> 全局模型类
  38 + </label>
  39 + </div>
  40 + <div class="col-xs-3">
  41 + <input checked="" name="delete" type="hidden" value="0">
  42 + <label class="control-label" data-toggle="tooltip" title="删除CRUD生成的相关文件">
  43 + <input name="delete" type="checkbox" value="1"> 删除模式
  44 + </label>
  45 + </div>
  46 + <div class="col-xs-3">
  47 + <input checked="" name="force" type="hidden" value="0">
  48 + <label class="control-label" data-toggle="tooltip" title="选中后,如果已经存在同名文件将被覆盖。如果是删除将不再提醒">
  49 + <input name="force" type="checkbox" value="1">
  50 + 强制覆盖模式
  51 + </label>
  52 + </div>
  53 + <!--
  54 + <div class="col-xs-3">
  55 + <input checked="" name="menu" type="hidden" value="0">
  56 + <label class="control-label" data-toggle="tooltip" title="选中后,将同时生成后台菜单规则">
  57 + <input name="menu" type="checkbox" value="1">
  58 + 生成菜单
  59 + </label>
  60 + </div>
  61 + -->
  62 + </div>
  63 + </div>
  64 + <div class="form-group">
  65 + <legend>主表设置</legend>
  66 + <div class="row">
  67 + <div class="col-xs-3">
  68 + <label>请选择主表</label>
  69 + {:build_select('table',$tableList,null,['class'=>'form-control selectpicker', 'data-live-search'=>'true']);}
  70 + </div>
  71 + <div class="col-xs-3">
  72 + <label>自定义控制器名</label>
  73 + <input type="text" class="form-control" name="controller" data-toggle="tooltip" title="默认根据表名自动生成,如果需要放在二级目录请手动填写" placeholder="支持目录层级,以/分隔">
  74 + </div>
  75 + <div class="col-xs-3">
  76 + <label>自定义模型名</label>
  77 + <input type="text" class="form-control" name="model" data-toggle="tooltip" title="默认根据表名自动生成" placeholder="不支持目录层级">
  78 + </div>
  79 + <div class="col-xs-3">
  80 + <label>显示字段(默认全部)</label>
  81 + <select name="fields[]" id="fields" multiple style="height:30px;" class="form-control selectpicker"></select>
  82 + </div>
  83 +
  84 + </div>
  85 +
  86 + </div>
  87 +
  88 + <div class="form-group hide" id="relation-zone">
  89 + <legend>关联表设置</legend>
  90 +
  91 + <div class="row" style="margin-top:15px;">
  92 + <div class="col-xs-12">
  93 + <a href="javascript:;" class="btn btn-primary btn-sm btn-newrelation" data-index="1">追加关联模型</a>
  94 + </div>
  95 + </div>
  96 + </div>
  97 +
  98 + <hr>
  99 + <div class="form-group" id="extend-zone">
  100 + <legend>字段识别设置 <span style="font-size:12px;font-weight: normal;">(与之匹配的字段都将生成相应组件)</span></legend>
  101 + <div class="row">
  102 + <div class="col-xs-2">
  103 + <label>复选框后缀</label>
  104 + <input type="text" class="form-control" name="setcheckboxsuffix" placeholder="默认为set类型" />
  105 + </div>
  106 + <div class="col-xs-2">
  107 + <label>单选框后缀</label>
  108 + <input type="text" class="form-control" name="enumradiosuffix" placeholder="默认为enum类型" />
  109 + </div>
  110 + <div class="col-xs-2">
  111 + <label>图片类型后缀</label>
  112 + <input type="text" class="form-control" name="imagefield" placeholder="默认为image,images,avatar,avatars" />
  113 + </div>
  114 + <div class="col-xs-2">
  115 + <label>文件类型后缀</label>
  116 + <input type="text" class="form-control" name="filefield" placeholder="默认为file,files" />
  117 + </div>
  118 + <div class="col-xs-2">
  119 + <label>日期时间后缀</label>
  120 + <input type="text" class="form-control" name="intdatesuffix" placeholder="默认为time" />
  121 + </div>
  122 + <div class="col-xs-2">
  123 + <label>开关后缀</label>
  124 + <input type="text" class="form-control" name="switchsuffix" placeholder="默认为switch" />
  125 + </div>
  126 + <div class="col-xs-2">
  127 + <label>城市选择后缀</label>
  128 + <input type="text" class="form-control" name="citysuffix" placeholder="默认为city" />
  129 + </div>
  130 + <div class="col-xs-2">
  131 + <label>动态下拉后缀(单)</label>
  132 + <input type="text" class="form-control" name="selectpagesuffix" placeholder="默认为_id" />
  133 + </div>
  134 + <div class="col-xs-2">
  135 + <label>动态下拉后缀(多)</label>
  136 + <input type="text" class="form-control" name="selectpagessuffix" placeholder="默认为_ids" />
  137 + </div>
  138 + <div class="col-xs-2">
  139 + <label>忽略的字段</label>
  140 + <input type="text" class="form-control" name="ignorefields" placeholder="默认无" />
  141 + </div>
  142 + <div class="col-xs-2">
  143 + <label>排序字段</label>
  144 + <input type="text" class="form-control" name="sortfield" placeholder="默认为weigh" />
  145 + </div>
  146 + <div class="col-xs-2">
  147 + <label>富文本编辑器</label>
  148 + <input type="text" class="form-control" name="editorsuffix" placeholder="默认为content" />
  149 + </div>
  150 + <div class="col-xs-2">
  151 + <label>选项卡过滤字段</label>
  152 + <input type="text" class="form-control" name="headingfilterfield" placeholder="默认为status" />
  153 + </div>
  154 + <div class="col-xs-2">
  155 + <label>标签后缀 <i class="fa fa-info-circle" data-toggle="tooltip" data-title="只支持1.3.0+版本"></i></label>
  156 + <input type="text" class="form-control" name="tagsuffix" placeholder="默认为tag,tags" />
  157 + </div>
  158 + <div class="col-xs-2">
  159 + <label>JSON后缀 <i class="fa fa-info-circle" data-toggle="tooltip" data-title="只支持1.3.0+版本"></i></label>
  160 + <input type="text" class="form-control" name="jsonsuffix" placeholder="默认为json" />
  161 + </div>
  162 + <div class="col-xs-2">
  163 + <label>固定列数量 <i class="fa fa-info-circle" data-toggle="tooltip" data-title="只支持1.3.0+版本,大于0时为右侧固定列数量,小于0时为左侧固定列数量"></i></label>
  164 + <input type="text" class="form-control" name="fixedcolumns" placeholder="默认不启用" />
  165 + </div>
  166 +
  167 + </div>
  168 +
  169 + </div>
  170 +
  171 + <div class="form-group">
  172 + <legend>生成命令行</legend>
  173 + <textarea class="form-control" data-toggle="tooltip" title="如果在线执行命令失败,可以将命令复制到命令行进行执行" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
  174 + </div>
  175 +
  176 + <div class="form-group">
  177 + <legend>返回结果</legend>
  178 + <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
  179 + </div>
  180 +
  181 + <div class="form-group">
  182 + <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
  183 + <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
  184 + </div>
  185 +
  186 + </form>
  187 + </div>
  188 + </div>
  189 + </div>
  190 + <div class="tab-pane fade" id="menu">
  191 + <div class="row">
  192 + <div class="col-xs-12">
  193 + <form role="form">
  194 + <input type="hidden" name="commandtype" value="menu" />
  195 + <div class="form-group">
  196 + <div class="row">
  197 + <div class="col-xs-3">
  198 + <input checked="" name="allcontroller" type="hidden" value="0">
  199 + <label class="control-label" data-toggle="tooltip" title="将删除全部的菜单规则,重新按控制器进行生成,请做好备份,谨慎选择">
  200 + <input name="allcontroller" data-toggle="collapse" data-target="#controller" type="checkbox" value="1"> 一键生成全部控制器
  201 + </label>
  202 + </div>
  203 + <div class="col-xs-3">
  204 + <input checked="" name="delete" type="hidden" value="0">
  205 + <label class="control-label" data-toggle="tooltip" title="删除控制器菜单规则">
  206 + <input name="delete" type="checkbox" value="1"> 删除模式
  207 + </label>
  208 + </div>
  209 + <div class="col-xs-3">
  210 + <input checked="" name="force" type="hidden" value="0">
  211 + <label class="control-label" data-toggle="tooltip" title="如果菜单规则已经存在则覆盖">
  212 + <input name="force" type="checkbox" value="1"> 强制覆盖模式
  213 + </label>
  214 + </div>
  215 + </div>
  216 + </div>
  217 +
  218 + <div class="form-group in" id="controller">
  219 + <legend>控制器设置</legend>
  220 +
  221 + <div class="row" style="margin-top:15px;">
  222 + <div class="col-xs-12">
  223 + <input type="text" name="controllerfile" class="form-control selectpage" style="width:720px;" data-source="command/get_controller_list" data-multiple="true" name="controller" placeholder="请选择控制器" />
  224 + </div>
  225 + </div>
  226 + </div>
  227 +
  228 + <div class="form-group">
  229 + <legend>生成命令行</legend>
  230 + <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
  231 + </div>
  232 +
  233 + <div class="form-group">
  234 + <legend>返回结果</legend>
  235 + <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
  236 + </div>
  237 +
  238 + <div class="form-group">
  239 + <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
  240 + <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
  241 + </div>
  242 +
  243 + </form>
  244 + </div>
  245 + </div>
  246 + </div>
  247 + <div class="tab-pane fade" id="min">
  248 + <div class="row">
  249 + <div class="col-xs-12">
  250 + <form role="form">
  251 + <input type="hidden" name="commandtype" value="min" />
  252 + <div class="form-group">
  253 + <legend>基础设置</legend>
  254 + <div class="row">
  255 + <div class="col-xs-3">
  256 + <label>请选择压缩模块</label>
  257 + <select name="module" class="form-control selectpicker">
  258 + <option value="all" selected>全部</option>
  259 + <option value="backend">后台Backend</option>
  260 + <option value="frontend">前台Frontend</option>
  261 + </select>
  262 + </div>
  263 + <div class="col-xs-3">
  264 + <label>请选择压缩资源</label>
  265 + <select name="resource" class="form-control selectpicker">
  266 + <option value="all" selected>全部</option>
  267 + <option value="js">JS</option>
  268 + <option value="css">CSS</option>
  269 + </select>
  270 + </div>
  271 + <div class="col-xs-3">
  272 + <label>请选择压缩模式</label>
  273 + <select name="optimize" class="form-control selectpicker">
  274 + <option value=""></option>
  275 + <option value="uglify">uglify</option>
  276 + <option value="closure">closure</option>
  277 + </select>
  278 + </div>
  279 + </div>
  280 + </div>
  281 +
  282 + <div class="form-group">
  283 + <legend>生成命令行</legend>
  284 + <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
  285 + </div>
  286 +
  287 + <div class="form-group">
  288 + <legend>返回结果</legend>
  289 + <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
  290 + </div>
  291 +
  292 + <div class="form-group">
  293 + <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
  294 + <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
  295 + </div>
  296 +
  297 + </form>
  298 + </div>
  299 + </div>
  300 + </div>
  301 + <div class="tab-pane fade" id="api">
  302 + <div class="row">
  303 + <div class="col-xs-12">
  304 + <form role="form">
  305 + <input type="hidden" name="commandtype" value="api" />
  306 + <div class="form-group">
  307 + <div class="row">
  308 + <div class="col-xs-3">
  309 + <input checked="" name="force" type="hidden" value="0">
  310 + <label class="control-label" data-toggle="tooltip" title="如果已经存在则覆盖">
  311 + <input name="force" type="checkbox" value="1">
  312 + 覆盖模式
  313 + </label>
  314 + </div>
  315 + </div>
  316 + </div>
  317 + <div class="form-group">
  318 + <legend>文档设置</legend>
  319 + <div class="row">
  320 + <div class="col-xs-3">
  321 + <label>请输入接口URL</label>
  322 + <input type="text" name="url" class="form-control" placeholder="API URL,可留空" />
  323 + </div>
  324 + <div class="col-xs-3">
  325 + <label>接口生成文件</label>
  326 + <input type="text" name="output" class="form-control" placeholder="留空则使用api.html" />
  327 + </div>
  328 + <div class="col-xs-3">
  329 + <label>模板文件</label>
  330 + <input type="text" name="template" class="form-control" placeholder="如果不清楚请留空" />
  331 + </div>
  332 + <div class="col-xs-3">
  333 + <label>文档语言</label>
  334 + <select name="language" class="form-control">
  335 + <option value="" selected>请选择语言</option>
  336 + <option value="zh-cn">中文</option>
  337 + <option value="en">英文</option>
  338 + </select>
  339 + </div>
  340 + </div>
  341 + <div class="row" style="margin-top:10px;">
  342 + <div class="col-xs-3">
  343 + <label>文档标题</label>
  344 + <input type="text" name="title" class="form-control" placeholder="默认为{$site.name}" />
  345 + </div>
  346 + <div class="col-xs-3">
  347 + <label>文档作者</label>
  348 + <input type="text" name="author" class="form-control" placeholder="默认为{$site.name}" />
  349 + </div>
  350 + <div class="col-xs-3">
  351 + <label>生成模块</label>
  352 + <select name="module" class="form-control selectpicker">
  353 + <option value="" selected>请选择模块</option>
  354 + <option value="api">API</option>
  355 + <option value="backend">后台</option>
  356 + <option value="frontend">前台</option>
  357 + </select>
  358 + </div>
  359 + <div class="col-xs-3">
  360 + <label>生成插件文档</label>
  361 + <select name="addon" class="form-control selectpicker" data-live-search="true">
  362 + <option value="" selected>请选择插件</option>
  363 + {foreach name=":get_addon_list()" id="item"}
  364 + <option value="{$item.name}">{$item.title}</option>
  365 + {/foreach}
  366 + </select>
  367 + </div>
  368 + </div>
  369 + </div>
  370 +
  371 + <div class="form-group">
  372 + <legend>生成命令行</legend>
  373 + <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
  374 + </div>
  375 +
  376 + <div class="form-group">
  377 + <legend>返回结果</legend>
  378 + <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
  379 + </div>
  380 +
  381 + <div class="form-group">
  382 + <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
  383 + <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
  384 + </div>
  385 +
  386 + </form>
  387 + </div>
  388 + </div>
  389 + </div>
  390 + </div>
  391 + </div>
  392 +</div>
  393 +<script id="relationtpl" type="text/html">
  394 + <div class="row relation-item">
  395 + <div class="col-xs-2">
  396 + <label>请选择关联表</label>
  397 + <select name="relation[<%=index%>][relation]" class="form-control relationtable" data-live-search="true"></select>
  398 + </div>
  399 + <div class="col-xs-2">
  400 + <label>请选择关联类型</label>
  401 + <select name="relation[<%=index%>][relationmode]" class="form-control relationmode"></select>
  402 + </div>
  403 + <div class="col-xs-2">
  404 + <label>关联外键</label>
  405 + <select name="relation[<%=index%>][relationforeignkey]" class="form-control relationforeignkey"></select>
  406 + </div>
  407 + <div class="col-xs-2">
  408 + <label>关联主键</label>
  409 + <select name="relation[<%=index%>][relationprimarykey]" class="form-control relationprimarykey"></select>
  410 + </div>
  411 + <div class="col-xs-2">
  412 + <label>请选择显示字段</label>
  413 + <select name="relation[<%=index%>][relationfields][]" multiple class="form-control relationfields"></select>
  414 + </div>
  415 + <div class="col-xs-2">
  416 + <label>&nbsp;</label>
  417 + <a href="javascript:;" class="btn btn-danger btn-block btn-removerelation">移除</a>
  418 + </div>
  419 + </div>
  420 +</script>
  1 +<table class="table table-striped">
  2 + <thead>
  3 + <tr>
  4 + <th>{:__('Title')}</th>
  5 + <th>{:__('Content')}</th>
  6 + </tr>
  7 + </thead>
  8 + <tbody>
  9 + <tr>
  10 + <td>{:__('Type')}</td>
  11 + <td>{$row.type}({$row.type_text})</td>
  12 + </tr>
  13 + <tr>
  14 + <td>{:__('Params')}</td>
  15 + <td>{$row.params|htmlentities}</td>
  16 + </tr>
  17 + <tr>
  18 + <td>{:__('Command')}</td>
  19 + <td>{$row.command|htmlentities}</td>
  20 + </tr>
  21 + <tr>
  22 + <td>{:__('Content')}</td>
  23 + <td>
  24 + <textarea class="form-control" name="" id="" cols="60" rows="10">{$row.content|htmlentities}</textarea>
  25 + </td>
  26 + </tr>
  27 + <tr>
  28 + <td>{:__('Executetime')}</td>
  29 + <td>{$row.executetime|datetime}</td>
  30 + </tr>
  31 + <tr>
  32 + <td>{:__('Status')}</td>
  33 + <td>{$row.status_text}</td>
  34 + </tr>
  35 + </tbody>
  36 +</table>
  37 +<div class="hide layer-footer">
  38 + <label class="control-label col-xs-12 col-sm-2"></label>
  39 + <div class="col-xs-12 col-sm-8">
  40 + <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
  41 + </div>
  42 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
  10 + <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('command/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
  11 + <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('command/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
  12 +
  13 + </div>
  14 + <table id="table" class="table table-striped table-bordered table-hover"
  15 + data-operate-detail="{:$auth->check('command/detail')}"
  16 + data-operate-execute="{:$auth->check('command/execute')}"
  17 + data-operate-del="{:$auth->check('command/del')}"
  18 + width="100%">
  19 + </table>
  20 + </div>
  21 + </div>
  22 +
  23 + </div>
  24 + </div>
  25 +</div>
@@ -61,42 +61,42 @@ @@ -61,42 +61,42 @@
61 </li> 61 </li>
62 62
63 <!-- 账号信息下拉框 --> 63 <!-- 账号信息下拉框 -->
64 - <li class="dropdown user user-menu">  
65 - <a href="#" class="dropdown-toggle" data-toggle="dropdown">  
66 - <img src="{$admin.avatar|cdnurl|htmlentities}" class="user-image" alt="">  
67 - <span class="hidden-xs">{$admin.nickname|htmlentities}</span>  
68 - </a>  
69 - <ul class="dropdown-menu">  
70 - <!-- User image -->  
71 - <!-- <li class="user-header">-->  
72 - <!-- <img src="{$admin.avatar|cdnurl|htmlentities}" class="img-circle" alt="">--> 64 +<!-- <li class="dropdown user user-menu">-->
  65 +<!-- <a href="#" class="dropdown-toggle" data-toggle="dropdown">-->
  66 +<!-- <img src="{$admin.avatar|cdnurl|htmlentities}" class="user-image" alt="">-->
  67 +<!-- <span class="hidden-xs">{$admin.nickname|htmlentities}</span>-->
  68 +<!-- </a>-->
  69 +<!-- <ul class="dropdown-menu">-->
  70 +<!-- &lt;!&ndash; User image &ndash;&gt;-->
  71 +<!-- &lt;!&ndash; <li class="user-header">&ndash;&gt;-->
  72 +<!-- &lt;!&ndash; <img src="{$admin.avatar|cdnurl|htmlentities}" class="img-circle" alt="">&ndash;&gt;-->
73 73
74 - <!-- <p>-->  
75 - <!-- {$admin.nickname|htmlentities}-->  
76 - <!-- <small>{$admin.logintime|date="Y-m-d H:i:s",###}</small>-->  
77 - <!-- </p>-->  
78 - <!-- </li>-->  
79 - <!-- <li class="user-body">-->  
80 - <!-- <div class="visible-xs">-->  
81 - <!-- <div class="pull-left">-->  
82 - <!-- <a href="__PUBLIC__" target="_blank"><i class="fa fa-home" style="font-size:14px;"></i> {:__('Home')}</a>-->  
83 - <!-- </div>-->  
84 - <!-- <div class="pull-right">-->  
85 - <!-- <a href="javascript:;" data-type="all" class="wipecache"><i class="fa fa-trash fa-fw"></i> {:__('Wipe all cache')}</a>-->  
86 - <!-- </div>-->  
87 - <!-- </div>-->  
88 - <!-- </li>-->  
89 - <!-- Menu Footer-->  
90 - <li>  
91 - <a href="general/profile" class="addtabsit"><i class="fa fa-user"></i>  
92 - {:__('Profile')}</a>  
93 - </li>  
94 - <li>  
95 - <a href="{:url('index/logout')}"><i class="fa fa-sign-out"></i>  
96 - {:__('Logout')}</a>  
97 - </li>  
98 - </ul>  
99 - </li> 74 +<!-- &lt;!&ndash; <p>&ndash;&gt;-->
  75 +<!-- &lt;!&ndash; {$admin.nickname|htmlentities}&ndash;&gt;-->
  76 +<!-- &lt;!&ndash; <small>{$admin.logintime|date="Y-m-d H:i:s",###}</small>&ndash;&gt;-->
  77 +<!-- &lt;!&ndash; </p>&ndash;&gt;-->
  78 +<!-- &lt;!&ndash; </li>&ndash;&gt;-->
  79 +<!-- &lt;!&ndash; <li class="user-body">&ndash;&gt;-->
  80 +<!-- &lt;!&ndash; <div class="visible-xs">&ndash;&gt;-->
  81 +<!-- &lt;!&ndash; <div class="pull-left">&ndash;&gt;-->
  82 +<!-- &lt;!&ndash; <a href="__PUBLIC__" target="_blank"><i class="fa fa-home" style="font-size:14px;"></i> {:__('Home')}</a>&ndash;&gt;-->
  83 +<!-- &lt;!&ndash; </div>&ndash;&gt;-->
  84 +<!-- &lt;!&ndash; <div class="pull-right">&ndash;&gt;-->
  85 +<!-- &lt;!&ndash; <a href="javascript:;" data-type="all" class="wipecache"><i class="fa fa-trash fa-fw"></i> {:__('Wipe all cache')}</a>&ndash;&gt;-->
  86 +<!-- &lt;!&ndash; </div>&ndash;&gt;-->
  87 +<!-- &lt;!&ndash; </div>&ndash;&gt;-->
  88 +<!-- &lt;!&ndash; </li>&ndash;&gt;-->
  89 +<!-- &lt;!&ndash; Menu Footer&ndash;&gt;-->
  90 +<!-- <li>-->
  91 +<!-- <a href="general/profile" class="addtabsit"><i class="fa fa-user"></i>-->
  92 +<!-- {:__('Profile')}</a>-->
  93 +<!-- </li>-->
  94 +<!-- <li>-->
  95 +<!-- <a href="{:url('index/logout')}"><i class="fa fa-sign-out"></i>-->
  96 +<!-- {:__('Logout')}</a>-->
  97 +<!-- </li>-->
  98 +<!-- </ul>-->
  99 +<!-- </li>-->
100 <!-- 控制栏切换按钮 --> 100 <!-- 控制栏切换按钮 -->
101 <!-- <li class="hidden-xs">--> 101 <!-- <li class="hidden-xs">-->
102 <!-- <a href="javascript:;" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>--> 102 <!-- <a href="javascript:;" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>-->
@@ -6,6 +6,8 @@ @@ -6,6 +6,8 @@
6 -moz-border-radius: 3px; 6 -moz-border-radius: 3px;
7 border-radius: 3px; 7 border-radius: 3px;
8 margin-bottom: 20px; 8 margin-bottom: 20px;
  9 + -webkit-box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05);
  10 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05);
9 } 11 }
10 12
11 .sm-st-icon { 13 .sm-st-icon {
@@ -25,6 +27,7 @@ @@ -25,6 +27,7 @@
25 } 27 }
26 28
27 .sm-st-info { 29 .sm-st-info {
  30 + font-size: 12px;
28 padding-top: 2px; 31 padding-top: 2px;
29 } 32 }
30 33
@@ -122,7 +125,6 @@ @@ -122,7 +125,6 @@
122 .stat .name { 125 .stat .name {
123 overflow: hidden; 126 overflow: hidden;
124 text-overflow: ellipsis; 127 text-overflow: ellipsis;
125 - margin: 5px 0;  
126 } 128 }
127 129
128 .stat.lg .value { 130 .stat.lg .value {
@@ -130,9 +132,6 @@ @@ -130,9 +132,6 @@
130 line-height: 28px; 132 line-height: 28px;
131 } 133 }
132 134
133 - .stat-col {  
134 - margin:0 0 10px 0;  
135 - }  
136 .stat.lg .name { 135 .stat.lg .name {
137 font-size: 16px; 136 font-size: 16px;
138 } 137 }
@@ -156,248 +155,568 @@ @@ -156,248 +155,568 @@
156 } 155 }
157 156
158 #statistics .panel h5 { 157 #statistics .panel h5 {
  158 + font-size: 13px;
  159 + }
  160 +</style><!DOCTYPE html>
  161 +
  162 + <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  163 + <script src="https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js"></script>
  164 + <script src="https://registry.npmmirror.com/echarts/5.5.0/files/dist/echarts.min.js"></script>
  165 + <style>
  166 + body {
  167 + margin: 0;
  168 + padding: 0;
  169 + }
  170 +
  171 + .general_console {
  172 + width: 100%;
  173 + height: 100vh;
  174 + display: flex;
  175 + justify-content: space-between;
  176 + /*justify-content: center;*/
  177 + /*align-items: center;*/
  178 + background-color: #f2f2f2;
  179 + padding: 24px;
  180 + box-sizing: border-box;
  181 + }
  182 +
  183 + .overview {
  184 + width: 100%;
  185 + height: 560px;
  186 + background-color: #fff;
  187 + padding: 24px;
  188 + box-sizing: border-box;
  189 + border-radius: 8px;
  190 + }
  191 +
  192 + .overview_title {
  193 + font-weight: bold;
  194 + color: #020E1F;
  195 + }
  196 +
  197 + .overview_main {
  198 + width: 100%;
  199 + height: 490px;
  200 + display: flex;
  201 + justify-content: space-between;
  202 + }
  203 +
  204 + .overview_main_left {
  205 + width: 55%;
  206 + height: 100%;
  207 + }
  208 +
  209 + #chart-container {
  210 + width: 100%;
  211 + height: 470px;
  212 + }
  213 +
  214 + .overview_main_right {
  215 + width: 40%;
  216 + height: 100%;
  217 + }
  218 +
  219 + .overview_main_right_item {
  220 + width: 100%;
  221 + height: 90px;
  222 + padding: 12px;
  223 + background-color: #F7F8FA;
  224 + border-radius: 8px;
  225 + box-sizing: border-box;
  226 + display: flex;
  227 + margin-bottom: 20px;
  228 + }
  229 +
  230 + .overview_main_right_item_left {
  231 + width: 60px;
  232 + height: 100%;
  233 + display: flex;
  234 + align-items: center;
  235 + justify-content: center;
  236 + }
  237 +
  238 + .overview_main_right_item_left img {
  239 + width: 60px;
  240 + height: 60px;
  241 + }
  242 +
  243 + .overview_main_right_item_right {
  244 + width: 100%;
  245 + height: 100%;
  246 + background-color: #fff;
  247 + padding: 12px;
  248 + box-sizing: border-box;
  249 + display: flex;
  250 + flex-direction: column;
  251 + justify-content: space-between;
  252 + }
  253 +
  254 + .overview_main_right_item_right_top {
  255 + font-weight: bold;
  256 + color: #020E1F;
  257 + display: flex;
  258 + justify-content: space-between;
  259 + }
  260 +
  261 + .overview_main_right_item_right_bottom {
  262 + font-size: 12px;
  263 + display: flex;
  264 + justify-content: space-between;
  265 + color: #828A97;
  266 + }
  267 +
  268 + .console_right {
  269 + width: 39%;
  270 + height: 100%;
  271 + }
  272 +
  273 + .user_info {
  274 + width: 100%;
  275 + height: 90px;
  276 + background-color: #fff;
  277 + display: flex;
  278 + align-items: center;
  279 + justify-content: space-between;
  280 + padding: 12px;
  281 + box-sizing: border-box;
  282 + border-radius: 8px;
  283 + }
  284 +
  285 + .user_info_avatar {
  286 + width: 60px;
  287 + height: 60px;
  288 + border-radius: 50%;
  289 + background-color: #cbcfe5;
  290 + display: flex;
  291 + line-height: 60px;
  292 + justify-content: center;
  293 + color: #ffffff;
  294 + }
  295 +
  296 + .user_info_name {
  297 + padding: 10px 12px;
  298 + box-sizing: border-box;
  299 + width: 78%;
  300 + height: 100%;
  301 + display: flex;
  302 + flex-direction: column;
  303 + justify-content: space-between;
  304 + color: #020E1F;
  305 + }
  306 +
  307 + .user_info_menu {
  308 + width: 134px;
  309 + height: 40px;
  310 + background-image: url('__CDN__/assets/img/admin_icon.png');
  311 + background-size: 100%;
  312 + line-height: 40px;
  313 + padding-left: 50px;
  314 + box-sizing: border-box;
159 font-size: 14px; 315 font-size: 14px;
  316 + color: #896300;
  317 + font-weight: bold;
160 } 318 }
161 -</style>  
162 -<div class="panel panel-default panel-intro">  
163 - <div class="panel-heading">  
164 - {:build_heading(null, false)}  
165 - <ul class="nav nav-tabs">  
166 - <li class="active"><a href="#one" data-toggle="tab">{:__('Dashboard')}</a></li>  
167 - <li><a href="#two" data-toggle="tab">{:__('Custom')}</a></li>  
168 - </ul>  
169 - </div>  
170 - <div class="panel-body">  
171 - <div id="myTabContent" class="tab-content">  
172 - <div class="tab-pane fade active in" id="one">  
173 319
174 - <div class="row">  
175 - <div class="col-sm-3 col-xs-6">  
176 - <div class="sm-st clearfix">  
177 - <span class="sm-st-icon st-red"><i class="fa fa-users"></i></span>  
178 - <div class="sm-st-info">  
179 - <span>{$totaluser}</span>  
180 - {:__('Total user')}  
181 - </div>  
182 - </div>  
183 - </div>  
184 - <div class="col-sm-3 col-xs-6">  
185 - <div class="sm-st clearfix">  
186 - <span class="sm-st-icon st-violet"><i class="fa fa-magic"></i></span>  
187 - <div class="sm-st-info">  
188 - <span>{$totaladdon}</span>  
189 - {:__('Total addon')}  
190 - </div>  
191 - </div>  
192 - </div>  
193 - <div class="col-sm-3 col-xs-6">  
194 - <div class="sm-st clearfix">  
195 - <span class="sm-st-icon st-blue"><i class="fa fa-leaf"></i></span>  
196 - <div class="sm-st-info">  
197 - <span>{$attachmentnums}</span>  
198 - {:__('Total attachment')}  
199 - </div>  
200 - </div>  
201 - </div>  
202 - <div class="col-sm-3 col-xs-6">  
203 - <div class="sm-st clearfix">  
204 - <span class="sm-st-icon st-green"><i class="fa fa-user"></i></span>  
205 - <div class="sm-st-info">  
206 - <span>{$totaladmin}</span>  
207 - {:__('Total admin')}  
208 - </div>  
209 - </div>  
210 - </div>  
211 - </div> 320 + .rankings {
  321 + width: 100%;
  322 + height: calc(100% - 90px - 24px);
  323 + background-color: #ffffff;
  324 + margin-top: 24px;
  325 + border-radius: 8px;
  326 + padding: 24px;
  327 + box-sizing: border-box;
  328 + }
212 329
213 - <div class="row">  
214 - <div class="col-lg-8">  
215 - <div id="echart" class="btn-refresh" style="height:300px;width:100%;"></div>  
216 - </div>  
217 - <div class="col-lg-4">  
218 - <div class="card sameheight-item stats">  
219 - <div class="card-block">  
220 - <div class="row row-sm stats-container">  
221 - <div class="col-xs-6 stat-col">  
222 - <div class="stat-icon"><i class="fa fa-rocket"></i></div>  
223 - <div class="stat">  
224 - <div class="value"> {$todayusersignup}</div>  
225 - <div class="name"> {:__('Today user signup')}</div>  
226 - </div>  
227 - <div class="progress">  
228 - <div class="progress-bar progress-bar-success" style="width: 20%"></div>  
229 - </div>  
230 - </div>  
231 - <div class="col-xs-6 stat-col">  
232 - <div class="stat-icon"><i class="fa fa-vcard"></i></div>  
233 - <div class="stat">  
234 - <div class="value"> {$todayuserlogin}</div>  
235 - <div class="name"> {:__('Today user login')}</div>  
236 - </div>  
237 - <div class="progress">  
238 - <div class="progress-bar progress-bar-success" style="width: 20%"></div>  
239 - </div>  
240 - </div>  
241 - <div class="col-xs-6 stat-col">  
242 - <div class="stat-icon"><i class="fa fa-calendar"></i></div>  
243 - <div class="stat">  
244 - <div class="value"> {$threednu}</div>  
245 - <div class="name"> {:__('Three dnu')}</div>  
246 - </div>  
247 - <div class="progress">  
248 - <div class="progress-bar progress-bar-success" style="width: 20%"></div>  
249 - </div>  
250 - </div>  
251 - <div class="col-xs-6 stat-col">  
252 - <div class="stat-icon"><i class="fa fa-calendar-plus-o"></i></div>  
253 - <div class="stat">  
254 - <div class="value"> {$sevendnu}</div>  
255 - <div class="name"> {:__('Seven dnu')}</div>  
256 - </div>  
257 - <div class="progress">  
258 - <div class="progress-bar progress-bar-success" style="width: 20%"></div>  
259 - </div>  
260 - </div>  
261 - <div class="col-xs-6 stat-col">  
262 - <div class="stat-icon"><i class="fa fa-user-circle"></i></div>  
263 - <div class="stat">  
264 - <div class="value"> {$sevendau}</div>  
265 - <div class="name"> {:__('Seven dau')}</div>  
266 - </div>  
267 - <div class="progress">  
268 - <div class="progress-bar progress-bar-success" style="width: 20%"></div>  
269 - </div>  
270 - </div>  
271 - <div class="col-xs-6 stat-col">  
272 - <div class="stat-icon"><i class="fa fa-user-circle-o"></i></div>  
273 - <div class="stat">  
274 - <div class="value"> {$thirtydau}</div>  
275 - <div class="name"> {:__('Thirty dau')}</div>  
276 - </div>  
277 - <div class="progress">  
278 - <div class="progress-bar progress-bar-success" style="width: 20%"></div>  
279 - </div>  
280 - </div>  
281 - </div>  
282 - </div>  
283 - </div>  
284 - </div>  
285 - </div> 330 + .rankings_title {
  331 + width: 100%;
  332 + height: 40px;
  333 + display: flex;
  334 + justify-content: space-between;
  335 + align-items: center;
  336 + }
286 337
287 - <div class="row" style="margin-top:15px;" id="statistics"> 338 + .rankings_title_left {
  339 + color: #1D2129;
  340 + font-weight: 700;
  341 + }
288 342
289 - <div class="col-lg-12">  
290 - </div>  
291 - <div class="col-xs-6 col-md-3">  
292 - <div class="panel bg-blue-gradient no-border">  
293 - <div class="panel-body">  
294 - <div class="panel-title">  
295 - <span class="label label-primary pull-right">{:__('Real time')}</span>  
296 - <h5>{:__('Working addon count')}</h5>  
297 - </div>  
298 - <div class="panel-content">  
299 - <div class="row">  
300 - <div class="col-md-12">  
301 - <h1 class="no-margins">{$totalworkingaddon}</h1>  
302 - <div class="font-bold"><i class="fa fa-magic"></i>  
303 - <small>{:__('Working addon count tips')}</small> 343 + .rankings_title_right {
  344 + width: 240px;
  345 + height: 32px;
  346 + display: flex;
  347 + padding: 3px;
  348 + box-sizing: border-box;
  349 + background-color: #F2F3F5;
  350 + border-radius: 8px;
  351 + }
  352 +
  353 + .rankings_title_right_item {
  354 + width: 80px;
  355 + text-align: center;
  356 + display: flex;
  357 + align-items: center;
  358 + justify-content: center;
  359 + font-size: 14px;
  360 + cursor: pointer;
  361 + color: #4E5969;
  362 + }
  363 +
  364 + .rankings_title_right_item_active {
  365 + width: 80px;
  366 + color: #165DFF;
  367 + background-color: #fff;
  368 + border-radius: 2px;
  369 + }
  370 +
  371 + .rankings_list {
  372 + width: 100%;
  373 + height: calc(100% - 64px);
  374 + display: flex;
  375 + flex-direction: column;
  376 + margin-top: 24px;
  377 + }
  378 +
  379 + .rankings_item {
  380 + display: flex;
  381 + width: 100%;
  382 + height: 32px;
  383 + line-height: 32px;
  384 + font-size: 14px;
  385 + }
  386 +
  387 + .rankings_item > div {
  388 + width: 33.33%;
  389 + text-align: center;
  390 + }
  391 +
  392 + .rankings_item:nth-child(odd) {
  393 + background-color: #F7F8FA;
  394 + }
  395 +
  396 + .console_left {
  397 + width: 60%;
  398 + height: 100%;
  399 + }
  400 +
  401 + .project_list {
  402 + width: 100%;
  403 + height: calc(100% - 560px - 24px);
  404 + background-color: #ffffff;
  405 + margin-top: 24px;
  406 + border-radius: 8px;
  407 + padding: 24px;
  408 + box-sizing: border-box;
  409 + }
  410 +
  411 + .project_list_title {
  412 + width: 100%;
  413 + height: 32px;
  414 + line-height: 32px;
  415 + display: flex;
  416 + justify-content: space-between;
  417 + align-items: center;
  418 + font-size: 16px;
  419 + }
  420 +
  421 + .project_list_title_left {
  422 + font-weight: bold;
  423 + }
  424 +
  425 + .project_list_title_right {
  426 + font-size: 14px;
  427 + color: #1F5BFF;
  428 + font-weight: bold;
  429 + }
  430 +
  431 + .project_list_main {
  432 + width: 100%;
  433 + /*height: calc(100% - 44px);*/
  434 + overflow: auto;
  435 + margin-top: 12px;
  436 + display: flex;
  437 + flex-wrap: wrap;
  438 + align-items: flex-start;
  439 + justify-content: flex-start;
  440 + }
  441 +
  442 + .project_list_main_item {
  443 + width: 23.875%;
  444 + height: 94px;
  445 + background-color: #ffffff;
  446 + margin-right: 1.5%;
  447 + margin-bottom: 24px;
  448 + padding: 10px 12px;
  449 + box-sizing: border-box;
  450 + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  451 + border-radius: 8px;
  452 + display: flex;
  453 + flex-direction: column;
  454 + justify-content: space-between;
  455 + border: 1px solid #EBEBEB;
  456 + }
  457 +
  458 + .project_list_main_item:nth-child( 4n ) {
  459 + margin-right: 0 !important;
  460 + }
  461 +
  462 + .project_list_main_item_top {
  463 + width: 100%;
  464 + }
  465 +
  466 + .project_list_main_item_top > div:first-child {
  467 + font-weight: 600;
  468 + color: #020E1F;
  469 + font-size: 16px;
  470 + }
  471 +
  472 + .project_list_main_item_top > div:last-child {
  473 + color: #828A97;
  474 + font-size: 12px;
  475 + }
  476 +
  477 + .project_list_main_item_bottom {
  478 + width: 100%;
  479 + height: 32px;
  480 + display: flex;
  481 + justify-content: space-between;
  482 + align-items: center;
  483 + font-size: 14px;
  484 + color: #031229;
  485 + }
  486 +
  487 + .project_list_main_item_bottom_right {
  488 + display: flex;
  489 + align-items: center;
  490 + }
  491 +
  492 + .project_list_main_item_bottom_right > img {
  493 + width: 16px;
  494 + height: 16px;
  495 + margin-right: 4px;
  496 + }
  497 + </style>
  498 +<div class="general_console">
  499 + <div class="console_left">
  500 + <div class="overview">
  501 + <div class="overview_title">项目总览</div>
  502 + <div class="overview_main">
  503 + <div class="overview_main_left">
  504 + <div id="chart-container"></div>
304 </div> 505 </div>
  506 + <div class="overview_main_right">
  507 + {volist name="project_overview" id="vo" }
  508 + <div class="overview_main_right_item">
  509 + <div class="overview_main_right_item_left">
  510 + <img src="{$vo.image}" alt="">
305 </div> 511 </div>
  512 + <div class="overview_main_right_item_right">
  513 + <div class="overview_main_right_item_right_top">
  514 + <div>{$vo.project_name}</div>
  515 + <div>{$vo.all_working_hours}小时</div>
306 </div> 516 </div>
  517 + <div class="overview_main_right_item_right_bottom">
  518 + <div>负责人: {$vo.username} 开始时间:{$vo.starttime|date="Y-m-d",###}</div>
  519 + <div style="color: #1F5BFF;font-weight: 600;cursor: pointer;" onclick="projectinfo({$vo.id})">详情</div>
307 </div> 520 </div>
308 </div> 521 </div>
309 </div> 522 </div>
  523 + {/volist}
  524 +
  525 +
  526 +
  527 +
  528 +
310 </div> 529 </div>
311 - <div class="col-xs-6 col-md-3">  
312 - <div class="panel bg-teal-gradient no-border">  
313 - <div class="panel-body">  
314 - <div class="ibox-title">  
315 - <span class="label label-primary pull-right">{:__('Real time')}</span>  
316 - <h5>{:__('Database count')}</h5>  
317 </div> 530 </div>
318 - <div class="ibox-content">  
319 - <div class="row">  
320 - <div class="col-md-6">  
321 - <h1 class="no-margins">{$dbtablenums}</h1>  
322 - <div class="font-bold"><i class="fa fa-database"></i>  
323 - <small>{:__('Database table nums')}</small>  
324 </div> 531 </div>
  532 + <div class="project_list">
  533 + <div class="project_list_title">
  534 + <div class="project_list_title_left">快捷入口</div>
325 </div> 535 </div>
326 - <div class="col-md-6">  
327 - <h1 class="no-margins">{$dbsize|format_bytes=###,'',0}</h1>  
328 - <div class="font-bold"><i class="fa fa-filter"></i>  
329 - <small>{:__('Database size')}</small> 536 +
  537 + <div class="project_list_main">
  538 + {volist name="quick_entrance" id="vo" }
  539 + <div class="project_list_main_item">
  540 + <div class="project_list_main_item_top">
  541 + <div>{$vo.project_name}</div>
  542 + <div>{$vo.starttime|date="Y-m-d",###}</div>
330 </div> 543 </div>
  544 + <div class="project_list_main_item_bottom">
  545 + <div>负责人:{$vo.username}</div>
  546 + <div class="project_list_main_item_bottom_right">
  547 + <img src="__CDN__/assets/img/IconGrid.png" alt="">
  548 + {$vo.all_working_hours}小时
331 </div> 549 </div>
332 </div> 550 </div>
333 </div> 551 </div>
  552 + {/volist}
334 </div> 553 </div>
335 </div> 554 </div>
336 </div> 555 </div>
337 556
338 - <div class="col-xs-6 col-md-3">  
339 - <div class="panel bg-purple-gradient no-border">  
340 - <div class="panel-body">  
341 - <div class="ibox-title">  
342 - <span class="label label-primary pull-right">{:__('Real time')}</span>  
343 - <h5>{:__('Attachment count')}</h5>  
344 - </div>  
345 - <div class="ibox-content">  
346 557
347 - <div class="row">  
348 - <div class="col-md-6">  
349 - <h1 class="no-margins">{$attachmentnums}</h1>  
350 - <div class="font-bold"><i class="fa fa-files-o"></i>  
351 - <small>{:__('Attachment nums')}</small>  
352 - </div>  
353 - </div>  
354 - <div class="col-md-6">  
355 - <h1 class="no-margins">{$attachmentsize|format_bytes=###,'',0}</h1>  
356 - <div class="font-bold"><i class="fa fa-filter"></i>  
357 - <small>{:__('Attachment size')}</small>  
358 - </div>  
359 - </div>  
360 - </div>  
361 - </div> 558 + <div class="console_right">
  559 + <div class="user_info">
  560 + <div class="user_info_avatar">
  561 + {$admin.nickname|htmlentities}
362 </div> 562 </div>
  563 + <div class="user_info_name">
  564 + <div class="user_info_name">
  565 + <div style="font-weight: bold;">{$admin.nickname|htmlentities}</div>
  566 + <div style="font-size: 14px">最近登录:{$admin.logintime|date="Y-m-d",###}</div>
363 </div> 567 </div>
364 </div> 568 </div>
365 - <div class="col-xs-6 col-md-3">  
366 - <div class="panel bg-green-gradient no-border">  
367 - <div class="panel-body">  
368 - <div class="ibox-title">  
369 - <span class="label label-primary pull-right">{:__('Real time')}</span>  
370 - <h5>{:__('Picture count')}</h5>  
371 - </div>  
372 - <div class="ibox-content">  
373 569
374 - <div class="row">  
375 - <div class="col-md-6">  
376 - <h1 class="no-margins">{$picturenums}</h1>  
377 - <div class="font-bold"><i class="fa fa-picture-o"></i>  
378 - <small>{:__('Picture nums')}</small>  
379 - </div>  
380 - </div>  
381 - <div class="col-md-6">  
382 - <h1 class="no-margins">{$picturesize|format_bytes=###,'',0}</h1>  
383 - <div class="font-bold"><i class="fa fa-filter"></i>  
384 - <small>{:__('Picture size')}</small>  
385 - </div>  
386 - </div> 570 + <div class="user_info_menu">
  571 + {if $admin.id=="1"}
  572 + 超级管理员
  573 + {else/}
  574 + 管理员
  575 + {/if}
387 </div> 576 </div>
388 </div> 577 </div>
  578 +
  579 + <div class="rankings">
  580 + <div class="rankings_title">
  581 + <div class="rankings_title_left">工时统计排行</div>
  582 + <div class="rankings_title_right">
  583 + <div class="rankings_title_right_item rankings_title_right_item_active" id="project_rank" name="project_rank">项目排行</div>
  584 + <div class="rankings_title_right_item " id="department_rank" name="department_rank">部门排行</div>
  585 + <div class="rankings_title_right_item " id="employee_rank" name="employee_rank">员工排行</div>
389 </div> 586 </div>
390 </div> 587 </div>
  588 +
  589 + <div class="rankings_list" id="project_rank_list" name="project_rank_list">
  590 + {volist name="$work_hour_statistics.project_statistics" id="vo" }
  591 + <div class="rankings_item">
  592 + <div>{$vo.name}</div>
  593 + <div>创建时间:{$vo.starttime|date="Y-m-d",###}</div>
  594 + <div>{$vo.all_working_hours}小时</div>
391 </div> 595 </div>
  596 + {/volist}
392 </div> 597 </div>
  598 + <div class="rankings_list" style="display: none" id="department_rank_list" name="department_rank_list">
  599 + {volist name="$work_hour_statistics.department_statistics" id="vo" }
  600 + <div class="rankings_item">
  601 + <div>{$vo.name}</div>
  602 + <div>创建时间:{$vo.starttime|date="Y-m-d",###}</div>
  603 + <div>{$vo.all_working_hours}小时</div>
393 </div> 604 </div>
394 - <div class="tab-pane fade" id="two">  
395 - <div class="row">  
396 - <div class="col-xs-12">  
397 - {:__('Custom zone')} 605 + {/volist}
398 </div> 606 </div>
  607 + <div class="rankings_list" style="display: none" id="employee_rank_list" name="employee_rank_list">
  608 + {volist name="$work_hour_statistics.admin_statistics" id="vo" }
  609 + <div class="rankings_item">
  610 + <div>{$vo.name}</div>
  611 + <div>创建时间:{$vo.starttime|date="Y-m-d",###}</div>
  612 + <div>{$vo.all_working_hours}小时</div>
399 </div> 613 </div>
  614 + {/volist}
400 </div> 615 </div>
401 </div> 616 </div>
402 </div> 617 </div>
  618 +
403 </div> 619 </div>
  620 +<script>
  621 + function projectinfo(id){
  622 + layer.open({
  623 + type: 2,
  624 + title: '项目详情',
  625 + maxmin: true,
  626 + shadeClose: true, //点击遮罩关闭层
  627 + area : ['800px' , '520px'],
  628 + content: 'dashboard/projectinfo?id='+id,
  629 + });
  630 + }
  631 +</script>
  632 +<script>
  633 + $('#project_rank').click(function() {
  634 + $('#project_rank_list').show();
  635 + $('#department_rank_list').hide();
  636 + $('#employee_rank_list').hide();
  637 + });
  638 + $('#department_rank').click(function() {
  639 + $('#project_rank_list').hide();
  640 + $('#department_rank_list').show();
  641 + $('#employee_rank_list').hide();
  642 + });
  643 +
  644 + $('#employee_rank').click(function() {
  645 + $('#project_rank_list').hide();
  646 + $('#department_rank_list').hide();
  647 + $('#employee_rank_list').show();
  648 + });
  649 +
  650 +
  651 +
  652 +
  653 +</script>
  654 +<script>
  655 + const dom = document.getElementById('chart-container');
  656 + const myChart = echarts.init(dom, null, {
  657 + renderer: 'canvas',
  658 + useDirtyRect: false
  659 + });
  660 + const app = {};
  661 +
  662 + let option;
  663 +
  664 + option = {
  665 + grid: {
  666 + left: "0%",
  667 + right: "0%",
  668 + top: "16%",
  669 + bottom: "10%",
  670 + containLabel: true,
  671 + },
  672 + series: [
  673 + {
  674 + name: 'Nightingale Chart',
  675 + type: 'pie',
  676 + radius: [50, 250],
  677 + center: ['50%', '55%'],
  678 + roseType: 'area',
  679 + itemStyle: {
  680 + borderRadius: 8
  681 + },
  682 + data: <?php echo json_encode($project_overview_chart); ?>
  683 + }
  684 + ]
  685 + };
  686 +
  687 +
  688 + if (option && typeof option === 'object') {
  689 + myChart.setOption(option);
  690 + }
  691 +
  692 + window.addEventListener('resize', myChart.resize);
  693 +
  694 +
  695 + const project_rank = document.getElementById('project_rank');
  696 + const department_rank = document.getElementById('department_rank');
  697 + const employee_rank = document.getElementById('employee_rank');
  698 +
  699 +
  700 + project_rank.addEventListener('click', function() {
  701 + project_rank.classList.add('rankings_title_right_item_active');
  702 + department_rank.classList.remove('rankings_title_right_item_active');
  703 + employee_rank.classList.remove('rankings_title_right_item_active');
  704 + // 事件处理代码
  705 + });
  706 +
  707 +
  708 + department_rank.addEventListener('click', function() {
  709 + project_rank.classList.remove('rankings_title_right_item_active');
  710 + department_rank.classList.add('rankings_title_right_item_active');
  711 + employee_rank.classList.remove('rankings_title_right_item_active');
  712 + // 事件处理代码
  713 + });
  714 +
  715 +
  716 + employee_rank.addEventListener('click', function() {
  717 + employee_rank.classList.add('rankings_title_right_item_active');
  718 + project_rank.classList.remove('rankings_title_right_item_active');
  719 + department_rank.classList.remove('rankings_title_right_item_active');
  720 + // 事件处理代码
  721 + });
  722 +</script>
  1 +<style>
  2 + .table-adminlog tr td {
  3 + word-break: break-all;
  4 + }
  5 +</style>
  6 +<table class="table table-striped table-adminlog">
  7 + <thead>
  8 + <tr>
  9 + <th width="100">{:__('Title')}</th>
  10 + <th>{:__('Content')}</th>
  11 + </tr>
  12 + </thead>
  13 + <tbody>
  14 + {volist name="row" id="vo" }
  15 + <tr>
  16 + <td>{:__($key)}</td>
  17 + <td>
  18 + {if $key=='createtime'}
  19 + {$vo|date="Y-m-d",###}
  20 + {elseif $key=='starttime'}
  21 + {$vo|date="Y-m-d",###}
  22 + {elseif $key=='endtime'}
  23 + {$vo|date="Y-m-d",###}
  24 + {elseif $key=='image'}
  25 + <img src="{$vo}" alt="">
  26 + {elseif $key=='all_working_hours'}
  27 + {$vo|htmlentities} 小时
  28 + {else/}
  29 + {$vo|htmlentities}
  30 + {/if}
  31 +
  32 + </td>
  33 + </tr>
  34 + {/volist}
  35 + </tbody>
  36 +</table>
  37 +<div class="hide layer-footer">
  38 + <label class="control-label col-xs-12 col-sm-2"></label>
  39 + <div class="col-xs-12 col-sm-8">
  40 + <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
  41 + </div>
  42 +</div>
  1 +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 + {:token()}
  3 + <div class="form-group">
  4 + <label for="c-pid" class="control-label col-xs-12 col-sm-2">{:__('上级部门')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <select id="c-pid" data-rule="required" class="form-control selectpicker" name="row[pid]">
  7 + {foreach name="parentList" item="vo"}
  8 + <option value="{$key}">{$vo.name}</option>
  9 + {/foreach}
  10 + </select>
  11 + </div>
  12 + </div>
  13 + <div class="form-group">
  14 + <label class="control-label col-xs-12 col-sm-2">{:__('部门名称')}:</label>
  15 + <div class="col-xs-12 col-sm-8">
  16 + <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text">
  17 + </div>
  18 + </div>
  19 +
  20 +
  21 + <div class="form-group layer-footer">
  22 + <label class="control-label col-xs-12 col-sm-2"></label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  25 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  26 + </div>
  27 + </div>
  28 +</form>
  1 +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 + {:token()}
  3 + <div class="form-group">
  4 + <label for="c-pid" class="control-label col-xs-12 col-sm-2">{:__('上级部门')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <select id="c-pid" data-rule="required" class="form-control selectpicker" name="row[pid]">
  7 + {foreach name="parentList" item="vo"}
  8 + <option value="{$key}" {in name="key" value="$row.pid"}selected{/in}>{$vo.name}</option>
  9 + {/foreach}
  10 + </select>
  11 +
  12 + </div>
  13 + </div>
  14 + <div class="form-group">
  15 + <label class="control-label col-xs-12 col-sm-2">{:__('部门名称')}:</label>
  16 + <div class="col-xs-12 col-sm-8">
  17 + <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="{$row.name|htmlentities}">
  18 + </div>
  19 + </div>
  20 +
  21 + <div class="form-group layer-footer">
  22 + <label class="control-label col-xs-12 col-sm-2"></label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  25 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  26 + </div>
  27 + </div>
  28 +</form>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
  10 + <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('department/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
  11 + <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('department/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
  12 + <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('department/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
  13 +
  14 +
  15 +
  16 +
  17 +
  18 + </div>
  19 + <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
  20 + data-operate-edit="{:$auth->check('department/edit')}"
  21 + data-operate-del="{:$auth->check('department/del')}"
  22 + width="100%">
  23 + </table>
  24 + </div>
  25 + </div>
  26 +
  27 + </div>
  28 + </div>
  29 +</div>
  1 +<table class="table table-striped">
  2 + <thead>
  3 + <tr>
  4 + <th>{:__('Title')}</th>
  5 + <th>{:__('Content')}</th>
  6 + </tr>
  7 + </thead>
  8 + <tbody>
  9 + {volist name="row" id="vo" }
  10 + <tr>
  11 + <td>{$key}</td>
  12 + <td style="word-break: break-all;">{$vo|htmlentities}</td>
  13 + </tr>
  14 + {/volist}
  15 + {if $Think.get.dialog}
  16 + <tr>
  17 + <td>回传数据</td>
  18 + <td>
  19 + <div class="input-group">
  20 + <input name="callback" class="form-control" value="test" />
  21 + <span class="input-group-btn"><a href="javascript:;" class="btn btn-success btn-callback" >回传数据</a></span>
  22 + </div>
  23 + </td>
  24 + </tr>
  25 + {/if}
  26 + </tbody>
  27 +</table>
  28 +<div class="hide layer-footer">
  29 + <label class="control-label col-xs-12 col-sm-2"></label>
  30 + <div class="col-xs-12 col-sm-8">
  31 + <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
  32 + </div>
  33 +</div>
  1 +<table class="table table-striped">
  2 + <tbody>
  3 + <tr><td>这里是编辑窗口</td></tr>
  4 + </tbody>
  5 +</table>
  6 +<div class="hide layer-footer">
  7 + <label class="control-label col-xs-12 col-sm-2"></label>
  8 + <div class="col-xs-12 col-sm-8">
  9 + <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
  10 + </div>
  11 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 +
  3 + <div class="panel-heading">
  4 + {:build_heading(null,FALSE)}
  5 + <ul class="nav nav-tabs nav-custom-condition">
  6 + <li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
  7 + <li class=""><a href="#t-1" data-value='1' data-toggle="tab">自定义搜索条件1</a></li>
  8 + <li class=""><a href="#t-2" data-value='2' data-toggle="tab">自定义搜索条件2</a></li>
  9 + </ul>
  10 + </div>
  11 +
  12 +
  13 + <div class="panel-body">
  14 + <div id="myTabContent" class="tab-content">
  15 + <div class="tab-pane fade active in" id="one">
  16 + <div class="widget-body no-padding">
  17 + <div id="toolbar" class="toolbar">
  18 + {:build_toolbar('refresh,delete')}
  19 + <a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
  20 + <div class="dropdown btn-group">
  21 + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> <?= __('More') ?></a>
  22 + <ul class="dropdown-menu text-left" role="menu">
  23 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
  24 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
  25 + </ul>
  26 + </div>
  27 + <a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-user"></i> 自定义搜索</a>
  28 + <a class="btn btn-success btn-change btn-start" data-params="action=start" data-url="example/bootstraptable/start" href="javascript:;"><i class="fa fa-play"></i> 启动</a>
  29 + <a class="btn btn-danger btn-change btn-pause" data-params="action=pause" data-url="example/bootstraptable/pause" href="javascript:;"><i class="fa fa-pause"></i> 暂停</a>
  30 + <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
  31 + <span class="extend">
  32 + 金额:<span id="money">0</span>
  33 + 单价:<span id="price">0</span>
  34 + </span>
  35 + </a>
  36 + </div>
  37 + <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
  38 +
  39 + </table>
  40 +
  41 + </div>
  42 + </div>
  43 +
  44 + </div>
  45 + </div>
  46 +</div>
  47 +<script id="categorytpl" type="text/html">
  48 + <div class="row">
  49 + <div class="col-xs-12">
  50 + <div class="form-inline" data-toggle="cxselect" data-selects="group,admin">
  51 + <select class="group form-control" name="group" data-url="example/bootstraptable/cxselect?type=group"></select>
  52 + <select class="admin form-control" name="admin_id" data-url="example/bootstraptable/cxselect?type=admin" data-query-name="group_id"></select>
  53 + <input type="hidden" class="operate" data-name="admin_id" value="=" />
  54 + </div>
  55 + </div>
  56 + </div>
  57 +</script>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<style>
  2 + .upload-image {
  3 + background: url('__CDN__/assets/addons/example/img/plus.png') no-repeat center center;
  4 + background-size: 30px 30px;
  5 + height: 30px;
  6 + width: 30px;
  7 + border: 1px solid #ccc;
  8 + }
  9 +
  10 + textarea.form-control {
  11 + background: #eee;
  12 + }
  13 +</style>
  14 +<div class="row">
  15 + <div class="col-md-6">
  16 + <div class="box box-success">
  17 + <div class="panel-heading">
  18 + {:__('自定义图片描述')}
  19 + </div>
  20 + <div class="panel-body">
  21 + <div class="alert alert-success-light">
  22 + <b>温馨提示</b><br>
  23 + 默认我们的多图是没有图片描述的,如果我们需要自定义描述,可以使用以下的自定义功能<br>
  24 + 特别注意的是图片的url和描述是分开储存的,也就是说图片一个字段,描述一个字段,你在前台使用时需要自己匹配映射关系<br>
  25 + <b>下面的演示textarea为了便于调试,设置为可见的,实际使用中应该添加个hidden的class进行隐藏</b>
  26 + </div>
  27 + <form id="first-form" role="form" data-toggle="validator" method="POST" action="">
  28 + <div class="form-group row">
  29 + <label class="control-label col-xs-12">{:__('一维数组示例')}:</label>
  30 + <div class="col-xs-12">
  31 + <div class="input-group">
  32 + <input id="c-files" data-rule="required" class="form-control" size="50" name="row[files]" type="text" value="https://cdn.fastadmin.net/uploads/addons/blog.png,https://cdn.fastadmin.net/uploads/addons/cms.png,https://cdn.fastadmin.net/uploads/addons/vote.png">
  33 + <div class="input-group-addon no-border no-padding">
  34 + <span><button type="button" id="plupload-files" class="btn btn-danger plupload" data-input-id="c-files" data-mimetype="*" data-multiple="true" data-preview-id="p-files"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
  35 + <span><button type="button" id="fachoose-files" class="btn btn-primary fachoose" data-input-id="c-files" data-mimetype="*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
  36 + </div>
  37 + <span class="msg-box n-right" for="c-files"></span>
  38 + </div>
  39 +
  40 + <!--ul需要添加 data-template和data-name属性,并一一对应且唯一 -->
  41 + <ul class="row list-inline plupload-preview" id="p-files" data-template="introtpl" data-name="row[intro]"></ul>
  42 +
  43 + <!--请注意 ul和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
  44 + <textarea name="row[intro]" class="form-control" style="margin-top:5px;">["简洁响应式博客","CMS内容管理系统","在线投票系统"]</textarea>
  45 +
  46 + <!--这里自定义图片预览的模板 开始-->
  47 + <script type="text/html" id="introtpl">
  48 + <li class="col-xs-3">
  49 + <a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail">
  50 + <img src="<%=fullurl%>" class="img-responsive">
  51 + </a>
  52 + <input type="text" name="row[intro][<%=index%>]" class="form-control mb-1" placeholder="请输入文件描述" value="<%=value?value:''%>"/>
  53 + <a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a>
  54 + </li>
  55 + </script>
  56 + <!--这里自定义图片预览的模板 结束-->
  57 + </div>
  58 + </div>
  59 + <div class="form-group row">
  60 + <label class="control-label col-xs-12">{:__('二维数组示例')}:</label>
  61 + <div class="col-xs-12">
  62 + <div class="input-group">
  63 + <input id="c-images" data-rule="required" class="form-control" size="50" name="row[images]" type="text" value="https://cdn.fastadmin.net/uploads/addons/example.png,https://cdn.fastadmin.net/uploads/addons/upyun.png,https://cdn.fastadmin.net/uploads/addons/alioss.png">
  64 + <div class="input-group-addon no-border no-padding">
  65 + <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
  66 + <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
  67 + </div>
  68 + <span class="msg-box n-right" for="c-images"></span>
  69 + </div>
  70 +
  71 + <!--ul需要添加 data-template和data-name属性,并一一对应且唯一 -->
  72 + <ul class="row list-inline plupload-preview" id="p-images" data-template="desctpl" data-name="row[desc]"></ul>
  73 +
  74 + <!--请注意 ul和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
  75 + <textarea name="row[desc]" class="form-control" style="margin-top:5px;">[{"info":"开发者示例插件","size":"1M"},{"info":"又拍云储存整合","size":"2M"},{"info":"阿里OSS云储存","size":"1M"}]</textarea>
  76 +
  77 + <!--这里自定义图片预览的模板 开始-->
  78 + <script type="text/html" id="desctpl">
  79 + <li class="col-xs-3">
  80 + <a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail">
  81 + <img src="<%=fullurl%>" class="img-responsive">
  82 + </a>
  83 + <input type="text" name="row[desc][<%=index%>][info]" class="form-control mb-1" placeholder="请输入插件描述" value="<%=value?value['info']:''%>"/>
  84 + <input type="text" name="row[desc][<%=index%>][size]" class="form-control mb-1" placeholder="请输入插件大小" value="<%=value?value['size']:''%>"/>
  85 + <a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a>
  86 + </li>
  87 + </script>
  88 + <!--这里自定义图片预览的模板 结束-->
  89 + </div>
  90 + </div>
  91 + <div class="form-group row">
  92 + <label class="control-label col-xs-12"></label>
  93 + <div class="col-xs-12">
  94 + <button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
  95 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  96 + </div>
  97 + </div>
  98 +
  99 + </form>
  100 + </div>
  101 + </div>
  102 +
  103 + </div>
  104 + <div class="col-md-6">
  105 + <div class="box box-info">
  106 + <div class="panel-heading">
  107 + {:__('自定义Fieldlist示例')}
  108 + </div>
  109 + <div class="panel-body">
  110 + <div class="alert alert-danger-light">
  111 + <b>温馨提示</b><br>
  112 + 默认的fieldlist为键值形式,如果需要一维数组或二维数组,可使用下面的自定义模板来实现<br>
  113 + 默认追加的元素是没有进行事件绑定的,我们需要监听btn-append这个按钮的fa.event.appendfieldlist事件<br>
  114 + <b>下面的演示textarea为了便于调试,设置为可见的,实际使用中应该添加个hidden的class进行隐藏</b>
  115 + </div>
  116 + <form id="second-form" role="form" data-toggle="validator" method="POST" action="">
  117 + <div class="form-group row">
  118 + <label class="control-label col-xs-12">
  119 + {:__('Fieldlist一维示例')}:
  120 + <span style="font-weight: normal"><font color="red">只支持FastAdmin1.5.0+</font> {if version_compare($Think.config.fastadmin.version, '1.5.0')<0}<span class="label label-danger">你当前FastAdmin版本不支持</span>{/if}</span>
  121 + </label>
  122 + <div class="col-xs-12">
  123 + <dl class="list-unstyled fieldlist" data-template="singletpl" data-name="row[single]" id="single-table">
  124 + <dd>
  125 + <ins>{:__('标题')}</ins>
  126 + </dd>
  127 + <dd>
  128 + <ins><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></ins>
  129 + </dd>
  130 + </dl>
  131 +
  132 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  133 + <textarea name="row[single]" class="form-control" cols="30" rows="5">["你好","世界"]</textarea>
  134 + <script id="singletpl" type="text/html">
  135 + <dd class="form-inline">
  136 + <ins><input type="text" name="<%=name%>[<%=index%>][value]" class="form-control" size="15" value="<%=row%>" placeholder="标题"/></ins>
  137 + <ins>
  138 + <!--下面的两个按钮务必保留-->
  139 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  140 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  141 + </ins>
  142 + </dd>
  143 + </script>
  144 + </div>
  145 + </div>
  146 + <div class="form-group row">
  147 + <label class="control-label col-xs-12">{:__('Fieldlist一维键值示例')}:</label>
  148 + <div class="col-xs-12">
  149 + <dl class="list-unstyled fieldlist" data-name="row[keyvalue]" id="keyvalue-table">
  150 + <dd>
  151 + <ins>{:__('标题')}</ins>
  152 + </dd>
  153 + <dd>
  154 + <ins><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></ins>
  155 + </dd>
  156 + </dl>
  157 +
  158 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  159 + <textarea name="row[keyvalue]" class="form-control" cols="30" rows="5">{"2":"Hello", "1":"World"}</textarea>
  160 + </div>
  161 + </div>
  162 + <div class="form-group row">
  163 + <label class="control-label col-xs-12">{:__('Fieldlist二维数组示例')}:</label>
  164 + <div class="col-xs-12">
  165 + <table class="table fieldlist" data-template="basictpl" data-name="row[basic]" id="first-table">
  166 + <tr>
  167 + <td>{:__('标题')}</td>
  168 + <td>{:__('介绍')}</td>
  169 + <td>{:__('大小')}</td>
  170 + <td>{:__('状态')}</td>
  171 + <td width="100"></td>
  172 + </tr>
  173 + <tr>
  174 + <td colspan="5"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
  175 + </tr>
  176 + </table>
  177 +
  178 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  179 + <textarea name="row[basic]" class="form-control" cols="30" rows="5">[{"title":"开发者示例插件","intro":"开发者必备","size":"1M","state":1},{"title":"又拍云储存整合","intro":"一款云储存插件","size":"2M","state":0},{"title":"阿里OSS云储存","intro":"一款云储存插件","size":"1M","state":1}]</textarea>
  180 + <script id="basictpl" type="text/html">
  181 + <tr class="form-inline">
  182 + <td><input type="text" name="<%=name%>[<%=index%>][title]" class="form-control" size="15" value="<%=row.title||'fast'%>" placeholder="标题"/></td>
  183 + <td><input type="text" name="<%=name%>[<%=index%>][intro]" class="form-control" size="15" value="<%=row.intro%>" placeholder="介绍"/></td>
  184 + <td><input type="text" name="<%=name%>[<%=index%>][size]" class="form-control" style="width:50px" value="<%=row.size%>" placeholder="大小"/></td>
  185 + <td>
  186 + <input type="hidden" name="<%=name%>[<%=index%>][state]" id="c-state-<%=index%>" class="form-control" style="width:50px" value="<%=row.state%>" placeholder="状态"/>
  187 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-state-<%=index%>" data-yes="1" data-no="0">
  188 + <i class="fa fa-toggle-on text-success <%if(row.state!=1){%>fa-flip-horizontal text-gray<%}%> fa-2x"></i>
  189 + </a>
  190 + </td>
  191 + <td>
  192 + <!--下面的两个按钮务必保留-->
  193 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  194 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  195 + </td>
  196 + </tr>
  197 + </script>
  198 + </div>
  199 + </div>
  200 + <div class="form-group row">
  201 + <label class="control-label col-xs-12">{:__('Fieldlist绑定事件示例')}:</label>
  202 + <div class="col-xs-12">
  203 + <table class="table fieldlist" data-template="eventtpl" data-name="row[event]" id="second-table">
  204 + <tr>
  205 + <td>{:__('管理员')}</td>
  206 + <td>{:__('图片')}</td>
  207 + <td>{:__('登录时间')}</td>
  208 + <td width="100"></td>
  209 + </tr>
  210 + <tr>
  211 + <td colspan="4"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
  212 + </tr>
  213 + </table>
  214 +
  215 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  216 + <textarea name="row[event]" class="form-control" cols="30" rows="5">[{"id":"1","image":"/assets/addons/example/img/200x200.png","time":"2019-06-28 12:05:03"}]</textarea>
  217 + <script id="eventtpl" type="text/html">
  218 + <tr class="form-inline">
  219 + <td><input type="text" name="<%=name%>[<%=index%>][id]" class="form-control selectpage" data-source="auth/admin/selectpage" data-field="username" value="<%=row.id%>" placeholder="管理员"/></td>
  220 + <td>
  221 + <input type="hidden" name="<%=name%>[<%=index%>][image]" id="c-image-<%=index%>" value="<%=row.image%>">
  222 + <!--@formatter:off-->
  223 + <button type="button" id="faupload-image" class="btn btn-danger faupload upload-image" data-input-id="c-image-<%=index%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" <%if(row.image){%>style="background-image: url('<%=Fast.api.cdnurl(row.image)%>')"<%}%>></button>
  224 + <!--@formatter:on-->
  225 + </td>
  226 + <td><input type="text" name="<%=name%>[<%=index%>][time]" class="form-control datetimepicker" style="width:120px" value="<%=row.time%>" placeholder="时间"/></td>
  227 + <td>
  228 + <!--下面的两个按钮务必保留-->
  229 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  230 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  231 + </td>
  232 + </tr>
  233 + </script>
  234 + </div>
  235 + </div>
  236 + <div class="form-group row">
  237 + <label class="control-label col-xs-12"></label>
  238 + <div class="col-xs-12">
  239 + <button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
  240 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  241 + </div>
  242 + </div>
  243 +
  244 + </form>
  245 + </div>
  246 + </div>
  247 +
  248 + </div>
  249 + <div class="col-md-6">
  250 + <div class="box box-warning">
  251 + <div class="panel-heading">
  252 + 自动完成+标签输入示例,<font color="red">只支持FastAdmin1.3.0+</font> {if version_compare($Think.config.fastadmin.version, '1.3.0')<0}<span class="label label-danger">你当前FastAdmin版本不支持</span>{/if}
  253 + </div>
  254 + <div class="panel-body">
  255 + <div class="alert alert-danger-light">
  256 + <b>温馨提示</b><br>
  257 + </div>
  258 + <form id="third-form" role="form" data-toggle="validator" method="POST" action="">
  259 +
  260 + <div class="form-group row">
  261 + <label class="control-label col-xs-12">自动完成</label>
  262 + <div class="col-xs-12">
  263 + <input type="text" class="form-control" data-role="autocomplete" data-autocomplete-options='{"url":"example/customform/get_title_list", "minChars":1}'/>
  264 + </div>
  265 + </div>
  266 + <div class="form-group row">
  267 + <label class="control-label col-xs-12">标签输入 <span class="text-muted small">输入后<code>回车</code><code>,</code>确认</span></label>
  268 + <div class="col-xs-12">
  269 + <input type="text" class="form-control" data-role="tagsinput"/>
  270 + </div>
  271 + </div>
  272 + <div class="form-group row">
  273 + <label class="control-label col-xs-12">自动完成+标签输入</label>
  274 + <div class="col-xs-12">
  275 + <input type="text" class="form-control" data-role="tagsinput" data-tagsinput-options='{"minChars":1, "autocomplete":{"url":"example/customform/get_title_list"}}'/>
  276 + </div>
  277 + </div>
  278 + </form>
  279 + </div>
  280 + </div>
  281 + </div>
  282 + <div class="col-md-6">
  283 + <div class="box box-danger">
  284 + <div class="panel-heading">
  285 + 动态显示,<font color="red">只支持FastAdmin1.3.3+</font> {if version_compare($Think.config.fastadmin.version, '1.3.3')<0}<span class="label label-danger">你当前FastAdmin版本不支持</span>{/if}
  286 + </div>
  287 + <div class="panel-body">
  288 + <form id="fourth-form" role="form" data-toggle="validator" method="POST" action="">
  289 +
  290 + <div class="form-group row">
  291 + <label class="control-label col-xs-12">常规使用</label>
  292 + <div class="col-xs-12">
  293 + <input type="radio" name="row[type]" value="value1" checked/> 类型1
  294 + <input type="radio" name="row[type]" value="value2"/> 类型2
  295 + <div data-favisible="type=value1" class="p-3">显示内容1</div>
  296 + <div data-favisible="type=value2" class="p-3">显示内容2</div>
  297 + </div>
  298 + </div>
  299 + <hr>
  300 + <div class="form-group row">
  301 + <label class="control-label col-xs-12">使用开关组件</label>
  302 + <div class="col-xs-12">
  303 +
  304 + <input id="c-switch" name="row[switch]" type="hidden" value="0">
  305 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch" data-yes="1" data-no="0">
  306 + <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
  307 + </a>
  308 +
  309 + <div data-favisible="switch=1" class="p-3">显示内容隐藏的内容</div>
  310 + </div>
  311 + </div>
  312 + <hr>
  313 + <div class="form-group row">
  314 + <label class="control-label col-xs-12">组件嵌套</label>
  315 + <div class="col-xs-12">
  316 + <input type="radio" name="row[mode]" value="value1"/> 模式1
  317 + <input type="radio" name="row[mode]" value="value2"/> 模式2
  318 + <div data-favisible="mode=value1" class="p-3">
  319 + <h4>显示内容1</h4>
  320 + <input id="c-switch1" name="row[switch1]" type="hidden" value="0">
  321 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch1" data-yes="1" data-no="0">
  322 + <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
  323 + </a>
  324 +
  325 + <div data-favisible="switch1=1" class="p-3">显示内容隐藏的内容1</div>
  326 + </div>
  327 + <div data-favisible="mode=value2" class="p-3">
  328 + <h4>显示内容2</h4>
  329 + <input id="c-switch2" name="row[switch2]" type="hidden" value="0">
  330 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch2" data-yes="1" data-no="0">
  331 + <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
  332 + </a>
  333 +
  334 + <div data-favisible="switch2=1" class="p-3">显示内容隐藏的内容2</div>
  335 + </div>
  336 + </div>
  337 + </div>
  338 + <hr>
  339 + <div class="form-group row">
  340 + <label class="control-label col-xs-12">使用内容判断 <span class="text-muted small">只有输入指定的内容才显示</span></label>
  341 + <div class="col-xs-12">
  342 + <input type="text" class="form-control" name="row[title]" placeholder="请输入abc三个字母">
  343 + <div data-favisible="title=abc" class="p-3">显示内容隐藏的内容</div>
  344 + </div>
  345 + </div>
  346 + </form>
  347 + </div>
  348 + </div>
  349 + </div>
  350 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 + </div>
  16 + </div>
  17 +
  18 + </div>
  19 + </div>
  20 +</div>
  21 +
  22 +<script id="customformtpl" type="text/html">
  23 + <!--form表单必须添加form-commsearch这个类-->
  24 + <form action="" class="form-commonsearch">
  25 + <div style="border-radius:2px;margin-bottom:10px;background:#f5f5f5;padding:15px 20px;">
  26 + <h4>自定义搜索表单</h4>
  27 + <hr>
  28 + <div class="row">
  29 + <div class="col-xs-12 col-sm-6 col-md-3">
  30 + <div class="form-group">
  31 + <label class="control-label">ID</label>
  32 + <!--显式的operate操作符-->
  33 + <div class="input-group">
  34 + <div class="input-group-btn">
  35 + <select class="form-control operate" data-name="id" style="width:60px;">
  36 + <option value="=" selected>等于</option>
  37 + <option value=">">大于</option>
  38 + <option value="<">小于</option>
  39 + </select>
  40 + </div>
  41 + <input class="form-control" type="text" name="id" placeholder="" value=""/>
  42 + </div>
  43 + </div>
  44 + </div>
  45 + <div class="col-xs-12 col-sm-6 col-md-3">
  46 + <div class="form-group">
  47 + <label class="control-label">标题</label>
  48 + <!--隐式的operate操作符,必须携带一个classoperate隐藏的文本框,且它的data-name="字段",值为操作符-->
  49 + <input class="operate" type="hidden" data-name="title" value="="/>
  50 + <div>
  51 + <input class="form-control" type="text" name="title" placeholder="请输入查找的标题" value=""/>
  52 + </div>
  53 + </div>
  54 + </div>
  55 + <div class="col-xs-12 col-sm-6 col-md-3">
  56 + <div class="form-group">
  57 + <label class="control-label">管理员ID</label>
  58 + <div class="row" data-toggle="cxselect" data-selects="group,admin">
  59 + <div class="col-xs-6">
  60 + <select class="group form-control" name="group"
  61 + data-url="example/bootstraptable/cxselect?type=group"></select>
  62 + </div>
  63 + <div class="col-xs-6">
  64 + <select class="admin form-control" name="admin_id"
  65 + data-url="example/bootstraptable/cxselect?type=admin"
  66 + data-query-name="group_id"></select>
  67 + </div>
  68 + <input type="hidden" class="operate" data-name="admin_id" value="="/>
  69 + </div>
  70 + </div>
  71 + </div>
  72 + <div class="col-xs-12 col-sm-6 col-md-3">
  73 + <div class="form-group">
  74 + <label class="control-label">用户名</label>
  75 + <input type="hidden" class="operate" data-name="username" value="="/>
  76 + <div>
  77 + <input id="c-category_id" data-source="auth/admin/index" data-primary-key="username"
  78 + data-field="username" class="form-control selectpage" name="username" type="text"
  79 + value="" style="display:block;">
  80 + </div>
  81 + </div>
  82 + </div>
  83 +
  84 + <div class="col-xs-12 col-sm-6 col-md-3" style="min-height:68px;">
  85 + <!--这里添加68px是为了避免刷新时出现元素错位闪屏-->
  86 + <div class="form-group">
  87 + <label class="control-label">IP</label>
  88 + <input type="hidden" class="operate" data-name="ip" value="in"/>
  89 + <div>
  90 + <!--select一个固定的高度-->
  91 + <!--@formatter:off-->
  92 + <select id="c-flag" class="form-control selectpicker" multiple name="ip" style="height:31px;">
  93 + {foreach name="ipList" item="vo"}
  94 + <option value="{$key}" {in name="key" value="" }selected{/in}>{$vo}</option>
  95 + {/foreach}
  96 + </select>
  97 + <!--@formatter:on-->
  98 + </div>
  99 + </div>
  100 + </div>
  101 + <div class="col-xs-12 col-sm-6 col-md-3">
  102 + <div class="form-group">
  103 + <label class="control-label">创建时间</label>
  104 + <input type="hidden" class="operate" data-name="createtime" value="RANGE"/>
  105 + <div>
  106 + <input type="text" class="form-control datetimerange" name="createtime" value=""/>
  107 + </div>
  108 + </div>
  109 + </div>
  110 + <div class="col-xs-12 col-sm-6 col-md-3">
  111 + <div class="form-group">
  112 + <label class="control-label"></label>
  113 + <div class="row">
  114 + <div class="col-xs-6">
  115 + <input type="submit" class="btn btn-success btn-block" value="提交"/>
  116 + </div>
  117 + <div class="col-xs-6">
  118 + <input type="reset" class="btn btn-primary btn-block" value="重置"/>
  119 + </div>
  120 + </div>
  121 + </div>
  122 + </div>
  123 + </div>
  124 + </div>
  125 + </form>
  126 +</script>
  1 +<style>#cxselect-example textarea{margin:10px 0;}</style>
  2 +<div class="panel panel-default panel-intro">
  3 + {:build_heading()}
  4 +
  5 + <div class="panel-body">
  6 + <div id="myTabContent" class="tab-content">
  7 + <div class="tab-pane fade active in" id="one">
  8 + <div class="widget-body no-padding" id="cxselect-example">
  9 + <form id="cxselectform" action="">
  10 + <div class="row">
  11 + <div class="col-md-6">
  12 +
  13 + <div class="panel panel-default">
  14 + <div class="panel-heading"><b>省市区联动</b>(通过AJAX读取数据)</div>
  15 + <div class="panel-body">
  16 + <div class="row">
  17 + <div class="col-xs-9">
  18 + <div class="form-inline" data-toggle="cxselect" data-selects="province,city,area">
  19 + <select class="province form-control" name="province" data-url="ajax/area"></select>
  20 + <select class="city form-control" name="city" data-url="ajax/area"></select>
  21 + <select class="area form-control" name="area" data-url="ajax/area"></select>
  22 + </div>
  23 + </div>
  24 + <div class="col-xs-3 text-right">
  25 + <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
  26 + </div>
  27 + <div class="col-xs-12">
  28 + <textarea class="form-control" rows="8">
  29 + </textarea>
  30 + </div>
  31 + </div>
  32 + <div class="row">
  33 + <div class="col-xs-9">
  34 + <div class="form-inline" data-toggle="cxselect" data-selects="province,city,area">
  35 + <select class="province form-control" name="province" data-url="ajax/area">
  36 + <option value="1964" selected>广东省</option>
  37 + </select>
  38 + <select class="city form-control" name="city" data-url="ajax/area">
  39 + <option value="1988" selected>深圳市</option>
  40 + </select>
  41 + <select class="area form-control" name="area" data-url="ajax/area">
  42 + <option value="1991" selected>南山区</option>
  43 + </select>
  44 + </div>
  45 + </div>
  46 + <div class="col-xs-3 text-right">
  47 + <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
  48 + </div>
  49 + <div class="col-xs-12">
  50 + <textarea class="form-control" rows="8">
  51 + </textarea>
  52 + </div>
  53 + </div>
  54 + </div>
  55 +
  56 + </div>
  57 + </div>
  58 + <div class="col-md-6">
  59 + <div class="panel panel-default">
  60 + <div class="panel-heading"><b>类别联动</b>(Ajax读取数据)</div>
  61 + <div class="panel-body">
  62 + <div class="row">
  63 + <div class="col-xs-9">
  64 + <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
  65 + <select class="first form-control" name="first" data-url="ajax/category?type=page&pid=5"></select>
  66 + <select class="second form-control" name="second" data-url="ajax/category" data-query-name="pid"></select>
  67 + </div>
  68 + </div>
  69 + <div class="col-xs-3 text-right">
  70 + <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
  71 + </div>
  72 + <div class="col-xs-12">
  73 + <textarea class="form-control" rows="8">
  74 + </textarea>
  75 + </div>
  76 + </div>
  77 + <div class="row">
  78 + <div class="col-xs-9">
  79 + <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
  80 + <select class="first form-control" name="first" data-url="ajax/category?type=page&pid=5">
  81 + <option value="6" selected>网站建站</option>
  82 + </select>
  83 + <select class="second form-control" name="second" data-url="ajax/category" data-query-name="pid">
  84 + <option value="9" selected>移动端</option>
  85 + </select>
  86 + </div>
  87 + </div>
  88 + <div class="col-xs-3 text-right">
  89 + <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
  90 + </div>
  91 + <div class="col-xs-12">
  92 + <textarea class="form-control" rows="8">
  93 + </textarea>
  94 + </div>
  95 + </div>
  96 +
  97 + </div>
  98 + </div>
  99 + </div>
  100 + <div class="col-md-6">
  101 + <div class="panel panel-default">
  102 + <div class="panel-heading"><b>省市区联动</b>(通过JSON渲染数据)</div>
  103 + <div class="panel-body">
  104 + <div class="row">
  105 + <div class="col-xs-9">
  106 + <!--由于在初始化中修改了默认值,所以这里需要修改-jsonSpace/jsonValue/jsonName的值-->
  107 + <div class="form-inline" data-toggle="cxselect" data-url="__CDN__/assets/libs/fastadmin-cxselect/js/cityData.min.json"
  108 + data-selects="province,city,area" data-json-space="" data-json-name="n" data-json-value="">
  109 + <select class="province form-control" name="province"></select>
  110 + <select class="city form-control" name="city"></select>
  111 + <select class="area form-control" name="area"></select>
  112 + </div>
  113 + </div>
  114 + <div class="col-xs-3 text-right">
  115 + <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
  116 + </div>
  117 + <div class="col-xs-12">
  118 + <textarea class="form-control" rows="8">
  119 + </textarea>
  120 + </div>
  121 + </div>
  122 + <div class="row">
  123 + <div class="col-xs-9">
  124 + <!--由于在初始化中修改了默认值,所以这里需要修改-jsonSpace/jsonValue/jsonName的值-->
  125 + <div class="form-inline" data-toggle="cxselect" data-url="__CDN__/assets/libs/fastadmin-cxselect/js/cityData.min.json"
  126 + data-selects="province,city,area" data-json-space="" data-json-name="n" data-json-value="">
  127 + <select class="province form-control" data-first-title="选择省">
  128 + <option value="">请选择</option>
  129 + <option value="浙江省" selected>浙江省</option>
  130 + </select>
  131 + <select class="city form-control" data-first-title="选择市">
  132 + <option value="">请选择</option>
  133 + <option value="杭州市" selected>杭州市</option>
  134 + </select>
  135 + <select class="area form-control" data-first-title="选择地区">
  136 + <option value="">请选择</option>
  137 + <option value="西湖区" selected>西湖区</option>
  138 + </select>
  139 + </div>
  140 + </div>
  141 + <div class="col-xs-3 text-right">
  142 + <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
  143 + </div>
  144 + <div class="col-xs-12">
  145 + <textarea class="form-control" rows="8">
  146 + </textarea>
  147 + </div>
  148 + </div>
  149 + </div>
  150 +
  151 + </div>
  152 + </div>
  153 + </div>
  154 + </form>
  155 + </div>
  156 + </div>
  157 +
  158 + </div>
  159 + </div>
  160 +</div>
  1 +<style>
  2 + .tab-content > .chart {
  3 + padding: 10px;
  4 + }
  5 +</style>
  6 +<div class="row">
  7 + <div class="col-lg-3 col-xs-6">
  8 + <!-- small box -->
  9 + <div class="small-box bg-aqua">
  10 + <div class="inner">
  11 + <h3>150</h3>
  12 +
  13 + <p>今日订单</p>
  14 + </div>
  15 + <div class="icon">
  16 + <i class="fa fa-shopping-cart"></i>
  17 + </div>
  18 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  19 + </div>
  20 + </div>
  21 + <!-- ./col -->
  22 + <div class="col-lg-3 col-xs-6">
  23 + <!-- small box -->
  24 + <div class="small-box bg-green">
  25 + <div class="inner">
  26 + <h3>53<sup style="font-size: 20px">%</sup></h3>
  27 +
  28 + <p>同比增长率</p>
  29 + </div>
  30 + <div class="icon">
  31 + <i class="fa fa-area-chart"></i>
  32 + </div>
  33 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  34 + </div>
  35 + </div>
  36 + <!-- ./col -->
  37 + <div class="col-lg-3 col-xs-6">
  38 + <!-- small box -->
  39 + <div class="small-box bg-yellow">
  40 + <div class="inner">
  41 + <h3>44</h3>
  42 +
  43 + <p>今日注册用户数</p>
  44 + </div>
  45 + <div class="icon">
  46 + <i class="fa fa-users"></i>
  47 + </div>
  48 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  49 + </div>
  50 + </div>
  51 + <!-- ./col -->
  52 + <div class="col-lg-3 col-xs-6">
  53 + <!-- small box -->
  54 + <div class="small-box bg-red">
  55 + <div class="inner">
  56 + <h3>65</h3>
  57 +
  58 + <p>唯一访客用户</p>
  59 + </div>
  60 + <div class="icon">
  61 + <i class="fa fa-user"></i>
  62 + </div>
  63 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  64 + </div>
  65 + </div>
  66 + <!-- ./col -->
  67 +</div>
  68 +<!-- /.row -->
  69 +<!-- Main row -->
  70 +<div class="row" style="margin-bottom:5px;">
  71 + <!-- Left col -->
  72 + <section class="col-lg-7 connectedSortable">
  73 + <!-- Custom tabs (Charts with tabs)-->
  74 + <div class="nav-tabs-custom charts-custom">
  75 + <!-- Tabs within a box -->
  76 + <ul class="nav nav-tabs pull-right">
  77 + <li class="active"><a href="#line-chart" data-toggle="tab">折线图</a></li>
  78 + <li><a href="#area-chart" data-toggle="tab">区域图</a></li>
  79 + <li class="pull-left header"><i class="fa fa-inbox"></i> 销售趋势</li>
  80 + </ul>
  81 + <div class="tab-content no-padding">
  82 + <!-- Morris chart - Sales -->
  83 + <div class="chart tab-pane active" id="line-chart" style="position: relative; height: 300px;"></div>
  84 + <div class="chart tab-pane" id="area-chart" style="position: relative; height: 300px;"></div>
  85 + </div>
  86 + </div>
  87 + <div class="nav-tabs-custom charts-custom">
  88 + <!-- Tabs within a box -->
  89 + <ul class="nav nav-tabs pull-right">
  90 + <li class="active"><a href="#pie-chart" data-toggle="tab">饼图</a></li>
  91 + <li><a href="#bar-chart" data-toggle="tab">柱状图</a></li>
  92 + <li class="pull-left header"><i class="fa fa-inbox"></i> 访问记录</li>
  93 + </ul>
  94 + <div class="tab-content no-padding">
  95 + <!-- Morris chart - Sales -->
  96 + <div class="chart tab-pane active" id="pie-chart" style="position: relative; height: 300px;"></div>
  97 + <div class="chart tab-pane" id="bar-chart" style="position: relative; height: 300px;"></div>
  98 + </div>
  99 + </div>
  100 + <!-- /.nav-tabs-custom -->
  101 +
  102 + </section>
  103 + <!-- /.Left col -->
  104 + <section class="col-lg-5 connectedSortable">
  105 +
  106 + <!-- Map box -->
  107 + <div class="box box-solid bg-light-blue-gradient">
  108 + <div class="box-header">
  109 + <!-- tools box -->
  110 + <div class="pull-right box-tools">
  111 + </div>
  112 + <!-- /. tools -->
  113 +
  114 + <i class="fa fa-map-marker"></i>
  115 +
  116 + <h3 class="box-title">
  117 + 访客分布
  118 + </h3>
  119 + </div>
  120 + <div class="box-body">
  121 + <div id="simplebar-chart" style="height: 250px; width: 100%;"></div>
  122 + </div>
  123 + <!-- /.box-body-->
  124 + <div class="box-footer no-border">
  125 + <div class="row">
  126 + <div class="col-xs-12 text-center">
  127 + <div class="knob-label">统计最近一周访客的记录</div>
  128 + </div>
  129 + <!-- ./col -->
  130 + </div>
  131 + <!-- /.row -->
  132 + </div>
  133 + </div>
  134 + <!-- /.box -->
  135 +
  136 + <!-- solid sales graph -->
  137 + <div class="box box-solid bg-teal-gradient">
  138 + <div class="box-header">
  139 + <i class="fa fa-th"></i>
  140 +
  141 + <h3 class="box-title">订单趋势</h3>
  142 +
  143 + <div class="box-tools pull-right">
  144 + </div>
  145 + </div>
  146 + <div class="box-body border-radius-none">
  147 + <div class="chart" id="smoothline-chart" style="height: 250px;"></div>
  148 + </div>
  149 + <!-- /.box-body-->
  150 + <div class="box-footer no-border">
  151 + <div class="row">
  152 + <div class="col-xs-12 text-center">
  153 + <div class="knob-label">统计最近一周订单的趋势</div>
  154 + </div>
  155 + <!-- ./col -->
  156 + </div>
  157 + <!-- /.row -->
  158 + </div>
  159 + </div>
  160 + <!-- /.box -->
  161 +
  162 + </section>
  163 + <!-- right col -->
  164 +</div>
  165 +<!-- /.row (main row) -->
  1 +<div class="panel panel-default panel-intro">
  2 + <div class="panel-heading">
  3 + <div class="panel-lead"><em>多表格(Multitable)</em>用于展示在一个页面展示多个表格数据,并且每次切换时刷新</div>
  4 + <ul class="nav nav-tabs">
  5 + <li class="active"><a href="#first" data-toggle="tab">表格1</a></li>
  6 + <li><a href="#second" data-toggle="tab">表格2</a></li>
  7 + </ul>
  8 + </div>
  9 + <div class="panel-body">
  10 + <div id="myTabContent" class="tab-content">
  11 + <div class="tab-pane fade active in" id="first">
  12 + <div id="toolbar1" class="toolbar">
  13 + {:build_toolbar('refresh')}
  14 + </div>
  15 + <table id="table1" class="table table-striped table-bordered table-hover" width="100%">
  16 + </table>
  17 + </div>
  18 + <div class="tab-pane fade" id="second">
  19 + <div id="toolbar2" class="toolbar">
  20 + {:build_toolbar('refresh')}
  21 + </div>
  22 + <table id="table2" class="table table-striped table-bordered table-hover" width="100%">
  23 + </table>
  24 + </div>
  25 + </div>
  26 + </div>
  27 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<div class="row">
  2 + <div class="col-xs-12 col-sm-6 col-md-5 col-lg-4">
  3 + <div class="panel panel-default panel-intro">
  4 + <div class="panel-body">
  5 + <div id="1" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar1" class="toolbar">
  9 + {:build_toolbar('refresh')}
  10 + </div>
  11 + <table id="table1" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 + </div>
  22 + </div>
  23 + <div class="col-xs-12 col-sm-6 col-md-7 col-lg-8">
  24 + <div class="panel panel-default panel-intro">
  25 + <div class="panel-body">
  26 + <div id="myTabContent2" class="tab-content">
  27 + <div class="tab-pane fade active in" id="two">
  28 + <div class="widget-body no-padding">
  29 + <div id="toolbar2" class="toolbar">
  30 + {:build_toolbar('refresh')}
  31 + </div>
  32 + <table id="table2" class="table table-striped table-bordered table-hover" width="100%">
  33 +
  34 + </table>
  35 +
  36 +
  37 + </div>
  38 + </div>
  39 +
  40 + </div>
  41 + </div>
  42 + </div>
  43 + </div>
  44 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + <a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
  11 + <a class="btn btn-success btn-toggle-view" href="javascript:;"><i class="fa fa-leaf"></i> 切换视图</a>
  12 + </div>
  13 + <table id="table" class="table table-striped table-hover" width="100%">
  14 +
  15 + </table>
  16 +
  17 + </div>
  18 + </div>
  19 +
  20 + </div>
  21 + </div>
  22 +</div>
  23 +<style type="text/css">
  24 + .example {
  25 + height:100%;position: relative;
  26 + }
  27 + .example > span {
  28 + position:absolute;left:15px;top:15px;
  29 + }
  30 +</style>
  31 +
  32 +<script id="itemtpl" type="text/html">
  33 + <!--
  34 + 如果启用了templateView,默认调用的是itemtpl这个模板,可以通过设置templateFormatter来修改
  35 + 在当前模板中可以使用三个变量(item:行数据,i:当前第几行,data:所有的行数据)
  36 + 此模板引擎使用的是art-templatenative,可参考官方文档
  37 + -->
  38 +
  39 + <div class="col-sm-4 col-md-3">
  40 + <!--下面四行是为了展示随机图片和标签,可移除-->
  41 + <% var imagearr = ['https://cdn.fastadmin.net/uploads/addons/blog.png', 'https://cdn.fastadmin.net/uploads/addons/cms.png', 'https://cdn.fastadmin.net/uploads/addons/vote.png', 'https://cdn.fastadmin.net/uploads/addons/blog.png', 'https://cdn.fastadmin.net/uploads/addons/alisms.png']; %>
  42 + <% var image = imagearr[item.id % 5]; %>
  43 + <% var labelarr = ['primary', 'success', 'info', 'danger', 'warning']; %>
  44 + <% var label = labelarr[item.id % 5]; %>
  45 + <div class="thumbnail example">
  46 + <span class="btn btn-<%=label%>">ID:<%=item.id%></span>
  47 + <img src="<%=image%>" style="width:100%;" alt="<%=item.title%>">
  48 + <div class="caption">
  49 + <h4><%=item.title?item.title:'无'%></h4>
  50 + <p class="text-muted">操作者IP:<%=item.ip%></p>
  51 + <p class="text-muted">操作时间:<%=Moment(item.createtime*1000).format("YYYY-MM-DD HH:mm:ss")%></p>
  52 + <p>
  53 + <!--详情的事件需要在JS中手动绑定-->
  54 + <a href="#" class="btn btn-primary btn-success btn-detail" data-id="<%=item.id%>"><i class="fa fa-camera"></i> 详情</a>
  55 +
  56 + <!--如果需要响应编辑或删除事件,可以给元素添加 btn-editbtn-del的类和data-id这个属性值-->
  57 + <a href="#" class="btn btn-primary btn-edit" data-id="<%=item.id%>"><i class="fa fa-pencil"></i> 编辑</a>
  58 + <a href="#" class="btn btn-danger btn-del" data-id="<%=item.id%>"><i class="fa fa-times"></i> 删除</a>
  59 + <span class="pull-right" style="margin-top:10px;">
  60 + <!--如果需要多选操作,请确保有下面的checkbox元素存在,可移除-->
  61 + <input name="checkbox" data-id="<%=item.id%>" type="checkbox" />
  62 + </span>
  63 + </p>
  64 + </div>
  65 + </div>
  66 + </div>
  67 +</script>
  1 +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label class="control-label col-xs-12 col-sm-2">{:__('Project_name')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input id="c-project_name" class="form-control" name="row[project_name]" type="text">
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <div class="input-group">
  13 + <input id="c-image" class="form-control" size="50" name="row[image]" type="text">
  14 + <div class="input-group-addon no-border no-padding">
  15 + <span><button type="button" id="faupload-image" class="btn btn-danger faupload" data-input-id="c-image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
  16 + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
  17 + </div>
  18 + <span class="msg-box n-right" for="c-image"></span>
  19 + </div>
  20 + <ul class="row list-inline faupload-preview" id="p-image"></ul>
  21 + </div>
  22 + </div>
  23 + <div class="form-group">
  24 + <label for="c-department_id" class="control-label col-xs-12 col-sm-2">{:__('Department_id')}:</label>
  25 + <div class="col-xs-12 col-sm-8">
  26 + <select id="c-department_id" data-rule="required" class="form-control selectpicker" name="row[department_id]">
  27 + {foreach name="parentList" item="vo"}
  28 + <option value="{$key}">{$vo.name}</option>
  29 + {/foreach}
  30 + </select>
  31 + </div>
  32 + </div>
  33 + <div class="form-group">
  34 + <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
  35 + <div class="col-xs-12 col-sm-8">
  36 + <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="">
  37 + </div>
  38 + </div>
  39 + <div class="form-group">
  40 + <label class="control-label col-xs-12 col-sm-2">{:__('Starttime')}:</label>
  41 + <div class="col-xs-12 col-sm-8">
  42 + <input id="c-starttime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[starttime]" type="text" value="{:date('Y-m-d')}">
  43 + </div>
  44 + </div>
  45 + <div class="form-group">
  46 + <label class="control-label col-xs-12 col-sm-2">{:__('Endtime')}:</label>
  47 + <div class="col-xs-12 col-sm-8">
  48 + <input id="c-endtime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[endtime]" type="text" value="{:date('Y-m-d')}">
  49 + </div>
  50 + </div>
  51 + <div class="form-group layer-footer">
  52 + <label class="control-label col-xs-12 col-sm-2"></label>
  53 + <div class="col-xs-12 col-sm-8">
  54 + <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
  55 + </div>
  56 + </div>
  57 +</form>
  1 +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label class="control-label col-xs-12 col-sm-2">{:__('Project_name')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input id="c-project_name" class="form-control" name="row[project_name]" type="text" value="{$row.project_name|htmlentities}">
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <div class="input-group">
  13 + <input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="{$row.image|htmlentities}">
  14 + <div class="input-group-addon no-border no-padding">
  15 + <span><button type="button" id="faupload-image" class="btn btn-danger faupload" data-input-id="c-image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
  16 + <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
  17 + </div>
  18 + <span class="msg-box n-right" for="c-image"></span>
  19 + </div>
  20 + <ul class="row list-inline faupload-preview" id="p-image"></ul>
  21 + </div>
  22 + </div>
  23 + <div class="form-group">
  24 + <label for="c-department_id" class="control-label col-xs-12 col-sm-2">{:__('Department_id')}:</label>
  25 + <div class="col-xs-12 col-sm-8">
  26 + <select id="c-department_id" data-rule="required" class="form-control selectpicker" name="row[department_id]">
  27 + {foreach name="parentList" item="vo"}
  28 + <option value="{$key}" {in name="key" value="$row.department_id"}selected{/in}>{$vo.name}</option>
  29 + {/foreach}
  30 + </select>
  31 + </div>
  32 + </div>
  33 + <div class="form-group">
  34 + <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
  35 + <div class="col-xs-12 col-sm-8">
  36 + <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="{$row.user_id|htmlentities}">
  37 + </div>
  38 + </div>
  39 + <div class="form-group">
  40 + <label class="control-label col-xs-12 col-sm-2">{:__('Starttime')}:</label>
  41 + <div class="col-xs-12 col-sm-8">
  42 + <input id="c-starttime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[starttime]" type="text" value="{:$row.starttime?datetime($row.starttime):''}">
  43 + </div>
  44 + </div>
  45 + <div class="form-group">
  46 + <label class="control-label col-xs-12 col-sm-2">{:__('Endtime')}:</label>
  47 + <div class="col-xs-12 col-sm-8">
  48 + <input id="c-endtime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[endtime]" type="text" value="{:$row.endtime?datetime($row.endtime):''}">
  49 + </div>
  50 + </div>
  51 + <div class="form-group layer-footer">
  52 + <label class="control-label col-xs-12 col-sm-2"></label>
  53 + <div class="col-xs-12 col-sm-8">
  54 + <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
  55 + </div>
  56 + </div>
  57 +</form>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
  10 + <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('project/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
  11 + <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('project/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
  12 + <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('project/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
  13 +
  14 +
  15 +
  16 +
  17 +
  18 + </div>
  19 + <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
  20 + data-operate-edit="{:$auth->check('project/edit')}"
  21 + data-operate-del="{:$auth->check('project/del')}"
  22 + width="100%">
  23 + </table>
  24 + </div>
  25 + </div>
  26 +
  27 + </div>
  28 + </div>
  29 +</div>
  1 +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 + {:token()}
  3 + <input type="hidden" name="row[id]" value="">
  4 +
  5 + <div class="form-group">
  6 + <label for="c-username" class="control-label col-xs-12 col-sm-2">{:__('Username')}:</label>
  7 + <div class="col-xs-12 col-sm-4">
  8 + <input id="c-username" data-rule="required" class="form-control" name="row[username]" type="text" value="">
  9 + </div>
  10 + </div>
  11 + <div class="form-group">
  12 + <label for="c-nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
  13 + <div class="col-xs-12 col-sm-4">
  14 + <input id="c-nickname" data-rule="required" class="form-control" name="row[nickname]" type="text" value="">
  15 + </div>
  16 + </div>
  17 + <div class="form-group">
  18 + <label for="c-password" class="control-label col-xs-12 col-sm-2">{:__('Password')}:</label>
  19 + <div class="col-xs-12 col-sm-4">
  20 + <input id="c-password" data-rule="password" class="form-control" name="row[password]" type="password" value="" placeholder="{:__('Leave password blank if dont want to change')}" autocomplete="new-password" />
  21 + </div>
  22 + </div>
  23 + <div class="form-group">
  24 + <label for="c-email" class="control-label col-xs-12 col-sm-2">{:__('Email')}:</label>
  25 + <div class="col-xs-12 col-sm-4">
  26 + <input id="c-email" data-rule="email" class="form-control" name="row[email]" type="text" value="">
  27 + </div>
  28 + </div>
  29 + <div class="form-group">
  30 + <label for="c-mobile" class="control-label col-xs-12 col-sm-2">{:__('Mobile')}:</label>
  31 + <div class="col-xs-12 col-sm-4">
  32 + <input id="c-mobile" data-rule="mobile" class="form-control" name="row[mobile]" type="text" value="">
  33 + </div>
  34 + </div>
  35 + <div class="form-group">
  36 + <label for="c-avatar" class="control-label col-xs-12 col-sm-2">{:__('Avatar')}:</label>
  37 + <div class="col-xs-12 col-sm-8">
  38 + <div class="input-group">
  39 + <input id="c-avatar" data-rule="" class="form-control" size="50" name="row[avatar]" type="text" value="">
  40 + <div class="input-group-addon no-border no-padding">
  41 + <span><button type="button" id="faupload-avatar" class="btn btn-danger faupload" data-input-id="c-avatar" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
  42 + <span><button type="button" id="fachoose-avatar" class="btn btn-primary fachoose" data-input-id="c-avatar" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
  43 + </div>
  44 + <span class="msg-box n-right" for="c-avatar"></span>
  45 + </div>
  46 + <ul class="row list-inline faupload-preview" id="p-avatar"></ul>
  47 + </div>
  48 + </div>
  49 + <div class="form-group">
  50 + <label for="c-level" class="control-label col-xs-12 col-sm-2">{:__('Level')}:</label>
  51 + <div class="col-xs-12 col-sm-4">
  52 + <input id="c-level" data-rule="required" class="form-control" name="row[level]" type="number" value="">
  53 + </div>
  54 + </div>
  55 +
  56 + <div class="form-group">
  57 + <label for="c-birthday" class="control-label col-xs-12 col-sm-2">{:__('Birthday')}:</label>
  58 + <div class="col-xs-12 col-sm-4">
  59 + <input id="c-birthday" data-rule="" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[birthday]" type="text" value="">
  60 + </div>
  61 + </div>
  62 + <div class="form-group">
  63 + <label for="c-bio" class="control-label col-xs-12 col-sm-2">{:__('Bio')}:</label>
  64 + <div class="col-xs-12 col-sm-8">
  65 + <input id="c-bio" data-rule="" class="form-control" name="row[bio]" type="text" value="">
  66 + </div>
  67 + </div>
  68 + <div class="form-group">
  69 + <label for="c-money" class="control-label col-xs-12 col-sm-2">{:__('Money')}:</label>
  70 + <div class="col-xs-12 col-sm-4">
  71 + <input id="c-money" data-rule="required" class="form-control" name="row[money]" type="number" value="">
  72 + </div>
  73 + </div>
  74 + <div class="form-group">
  75 + <label for="c-score" class="control-label col-xs-12 col-sm-2">{:__('Score')}:</label>
  76 + <div class="col-xs-12 col-sm-4">
  77 + <input id="c-score" data-rule="required" class="form-control" name="row[score]" type="number" value="">
  78 + </div>
  79 + </div>
  80 + <div class="form-group">
  81 + <label for="c-successions" class="control-label col-xs-12 col-sm-2">{:__('Successions')}:</label>
  82 + <div class="col-xs-12 col-sm-4">
  83 + <input id="c-successions" data-rule="required" class="form-control" name="row[successions]" type="number" value="">
  84 + </div>
  85 + </div>
  86 + <div class="form-group">
  87 + <label for="c-maxsuccessions" class="control-label col-xs-12 col-sm-2">{:__('Maxsuccessions')}:</label>
  88 + <div class="col-xs-12 col-sm-4">
  89 + <input id="c-maxsuccessions" data-rule="required" class="form-control" name="row[maxsuccessions]" type="number" value="">
  90 + </div>
  91 + </div>
  92 + <div class="form-group">
  93 + <label for="c-prevtime" class="control-label col-xs-12 col-sm-2">{:__('Prevtime')}:</label>
  94 + <div class="col-xs-12 col-sm-4">
  95 + <input id="c-prevtime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[prevtime]" type="text" value="">
  96 + </div>
  97 + </div>
  98 + <div class="form-group">
  99 + <label for="c-logintime" class="control-label col-xs-12 col-sm-2">{:__('Logintime')}:</label>
  100 + <div class="col-xs-12 col-sm-4">
  101 + <input id="c-logintime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[logintime]" type="text" value="">
  102 + </div>
  103 + </div>
  104 + <div class="form-group">
  105 + <label for="c-loginip" class="control-label col-xs-12 col-sm-2">{:__('Loginip')}:</label>
  106 + <div class="col-xs-12 col-sm-4">
  107 + <input id="c-loginip" data-rule="required" class="form-control" name="row[loginip]" type="text" value="">
  108 + </div>
  109 + </div>
  110 + <div class="form-group">
  111 + <label for="c-loginfailure" class="control-label col-xs-12 col-sm-2">{:__('Loginfailure')}:</label>
  112 + <div class="col-xs-12 col-sm-4">
  113 + <input id="c-loginfailure" data-rule="required" class="form-control" name="row[loginfailure]" type="number" value="">
  114 + </div>
  115 + </div>
  116 + <div class="form-group">
  117 + <label for="c-joinip" class="control-label col-xs-12 col-sm-2">{:__('Joinip')}:</label>
  118 + <div class="col-xs-12 col-sm-4">
  119 + <input id="c-joinip" data-rule="required" class="form-control" name="row[joinip]" type="text" value="">
  120 + </div>
  121 + </div>
  122 + <div class="form-group">
  123 + <label for="c-jointime" class="control-label col-xs-12 col-sm-2">{:__('Jointime')}:</label>
  124 + <div class="col-xs-12 col-sm-4">
  125 + <input id="c-jointime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[jointime]" type="text" value="">
  126 + </div>
  127 + </div>
  128 +
  129 + <div class="form-group layer-footer">
  130 + <label class="control-label col-xs-12 col-sm-2"></label>
  131 + <div class="col-xs-12 col-sm-8">
  132 + <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
  133 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  134 + </div>
  135 + </div>
  136 +</form>
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <div class="tab-pane fade active in" id="one"> 6 <div class="tab-pane fade active in" id="one">
7 <div class="widget-body no-padding"> 7 <div class="widget-body no-padding">
8 <div id="toolbar" class="toolbar"> 8 <div id="toolbar" class="toolbar">
9 - {:build_toolbar('refresh,edit,del')} 9 + {:build_toolbar('refresh,add,edit,del')}
10 <div class="dropdown btn-group {:$auth->check('user/user/multi')?'':'hide'}"> 10 <div class="dropdown btn-group {:$auth->check('user/user/multi')?'':'hide'}">
11 <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a> 11 <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
12 <ul class="dropdown-menu text-left" role="menu"> 12 <ul class="dropdown-menu text-left" role="menu">
  1 +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <textarea id="c-content" class="form-control editor" rows="5" name="row[content]" cols="50"></textarea>
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label class="control-label col-xs-12 col-sm-2">{:__('Working_hours')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input id="c-working_hours" class="form-control" name="row[working_hours]" type="number">
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label class="control-label col-xs-12 col-sm-2">{:__('Project_id')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <input id="c-project_id" data-rule="required" data-source="project/index" class="form-control selectpage" data-field="project_name" name="row[project_id]" type="text" value="">
  19 + </div>
  20 + </div>
  21 + <div class="form-group">
  22 + <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="">
  25 + </div>
  26 + </div>
  27 + <div class="form-group">
  28 + <label class="control-label col-xs-12 col-sm-2">{:__('Reporttime')}:</label>
  29 + <div class="col-xs-12 col-sm-8">
  30 + <input id="c-reporttime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[reporttime]" type="text" value="{:date('Y-m-d H:i:s')}">
  31 + </div>
  32 + </div>
  33 + <div class="form-group layer-footer">
  34 + <label class="control-label col-xs-12 col-sm-2"></label>
  35 + <div class="col-xs-12 col-sm-8">
  36 + <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
  37 + </div>
  38 + </div>
  39 +</form>
  1 +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <textarea id="c-content" class="form-control editor" rows="5" name="row[content]" cols="50">{$row.content|htmlentities}</textarea>
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label class="control-label col-xs-12 col-sm-2">{:__('Working_hours')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input id="c-working_hours" class="form-control" name="row[working_hours]" type="number" value="{$row.working_hours|htmlentities}">
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label class="control-label col-xs-12 col-sm-2">{:__('Project_id')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <input id="c-project_id" data-rule="required" data-source="project/index" class="form-control selectpage" name="row[project_id]" type="text" value="{$row.project_id|htmlentities}">
  19 + </div>
  20 + </div>
  21 + <div class="form-group">
  22 + <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="{$row.user_id|htmlentities}">
  25 + </div>
  26 + </div>
  27 + <div class="form-group">
  28 + <label class="control-label col-xs-12 col-sm-2">{:__('Reporttime')}:</label>
  29 + <div class="col-xs-12 col-sm-8">
  30 + <input id="c-reporttime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[reporttime]" type="text" value="{:$row.reporttime?datetime($row.reporttime):''}">
  31 + </div>
  32 + </div>
  33 + <div class="form-group layer-footer">
  34 + <label class="control-label col-xs-12 col-sm-2"></label>
  35 + <div class="col-xs-12 col-sm-8">
  36 + <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
  37 + </div>
  38 + </div>
  39 +</form>