index.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. <table id="data-table" lay-filter="data-table"></table>
  14. </div>
  15. </div>
  16. <!-- 表格顶部工具栏 -->
  17. <script type="text/html" id="table-toolbar">
  18. <button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add" permission="app.admin.rule.insert">
  19. <i class="layui-icon layui-icon-add-1"></i>新增
  20. </button>
  21. <button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove" permission="app.admin.rule.delete">
  22. <i class="layui-icon layui-icon-delete"></i>删除
  23. </button>
  24. </script>
  25. <!-- 表格行工具栏 -->
  26. <script type="text/html" id="table-bar">
  27. <button class="pear-btn pear-btn-xs tool-btn" lay-event="edit" permission="app.admin.rule.update">编辑</button>
  28. <button class="pear-btn pear-btn-xs tool-btn" lay-event="remove" permission="app.admin.rule.delete">删除</button>
  29. </script>
  30. <script src="/app/admin/component/layui/layui.js?v=2.8.12"></script>
  31. <script src="/app/admin/component/pear/pear.js"></script>
  32. <script src="/app/admin/admin/js/permission.js"></script>
  33. <script src="/app/admin/admin/js/common.js"></script>
  34. <script>
  35. // 相关常量
  36. const PRIMARY_KEY = "id";
  37. const SELECT_API = "/app/admin/rule/select?limit=5000";
  38. const DELETE_API = "/app/admin/rule/delete";
  39. const UPDATE_API = "/app/admin/rule/update";
  40. const INSERT_URL = "/app/admin/rule/insert";
  41. const UPDATE_URL = "/app/admin/rule/update";
  42. // 表格渲染
  43. layui.use(["table", "treetable", "form", "common", "popup", "util"], function() {
  44. let table = layui.table;
  45. let form = layui.form;
  46. let $ = layui.$;
  47. let common = layui.common;
  48. let treeTable = layui.treetable;
  49. let util = layui.util;
  50. // 表格头部列数据
  51. let cols = [
  52. {
  53. type: "checkbox"
  54. },{
  55. title: "标题",
  56. field: "title",
  57. },{
  58. title: "图标",
  59. field: "icon",
  60. templet: function (d) {
  61. return '<i class="layui-icon ' + util.escape(d["icon"]) + '"></i>';
  62. }
  63. },{
  64. title: "主键",
  65. field: "id",
  66. hide: true,
  67. },{
  68. title: "key",
  69. field: "key",
  70. },{
  71. title: "上级菜单",
  72. field: "pid",
  73. hide: true,
  74. templet: function (d) {
  75. let field = "pid";
  76. if (typeof d[field] == "undefined") return "";
  77. let items = [];
  78. layui.each((d[field] + "").split(","), function (k , v) {
  79. items.push(apiResults[field][v] || v);
  80. });
  81. return util.escape(items.join(","));
  82. }
  83. },{
  84. title: "创建时间",
  85. field: "created_at",
  86. hide: true,
  87. },{
  88. title: "更新时间",
  89. field: "updated_at",
  90. hide: true,
  91. },{
  92. title: "url",
  93. field: "href",
  94. },{
  95. title: "类型",
  96. field: "type",
  97. width: 80,
  98. templet: function (d) {
  99. let field = "type";
  100. let value = apiResults["type"][d["type"]] || d["type"];
  101. let css = {"目录":"layui-bg-blue", "菜单": "layui-bg-green", "权限": "layui-bg-orange"}[value];
  102. return '<span class="layui-badge '+css+'">'+util.escape(value)+'</span>';
  103. }
  104. },{
  105. title: "排序",
  106. field: "weight",
  107. width: 80,
  108. },{
  109. title: "操作",
  110. toolbar: "#table-bar",
  111. align: "center",
  112. fixed: "right",
  113. width: 130,
  114. }
  115. ];
  116. // 渲染表格
  117. function render()
  118. {
  119. treeTable.render({
  120. elem: "#data-table",
  121. url: SELECT_API,
  122. treeColIndex: 1,
  123. treeIdName: "id",
  124. treePidName: "pid",
  125. treeDefaultClose: true,
  126. cols: [cols],
  127. skin: "line",
  128. size: "lg",
  129. toolbar: "#table-toolbar",
  130. defaultToolbar: [{
  131. title: "刷新",
  132. layEvent: "refresh",
  133. icon: "layui-icon-refresh",
  134. }, "filter", "print", "exports"]
  135. });
  136. }
  137. // 获取下拉菜单及树形组件数据
  138. let apis = [];
  139. let apiResults = {};
  140. apiResults["pid"] = [];
  141. apis.push(["pid", "/app/admin/rule/select?format=tree&type=0,1"]);
  142. apiResults["type"] = ["目录","菜单","权限"];
  143. let count = apis.length;
  144. layui.each(apis, function (k, item) {
  145. let [field, url] = item;
  146. $.ajax({
  147. url: url,
  148. dateType: "json",
  149. success: function (res) {
  150. if (res.code) {
  151. return layui.popup.failure(res.msg);
  152. }
  153. function travel(items) {
  154. for (let k in items) {
  155. let item = items[k];
  156. apiResults[field][item.value] = item.name;
  157. if (item.children) {
  158. travel(item.children);
  159. }
  160. }
  161. }
  162. travel(res.data);
  163. },
  164. complete: function () {
  165. if (--count === 0) {
  166. render();
  167. }
  168. }
  169. });
  170. });
  171. if (!count) {
  172. render();
  173. }
  174. // 删除或编辑行事件
  175. table.on("tool(data-table)", function(obj) {
  176. if (obj.event === "remove") {
  177. remove(obj);
  178. } else if (obj.event === "edit") {
  179. edit(obj);
  180. }
  181. });
  182. // 添加 批量删除 刷新事件
  183. table.on("toolbar(data-table)", function(obj) {
  184. if (obj.event === "add") {
  185. add();
  186. } else if (obj.event === "refresh") {
  187. refreshTable();
  188. } else if (obj.event === "batchRemove") {
  189. batchRemove(obj);
  190. }
  191. });
  192. // 添加行
  193. let add = function() {
  194. layer.open({
  195. type: 2,
  196. title: "新增",
  197. shade: 0.1,
  198. area: [common.isModile()?"100%":"520px", common.isModile()?"100%":"520px"],
  199. content: INSERT_URL
  200. });
  201. }
  202. // 编辑行
  203. let edit = function(obj) {
  204. let value = obj.data[PRIMARY_KEY];
  205. layer.open({
  206. type: 2,
  207. title: "修改",
  208. shade: 0.1,
  209. area: [common.isModile()?"100%":"520px", common.isModile()?"100%":"520px"],
  210. content: UPDATE_URL + "?" + PRIMARY_KEY + "=" + value
  211. });
  212. }
  213. // 删除行
  214. let remove = function(obj) {
  215. return doRemove(obj.data[PRIMARY_KEY], obj);
  216. }
  217. // 删除多行
  218. let batchRemove = function(obj) {
  219. let checkIds = common.checkField(obj, PRIMARY_KEY);
  220. if (checkIds === "") {
  221. layui.popup.warning("未选中数据");
  222. return false;
  223. }
  224. doRemove(checkIds.split(","));
  225. }
  226. // 执行删除
  227. let doRemove = function (ids, obj) {
  228. let data = {};
  229. data[PRIMARY_KEY] = ids;
  230. layer.confirm("确定删除?", {
  231. icon: 3,
  232. title: "提示"
  233. }, function(index) {
  234. layer.close(index);
  235. let loading = layer.load();
  236. $.ajax({
  237. url: DELETE_API,
  238. data: data,
  239. dataType: "json",
  240. type: "post",
  241. success: function(res) {
  242. layer.close(loading);
  243. if (res.code) {
  244. return layui.popup.failure(res.msg);
  245. }
  246. return layui.popup.success("操作成功", function () {
  247. return obj ? obj.del() : refreshTable();
  248. });
  249. }
  250. })
  251. });
  252. }
  253. // 刷新表格
  254. window.refreshTable = function() {
  255. table.reloadData("data-table", {
  256. scrollPos: "fixed",
  257. done: function (res, curr) {
  258. if (curr > 1 && res.data && !res.data.length) {
  259. curr = curr - 1;
  260. table.reloadData("data-table", {
  261. page: {
  262. curr: curr
  263. },
  264. })
  265. }
  266. }
  267. });
  268. }
  269. })
  270. </script>
  271. </body>
  272. </html>