dict-management.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  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="addDictBtn">
  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="grid grid-cols-1 lg:grid-cols-3 gap-6">
  64. <!-- 左侧字典类型列表 -->
  65. <div class="card">
  66. <div class="flex justify-between items-center border-b p-4">
  67. <h2 class="font-medium">字典类型</h2>
  68. </div>
  69. <div class="table-container">
  70. <table>
  71. <thead>
  72. <tr>
  73. <th>字典名称</th>
  74. <th>字典编码</th>
  75. <th>状态</th>
  76. </tr>
  77. </thead>
  78. <tbody>
  79. <tr class="dict-type-row active" data-id="1">
  80. <td>用户性别</td>
  81. <td>sys_user_sex</td>
  82. <td><span class="badge badge-success">启用</span></td>
  83. </tr>
  84. <tr class="dict-type-row" data-id="2">
  85. <td>菜单状态</td>
  86. <td>sys_menu_status</td>
  87. <td><span class="badge badge-success">启用</span></td>
  88. </tr>
  89. <tr class="dict-type-row" data-id="3">
  90. <td>系统开关</td>
  91. <td>sys_normal_disable</td>
  92. <td><span class="badge badge-success">启用</span></td>
  93. </tr>
  94. <tr class="dict-type-row" data-id="4">
  95. <td>任务状态</td>
  96. <td>sys_job_status</td>
  97. <td><span class="badge badge-success">启用</span></td>
  98. </tr>
  99. <tr class="dict-type-row" data-id="5">
  100. <td>任务分组</td>
  101. <td>sys_job_group</td>
  102. <td><span class="badge badge-success">启用</span></td>
  103. </tr>
  104. <tr class="dict-type-row" data-id="6">
  105. <td>通知类型</td>
  106. <td>sys_notice_type</td>
  107. <td><span class="badge badge-success">启用</span></td>
  108. </tr>
  109. <tr class="dict-type-row" data-id="7">
  110. <td>通知状态</td>
  111. <td>sys_notice_status</td>
  112. <td><span class="badge badge-success">启用</span></td>
  113. </tr>
  114. <tr class="dict-type-row" data-id="8">
  115. <td>作业状态</td>
  116. <td>farm_task_status</td>
  117. <td><span class="badge badge-success">启用</span></td>
  118. </tr>
  119. <tr class="dict-type-row" data-id="9">
  120. <td>设备类型</td>
  121. <td>device_type</td>
  122. <td><span class="badge badge-success">启用</span></td>
  123. </tr>
  124. <tr class="dict-type-row" data-id="10">
  125. <td>作物类型</td>
  126. <td>crop_type</td>
  127. <td><span class="badge badge-success">启用</span></td>
  128. </tr>
  129. </tbody>
  130. </table>
  131. </div>
  132. <div class="p-4 flex justify-between items-center">
  133. <div class="text-sm text-gray-500">
  134. 共 <span class="font-medium">10</span> 条记录,每页 <span class="font-medium">10</span> 条
  135. </div>
  136. <div class="pagination">
  137. <div class="pagination-item disabled">
  138. <i class="iconfont icon-left"></i>
  139. </div>
  140. <div class="pagination-item active">1</div>
  141. <div class="pagination-item">
  142. <i class="iconfont icon-right"></i>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147. <!-- 右侧字典数据列表 -->
  148. <div class="card lg:col-span-2">
  149. <div class="flex justify-between items-center border-b p-4">
  150. <h2 class="font-medium">字典数据 - 用户性别</h2>
  151. <button class="btn btn-primary" id="addDictDataBtn">
  152. <i class="iconfont icon-plus btn-icon"></i>
  153. 新增字典数据
  154. </button>
  155. </div>
  156. <div class="table-container">
  157. <table>
  158. <thead>
  159. <tr>
  160. <th>字典标签</th>
  161. <th>字典键值</th>
  162. <th>字典排序</th>
  163. <th>状态</th>
  164. <th>操作</th>
  165. </tr>
  166. </thead>
  167. <tbody>
  168. <tr>
  169. <td>男</td>
  170. <td>1</td>
  171. <td>1</td>
  172. <td><span class="badge badge-success">启用</span></td>
  173. <td>
  174. <div class="flex gap-2">
  175. <button class="btn btn-default btn-sm edit-data-btn" data-id="1">
  176. <i class="iconfont icon-edit btn-icon"></i>
  177. 编辑
  178. </button>
  179. <button class="btn btn-danger btn-sm">
  180. <i class="iconfont icon-delete btn-icon"></i>
  181. 删除
  182. </button>
  183. </div>
  184. </td>
  185. </tr>
  186. <tr>
  187. <td>女</td>
  188. <td>2</td>
  189. <td>2</td>
  190. <td><span class="badge badge-success">启用</span></td>
  191. <td>
  192. <div class="flex gap-2">
  193. <button class="btn btn-default btn-sm edit-data-btn" data-id="2">
  194. <i class="iconfont icon-edit btn-icon"></i>
  195. 编辑
  196. </button>
  197. <button class="btn btn-danger btn-sm">
  198. <i class="iconfont icon-delete btn-icon"></i>
  199. 删除
  200. </button>
  201. </div>
  202. </td>
  203. </tr>
  204. <tr>
  205. <td>未知</td>
  206. <td>0</td>
  207. <td>3</td>
  208. <td><span class="badge badge-success">启用</span></td>
  209. <td>
  210. <div class="flex gap-2">
  211. <button class="btn btn-default btn-sm edit-data-btn" data-id="3">
  212. <i class="iconfont icon-edit btn-icon"></i>
  213. 编辑
  214. </button>
  215. <button class="btn btn-danger btn-sm">
  216. <i class="iconfont icon-delete btn-icon"></i>
  217. 删除
  218. </button>
  219. </div>
  220. </td>
  221. </tr>
  222. </tbody>
  223. </table>
  224. </div>
  225. <div class="p-4 flex justify-between items-center">
  226. <div class="text-sm text-gray-500">
  227. 共 <span class="font-medium">3</span> 条记录,每页 <span class="font-medium">10</span> 条
  228. </div>
  229. <div class="pagination">
  230. <div class="pagination-item disabled">
  231. <i class="iconfont icon-left"></i>
  232. </div>
  233. <div class="pagination-item active">1</div>
  234. <div class="pagination-item">
  235. <i class="iconfont icon-right"></i>
  236. </div>
  237. </div>
  238. </div>
  239. </div>
  240. </div>
  241. </div>
  242. <!-- 字典类型表单弹窗 -->
  243. <div class="modal-overlay" id="dictModal">
  244. <div class="modal">
  245. <div class="modal-header">
  246. <h3 class="modal-title" id="dictModalTitle">新增字典</h3>
  247. <div class="modal-close" id="closeDictModal">&times;</div>
  248. </div>
  249. <div class="modal-body">
  250. <form id="dictForm">
  251. <div class="form-group">
  252. <label class="form-label" for="dictName">字典名称</label>
  253. <input type="text" id="dictName" class="form-input" placeholder="请输入字典名称">
  254. </div>
  255. <div class="form-group">
  256. <label class="form-label" for="dictCode">字典编码</label>
  257. <input type="text" id="dictCode" class="form-input" placeholder="请输入字典编码">
  258. </div>
  259. <div class="form-group">
  260. <label class="form-label" for="dictDesc">字典描述</label>
  261. <textarea id="dictDesc" class="form-input" rows="3" placeholder="请输入字典描述"></textarea>
  262. </div>
  263. <div class="form-group">
  264. <label class="form-label">状态</label>
  265. <div class="flex items-center gap-4">
  266. <label class="flex items-center">
  267. <input type="radio" name="dictStatus" value="1" checked class="mr-2">
  268. 启用
  269. </label>
  270. <label class="flex items-center">
  271. <input type="radio" name="dictStatus" value="0" class="mr-2">
  272. 禁用
  273. </label>
  274. </div>
  275. </div>
  276. </form>
  277. </div>
  278. <div class="modal-footer">
  279. <button class="btn btn-default" id="cancelDictBtn">取消</button>
  280. <button class="btn btn-primary" id="saveDictBtn">保存</button>
  281. </div>
  282. </div>
  283. </div>
  284. <!-- 字典数据表单弹窗 -->
  285. <div class="modal-overlay" id="dictDataModal">
  286. <div class="modal">
  287. <div class="modal-header">
  288. <h3 class="modal-title" id="dictDataModalTitle">新增字典数据</h3>
  289. <div class="modal-close" id="closeDictDataModal">&times;</div>
  290. </div>
  291. <div class="modal-body">
  292. <form id="dictDataForm">
  293. <div class="form-group">
  294. <label class="form-label" for="dictType">字典类型</label>
  295. <input type="text" id="dictType" class="form-input" value="用户性别" readonly>
  296. </div>
  297. <div class="form-group">
  298. <label class="form-label" for="dictLabel">字典标签</label>
  299. <input type="text" id="dictLabel" class="form-input" placeholder="请输入字典标签">
  300. </div>
  301. <div class="form-group">
  302. <label class="form-label" for="dictValue">字典键值</label>
  303. <input type="text" id="dictValue" class="form-input" placeholder="请输入字典键值">
  304. </div>
  305. <div class="form-group">
  306. <label class="form-label" for="dictSort">字典排序</label>
  307. <input type="number" id="dictSort" class="form-input" placeholder="请输入字典排序" value="1">
  308. </div>
  309. <div class="form-group">
  310. <label class="form-label">状态</label>
  311. <div class="flex items-center gap-4">
  312. <label class="flex items-center">
  313. <input type="radio" name="dataStatus" value="1" checked class="mr-2">
  314. 启用
  315. </label>
  316. <label class="flex items-center">
  317. <input type="radio" name="dataStatus" value="0" class="mr-2">
  318. 禁用
  319. </label>
  320. </div>
  321. </div>
  322. <div class="form-group">
  323. <label class="form-label" for="remark">备注</label>
  324. <textarea id="remark" class="form-input" rows="2" placeholder="请输入备注"></textarea>
  325. </div>
  326. </form>
  327. </div>
  328. <div class="modal-footer">
  329. <button class="btn btn-default" id="cancelDataBtn">取消</button>
  330. <button class="btn btn-primary" id="saveDataBtn">保存</button>
  331. </div>
  332. </div>
  333. </div>
  334. <script>
  335. document.addEventListener('DOMContentLoaded', function() {
  336. // 字典类型行点击事件
  337. const dictTypeRows = document.querySelectorAll('.dict-type-row');
  338. dictTypeRows.forEach(row => {
  339. row.addEventListener('click', function() {
  340. // 移除其他行的活动状态
  341. dictTypeRows.forEach(r => r.classList.remove('active'));
  342. // 添加当前行的活动状态
  343. this.classList.add('active');
  344. // 更新右侧标题
  345. const dictName = this.querySelector('td:first-child').textContent;
  346. document.querySelector('.card.lg\\:col-span-2 h2').textContent = `字典数据 - ${dictName}`;
  347. // 更新字典数据表单中的字典类型
  348. document.getElementById('dictType').value = dictName;
  349. // 实际应用中,这里应该发送请求获取对应的字典数据
  350. });
  351. });
  352. // 字典类型表单弹窗
  353. const dictModal = document.getElementById('dictModal');
  354. const dictModalTitle = document.getElementById('dictModalTitle');
  355. const addDictBtn = document.getElementById('addDictBtn');
  356. const closeDictModal = document.getElementById('closeDictModal');
  357. const cancelDictBtn = document.getElementById('cancelDictBtn');
  358. const saveDictBtn = document.getElementById('saveDictBtn');
  359. // 打开新增字典弹窗
  360. addDictBtn.addEventListener('click', function() {
  361. dictModalTitle.textContent = '新增字典';
  362. document.getElementById('dictForm').reset();
  363. dictModal.style.display = 'flex';
  364. });
  365. // 关闭字典弹窗
  366. function closeDictModalFunc() {
  367. dictModal.style.display = 'none';
  368. }
  369. closeDictModal.addEventListener('click', closeDictModalFunc);
  370. cancelDictBtn.addEventListener('click', closeDictModalFunc);
  371. // 保存字典
  372. saveDictBtn.addEventListener('click', function() {
  373. alert('字典保存成功!');
  374. closeDictModalFunc();
  375. });
  376. // 字典数据表单弹窗
  377. const dictDataModal = document.getElementById('dictDataModal');
  378. const dictDataModalTitle = document.getElementById('dictDataModalTitle');
  379. const addDictDataBtn = document.getElementById('addDictDataBtn');
  380. const closeDictDataModal = document.getElementById('closeDictDataModal');
  381. const cancelDataBtn = document.getElementById('cancelDataBtn');
  382. const saveDataBtn = document.getElementById('saveDataBtn');
  383. const editDataBtns = document.querySelectorAll('.edit-data-btn');
  384. // 打开新增字典数据弹窗
  385. addDictDataBtn.addEventListener('click', function() {
  386. dictDataModalTitle.textContent = '新增字典数据';
  387. document.getElementById('dictDataForm').reset();
  388. // 设置字典类型为当前选中的字典类型
  389. const activeType = document.querySelector('.dict-type-row.active td:first-child').textContent;
  390. document.getElementById('dictType').value = activeType;
  391. dictDataModal.style.display = 'flex';
  392. });
  393. // 打开编辑字典数据弹窗
  394. editDataBtns.forEach(btn => {
  395. btn.addEventListener('click', function() {
  396. const dataId = this.getAttribute('data-id');
  397. dictDataModalTitle.textContent = '编辑字典数据';
  398. // 模拟获取字典数据
  399. if (dataId === '1') {
  400. document.getElementById('dictLabel').value = '男';
  401. document.getElementById('dictValue').value = '1';
  402. document.getElementById('dictSort').value = '1';
  403. document.querySelector('input[name="dataStatus"][value="1"]').checked = true;
  404. document.getElementById('remark').value = '男性用户';
  405. }
  406. dictDataModal.style.display = 'flex';
  407. });
  408. });
  409. // 关闭字典数据弹窗
  410. function closeDictDataModalFunc() {
  411. dictDataModal.style.display = 'none';
  412. }
  413. closeDictDataModal.addEventListener('click', closeDictDataModalFunc);
  414. cancelDataBtn.addEventListener('click', closeDictDataModalFunc);
  415. // 保存字典数据
  416. saveDataBtn.addEventListener('click', function() {
  417. alert('字典数据保存成功!');
  418. closeDictDataModalFunc();
  419. });
  420. // 点击弹窗外部关闭弹窗
  421. window.addEventListener('click', function(e) {
  422. if (e.target === dictModal) {
  423. closeDictModalFunc();
  424. }
  425. if (e.target === dictDataModal) {
  426. closeDictDataModalFunc();
  427. }
  428. });
  429. // 添加表格行的悬停效果
  430. const tableRows = document.querySelectorAll('tbody tr');
  431. tableRows.forEach(row => {
  432. row.classList.add('hover:bg-gray-50', 'cursor-pointer');
  433. });
  434. });
  435. </script>
  436. </body>
  437. </html>