index.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>浏览页面</title>
  6. <link rel="stylesheet" href="/app/admin/component/pear/css/pear.css" />
  7. <link rel="stylesheet" href="/app/admin/admin/css/reset.css" />
  8. </head>
  9. <body class="pear-container">
  10. <!-- 顶部查询表单 -->
  11. <div class="layui-card">
  12. <div class="layui-card-body">
  13. <form class="layui-form top-search-from">
  14. <div class="layui-form-item">
  15. <label class="layui-form-label">用户名</label>
  16. <div class="layui-input-block">
  17. <input type="text" name="username" value="" class="layui-input">
  18. </div>
  19. </div>
  20. <div class="layui-form-item">
  21. <label class="layui-form-label">昵称</label>
  22. <div class="layui-input-block">
  23. <input type="text" name="nickname" value="" class="layui-input">
  24. </div>
  25. </div>
  26. <div class="layui-form-item">
  27. <label class="layui-form-label">邮箱</label>
  28. <div class="layui-input-block">
  29. <input type="text" name="email" value="" class="layui-input">
  30. </div>
  31. </div>
  32. <div class="layui-form-item">
  33. <label class="layui-form-label">手机</label>
  34. <div class="layui-input-block">
  35. <input type="text" name="mobile" value="" class="layui-input">
  36. </div>
  37. </div>
  38. <div class="layui-form-item">
  39. <label class="layui-form-label">创建时间</label>
  40. <div class="layui-input-block">
  41. <div class="layui-input-block" id="created_at">
  42. <input type="text" autocomplete="off" name="created_at[]" id="created_at-date-start" class="layui-input inline-block" placeholder="开始时间">
  43. -
  44. <input type="text" autocomplete="off" name="created_at[]" id="created_at-date-end" class="layui-input inline-block" placeholder="结束时间">
  45. </div>
  46. </div>
  47. </div>
  48. <div class="layui-form-item layui-inline">
  49. <label class="layui-form-label"></label>
  50. <button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="table-query">
  51. <i class="layui-icon layui-icon-search"></i>查询
  52. </button>
  53. <button type="reset" class="pear-btn pear-btn-md" lay-submit lay-filter="table-reset">
  54. <i class="layui-icon layui-icon-refresh"></i>重置
  55. </button>
  56. </div>
  57. <div class="toggle-btn">
  58. <a class="layui-hide">展开<i class="layui-icon layui-icon-down"></i></a>
  59. <a class="layui-hide">收起<i class="layui-icon layui-icon-up"></i></a>
  60. </div>
  61. </form>
  62. </div>
  63. </div>
  64. <!-- 数据表格 -->
  65. <div class="layui-card">
  66. <div class="layui-card-body">
  67. <table id="data-table" lay-filter="data-table"></table>
  68. </div>
  69. </div>
  70. <!-- 表格顶部工具栏 -->
  71. <script type="text/html" id="table-toolbar">
  72. <button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add" permission="app.admin.admin.insert">
  73. <i class="layui-icon layui-icon-add-1"></i>新增
  74. </button>
  75. <button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove" permission="app.admin.admin.delete">
  76. <i class="layui-icon layui-icon-delete"></i>删除
  77. </button>
  78. </script>
  79. <!-- 表格行工具栏 -->
  80. <script type="text/html" id="table-bar">
  81. {{# if(d.show_toolbar){ }}
  82. <button class="pear-btn pear-btn-xs tool-btn" lay-event="edit" permission="app.admin.admin.update">编辑</button>
  83. <button class="pear-btn pear-btn-xs tool-btn" lay-event="remove" permission="app.admin.admin.delete">删除</button>
  84. {{# } }}
  85. <button class="pear-btn pear-btn-xs tool-btn" lay-event="relevance" permission="app.admin.admin.relevance">关联团队长</button>
  86. </script>
  87. <script src="/app/admin/component/layui/layui.js?v=2.8.12"></script>
  88. <script src="/app/admin/component/pear/pear.js"></script>
  89. <script src="/app/admin/admin/js/permission.js"></script>
  90. <script src="/app/admin/admin/js/common.js"></script>
  91. <script>
  92. // 相关常量
  93. const PRIMARY_KEY = "id";
  94. const SELECT_API = "/app/admin/admin/select";
  95. const UPDATE_API = "/app/admin/admin/update";
  96. const DELETE_API = "/app/admin/admin/delete";
  97. const INSERT_URL = "/app/admin/admin/insert";
  98. const UPDATE_URL = "/app/admin/admin/update";
  99. const relevance_URL = "/app/admin/admin/relevance";
  100. // 字段 创建时间 created_at
  101. layui.use(["laydate"], function() {
  102. layui.laydate.render({
  103. elem: "#created_at",
  104. range: ["#created_at-date-start", "#created_at-date-end"],
  105. });
  106. })
  107. // 表格渲染
  108. layui.use(["table", "form", "common", "popup", "util"], function() {
  109. let table = layui.table;
  110. let form = layui.form;
  111. let $ = layui.$;
  112. let common = layui.common;
  113. let util = layui.util;
  114. // 表头参数
  115. let cols = [
  116. {
  117. type: "checkbox"
  118. },{
  119. title: "ID",
  120. field: "id",
  121. width: 100,
  122. sort: true,
  123. },{
  124. title: "用户名",
  125. field: "username",
  126. },{
  127. title: "昵称",
  128. field: "nickname",
  129. },{
  130. title: "密码",
  131. field: "password",
  132. hide: true,
  133. },{
  134. title: "头像",
  135. field: "avatar",
  136. templet: function (d) {
  137. return '<img src="'+encodeURI(d['avatar'])+'" style="max-width:32px;max-height:32px;" alt="" />'
  138. },
  139. width: 90,
  140. },{
  141. title: "邮箱",
  142. field: "email",
  143. hide: true,
  144. },{
  145. title: "手机",
  146. field: "mobile",
  147. hide: true,
  148. },{
  149. title: "创建时间",
  150. field: "created_at",
  151. hide: true,
  152. },{
  153. title: "更新时间",
  154. field: "updated_at",
  155. hide: true,
  156. },{
  157. title: "登录时间",
  158. field: "login_at",
  159. },{
  160. title: "角色",
  161. field: "roles",
  162. templet: function (d) {
  163. let field = "roles";
  164. if (typeof d[field] == "undefined") return "";
  165. let items = [];
  166. layui.each((d[field] + "").split(","), function (k , v) {
  167. items.push(apiResults[field][v] || v);
  168. });
  169. return util.escape(items.join(","));
  170. }
  171. },{
  172. title: "禁用",
  173. field: "status",
  174. templet: function (d) {
  175. let field = "status";
  176. form.on("switch("+field+")", function (data) {
  177. let load = layer.load();
  178. let postData = {};
  179. postData[field] = data.elem.checked ? 1 : 0;
  180. postData[PRIMARY_KEY] = this.value;
  181. $.post(UPDATE_API, postData, function (res) {
  182. layer.close(load);
  183. if (res.code) {
  184. return layui.popup.failure(res.msg, function () {
  185. data.elem.checked = !data.elem.checked;
  186. form.render();
  187. });
  188. }
  189. return layui.popup.success("操作成功");
  190. })
  191. });
  192. let checked = d[field] === 1 ? "checked" : "";
  193. if (parent.Admin.Account.id === d.id) return '';
  194. return '<input type="checkbox" value="'+util.escape(d[PRIMARY_KEY])+'" lay-filter="'+util.escape(field)+'" lay-skin="switch" lay-text="'+util.escape('')+'" '+checked+'/>';
  195. },
  196. width: 90,
  197. },{
  198. title: "操作",
  199. toolbar: "#table-bar",
  200. align: "center",
  201. fixed: "right",
  202. width: 200,
  203. }
  204. ];
  205. // 渲染表格
  206. function render()
  207. {
  208. table.render({
  209. elem: "#data-table",
  210. url: SELECT_API,
  211. page: true,
  212. cols: [cols],
  213. skin: "line",
  214. size: "lg",
  215. toolbar: "#table-toolbar",
  216. autoSort: false,
  217. defaultToolbar: [{
  218. title: "刷新",
  219. layEvent: "refresh",
  220. icon: "layui-icon-refresh",
  221. }, "filter", "print", "exports"],
  222. done: function () {
  223. layer.photos({photos: 'div[lay-id="data-table"]', anim: 5});
  224. }
  225. });
  226. }
  227. // 获取表格中下拉或树形组件数据
  228. let apis = [];
  229. apis.push(["roles", "/app/admin/role/select?format=select"]);
  230. let apiResults = {};
  231. apiResults["roles"] = [];
  232. let count = apis.length;
  233. layui.each(apis, function (k, item) {
  234. let [field, url] = item;
  235. $.ajax({
  236. url: url,
  237. dateType: "json",
  238. success: function (res) {
  239. if (res.code) {
  240. return layui.popup.failure(res.msg);
  241. }
  242. function travel(items) {
  243. for (let k in items) {
  244. let item = items[k];
  245. apiResults[field][item.value] = item.name;
  246. if (item.children) {
  247. travel(item.children);
  248. }
  249. }
  250. }
  251. travel(res.data);
  252. },
  253. complete: function () {
  254. if (--count === 0) {
  255. render();
  256. }
  257. }
  258. });
  259. });
  260. if (!count) {
  261. render();
  262. }
  263. // 编辑或删除行事件
  264. table.on("tool(data-table)", function(obj) {
  265. if (obj.event === "remove") {
  266. remove(obj);
  267. } else if (obj.event === "edit") {
  268. edit(obj);
  269. }else if (obj.event === "relevance"){
  270. relevance(obj);
  271. }
  272. });
  273. // 表格顶部工具栏事件
  274. table.on("toolbar(data-table)", function(obj) {
  275. if (obj.event === "add") {
  276. add();
  277. } else if (obj.event === "refresh") {
  278. refreshTable();
  279. } else if (obj.event === "batchRemove") {
  280. batchRemove(obj);
  281. }
  282. });
  283. // 表格顶部搜索事件
  284. form.on("submit(table-query)", function(data) {
  285. table.reload("data-table", {
  286. page: {
  287. curr: 1
  288. },
  289. where: data.field
  290. })
  291. return false;
  292. });
  293. // 表格顶部搜索重置事件
  294. form.on("submit(table-reset)", function(data) {
  295. table.reload("data-table", {
  296. where: []
  297. })
  298. });
  299. // 表格排序事件
  300. table.on("sort(data-table)", function(obj){
  301. table.reload("data-table", {
  302. initSort: obj,
  303. scrollPos: "fixed",
  304. where: {
  305. field: obj.field,
  306. order: obj.type
  307. }
  308. });
  309. });
  310. // 表格新增数据
  311. let add = function() {
  312. layer.open({
  313. type: 2,
  314. title: "新增",
  315. shade: 0.1,
  316. area: [common.isModile()?"100%":"500px", common.isModile()?"100%":"450px"],
  317. content: INSERT_URL
  318. });
  319. }
  320. // 表格编辑数据
  321. let edit = function(obj) {
  322. let value = obj.data[PRIMARY_KEY];
  323. layer.open({
  324. type: 2,
  325. title: "修改",
  326. shade: 0.1,
  327. area: [common.isModile()?"100%":"500px", common.isModile()?"100%":"450px"],
  328. content: UPDATE_URL + "?" + PRIMARY_KEY + "=" + value
  329. });
  330. }
  331. let relevance = function(obj) {
  332. let value = obj.data[PRIMARY_KEY];
  333. layer.open({
  334. type: 2,
  335. title: "修改",
  336. shade: 0.1,
  337. area: [common.isModile()?"100%":"500px", common.isModile()?"100%":"450px"],
  338. content: relevance_URL + "?" + PRIMARY_KEY + "=" + value
  339. });
  340. }
  341. // 删除一行
  342. let remove = function(obj) {
  343. return doRemove(obj.data[PRIMARY_KEY]);
  344. }
  345. // 删除多行
  346. let batchRemove = function(obj) {
  347. let checkIds = common.checkField(obj, PRIMARY_KEY);
  348. if (checkIds === "") {
  349. layui.popup.warning("未选中数据");
  350. return false;
  351. }
  352. doRemove(checkIds.split(","));
  353. }
  354. // 执行删除
  355. let doRemove = function (ids) {
  356. let data = {};
  357. data[PRIMARY_KEY] = ids;
  358. layer.confirm("确定删除?", {
  359. icon: 3,
  360. title: "提示"
  361. }, function(index) {
  362. layer.close(index);
  363. let loading = layer.load();
  364. $.ajax({
  365. url: DELETE_API,
  366. data: data,
  367. dataType: "json",
  368. type: "post",
  369. success: function(res) {
  370. layer.close(loading);
  371. if (res.code) {
  372. return layui.popup.failure(res.msg);
  373. }
  374. return layui.popup.success("操作成功", refreshTable);
  375. }
  376. })
  377. });
  378. }
  379. // 刷新表格数据
  380. window.refreshTable = function() {
  381. table.reloadData("data-table", {
  382. scrollPos: "fixed",
  383. done: function (res, curr) {
  384. if (curr > 1 && res.data && !res.data.length) {
  385. curr = curr - 1;
  386. table.reloadData("data-table", {
  387. page: {
  388. curr: curr
  389. },
  390. })
  391. }
  392. }
  393. });
  394. }
  395. })
  396. </script>
  397. </body>
  398. </html>