index.html 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  7. <title>帐号管理</title>
  8. <link rel="stylesheet" href="../../../assets/libs/layui/css/layui.css"/>
  9. <link rel="stylesheet" href="../../../assets/module/admin.css?v=312"/>
  10. <link rel="stylesheet" href="../../../assets/module/zTree/css/metroStyle/metroStyle.css"/>
  11. <link rel="stylesheet" href="../../../assets/module/formSelects/formSelects-v4.css"/>
  12. <body>
  13. <!-- 页面加载loading -->
  14. <div class="page-loading">
  15. <div class="ball-loader">
  16. <span></span><span></span><span></span><span></span>
  17. </div>
  18. </div>
  19. <!-- 正文开始 -->
  20. <div class="layui-fluid">
  21. <div class="layui-row layui-col-space15">
  22. <!-- 左栏 -->
  23. <div class="layui-col-sm12 layui-col-md1 layui-col-lg2">
  24. <div class="layui-card">
  25. <div class="layui-card-body mini-bar zTree" id="treeTbTree">
  26. <ul id="groupTree" class="ztree"></ul>
  27. <input type="hidden" id="curGroupId" value=""/>
  28. </div>
  29. </div>
  30. </div>
  31. <!-- 右栏 -->
  32. <div class="layui-col-sm12 layui-col-md11 layui-col-lg10">
  33. <div class="layui-card">
  34. <div class="layui-card-body">
  35. <div class="layui-form toolbar">
  36. <div class="layui-form-item text-right">
  37. <div class="layui-inline pull-left" style="margin-top:10px;">
  38. <span><i class="layui-icon layui-icon-group"></i>
  39. </span><span id="curGroupName"></span>
  40. </div>
  41. <div class="layui-inline">
  42. <label class="layui-form-label w-auto">搜索:</label>
  43. <div class="layui-input-inline mr0">
  44. <input name="keyword" class="layui-input" type="text" placeholder="输入关键字"/>
  45. </div>
  46. </div>
  47. <div class="layui-inline">
  48. <button class="layui-btn icon-btn" lay-filter="formSubSearchRole" lay-submit>
  49. <i class="layui-icon">&#xe615;</i>搜索
  50. </button>
  51. </div>
  52. <div class="layui-inline">
  53. <button id="btnAdd" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加
  54. </button>
  55. </div>
  56. </div>
  57. </div>
  58. <table class="layui-table" id="datatable" lay-filter="datatable"></table>
  59. </div>
  60. </div>
  61. </div>
  62. </div>
  63. </div>
  64. <!-- 状态列 -->
  65. <script type="text/html" id="accountStatusTpl">
  66. <input type="checkbox" lay-filter="accountStatus" value="{{d.accountStatus}}" accountId="{{d.aId}}"
  67. lay-skin="switch"
  68. lay-text="正常|锁定" {{d.accountStatus==0?'checked':''}}/>
  69. </script>
  70. <script type="text/html" id="grantGroupTpl">
  71. {{# if(d.grantGroupId > 0){ }}
  72. <a class="layui-table-link" lay-event="editGrantGroup"><i class="layui-icon layui-icon-friends"></i>{{d.grantGroupName}}</a>
  73. {{# }else{ }}
  74. <a class="layui-btn layui-btn-radius layui-btn-xs" lay-event="addGrantGroup"><i
  75. class="layui-icon layui-icon-add-1"></i>部门</a>
  76. {{# } }}
  77. </script>
  78. <!-- 表格操作列 -->
  79. <script type="text/html" id="optionTpl">
  80. <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
  81. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  82. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="resetPwd">重置密码</a>
  83. </script>
  84. <!-- 表单弹窗 -->
  85. <script type="text/html" id="modelTpl">
  86. <form id="modelForm" lay-filter="modelForm" class="layui-form model-form">
  87. <div class="layui-form-item">
  88. <label class="layui-form-label">所属部门</label>
  89. <div class="layui-input-block">
  90. <input type="hidden" class="layui-input" id="groupId" name="groupId" value="" lay-verify="required"/>
  91. <input type="text" class="layui-input layui-disabled" id="groupName" name="groupName" value=""
  92. disabled/>
  93. </div>
  94. </div>
  95. <div class="layui-form-item">
  96. <label class="layui-form-label">帐号名称</label>
  97. <div class="layui-input-block">
  98. <input type="hidden" class="layui-input" id="accountId" name="accountId" value=""/>
  99. <input type="hidden" class="layui-input" id="oldAccountName" name="oldAccountName" value=""/>
  100. <input type="text" class="layui-input" id="accountName" name="accountName" value=""
  101. autocomplete="off" lay-verify="accountName|required" maxlength="128"/>
  102. </div>
  103. </div>
  104. <div class="layui-form-item pwd">
  105. <label class="layui-form-label">密码</label>
  106. <div class="layui-input-block">
  107. <input type="password" class="layui-input" id="password" name="password"
  108. placeholder="输入密码" value="" maxlength="32"/>
  109. </div>
  110. </div>
  111. <div class="layui-form-item">
  112. <label class="layui-form-label">姓名</label>
  113. <div class="layui-input-block">
  114. <input type="text" class="layui-input" id="accountRealName" name="accountRealName"
  115. placeholder="输入姓名" value="" autocomplete="off" lay-verify="required" maxlength="64"/>
  116. </div>
  117. </div>
  118. <div class="layui-form-item">
  119. <label class="layui-form-label">性别</label>
  120. <div class="layui-input-block">
  121. <input type="radio" name="accountSex" value="1" title="男">
  122. <input type="radio" name="accountSex" value="2" title="女">
  123. </div>
  124. </div>
  125. <div class="layui-form-item">
  126. <label class="layui-form-label">手机号码</label>
  127. <div class="layui-input-block">
  128. <input type="hidden" class="layui-input" id="oldAccountTel" name="oldAccountTel" placeholder="手机号码"/>
  129. <input type="text" class="layui-input" id="accountTel" name="accountTel" placeholder="手机号码"
  130. autocomplete="off" lay-verify="phone" maxlength="11"/>
  131. </div>
  132. </div>
  133. <div class="layui-form-item">
  134. <label class="layui-form-label">岗位</label>
  135. <div class="layui-input-block">
  136. <select id="positionId" name="positionId" xm-select="positionId" xm-select-radio></select>
  137. <input type="hidden" id="gmpId" name="gmpId" value=""/>
  138. </div>
  139. </div>
  140. <div class="layui-form-item">
  141. <label class="layui-form-label">身份证号</label>
  142. <div class="layui-input-block">
  143. <input type="text" class="layui-input" id="accountIdCard" name="accountIdCard" placeholder="身份证号"
  144. autocomplete="off" maxlength="18"/>
  145. </div>
  146. </div>
  147. <div class="layui-form-item">
  148. <label class="layui-form-label">职称</label>
  149. <div class="layui-input-block">
  150. <input type="text" class="layui-input" id="accountRank" name="accountRank" placeholder="职称"
  151. autocomplete="off" maxlength="64"/>
  152. </div>
  153. </div>
  154. <div class="layui-form-item">
  155. <label class="layui-form-label">工种</label>
  156. <div class="layui-input-block">
  157. <input type="text" class="layui-input" id="accountWorkType" name="accountWorkType" placeholder="工种"
  158. autocomplete="off" maxlength="64"/>
  159. </div>
  160. </div>
  161. <div class="layui-form-item text-right">
  162. <button class="layui-btn layui-btn-primary" type="button" ew-event="closePageDialog">取消</button>
  163. <button class="layui-btn" lay-filter="modelSubmit" lay-submit>保存</button>
  164. </div>
  165. </form>
  166. </script>
  167. <script type="text/html" id="resetPwdModelTpl">
  168. <form id="resetPwdModelForm" lay-filter="resetPwdModelForm" class="layui-form model-form">
  169. <div class="layui-form-item">
  170. <label class="layui-form-label">新密码</label>
  171. <div class="layui-input-block">
  172. <input type="hidden" name="aId" value=""/>
  173. <input type="password" class="layui-input" id="newPassword" name="newPassword" value=""
  174. lay-verify="pwd|required" maxlength="32"/>
  175. </div>
  176. </div>
  177. <div class="layui-form-item">
  178. <label class="layui-form-label">再输一遍</label>
  179. <div class="layui-input-block">
  180. <input type="password" class="layui-input" id="rePassword" name="rePassword" value=""
  181. lay-verify="pwd|required" maxlength="32"/>
  182. </div>
  183. </div>
  184. <div class="layui-form-item text-right">
  185. <button class="layui-btn layui-btn-primary" type="button" ew-event="closePageDialog">取消</button>
  186. <button class="layui-btn" lay-filter="resetPwdModelSubmit" lay-submit>保存</button>
  187. </div>
  188. </form>
  189. </script>
  190. <!-- js部分 -->
  191. <script type="text/javascript" src="../../../assets/libs/layui/layui.js"></script>
  192. <script type="text/javascript" src="../../../assets/js/common.js?v=313"></script>
  193. <script>
  194. layui.use(['iconPicker', 'layer', 'element', 'form', 'table', 'admin', 'uParas', 'util', 'zTree', 'formSelects'], function () {
  195. var $ = layui.jquery;
  196. var layer = layui.layer;
  197. var form = layui.form;
  198. var table = layui.table;
  199. var admin = layui.admin;
  200. var uParas = layui.uParas;
  201. form.verify({
  202. accountName: function (value, item) {
  203. var checkValue = value.trim();
  204. //用户名正则,4到16位(字母,数字,下划线,减号)
  205. if (!(/^[[a-zA-Z0-9_]{2,16}$/.test(checkValue))) {
  206. return "请输入正确的用户名";
  207. }
  208. var oldAccountName = $("#oldAccountName").val();
  209. if (((oldAccountName != "") && (oldAccountName != checkValue))
  210. || ((oldAccountName == "") && (checkValue != ""))) {
  211. //初始化群组树
  212. var url1 = uParas.baseUrl + '/ent/groupAccount/checkAccountNameExist/' + checkValue;
  213. admin.req(url1, {}, function (resp) {
  214. if (resp.code == 1) {
  215. return "用户名已存在!";
  216. }
  217. }, 'GET');
  218. }
  219. },
  220. accountTel: function (value, item) {
  221. var checkValue = value.trim();
  222. if (!(/^1\d{10}$/.test(value))) {
  223. return "请输入正确的手机号码";
  224. }
  225. var oldAccountTel = $("#accountTel").val();
  226. if (((oldAccountTel != "") && (oldAccountTel != checkValue))
  227. || ((oldAccountTel == "") && (checkValue != ""))) {
  228. //初始化群组树
  229. var url1 = uParas.baseUrl + '/org/groupAccount/checkAccountTelExist/' + checkValue;
  230. admin.req(url1, {}, function (resp) {
  231. if (resp.code == 1) {
  232. return "手机号已存在,请更换手机号!";
  233. }
  234. }, 'GET');
  235. }
  236. },
  237. phone: [/^1\d{10}$/, '手机必须11位,只能是数字!'],
  238. email: [/^[a-z0-9._%-]+@([a-z0-9-]+\.)+[a-z]{2,4}$|^1[3|4|5|7|8]\d{9}$/, '邮箱格式不对'],
  239. pwd: function () {
  240. var newPwd = $('#newPassword').val();
  241. var rePwd = $('#rePassword').val();
  242. ;
  243. if (newPwd != rePwd) {
  244. return "两次输入不一致!";
  245. }
  246. }
  247. });
  248. //左树设置
  249. var leftgroupTreeSetting = {
  250. data: {
  251. simpleData: {
  252. enable: true,
  253. idKey: "gId",
  254. pIdKey: "groupParent",
  255. rootPId: 0,
  256. },
  257. key: {
  258. name: "groupName",
  259. title: "groupName",
  260. }
  261. },
  262. callback: {
  263. onClick: leftNodeClick,
  264. }
  265. };
  266. function leftNodeClick(e, treeId, treeNode) {
  267. var groupId = treeNode.gId;
  268. var groupName = treeNode.groupName;
  269. $("#curGroupId").val(groupId);
  270. $("#curGroupName").html(groupName);
  271. refreshTable();
  272. }
  273. function refreshTable() {
  274. var groupId = $("#curGroupId").val();
  275. insTb.reload({
  276. where: {
  277. gId: groupId,
  278. }
  279. }, 'data');
  280. }
  281. //初始化群组树
  282. var url1 = uParas.baseUrl + '/org/groupAccount/getGroupTreeList';
  283. admin.req(url1, {}, function (resp) {
  284. if (resp.code == 1) {
  285. var zNodes = resp.data;
  286. $.fn.zTree.init($('#groupTree'), leftgroupTreeSetting, zNodes);
  287. selectNode();
  288. layer.closeAll('loading');
  289. } else {
  290. layer.msg(resp.msg);
  291. }
  292. }, 'GET');
  293. //选择节点
  294. function selectNode() {
  295. var treeObj = $.fn.zTree.getZTreeObj("groupTree");
  296. var nodes = treeObj.getNodes();
  297. if (nodes.length > 0) {
  298. var node = nodes[0];
  299. treeObj.selectNode(node);
  300. treeObj.expandNode(node, true, false, false);
  301. var groupId = node.gId;
  302. var groupName = node.groupName;
  303. $("#curGroupId").val(groupId);
  304. $("#curGroupName").html(groupName);
  305. initDataTable();
  306. }
  307. }
  308. var insTb = null;
  309. function initDataTable() {
  310. console.log($("#curGroupId").val())
  311. // 渲染表格
  312. if (!insTb && typeof (insTb) != "undefined" && insTb != 0) {
  313. insTb = table.render({
  314. elem: '#datatable',
  315. url: uParas.baseUrl + '/org/groupAccount/queryAccount',
  316. where: {
  317. gId: $("#curGroupId").val(),
  318. },
  319. page: true,
  320. cellMinWidth: 100,
  321. cols: [[
  322. {type: 'numbers', align: 'center', title: '#', width: 60},
  323. {field: 'accountName', align: 'center', sort: false, title: '名称', width: 150},
  324. {field: 'accountRealName', align: 'center', sort: false, title: '姓名', width: 150},
  325. {field: 'accountTel', align: 'center', sort: false, title: '联系方式', width: 150},
  326. {field: 'groupName', align: 'left', sort: false, title: '所在部门'},
  327. {field: 'positionTitle', align: 'center', sort: false, title: '岗位', width: 150},
  328. {
  329. field: 'accountStatus',
  330. align: 'center',
  331. sort: false,
  332. title: '状态',
  333. templet: '#accountStatusTpl',
  334. width: 120,
  335. unresize: true
  336. },
  337. /*{field: 'grantGroupName', align: 'center', sort: false, title: '授权部门', templet: '#grantGroupTpl'},*/
  338. {align: 'center', toolbar: '#optionTpl', title: '操作', width: 200},
  339. ]]
  340. });
  341. }
  342. }
  343. // 添加按钮点击事件
  344. $('#btnAdd').click(function () {
  345. var curGroupId = $("#curGroupId").val();
  346. showAddModel(curGroupId);
  347. });
  348. // 搜索
  349. form.on('submit(formSubSearchRole)', function (data) {
  350. insTb.reload({where: data.field}, 'data');
  351. });
  352. //监听帐号状态操作
  353. form.on('switch(accountStatus)', function (obj) {
  354. console.log(obj);
  355. var accountId = obj.elem.attributes['accountId'].nodeValue;
  356. var accountStatus = obj.elem.checked ? 0 : 1;
  357. layer.load();
  358. var url = uParas.baseUrl + '/org/groupAccount/updateAccountStatus/' + accountId + "/" + accountStatus;
  359. admin.req(url, {}, function (resp) {
  360. layer.closeAll('loading');
  361. if (resp.code == 1) {
  362. layer.msg(resp.msg);
  363. } else {
  364. layer.msg(resp.msg);
  365. insTb.reload({}, 'data');
  366. }
  367. }, 'POST');
  368. });
  369. // 工具条点击事件
  370. table.on('tool(datatable)', function (obj) {
  371. var data = obj.data;
  372. var layEvent = obj.event;
  373. if (layEvent == 'edit') { // 修改
  374. showEditModel(data);
  375. } else if (layEvent == 'del') { // 删除
  376. doDel(obj);
  377. } else if (layEvent == 'resetPwd') {
  378. resetPwd(data);
  379. } else if (layEvent == 'addGrantGroup') {
  380. addGrantGroup(data);
  381. } else if (layEvent == 'editGrantGroup') {
  382. editGrantGroup(data);
  383. }
  384. });
  385. function reLoadData() {
  386. insTb.reload({}, 'data');
  387. }
  388. function addGrantGroup(data) {
  389. admin.open({
  390. type: 2,
  391. title: '授权部门',
  392. content: "./grantGroup.html?gmpId=" + data.gmpId,
  393. area: ['600px', '500px'],
  394. success: function (layero, dIndex) {
  395. layer.setTop(layero);
  396. },
  397. end: function () {
  398. reLoadData();
  399. }
  400. });
  401. }
  402. function editGrantGroup(data) {
  403. admin.open({
  404. type: 2,
  405. title: '授权部门',
  406. content: "./grantGroup.html?gmpId=" + data.gmpId,
  407. area: ['600px', '500px'],
  408. success: function (layero, dIndex) {
  409. layer.setTop(layero);
  410. },
  411. end: function () {
  412. reLoadData();
  413. }
  414. });
  415. }
  416. // 显示新增弹窗
  417. function showAddModel(data) {
  418. var curGroupId = $("#curGroupId").val();
  419. var curGroupName = $("#curGroupName").html();
  420. admin.open({
  421. type: 1,
  422. title: '添加帐号',
  423. content: $('#modelTpl').html(),
  424. success: function (layero, dIndex) {
  425. uParas.initSimpleSelect("positionId", 'modelForm', "/ent/position/getList", "positionTitle", "pId");
  426. form.val('modelForm', {
  427. 'groupId': curGroupId,
  428. 'groupName': curGroupName,
  429. 'accountSex': '1',
  430. });
  431. var url = uParas.baseUrl + '/org/groupAccount/saveAccountGroupPosition';
  432. // 保存处理
  433. form.on('submit(modelSubmit)', function (data) {
  434. layer.load();
  435. admin.req(url, data.field, function (resp) {
  436. layer.closeAll('loading');
  437. if (resp.code == 1) {
  438. layer.close(dIndex);
  439. layer.msg(resp.msg);
  440. insTb.reload({}, 'data');
  441. } else {
  442. layer.msg(resp.msg);
  443. }
  444. }, 'POST');
  445. return false;
  446. });
  447. }
  448. });
  449. }
  450. // 显示表单弹窗
  451. function showEditModel(data) {
  452. admin.open({
  453. type: 1,
  454. title: '编辑帐号',
  455. content: $('#modelTpl').html(),
  456. success: function (layero, dIndex) {
  457. var index = layer.load('loading');
  458. $(".pwd").hide();
  459. var url1 = uParas.baseUrl + "/org/groupAccount/getAccount/" + data.gmId;
  460. admin.req(url1, {}, function (resp) {
  461. if (resp.code == 1) {
  462. form.val('modelForm', {
  463. 'groupId': resp.data.gId,
  464. 'groupName': resp.data.groupName,
  465. 'accountId': resp.data.aId,
  466. 'accountName': resp.data.accountName,
  467. 'password': resp.data.password,
  468. 'accountSex': "" + resp.data.accountSex + "",
  469. 'oldAccountName': resp.data.accountName,
  470. 'accountRealName': resp.data.accountRealName,
  471. 'accountTel': resp.data.accountTel,
  472. 'oldAccountTel': resp.data.accountTel,
  473. 'accountRank': resp.data.accountRank,
  474. 'accountIdCard': resp.data.accountIdCard,
  475. 'accountWorkType': resp.data.accountWorkType,
  476. }); // 回显数据
  477. uParas.initSimpleSelect("positionId", 'modelForm', "/ent/position/getList", "positionTitle", "pId", resp.data.positionId);
  478. layer.close(index);
  479. } else {
  480. layer.msg(resp.msg)
  481. }
  482. }, 'GET');
  483. var url = uParas.baseUrl + '/org/groupAccount/updateAccountGroupPosition';
  484. // 表单提交事件
  485. form.on('submit(modelSubmit)', function (dataF) {
  486. layer.load();
  487. dataF.field.gmId = data.gmId;
  488. dataF.field.gmpId = data.gmpId;
  489. dataF.field.aId = dataF.field.accountId;
  490. admin.req(url, dataF.field, function (resp) {
  491. layer.closeAll('loading');
  492. if (resp.code == 1) {
  493. layer.close(dIndex);
  494. layer.msg(resp.msg);
  495. insTb.reload({}, 'data');
  496. } else {
  497. layer.msg(resp.msg);
  498. }
  499. }, 'POST');
  500. return false;
  501. });
  502. }
  503. });
  504. }
  505. // 删除
  506. function doDel(obj) {
  507. layer.confirm('确定要删除“' + obj.data.accountRealName + '”吗?', {
  508. skin: 'layui-layer-admin',
  509. shade: .1
  510. }
  511. , function (i) {
  512. layer.close(i);
  513. layer.load();
  514. var url = uParas.baseUrl + '/org/groupAccount/deleteAccountGroupPosition/' + obj.data.aId;
  515. admin.req(url, {}, function (resp) {
  516. layer.closeAll('loading');
  517. if (resp.code == 1) {
  518. layer.msg(resp.msg);
  519. obj.del();
  520. } else {
  521. layer.msg(resp.msg);
  522. }
  523. }, 'GET');
  524. });
  525. }
  526. //重置密码
  527. function resetPwd(data) {
  528. admin.open({
  529. type: 1,
  530. title: '重置密码',
  531. content: $('#resetPwdModelTpl').html(),
  532. success: function (layero, dIndex) {
  533. form.val('resetPwdModelForm', {
  534. 'aId': data.aId,
  535. }); // 回显数据
  536. var url = uParas.baseUrl + '/org/groupAccount/resetPassword';
  537. // 表单提交事件
  538. form.on('submit(resetPwdModelSubmit)', function (data) {
  539. layer.load();
  540. data.field.password = data.field.newPassword;
  541. admin.req(url, data.field, function (resp) {
  542. layer.closeAll('loading');
  543. if (resp.code == 1) {
  544. layer.close(dIndex);
  545. layer.msg(resp.msg);
  546. } else {
  547. layer.msg(resp.msg);
  548. }
  549. }, 'POST');
  550. return false;
  551. });
  552. }
  553. });
  554. }
  555. });
  556. </script>
  557. </body>
  558. </html>