正在显示
59 个修改的文件
包含
4412 行增加
和
315 行删除
application/admin/controller/Command.php
0 → 100644
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'), | ||
76 | - ]); | ||
77 | - | ||
78 | - $this->assignconfig('column', array_keys($userlist)); | ||
79 | - $this->assignconfig('userdata', array_values($userlist)); | ||
80 | - | 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 | ||
84 | + ]); | ||
85 | + return $this->view->fetch(); | ||
86 | + } | ||
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); | ||
81 | return $this->view->fetch(); | 96 | return $this->view->fetch(); |
82 | } | 97 | } |
83 | - | ||
84 | } | 98 | } |
application/admin/controller/Department.php
0 → 100644
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 | +} |
application/admin/controller/Project.php
0 → 100644
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 | +} |
application/admin/lang/zh-cn/command.php
0 → 100644
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 | ]; |
application/admin/lang/zh-cn/department.php
0 → 100644
application/admin/lang/zh-cn/project.php
0 → 100644
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 | +]; |
application/admin/model/Area.php
0 → 100644
application/admin/model/Command.php
0 → 100644
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 | +} |
application/admin/model/Department.php
0 → 100644
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 | +} |
application/admin/model/Project.php
0 → 100644
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 | +} |
application/admin/model/Workinghours.php
0 → 100644
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 | +} |
application/admin/validate/Command.php
0 → 100644
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 | +} |
application/admin/validate/Department.php
0 → 100644
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 | +} |
application/admin/validate/Project.php
0 → 100644
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 | +} |
application/admin/validate/Workinghours.php
0 → 100644
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 | +} |
application/admin/view/command/add.html
0 → 100644
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> </label> | ||
417 | + <a href="javascript:;" class="btn btn-danger btn-block btn-removerelation">移除</a> | ||
418 | + </div> | ||
419 | + </div> | ||
420 | +</script> |
application/admin/view/command/detail.html
0 → 100644
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> |
application/admin/view/command/index.html
0 → 100644
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 | +<!-- <!– User image –>--> | ||
71 | +<!-- <!– <li class="user-header">–>--> | ||
72 | +<!-- <!– <img src="{$admin.avatar|cdnurl|htmlentities}" class="img-circle" alt="">–>--> | ||
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 | +<!-- <!– <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>--> | ||
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 { |
159 | - font-size: 14px; | 158 | + font-size: 13px; |
160 | } | 159 | } |
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 | - | ||
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> | 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; | ||
315 | + font-size: 14px; | ||
316 | + color: #896300; | ||
317 | + font-weight: bold; | ||
318 | + } | ||
319 | + | ||
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 | + } | ||
329 | + | ||
330 | + .rankings_title { | ||
331 | + width: 100%; | ||
332 | + height: 40px; | ||
333 | + display: flex; | ||
334 | + justify-content: space-between; | ||
335 | + align-items: center; | ||
336 | + } | ||
337 | + | ||
338 | + .rankings_title_left { | ||
339 | + color: #1D2129; | ||
340 | + font-weight: 700; | ||
341 | + } | ||
342 | + | ||
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> | ||
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=""> | ||
191 | </div> | 511 | </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')} | 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> | ||
199 | </div> | 516 | </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')} | 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> | ||
208 | </div> | 520 | </div> |
209 | </div> | 521 | </div> |
210 | </div> | 522 | </div> |
523 | + {/volist} | ||
524 | + | ||
525 | + | ||
526 | + | ||
527 | + | ||
528 | + | ||
211 | </div> | 529 | </div> |
530 | + </div> | ||
531 | + </div> | ||
532 | + <div class="project_list"> | ||
533 | + <div class="project_list_title"> | ||
534 | + <div class="project_list_title_left">快捷入口</div> | ||
535 | + </div> | ||
212 | 536 | ||
213 | - <div class="row"> | ||
214 | - <div class="col-lg-8"> | ||
215 | - <div id="echart" class="btn-refresh" style="height:300px;width:100%;"></div> | 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> | ||
216 | </div> | 543 | </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> | 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}小时 | ||
283 | </div> | 549 | </div> |
284 | </div> | 550 | </div> |
285 | </div> | 551 | </div> |
552 | + {/volist} | ||
553 | + </div> | ||
554 | + </div> | ||
555 | + </div> | ||
286 | 556 | ||
287 | - <div class="row" style="margin-top:15px;" id="statistics"> | ||
288 | 557 | ||
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> | ||
304 | - </div> | ||
305 | - </div> | ||
306 | - </div> | ||
307 | - </div> | ||
308 | - </div> | ||
309 | - </div> | ||
310 | - </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> | ||
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> | ||
325 | - </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> | ||
330 | - </div> | ||
331 | - </div> | ||
332 | - </div> | ||
333 | - </div> | ||
334 | - </div> | ||
335 | - </div> | ||
336 | - </div> | 558 | + <div class="console_right"> |
559 | + <div class="user_info"> | ||
560 | + <div class="user_info_avatar"> | ||
561 | + {$admin.nickname|htmlentities} | ||
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> | ||
567 | + </div> | ||
568 | + </div> | ||
337 | 569 | ||
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 | - | ||
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> | ||
362 | - </div> | ||
363 | - </div> | ||
364 | - </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 | - | ||
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> | ||
387 | - </div> | ||
388 | - </div> | ||
389 | - </div> | ||
390 | - </div> | ||
391 | - </div> | 570 | + <div class="user_info_menu"> |
571 | + {if $admin.id=="1"} | ||
572 | + 超级管理员 | ||
573 | + {else/} | ||
574 | + 管理员 | ||
575 | + {/if} | ||
576 | + </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> | ||
392 | </div> | 586 | </div> |
393 | </div> | 587 | </div> |
394 | - <div class="tab-pane fade" id="two"> | ||
395 | - <div class="row"> | ||
396 | - <div class="col-xs-12"> | ||
397 | - {:__('Custom zone')} | ||
398 | - </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> | ||
595 | + </div> | ||
596 | + {/volist} | ||
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> | ||
604 | + </div> | ||
605 | + {/volist} | ||
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> |
application/admin/view/department/add.html
0 → 100644
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> |
application/admin/view/department/edit.html
0 → 100644
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> |
application/admin/view/department/index.html
0 → 100644
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操作符,必须携带一个class为operate隐藏的文本框,且它的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-template的native,可参考官方文档 | ||
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-edit或btn-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> |
application/admin/view/project/add.html
0 → 100644
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> |
application/admin/view/project/edit.html
0 → 100644
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> |
application/admin/view/project/index.html
0 → 100644
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> |
application/admin/view/user/user/add.html
0 → 100644
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"> |
application/admin/view/workinghours/add.html
0 → 100644
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> |
-
请 注册 或 登录 后发表评论