role-management.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. <!DOCTYPE html>
  2. <html lang="zh-CN" class="iframe-content">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>角色管理 - 爱智农</title>
  7. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css">
  8. <link rel="stylesheet" href="https://at.alicdn.com/t/font_3114978_qe0b39no76.css">
  9. <link rel="stylesheet" href="../assets/css/global.css">
  10. <style>
  11. body {
  12. font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
  13. background-color: #f5f7f9;
  14. color: #333;
  15. margin: 0;
  16. padding: 0;
  17. height: auto;
  18. overflow-y: auto;
  19. overflow-x: hidden;
  20. min-height: 100%;
  21. }
  22. .page-container {
  23. padding: 20px;
  24. position: relative;
  25. min-height: 100vh;
  26. width: 100%;
  27. max-width: 100%;
  28. box-sizing: border-box;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <div class="page-container responsive-container">
  34. <div class="flex justify-between items-center mb-6">
  35. <h1 class="text-2xl font-bold">角色管理</h1>
  36. <button class="btn btn-primary" id="addRoleBtn">
  37. <i class="iconfont icon-plus btn-icon"></i>
  38. 新增角色
  39. </button>
  40. </div>
  41. <div class="card p-6 mb-6">
  42. <div class="flex flex-wrap gap-4">
  43. <div class="search-box flex-grow">
  44. <input type="text" class="input" placeholder="请输入角色名称/编码">
  45. <button class="btn btn-primary">
  46. <i class="iconfont icon-search btn-icon"></i>
  47. 搜索
  48. </button>
  49. <button class="btn btn-default">
  50. <i class="iconfont icon-reload btn-icon"></i>
  51. 重置
  52. </button>
  53. </div>
  54. <div class="flex gap-2">
  55. <select class="select">
  56. <option value="">所有状态</option>
  57. <option value="1">启用</option>
  58. <option value="0">禁用</option>
  59. </select>
  60. </div>
  61. </div>
  62. </div>
  63. <div class="card">
  64. <div class="table-container">
  65. <table>
  66. <thead>
  67. <tr>
  68. <th>角色名称</th>
  69. <th>角色编码</th>
  70. <th>描述</th>
  71. <th>创建时间</th>
  72. <th>状态</th>
  73. <th>操作</th>
  74. </tr>
  75. </thead>
  76. <tbody>
  77. <tr>
  78. <td>超级管理员</td>
  79. <td>SUPER_ADMIN</td>
  80. <td>拥有系统所有权限</td>
  81. <td>2023-01-01 00:00:00</td>
  82. <td><span class="badge badge-success">启用</span></td>
  83. <td>
  84. <div class="flex gap-2">
  85. <button class="btn btn-default btn-sm edit-btn" data-id="1">
  86. <i class="iconfont icon-edit btn-icon"></i>
  87. 编辑
  88. </button>
  89. <button class="btn btn-default btn-sm permission-btn" data-id="1">
  90. <i class="iconfont icon-lock btn-icon"></i>
  91. 权限
  92. </button>
  93. </div>
  94. </td>
  95. </tr>
  96. <tr>
  97. <td>系统管理员</td>
  98. <td>ADMIN</td>
  99. <td>管理系统基础功能</td>
  100. <td>2023-01-01 00:00:00</td>
  101. <td><span class="badge badge-success">启用</span></td>
  102. <td>
  103. <div class="flex gap-2">
  104. <button class="btn btn-default btn-sm edit-btn" data-id="2">
  105. <i class="iconfont icon-edit btn-icon"></i>
  106. 编辑
  107. </button>
  108. <button class="btn btn-default btn-sm permission-btn" data-id="2">
  109. <i class="iconfont icon-lock btn-icon"></i>
  110. 权限
  111. </button>
  112. <button class="btn btn-danger btn-sm">
  113. <i class="iconfont icon-delete btn-icon"></i>
  114. 删除
  115. </button>
  116. </div>
  117. </td>
  118. </tr>
  119. <tr>
  120. <td>运营管理员</td>
  121. <td>OPERATOR</td>
  122. <td>管理日常运营事务</td>
  123. <td>2023-01-02 10:30:00</td>
  124. <td><span class="badge badge-success">启用</span></td>
  125. <td>
  126. <div class="flex gap-2">
  127. <button class="btn btn-default btn-sm edit-btn" data-id="3">
  128. <i class="iconfont icon-edit btn-icon"></i>
  129. 编辑
  130. </button>
  131. <button class="btn btn-default btn-sm permission-btn" data-id="3">
  132. <i class="iconfont icon-lock btn-icon"></i>
  133. 权限
  134. </button>
  135. <button class="btn btn-danger btn-sm">
  136. <i class="iconfont icon-delete btn-icon"></i>
  137. 删除
  138. </button>
  139. </div>
  140. </td>
  141. </tr>
  142. <tr>
  143. <td>农场管理员</td>
  144. <td>FARM_MANAGER</td>
  145. <td>管理农场相关功能</td>
  146. <td>2023-01-03 09:15:00</td>
  147. <td><span class="badge badge-success">启用</span></td>
  148. <td>
  149. <div class="flex gap-2">
  150. <button class="btn btn-default btn-sm edit-btn" data-id="4">
  151. <i class="iconfont icon-edit btn-icon"></i>
  152. 编辑
  153. </button>
  154. <button class="btn btn-default btn-sm permission-btn" data-id="4">
  155. <i class="iconfont icon-lock btn-icon"></i>
  156. 权限
  157. </button>
  158. <button class="btn btn-danger btn-sm">
  159. <i class="iconfont icon-delete btn-icon"></i>
  160. 删除
  161. </button>
  162. </div>
  163. </td>
  164. </tr>
  165. <tr>
  166. <td>数据分析员</td>
  167. <td>DATA_ANALYST</td>
  168. <td>查看和分析数据</td>
  169. <td>2023-01-04 14:20:00</td>
  170. <td><span class="badge badge-success">启用</span></td>
  171. <td>
  172. <div class="flex gap-2">
  173. <button class="btn btn-default btn-sm edit-btn" data-id="5">
  174. <i class="iconfont icon-edit btn-icon"></i>
  175. 编辑
  176. </button>
  177. <button class="btn btn-default btn-sm permission-btn" data-id="5">
  178. <i class="iconfont icon-lock btn-icon"></i>
  179. 权限
  180. </button>
  181. <button class="btn btn-danger btn-sm">
  182. <i class="iconfont icon-delete btn-icon"></i>
  183. 删除
  184. </button>
  185. </div>
  186. </td>
  187. </tr>
  188. <tr>
  189. <td>普通用户</td>
  190. <td>USER</td>
  191. <td>基础功能访问</td>
  192. <td>2023-01-05 16:45:00</td>
  193. <td><span class="badge badge-success">启用</span></td>
  194. <td>
  195. <div class="flex gap-2">
  196. <button class="btn btn-default btn-sm edit-btn" data-id="6">
  197. <i class="iconfont icon-edit btn-icon"></i>
  198. 编辑
  199. </button>
  200. <button class="btn btn-default btn-sm permission-btn" data-id="6">
  201. <i class="iconfont icon-lock btn-icon"></i>
  202. 权限
  203. </button>
  204. <button class="btn btn-danger btn-sm">
  205. <i class="iconfont icon-delete btn-icon"></i>
  206. 删除
  207. </button>
  208. </div>
  209. </td>
  210. </tr>
  211. </tbody>
  212. </table>
  213. </div>
  214. <div class="p-4 flex justify-between items-center">
  215. <div class="text-sm text-gray-500">
  216. 共 <span class="font-medium">6</span> 条记录,每页 <span class="font-medium">10</span> 条
  217. </div>
  218. <div class="pagination">
  219. <div class="pagination-item disabled">
  220. <i class="iconfont icon-left"></i>
  221. </div>
  222. <div class="pagination-item active">1</div>
  223. <div class="pagination-item">
  224. <i class="iconfont icon-right"></i>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. </div>
  230. <!-- 角色表单弹窗 -->
  231. <div class="modal-overlay" id="roleModal">
  232. <div class="modal">
  233. <div class="modal-header">
  234. <h3 class="modal-title" id="modalTitle">新增角色</h3>
  235. <div class="modal-close" id="closeModal">&times;</div>
  236. </div>
  237. <div class="modal-body">
  238. <form id="roleForm">
  239. <div class="form-group">
  240. <label class="form-label" for="roleName">角色名称</label>
  241. <input type="text" id="roleName" class="form-input" placeholder="请输入角色名称">
  242. </div>
  243. <div class="form-group">
  244. <label class="form-label" for="roleCode">角色编码</label>
  245. <input type="text" id="roleCode" class="form-input" placeholder="请输入角色编码">
  246. </div>
  247. <div class="form-group">
  248. <label class="form-label" for="roleDesc">角色描述</label>
  249. <textarea id="roleDesc" class="form-input" rows="3" placeholder="请输入角色描述"></textarea>
  250. </div>
  251. <div class="form-group">
  252. <label class="form-label">状态</label>
  253. <div class="flex items-center gap-4">
  254. <label class="flex items-center">
  255. <input type="radio" name="status" value="1" checked class="mr-2">
  256. 启用
  257. </label>
  258. <label class="flex items-center">
  259. <input type="radio" name="status" value="0" class="mr-2">
  260. 禁用
  261. </label>
  262. </div>
  263. </div>
  264. </form>
  265. </div>
  266. <div class="modal-footer">
  267. <button class="btn btn-default" id="cancelBtn">取消</button>
  268. <button class="btn btn-primary" id="saveBtn">保存</button>
  269. </div>
  270. </div>
  271. </div>
  272. <!-- 权限设置弹窗 -->
  273. <div class="modal-overlay" id="permissionModal">
  274. <div class="modal" style="max-width: 700px;">
  275. <div class="modal-header">
  276. <h3 class="modal-title">角色权限设置</h3>
  277. <div class="modal-close" id="closePermissionModal">&times;</div>
  278. </div>
  279. <div class="modal-body">
  280. <div class="mb-4">
  281. <h4 class="font-medium mb-2">角色:<span id="currentRoleName">系统管理员</span></h4>
  282. </div>
  283. <div class="border rounded p-4 mb-4">
  284. <div class="flex items-center mb-2">
  285. <input type="checkbox" id="selectAll" class="mr-2">
  286. <label for="selectAll" class="font-medium">全选</label>
  287. </div>
  288. </div>
  289. <div class="max-h-96 overflow-y-auto">
  290. <!-- 系统管理 -->
  291. <div class="border rounded p-4 mb-4">
  292. <div class="flex items-center mb-2">
  293. <input type="checkbox" id="system" class="mr-2 parent-checkbox">
  294. <label for="system" class="font-medium">系统管理</label>
  295. </div>
  296. <div class="pl-8">
  297. <div class="grid grid-cols-3 gap-4">
  298. <label class="flex items-center">
  299. <input type="checkbox" class="mr-2 child-checkbox" data-parent="system">
  300. 用户管理
  301. </label>
  302. <label class="flex items-center">
  303. <input type="checkbox" class="mr-2 child-checkbox" data-parent="system">
  304. 角色管理
  305. </label>
  306. <label class="flex items-center">
  307. <input type="checkbox" class="mr-2 child-checkbox" data-parent="system">
  308. 权限管理
  309. </label>
  310. <label class="flex items-center">
  311. <input type="checkbox" class="mr-2 child-checkbox" data-parent="system">
  312. 组织机构管理
  313. </label>
  314. <label class="flex items-center">
  315. <input type="checkbox" class="mr-2 child-checkbox" data-parent="system">
  316. 登录日志
  317. </label>
  318. <label class="flex items-center">
  319. <input type="checkbox" class="mr-2 child-checkbox" data-parent="system">
  320. 操作日志
  321. </label>
  322. </div>
  323. </div>
  324. </div>
  325. <!-- 地块与农场管理 -->
  326. <div class="border rounded p-4 mb-4">
  327. <div class="flex items-center mb-2">
  328. <input type="checkbox" id="farm" class="mr-2 parent-checkbox">
  329. <label for="farm" class="font-medium">地块与农场管理</label>
  330. </div>
  331. <div class="pl-8">
  332. <div class="grid grid-cols-3 gap-4">
  333. <label class="flex items-center">
  334. <input type="checkbox" class="mr-2 child-checkbox" data-parent="farm">
  335. 地块管理列表
  336. </label>
  337. <label class="flex items-center">
  338. <input type="checkbox" class="mr-2 child-checkbox" data-parent="farm">
  339. 地块设备绑定
  340. </label>
  341. <label class="flex items-center">
  342. <input type="checkbox" class="mr-2 child-checkbox" data-parent="farm">
  343. 地块人员绑定
  344. </label>
  345. <label class="flex items-center">
  346. <input type="checkbox" class="mr-2 child-checkbox" data-parent="farm">
  347. 地块绘制区域
  348. </label>
  349. </div>
  350. </div>
  351. </div>
  352. <!-- 设备监控管理 -->
  353. <div class="border rounded p-4 mb-4">
  354. <div class="flex items-center mb-2">
  355. <input type="checkbox" id="device" class="mr-2 parent-checkbox">
  356. <label for="device" class="font-medium">设备监控管理</label>
  357. </div>
  358. <div class="pl-8">
  359. <div class="grid grid-cols-3 gap-4">
  360. <label class="flex items-center">
  361. <input type="checkbox" class="mr-2 child-checkbox" data-parent="device">
  362. 设备管理列表
  363. </label>
  364. <label class="flex items-center">
  365. <input type="checkbox" class="mr-2 child-checkbox" data-parent="device">
  366. 设备监控实时展示
  367. </label>
  368. <label class="flex items-center">
  369. <input type="checkbox" class="mr-2 child-checkbox" data-parent="device">
  370. 设备告警信息
  371. </label>
  372. </div>
  373. </div>
  374. </div>
  375. </div>
  376. </div>
  377. <div class="modal-footer">
  378. <button class="btn btn-default" id="cancelPermissionBtn">取消</button>
  379. <button class="btn btn-primary" id="savePermissionBtn">保存</button>
  380. </div>
  381. </div>
  382. </div>
  383. <script>
  384. document.addEventListener('DOMContentLoaded', function() {
  385. // 角色表单弹窗
  386. const roleModal = document.getElementById('roleModal');
  387. const modalTitle = document.getElementById('modalTitle');
  388. const addRoleBtn = document.getElementById('addRoleBtn');
  389. const closeModal = document.getElementById('closeModal');
  390. const cancelBtn = document.getElementById('cancelBtn');
  391. const saveBtn = document.getElementById('saveBtn');
  392. const editBtns = document.querySelectorAll('.edit-btn');
  393. const roleForm = document.getElementById('roleForm');
  394. // 打开新增角色弹窗
  395. addRoleBtn.addEventListener('click', function() {
  396. modalTitle.textContent = '新增角色';
  397. roleForm.reset();
  398. roleModal.style.display = 'flex';
  399. });
  400. // 打开编辑角色弹窗
  401. editBtns.forEach(btn => {
  402. btn.addEventListener('click', function() {
  403. const roleId = this.getAttribute('data-id');
  404. modalTitle.textContent = '编辑角色';
  405. // 模拟获取角色数据
  406. // 实际应用中应该通过API获取
  407. if (roleId === '2') {
  408. document.getElementById('roleName').value = '系统管理员';
  409. document.getElementById('roleCode').value = 'ADMIN';
  410. document.getElementById('roleDesc').value = '管理系统基础功能';
  411. }
  412. roleModal.style.display = 'flex';
  413. });
  414. });
  415. // 关闭弹窗
  416. function closeRoleModal() {
  417. roleModal.style.display = 'none';
  418. }
  419. closeModal.addEventListener('click', closeRoleModal);
  420. cancelBtn.addEventListener('click', closeRoleModal);
  421. // 保存角色
  422. saveBtn.addEventListener('click', function() {
  423. alert('角色信息保存成功!');
  424. closeRoleModal();
  425. });
  426. // 权限设置弹窗
  427. const permissionModal = document.getElementById('permissionModal');
  428. const permissionBtns = document.querySelectorAll('.permission-btn');
  429. const closePermissionModal = document.getElementById('closePermissionModal');
  430. const cancelPermissionBtn = document.getElementById('cancelPermissionBtn');
  431. const savePermissionBtn = document.getElementById('savePermissionBtn');
  432. const currentRoleName = document.getElementById('currentRoleName');
  433. // 打开权限设置弹窗
  434. permissionBtns.forEach(btn => {
  435. btn.addEventListener('click', function() {
  436. const roleId = this.getAttribute('data-id');
  437. const roleName = this.closest('tr').querySelector('td:first-child').textContent;
  438. currentRoleName.textContent = roleName;
  439. permissionModal.style.display = 'flex';
  440. });
  441. });
  442. // 关闭权限设置弹窗
  443. function closePermissionModalFunc() {
  444. permissionModal.style.display = 'none';
  445. }
  446. closePermissionModal.addEventListener('click', closePermissionModalFunc);
  447. cancelPermissionBtn.addEventListener('click', closePermissionModalFunc);
  448. // 保存权限设置
  449. savePermissionBtn.addEventListener('click', function() {
  450. alert('权限设置保存成功!');
  451. closePermissionModalFunc();
  452. });
  453. // 全选功能
  454. const selectAll = document.getElementById('selectAll');
  455. const allCheckboxes = document.querySelectorAll('.parent-checkbox, .child-checkbox');
  456. selectAll.addEventListener('change', function() {
  457. allCheckboxes.forEach(checkbox => {
  458. checkbox.checked = this.checked;
  459. });
  460. });
  461. // 父级选择框控制子级
  462. const parentCheckboxes = document.querySelectorAll('.parent-checkbox');
  463. parentCheckboxes.forEach(parent => {
  464. parent.addEventListener('change', function() {
  465. const parentId = this.id;
  466. const children = document.querySelectorAll(`.child-checkbox[data-parent="${parentId}"]`);
  467. children.forEach(child => {
  468. child.checked = this.checked;
  469. });
  470. });
  471. });
  472. // 子级选择框影响父级
  473. const childCheckboxes = document.querySelectorAll('.child-checkbox');
  474. childCheckboxes.forEach(child => {
  475. child.addEventListener('change', function() {
  476. const parentId = this.getAttribute('data-parent');
  477. const parent = document.getElementById(parentId);
  478. const siblings = document.querySelectorAll(`.child-checkbox[data-parent="${parentId}"]`);
  479. // 如果所有子级都选中,则父级也选中
  480. const allChecked = Array.from(siblings).every(sibling => sibling.checked);
  481. parent.checked = allChecked;
  482. // 更新全选状态
  483. const allParentsChecked = Array.from(parentCheckboxes).every(p => p.checked);
  484. selectAll.checked = allParentsChecked;
  485. });
  486. });
  487. // 点击弹窗外部关闭弹窗
  488. window.addEventListener('click', function(e) {
  489. if (e.target === roleModal) {
  490. closeRoleModal();
  491. }
  492. if (e.target === permissionModal) {
  493. closePermissionModalFunc();
  494. }
  495. });
  496. });
  497. </script>
  498. </body>
  499. </html>