authorities.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <!-- 正文开始 -->
  2. <div class="layui-fluid">
  3. <div class="layui-card">
  4. <div class="layui-card-body">
  5. <div class="layui-form toolbar">
  6. <div class="layui-form-item">
  7. <div class="layui-inline">
  8. <label class="layui-form-label w-auto">搜索:</label>
  9. <div class="layui-input-inline mr0">
  10. <input id="edtSearchAuth" class="layui-input" placeholder="输入关键字"/>
  11. </div>
  12. </div>
  13. <div class="layui-inline">
  14. <button id="btnSearchAuth" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索
  15. </button>
  16. <button id="btnAddAuth" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
  17. </div>
  18. </div>
  19. </div>
  20. <table id="tableAuth"></table>
  21. </div>
  22. </div>
  23. </div>
  24. <!-- 表格操作列 -->
  25. <script type="text/html" id="tableBarAuth">
  26. <a class="layui-btn layui-btn-xs" lay-event="add">新增</a>
  27. <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
  28. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  29. </script>
  30. <!-- 表单弹窗 -->
  31. <script type="text/html" id="modelAuth">
  32. <form id="modelAuthForm" lay-filter="modelAuthForm" class="layui-form model-form">
  33. <input name="id" type="hidden"/>
  34. <div class="layui-row">
  35. <div class="layui-col-md6">
  36. <div class="layui-form-item">
  37. <label class="layui-form-label layui-form-required">上级菜单</label>
  38. <div class="layui-input-block">
  39. <div id="selParentIds" class="ew-xmselect-tree"> </div>
  40. </div>
  41. </div>
  42. <div class="layui-form-item">
  43. <label class="layui-form-label layui-form-required">权限名称</label>
  44. <div class="layui-input-block">
  45. <input name="name" placeholder="请输入权限名称" type="text" class="layui-input" maxlength="50"
  46. lay-verType="tips" lay-verify="required" required/>
  47. </div>
  48. </div>
  49. <div class="layui-form-item">
  50. <label class="layui-form-label layui-form-required">权限类型</label>
  51. <div class="layui-input-block">
  52. <input name="type" type="radio" value="0" title="菜单" checked/>
  53. <input name="type" type="radio" value="1" title="操作"/>
  54. </div>
  55. </div>
  56. <div class="layui-form-item">
  57. <label class="layui-form-label layui-form-required">菜单url</label>
  58. <div class="layui-input-block">
  59. <input name="url" placeholder="请输入菜单url" type="text" class="layui-input"/>
  60. </div>
  61. </div>
  62. </div>
  63. <div class="layui-col-md6">
  64. <div class="layui-form-item">
  65. <label class="layui-form-label layui-form-required">权限标识</label>
  66. <div class="layui-input-block">
  67. <!-- <input name="policy" placeholder="请输入权限标识" type="text" class="layui-input"/>-->
  68. <select name="policy">
  69. <option value="view">view</option>
  70. <option value="get">get</option>
  71. <option value="post">post</option>
  72. <option value="put">put</option>
  73. <option value="delete">delete</option>
  74. </select>
  75. </div>
  76. </div>
  77. <div class="layui-form-item">
  78. <label class="layui-form-label">菜单图标</label>
  79. <div class="layui-input-block">
  80. <input name="icon" placeholder="请输入菜单图标" type="text" class="layui-input"/>
  81. </div>
  82. </div>
  83. <div class="layui-form-item">
  84. <label class="layui-form-label">排序号</label>
  85. <div class="layui-input-block">
  86. <input name="sort" placeholder="请输入排序号" type="number" class="layui-input" min="0" max="1000"/>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. <div class="layui-form-item text-right">
  92. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  93. <button class="layui-btn" lay-filter="modelSubmitAuth" lay-submit>保存</button>
  94. </div>
  95. </form>
  96. </script>
  97. <!-- js部分 -->
  98. <script>
  99. layui.use(['layer', 'form', 'setter','admin', 'treeTable', 'xmSelect', 'util', 'notice'], function () {
  100. var $ = layui.jquery;
  101. var layer = layui.layer;
  102. var form = layui.form;
  103. var setter = layui.setter;
  104. var admin = layui.admin;
  105. var treeTable = layui.treeTable;
  106. var xmSelect = layui.xmSelect;
  107. var util = layui.util;
  108. var notice = layui.notice;
  109. // 所有
  110. var policies = [];
  111. // 渲染表格
  112. var insTb = treeTable.render({
  113. elem: '#tableAuth',
  114. tree: {
  115. iconIndex: 1, // 折叠图标显示在第几列
  116. idName: 'id', // 自定义id字段的名称
  117. pidName: 'parent_id', // 自定义标识是否还有子节点的字段名称
  118. isPidData: true // 是否是pid形式数据
  119. },
  120. text: {
  121. none: '获取不到数据'
  122. },
  123. toolbar: true,
  124. cellMinWidth: 100,
  125. cols: [
  126. {type: 'numbers'},
  127. {field: 'name', title: '权限名称', width: 300},
  128. {field: 'url', title: '路由Url', width: 200},
  129. {field: 'policy', title: '授权标识',width: 100},
  130. {field: 'sort', title: '排序号', align: 'center', width: 100},
  131. {
  132. title: '类型', templet: function (d) {
  133. var strs = [
  134. '<span class="layui-badge layui-badge-green">菜单</span>',
  135. '<span class="layui-badge layui-badge-blue">操作</span>'
  136. ];
  137. return strs[d.type];
  138. }, align: 'center', width: 100
  139. },
  140. {
  141. field: 'created_at', templet: function (d) {
  142. return util.toDateString(d.created_at * 1e3);
  143. }, title: '创建时间', align: 'center'
  144. },
  145. {templet: '#tableBarAuth', title: '操作', align: 'center', width: 200}
  146. ],
  147. reqData: function (data, callback) {
  148. admin.req('permission/perm', function (r) {
  149. if(r.code === 10000){
  150. callback(policies = r.data);
  151. }
  152. callback(policies);
  153. }, 'GET');
  154. }
  155. });
  156. // 搜索
  157. $('#btnSearchAuth').click(function () {
  158. var keyword = $('#edtSearchAuth').val();
  159. if (keyword) {
  160. insTb.filterData(keyword);
  161. } else {
  162. insTb.clearFilter();
  163. }
  164. });
  165. // 添加按钮点击事件
  166. $('#btnAddAuth').click(function () {
  167. showEditModel();
  168. });
  169. // 工具条点击事件
  170. treeTable.on('tool(tableAuth)', function (obj) {
  171. var data = obj.data;
  172. var layEvent = obj.event;
  173. if (layEvent === 'edit') { // 修改
  174. showEditModel(data);
  175. } else if (layEvent === 'add') { // add
  176. showEditModel({parent_id:data.id,pname: data.name});
  177. }else if (layEvent === 'del') { // 删除
  178. doDel(data.id, data.name);
  179. }
  180. });
  181. // 显示表单弹窗
  182. function showEditModel(mAuth) {
  183. admin.open({
  184. type: 1,
  185. title: (mAuth ? '修改' : '添加') + '权限',
  186. area: '600px', //宽高
  187. content: $('#modelAuth').html(),
  188. success: function (layero, dIndex) {
  189. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  190. //
  191. if (mAuth && mAuth.type === '1') {
  192. $('#modelAuthForm input[name="type"][value="1"]').prop("checked", true);
  193. }
  194. let selParentIds = xmSelect.render({
  195. el: '#selParentIds',
  196. data: insTb.options.data,
  197. model: { label: { type: 'text' } },
  198. radio: true,
  199. clickClose: true,
  200. name: 'parent_id',
  201. prop: {
  202. name: 'name',
  203. value: 'id'
  204. },
  205. tree: {
  206. show: true,
  207. indent: 15,
  208. strict: false,
  209. expandedKeys: true
  210. },
  211. height: '250px'
  212. });
  213. // 数据处理
  214. var sData = [{id: -1, parent_id: 0, name: '选择上一级菜单',value: 0}];
  215. $.each(policies, function (index, item) {
  216. sData.push({
  217. id: item.id,
  218. parent_id:item.parent_id,
  219. name: item.name,
  220. value: item.id,
  221. open:item.open
  222. })
  223. });
  224. // 追加数据
  225. //selParentIds.update({ data: setter.lists2tree(sData,'children') });
  226. //设置默认值
  227. selParentIds.setValue([ (mAuth ? sData[mAuth.parent_id] :{ name: (mAuth && mAuth.pname || '选择上一级菜单'), value: 0})], null, true);
  228. form.render('radio');
  229. form.render('select');
  230. form.val('modelAuthForm', mAuth); // 回显数据
  231. // 表单提交事件
  232. form.on('submit(modelSubmitAuth)', function (data) {
  233. if (data.field.parent_id === '') {
  234. data.field.parent_id = '0';
  235. }
  236. layer.load(2);
  237. admin.req('permission/perm' + (mAuth ? ( mAuth.pname? '':'/' + data.field.id ): ''), data.field, function (res) {
  238. layer.closeAll('loading');
  239. if (res.code === 10000) {
  240. // 更新菜单权限
  241. setter.updateUser();
  242. layer.close(dIndex);
  243. notice.msg(res.message, {icon: 1});
  244. insTb.refresh();
  245. } else {
  246. notice.msg(res.message, {icon: 2});
  247. }
  248. }, mAuth ? (mAuth.pname ? 'POST': 'PUT' ): 'POST');
  249. return false;
  250. });
  251. }
  252. });
  253. }
  254. // 删除
  255. function doDel(dataId, title) {
  256. layer.confirm('确定要删除“' + title + '”吗?', {
  257. skin: 'layui-layer-admin',
  258. shade: .1
  259. }, function (index) {
  260. layer.close(index);
  261. layer.load(2);
  262. admin.req('permission/perm/' + dataId, (res) => {
  263. layer.closeAll('loading');
  264. if (res.code === 10000) {
  265. notice.msg(res.message, {icon: 1});
  266. insTb.refresh();
  267. } else {
  268. notice.msg(res.message, {icon: 2});
  269. }
  270. }, 'DELETE');
  271. });
  272. }
  273. });
  274. </script>