users.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <style type="text/css">
  2. .xm-label-block {
  3. background-color: #287bd2
  4. }
  5. </style>
  6. <!-- 正文开始 -->
  7. <div class="layui-fluid">
  8. <div class="layui-card">
  9. <div class="layui-card-body">
  10. <div class="layui-form toolbar" id="tbToolBar">
  11. <div class="layui-form-item">
  12. <div class="layui-inline">
  13. <label class="layui-form-label w-auto">关键词:</label>
  14. <div class="layui-input-inline mr0">
  15. <input name="keyword" class="layui-input" type="text" placeholder="输入账号/用户名"/>
  16. </div>
  17. </div>
  18. <div class="layui-inline">
  19. <label class="layui-form-label">状 态:</label>
  20. <div class="layui-input-inline mr0">
  21. <select name="status">
  22. <option value="">所有</option>
  23. <option value="0">禁用</option>
  24. <option value="1">正常</option>
  25. <option value="trashed">删除</option>
  26. </select>
  27. </div>
  28. </div>
  29. <div class="layui-inline" style="padding-right: 110px;">
  30. <button class="layui-btn icon-btn" lay-filter="formSubSearchUser" lay-submit>
  31. <i class="layui-icon">&#xe615;</i>搜索
  32. </button>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="layui-tab layui-tab-brief">
  37. <table id="dataTable" lay-filter="dataTable"></table>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. <script type="text/html" id="toolBarTpl">
  43. <div class="layui-btn-group fl">
  44. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle-fine user-add-btn">&nbsp;添加</a>
  45. <a table-data="{'url':'permission/users/plectron','action':'put',param:{'status': 1}}" class="layui-btn layui-btn-sm layui-icon layui-icon-play table-toolbar-btn">&nbsp;启用</a >
  46. <a table-data="{'url':'permission/users/plectron','action':'put',param:{'status': 0}}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-pause table-toolbar-btn">&nbsp;禁用</a>
  47. <a table-data="{'url':'permission/users/plectron','action':'delete'}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-close table-toolbar-btn">&nbsp;删除</a>
  48. </div>
  49. </script>
  50. <!-- 表格操作列 -->
  51. <script type="text/html" id="tableBarUser">
  52. {{# if(d.deleted_at !== 0){ }}
  53. <a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="restore">恢复</a>
  54. {{# }else if(d.id == 1){ }}
  55. <a class="layui-btn layui-btn-disabled layui-btn-xs" lay-tips="禁止操作">修改</a>
  56. <a class="layui-btn layui-btn-disabled layui-btn-xs" lay-tips="禁止操作">删除</a>
  57. {{# }else{ }}
  58. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  59. <a class="layui-btn layui-btn-danger layui-btn-xs" perm-show="delete:/users/<id>" lay-event="del">删除</a>
  60. {{# } }}
  61. </script>
  62. <!-- 表格状态列 -->
  63. <script type="text/html" id="tableStateUser">
  64. {{# if(d.deleted_at !== 0){ }}
  65. <span class="layui-badge layui-badge-red">用户删除</span>
  66. {{# }else if(d.id == 1){ }}
  67. <span class="layui-badge layui-bg-black">禁止操作</span>
  68. {{# }else{ }}
  69. <input type="checkbox" value="{{ d.status }}" switch-data="{'url':'users/{{ d.id }}','action':'put'}" lay-skin="switch" lay-filter="ckDataTableState"
  70. lay-text="正常|锁定" {{d.status==1?'checked':''}}/>
  71. {{# } }}
  72. </script>
  73. <!-- 表单弹窗 -->
  74. <script type="text/html" id="modelUser">
  75. <form id="modelUserForm" lay-filter="modelUserForm" class="layui-form model-form">
  76. <input name="id" type="hidden"/>
  77. <div class="layui-form-item">
  78. <label class="layui-form-label layui-form-required">账号</label>
  79. <div class="layui-input-block">
  80. <input name="email" placeholder="请输入账号" type="text" class="layui-input" maxlength="80"
  81. lay-verType="tips" lay-verify="required" required/>
  82. </div>
  83. </div>
  84. <div class="layui-form-item">
  85. <label class="layui-form-label layui-form-required">用户名</label>
  86. <div class="layui-input-block">
  87. <input name="username" placeholder="请输入用户名" type="text" class="layui-input" maxlength="20"
  88. lay-verType="tips" lay-verify="required" required/>
  89. </div>
  90. </div>
  91. <div id="selPassword"></div>
  92. <div class="layui-form-item">
  93. <label class="layui-form-label">密 码</label>
  94. <div class="layui-input-block">
  95. <input name="password" placeholder="请输入密码" type="password" class="layui-input" maxlength="20"
  96. lay-verType="tips"/>
  97. </div>
  98. </div>
  99. <div class="layui-form-item">
  100. <label class="layui-form-label layui-form-required">角色</label>
  101. <div class="layui-input-block">
  102. <div id="selRoles"></div>
  103. </div>
  104. </div>
  105. <div class="layui-form-item text-right">
  106. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  107. <button class="layui-btn" perm-show="put:/permission/users/<id>" lay-filter="modelSubmitUser" lay-submit>保存</button>
  108. </div>
  109. </form>
  110. </script>
  111. <!-- js部分 -->
  112. <script>
  113. layui.use(['layer', 'form', 'table', 'util', 'notice','md5', 'admin', 'setter', 'xmSelect'], function () {
  114. var $ = layui.jquery;
  115. var layer = layui.layer;
  116. var form = layui.form;
  117. var table = layui.table;
  118. var util = layui.util;
  119. var admin = layui.admin;
  120. var notice = layui.notice;
  121. var setter = layui.setter;
  122. var md5 = layui.md5;
  123. var xmSelect = layui.xmSelect;
  124. form.render('select');
  125. // 渲染表格
  126. var insTb = table.render({
  127. elem: '#dataTable',
  128. url: setter.baseServer + 'permission/users',
  129. page: true,
  130. // toolbar: true,
  131. toolbar: '#toolBarTpl',
  132. cellMinWidth: 100,
  133. cols: [[
  134. {type: 'checkbox'},
  135. {field: 'email', title: '账号', width: 200},
  136. {field: 'username', title: '用户名'},
  137. {field: 'last_login_ip', title: '上次登录IP'},
  138. {field: 'last_login_time', templet: function (d) {
  139. return util.toDateString(d.last_login_time * 1e3);
  140. }, title: '上次登录时间', width: 180
  141. },
  142. {
  143. field: 'created_at', sort: true, templet: function (d) {
  144. return util.toDateString(d.created_at * 1e3);
  145. }, title: '创建时间', width: 180
  146. },
  147. {field: 'status', templet: '#tableStateUser', title: '状态', width: 120},
  148. {fixed:'right', align: 'center', toolbar: '#tableBarUser', title: '操作', minWidth: 200}
  149. ]],
  150. done:function () {
  151. admin.renderPerm()
  152. }
  153. });
  154. // 添加
  155. $(document).on('click','.user-add-btn', function () {
  156. showEditModel();
  157. });
  158. // 搜索
  159. form.on('submit(formSubSearchUser)', function (data) {
  160. insTb.reload({where: data.field}, 'data');
  161. });
  162. // 工具条点击事件
  163. table.on('tool(dataTable)', function (obj) {
  164. var data = obj.data;
  165. var layEvent = obj.event;
  166. if (layEvent === 'edit') { // 修改
  167. showEditModel(data);
  168. } else if (layEvent === 'del') { // 删除
  169. layer.confirm('确定要删除“' + data.username + '”吗?', {
  170. skin: 'layui-layer-admin',
  171. shade: .1
  172. }, function (i) {
  173. layer.close(i);
  174. layer.load(2);
  175. admin.req('permission/users/' + data.id, function (r) {
  176. layer.closeAll('loading');
  177. if (r.code === 10000) {
  178. notice.msg(r.message, {icon: 1});
  179. insTb.reload({}, 'data');
  180. } else {
  181. notice.msg(r.message, {icon: 2});
  182. }
  183. }, 'DELETE');
  184. });
  185. } else if (layEvent === 'restore') { // 恢复
  186. layer.confirm('确定要恢复“' + data.username + '”吗?', {
  187. skin: 'layui-layer-admin',
  188. shade: .1
  189. }, function (i) {
  190. layer.close(i);
  191. layer.load(2);
  192. admin.req('permission/users/' + data.id + '/restore',function (r) {
  193. layer.closeAll('loading');
  194. if (r.code === 10000) {
  195. notice.msg(r.message, {icon: 1});
  196. insTb.reload({}, 'data');
  197. } else {
  198. notice.msg(r.message, {icon: 2});
  199. }
  200. }, 'POST');
  201. });
  202. }
  203. });
  204. // 显示表单弹窗
  205. function showEditModel(data) {
  206. admin.open({
  207. type: 1,
  208. area: ['420px'], //宽高
  209. title: (data ? '修改' : '添加') + '用户',
  210. content: $('#modelUser').html(),
  211. success: function (layero, dIndex) {
  212. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  213. // 多选框
  214. let selSelect = xmSelect.render({
  215. el: '#selRoles',
  216. name: 'roles',
  217. radio: true,
  218. clickClose: true,
  219. data: []
  220. });
  221. // 获取权限组
  222. admin.req('permission/roles', (p) => {
  223. var selData = [];
  224. var selValue = [];
  225. if(p.code === 10000){
  226. $.each(p.data.list,function (index,item) {
  227. selData.push({
  228. name: item.name + '(' + item.description + ')',
  229. value: item.id
  230. })
  231. });
  232. selSelect.update({ data: selData});
  233. }
  234. // 用户的权限
  235. data && admin.req('permission/users/' + data.id +'/roles', (u) => {
  236. (u.code === 10000) && $.each(u.data, (ui, ut) => {
  237. selValue.push({
  238. name: ut.name + '(' + ut.description + ')',
  239. value: ut.id
  240. })
  241. });
  242. selSelect.setValue(selValue)
  243. });
  244. });
  245. // 置空密码
  246. data ? data.password = "" : data = undefined;
  247. if (data){
  248. // 追加可读
  249. $('input[name=email]').attr('readonly',true).addClass('layui-disabled')
  250. }
  251. form.render('radio');
  252. form.render('select');
  253. // 回显数据
  254. form.val('modelUserForm', data);
  255. // 表单提交事件
  256. form.on('submit(modelSubmitUser)', function (form) {
  257. // 密处理
  258. if (form.field.password != '')
  259. form.field.password = md5.exec(form.field.password);
  260. layer.load(2);
  261. admin.req('permission/users' + (data ? '/' + form.field.id : ''), form.field, function (res) {
  262. layer.closeAll('loading');
  263. if (res.code === 10000) {
  264. // 更新菜单权限
  265. setter.updateUser();
  266. layer.close(dIndex);
  267. notice.msg(res.message, {icon: 1});
  268. insTb.reload({}, 'data');
  269. } else {
  270. notice.msg(res.message, {icon: 2});
  271. }
  272. }, data ? 'PUT' : 'POST');
  273. return false;
  274. });
  275. }
  276. });
  277. }
  278. });
  279. </script>