xto-fronted 0.4.85 → 0.4.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/dist/assets/404-BNfk6aVM.js +1 -0
  2. package/dist/assets/404-ByYjFnhI.js +1 -0
  3. package/dist/assets/404-CH5_LdtS.css +1 -0
  4. package/dist/assets/404-sqW80Hc-.css +1 -0
  5. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  6. package/dist/assets/index-BBhC8PX4.js +1 -0
  7. package/dist/assets/index-BOEFG4lP.css +1 -0
  8. package/dist/assets/index-BRR97dc6.js +1 -0
  9. package/dist/assets/index-BSa4SMHI.js +1 -0
  10. package/dist/assets/index-BihVoviB.js +1 -0
  11. package/dist/assets/index-Bmux4tGG.js +1 -0
  12. package/dist/assets/index-BrvR0Fn_.css +1 -0
  13. package/dist/assets/index-C4ZCZoPp.js +1 -0
  14. package/dist/assets/index-CMgRqiaT.js +1 -0
  15. package/dist/assets/index-CUh_s55Z.css +1 -0
  16. package/dist/assets/index-CV768Wu1.js +1 -0
  17. package/dist/assets/index-D0OnMilp.js +1 -0
  18. package/dist/assets/index-D9wlAuR_.js +1 -0
  19. package/dist/assets/index-DPkO-STg.js +1 -0
  20. package/dist/assets/index-DawJb02s.css +1 -0
  21. package/dist/assets/index-DcFOybjo.js +1 -0
  22. package/dist/assets/index-DiHSZ6SJ.js +2 -0
  23. package/dist/assets/index-GDP-IkXE.css +1 -0
  24. package/dist/assets/index-Gx75raue.js +2 -0
  25. package/dist/assets/index-JsZ6rkQj.js +1 -0
  26. package/dist/assets/index-PfV8pzQz.css +1 -0
  27. package/dist/assets/index-Swfu6yvD.css +1 -0
  28. package/dist/assets/index-eQ-JQMk3.css +1 -0
  29. package/dist/assets/vendor-42ANG6Sg.js +6 -0
  30. package/dist/assets/vite-Dw-pgLOX.js +1 -0
  31. package/dist/assets/vue-vendor-05sbU7Th.js +29 -0
  32. package/dist/assets/vue-vendor-Br-l7wbK.js +29 -0
  33. package/dist/assets/xto-base-BSTP-Yn2.js +1 -0
  34. package/dist/assets/xto-base-C-IBqjVs.js +1 -0
  35. package/dist/assets/xto-base-C6eqMPdO.css +1 -0
  36. package/dist/assets/xto-base-CL2NKZJJ.css +1 -0
  37. package/dist/assets/xto-business--V1F5Gwb.css +1 -0
  38. package/dist/assets/xto-core-DZK7Cyg0.js +1 -0
  39. package/dist/assets/xto-core-cL8BAdce.js +1 -0
  40. package/dist/assets/xto-data-BFpiDgJi.js +1 -0
  41. package/dist/assets/xto-data-CnAQAQH2.css +1 -0
  42. package/dist/assets/xto-data-Cw0dv5K5.js +1 -0
  43. package/dist/assets/xto-data-MxZsiJgi.css +1 -0
  44. package/dist/assets/xto-feedback-B2M02fn3.js +1 -0
  45. package/dist/assets/xto-feedback-Bxx38c3P.css +1 -0
  46. package/dist/assets/xto-feedback-ByaS-C7_.css +1 -0
  47. package/dist/assets/xto-feedback-CTk0sMCW.js +1 -0
  48. package/dist/assets/xto-form-C5i2lk3C.js +1 -0
  49. package/dist/assets/xto-form-CrsyAjyr.css +1 -0
  50. package/dist/assets/xto-form-Cu6q3VLG.css +1 -0
  51. package/dist/assets/xto-form-NRjKKNcY.js +1 -0
  52. package/dist/assets/xto-layout-BDD6sSlM.css +1 -0
  53. package/dist/assets/xto-layout-D1stVnJI.css +1 -0
  54. package/dist/assets/xto-navigation-BuRQVoD8.css +1 -0
  55. package/dist/assets/xto-navigation-DHsTg0WG.js +1 -0
  56. package/dist/assets/xto-navigation-XfpyMpEo.css +1 -0
  57. package/dist/assets/xto-navigation-qLRTxo68.js +1 -0
  58. package/dist/index-0h_oG71z.js +345 -0
  59. package/dist/index-1EEezXR3.js +142 -0
  60. package/dist/index-1EkaJDoD.js +142 -0
  61. package/dist/index-1VN-SSaj.js +2873 -0
  62. package/dist/index-23nX2t9j.js +142 -0
  63. package/dist/index-2RwL0s53.js +142 -0
  64. package/dist/index-2tvOdd6w.js +372 -0
  65. package/dist/index-3zeoNaqT.js +345 -0
  66. package/dist/index-8oCLh51t.js +475 -0
  67. package/dist/index-AF5JN8Up.js +142 -0
  68. package/dist/index-B02xiP9g.js +372 -0
  69. package/dist/index-B05xso4D.js +345 -0
  70. package/dist/index-B1VS4tRU.js +475 -0
  71. package/dist/index-B3_VQZ-d.js +372 -0
  72. package/dist/index-B3kL6i_g.js +345 -0
  73. package/dist/index-B4Wny0vt.js +345 -0
  74. package/dist/index-B5RdBQ-f.js +475 -0
  75. package/dist/index-B5rbuoWS.js +2835 -0
  76. package/dist/index-BAFpPlnI.js +475 -0
  77. package/dist/index-BAJakzRz.js +142 -0
  78. package/dist/index-BAOHlfVd.js +142 -0
  79. package/dist/index-BAzJWzWG.js +2852 -0
  80. package/dist/index-BEIxh_R3.js +2982 -0
  81. package/dist/index-BEWrRNps.js +475 -0
  82. package/dist/index-BFtKVmzo.js +142 -0
  83. package/dist/index-BHPrW1wN.js +142 -0
  84. package/dist/index-BHQIqN1E.js +372 -0
  85. package/dist/index-BHZ_y8lp.js +2067 -0
  86. package/dist/index-BHvnTk5Z.js +475 -0
  87. package/dist/index-BIf7CYCW.js +475 -0
  88. package/dist/index-BK1Y1z9_.js +142 -0
  89. package/dist/index-BK8qDl14.js +372 -0
  90. package/dist/index-BKnta6nv.js +372 -0
  91. package/dist/index-BLIem13z.js +345 -0
  92. package/dist/index-BNBv_FCu.js +142 -0
  93. package/dist/index-BNwtCm83.js +345 -0
  94. package/dist/index-BOEMA7WH.js +345 -0
  95. package/dist/index-BOwDukt-.js +2346 -0
  96. package/dist/index-BR9WVjrV.js +2851 -0
  97. package/dist/index-BRMkw154.js +475 -0
  98. package/dist/index-BRQBannD.js +345 -0
  99. package/dist/index-BShKtLTm.js +475 -0
  100. package/dist/index-BVpqTdd2.js +3132 -0
  101. package/dist/index-BWGQANAN.js +2851 -0
  102. package/dist/index-BZKw7U60.js +475 -0
  103. package/dist/index-BadGWG4q.js +475 -0
  104. package/dist/index-BbeWpCd3.js +345 -0
  105. package/dist/index-BeUYNx5P.js +475 -0
  106. package/dist/index-BgiGtxRr.js +142 -0
  107. package/dist/index-BhKJLk9M.js +2824 -0
  108. package/dist/index-BijsKQ3r.js +475 -0
  109. package/dist/index-BjEfspqP.js +475 -0
  110. package/dist/index-BjEnT8WQ.js +372 -0
  111. package/dist/index-BpOcz1m4.js +142 -0
  112. package/dist/index-BrRdLbLB.js +142 -0
  113. package/dist/index-BsHOXfCq.js +372 -0
  114. package/dist/index-Bt5ocakb.js +475 -0
  115. package/dist/index-BtE24Mt4.js +142 -0
  116. package/dist/index-BvcBQjw6.js +2836 -0
  117. package/dist/index-C0krZRWf.js +2859 -0
  118. package/dist/index-C1cKUqmA.js +372 -0
  119. package/dist/index-C3ANmIDM.js +475 -0
  120. package/dist/index-C5JrEkwD.js +345 -0
  121. package/dist/index-C5m4qNMQ.js +2851 -0
  122. package/dist/index-C69vu_ot.js +3147 -0
  123. package/dist/index-C6Um6eFy.js +475 -0
  124. package/dist/index-C75ePQYC.js +372 -0
  125. package/dist/index-C7wKLGhC.js +142 -0
  126. package/dist/index-C8DBDnxx.js +2836 -0
  127. package/dist/index-CAnqlIjX.js +475 -0
  128. package/dist/index-CB36fztK.js +345 -0
  129. package/dist/index-CBKo6Enz.js +345 -0
  130. package/dist/index-CBcuyFIa.js +2326 -0
  131. package/dist/index-CCxIu4ex.js +372 -0
  132. package/dist/index-CD1ZEMzL.js +2836 -0
  133. package/dist/index-CDx-6tvY.js +345 -0
  134. package/dist/index-CGrvOpdb.js +372 -0
  135. package/dist/index-CHJWNf3f.js +475 -0
  136. package/dist/index-CIb06BxE.js +372 -0
  137. package/dist/index-CLiJcB9v.js +142 -0
  138. package/dist/index-CNS6Ohfw.js +2853 -0
  139. package/dist/index-COkjB5Jm.js +142 -0
  140. package/dist/index-CS5h1O5W.js +345 -0
  141. package/dist/index-CT0deRSL.js +372 -0
  142. package/dist/index-CTQQBaf4.js +345 -0
  143. package/dist/index-CUAC0ZFB.js +475 -0
  144. package/dist/index-CVMV9Tfg.js +142 -0
  145. package/dist/index-CWOx59Vc.js +142 -0
  146. package/dist/index-CWdSR99B.js +372 -0
  147. package/dist/index-CWvOcS8Y.js +345 -0
  148. package/dist/index-C_8yJlf1.js +475 -0
  149. package/dist/index-C_MzXmh2.js +2830 -0
  150. package/dist/index-Cb7HXiBR.js +372 -0
  151. package/dist/index-CbA8oUvZ.js +142 -0
  152. package/dist/index-CbEIzXG9.js +475 -0
  153. package/dist/index-Cb_m0zz1.js +475 -0
  154. package/dist/index-Cc6HgGzc.js +142 -0
  155. package/dist/index-CcWdW9Mj.js +372 -0
  156. package/dist/index-CdAqkP8L.js +345 -0
  157. package/dist/index-CeVUHSt9.js +2847 -0
  158. package/dist/index-CejRpy0a.js +475 -0
  159. package/dist/index-Cg5wO_jJ.js +372 -0
  160. package/dist/index-CgZM1vHq.js +372 -0
  161. package/dist/index-CgofFg1D.js +372 -0
  162. package/dist/index-ChheXGDK.js +372 -0
  163. package/dist/index-ChuFHoI0.js +372 -0
  164. package/dist/index-CiOJZ6_b.js +372 -0
  165. package/dist/index-ClCWmz_7.js +2844 -0
  166. package/dist/index-CmajGrKA.js +142 -0
  167. package/dist/index-Cn_4o3fi.js +345 -0
  168. package/dist/index-CoJBI1vE.js +345 -0
  169. package/dist/index-CqLLaQ-P.js +372 -0
  170. package/dist/index-CsRhLwmR.js +475 -0
  171. package/dist/index-CttJvDTG.js +475 -0
  172. package/dist/index-Cu3m9UeX.js +345 -0
  173. package/dist/index-CyQbOMHa.js +2859 -0
  174. package/dist/index-D-NcbLKL.js +345 -0
  175. package/dist/index-D0gstkiI.js +2836 -0
  176. package/dist/index-D0krzDtx.js +475 -0
  177. package/dist/index-D1moFd4V.js +372 -0
  178. package/dist/index-D2Hs4bZj.js +345 -0
  179. package/dist/index-D4QhrTZs.js +475 -0
  180. package/dist/index-D6CC02F-.js +372 -0
  181. package/dist/index-D6s7Za5s.js +142 -0
  182. package/dist/index-D7i5bck2.js +3132 -0
  183. package/dist/index-D8YBeNfn.js +345 -0
  184. package/dist/index-D93bv6lU.js +372 -0
  185. package/dist/index-DAX_bFj5.js +142 -0
  186. package/dist/index-DBii9cjr.js +475 -0
  187. package/dist/index-DBzpSkNi.js +345 -0
  188. package/dist/index-DCuKNBck.js +3153 -0
  189. package/dist/index-DE3uKf0K.js +142 -0
  190. package/dist/index-DGAqp0QX.js +372 -0
  191. package/dist/index-DGh_w_v1.js +475 -0
  192. package/dist/index-DItKvJyI.js +475 -0
  193. package/dist/index-DKAyB0fv.js +345 -0
  194. package/dist/index-DKN4xsXi.js +2851 -0
  195. package/dist/index-DN_iIn8V.js +345 -0
  196. package/dist/index-DONIBpuJ.js +345 -0
  197. package/dist/index-DPDK8Ht4.js +2851 -0
  198. package/dist/index-DPr3ldST.js +2354 -0
  199. package/dist/index-DS1wfdxM.js +142 -0
  200. package/dist/index-DUW5cCh8.js +372 -0
  201. package/dist/index-DUv28uVd.js +142 -0
  202. package/dist/index-DVS-5SZn.js +475 -0
  203. package/dist/index-DWI51JAp.js +372 -0
  204. package/dist/index-DWVmEexu.js +475 -0
  205. package/dist/index-DXf9wUqQ.js +142 -0
  206. package/dist/index-DXmB-sjP.js +345 -0
  207. package/dist/index-DY_e_Dxv.js +372 -0
  208. package/dist/index-DZar-us7.js +142 -0
  209. package/dist/index-D_nwqVrw.js +2847 -0
  210. package/dist/index-DbEeir7h.js +2834 -0
  211. package/dist/index-Dbf5ypbh.js +142 -0
  212. package/dist/index-DcSK-2pt.js +345 -0
  213. package/dist/index-DclK-Mc7.js +2864 -0
  214. package/dist/index-DcnzaxVi.js +142 -0
  215. package/dist/index-Dd8PlF0M.js +2857 -0
  216. package/dist/index-DdkVT39s.js +345 -0
  217. package/dist/index-DeLbU1t-.js +345 -0
  218. package/dist/index-DfV_J8Te.js +345 -0
  219. package/dist/index-DgPnNd8U.js +475 -0
  220. package/dist/index-Dg_JLa7s.js +345 -0
  221. package/dist/index-Di2VPQjn.js +345 -0
  222. package/dist/index-DibHUbqc.js +372 -0
  223. package/dist/index-DjCVSrpw.js +475 -0
  224. package/dist/index-Djdb936p.js +142 -0
  225. package/dist/index-DmFL_GSt.js +142 -0
  226. package/dist/index-DmP4X2k0.js +372 -0
  227. package/dist/index-DmtmRd1r.js +372 -0
  228. package/dist/index-Dn8MA3kh.js +475 -0
  229. package/dist/index-Do7uXDSi.js +2071 -0
  230. package/dist/index-Dpv1M9Hu.js +372 -0
  231. package/dist/index-DqUuZC8f.js +372 -0
  232. package/dist/index-DtEXQIjn.js +372 -0
  233. package/dist/index-Dtw-qZ0V.js +372 -0
  234. package/dist/index-Dv3hIz8H.js +345 -0
  235. package/dist/index-Dv9jnaWp.js +345 -0
  236. package/dist/index-Dw8KZwGJ.js +2354 -0
  237. package/dist/index-DwJILh-Q.js +3149 -0
  238. package/dist/index-DwzGV3B9.js +142 -0
  239. package/dist/index-DyybaRkK.js +345 -0
  240. package/dist/index-DzerABZq.js +372 -0
  241. package/dist/index-F53NVkhc.js +142 -0
  242. package/dist/index-Fl0_k4XF.js +475 -0
  243. package/dist/index-HMYRCPrs.js +2326 -0
  244. package/dist/index-I49wpmT-.js +372 -0
  245. package/dist/index-IPv1O8Zq.js +345 -0
  246. package/dist/index-JLqnaery.js +372 -0
  247. package/dist/index-JRCQ1CYj.js +142 -0
  248. package/dist/index-L86-iO8O.js +345 -0
  249. package/dist/index-Q56EoFor.js +142 -0
  250. package/dist/index-QxKMr6p0.js +2829 -0
  251. package/dist/index-THRvW9Xm.js +2856 -0
  252. package/dist/index-WIUmTlfL.js +345 -0
  253. package/dist/index-WRrsK0pR.js +475 -0
  254. package/dist/index-Wq652QGf.js +2836 -0
  255. package/dist/index-YnSLCdjP.js +475 -0
  256. package/dist/index-Ynf0lvBE.js +142 -0
  257. package/dist/index-_OtTmb9i.js +142 -0
  258. package/dist/index-_oqoy_3D.js +142 -0
  259. package/dist/index-cl4Y-BWw.js +475 -0
  260. package/dist/index-d_eHJkDW.js +475 -0
  261. package/dist/index-dnmEyUWB.js +372 -0
  262. package/dist/index-dz6CwD6A.js +142 -0
  263. package/dist/index-g4rkaRry.js +475 -0
  264. package/dist/index-g9bRMdAX.js +142 -0
  265. package/dist/index-h4z4-a2p.js +2852 -0
  266. package/dist/index-h7BhcQYM.js +475 -0
  267. package/dist/index-hI3qofTF.js +345 -0
  268. package/dist/index-iyQQumAA.js +372 -0
  269. package/dist/index-js_OhKON.js +345 -0
  270. package/dist/index-kgb4MdHr.js +475 -0
  271. package/dist/index-logKl0VM.js +3144 -0
  272. package/dist/index-lrFMrOlR.js +3132 -0
  273. package/dist/index-mEHxtQWj.js +372 -0
  274. package/dist/index-mNm1BV3n.js +2857 -0
  275. package/dist/index-oOzAFXfr.js +142 -0
  276. package/dist/index-s3vGq0ro.js +345 -0
  277. package/dist/index-wt7AbUqc.js +2342 -0
  278. package/dist/index.es.js +1 -1
  279. package/dist/index.html +28 -0
  280. package/dist/index.umd.js +1 -8
  281. package/dist/style.css +1 -1
  282. package/package.json +87 -91
  283. package/src/App.vue +1 -30
  284. package/src/assets/styles/_root.scss +97 -141
  285. package/src/assets/styles/_variables.scss +19 -44
  286. package/src/assets/styles/index.scss +42 -267
  287. package/src/components/Layout/Sidebar.vue +2 -43
  288. package/src/components/Layout/TopMenu.vue +12 -37
  289. package/src/components/Layout/index.vue +0 -1
  290. package/src/utils/request.ts +1 -18
  291. package/src/views/dashboard/index.vue +155 -417
  292. package/src/views/error/403.vue +56 -251
  293. package/src/views/error/404.vue +56 -253
  294. package/src/views/login/index.vue +194 -586
  295. package/src/views/system/menu/index.vue +94 -403
  296. package/src/views/system/role/index.vue +69 -348
  297. package/src/views/system/user/index.vue +73 -402
  298. package/dist/index-BZaqYObA.js +0 -479
  299. package/dist/index-CbwOysFI.js +0 -641
  300. package/dist/index-Jynxhhda.js +0 -189
  301. package/dist/index-XgzSS-fV.js +0 -515
  302. package/dist/index-_iZKFlCa.js +0 -4178
  303. package/src/types/json-bigint.d.ts +0 -18
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, reactive, computed, onMounted } from 'vue'
3
3
  import { Form, FormItem, Input, Select, Switch } from '@xto/form'
4
- import { Tag, Pagination } from '@xto/data'
4
+ import { Tag, Card, Pagination } from '@xto/data'
5
5
  import { Modal, Message, Popconfirm } from '@xto/feedback'
6
6
  import { Space, Button } from '@xto/base'
7
7
  import { Status, StatusOptions } from '@/enums'
@@ -132,11 +132,6 @@ const handleSubmit = async () => {
132
132
  }
133
133
  }
134
134
 
135
- // 状态切换
136
- const handleStatusChange = (row: Role) => {
137
- Message.success(`已${row.status === Status.ENABLED ? '启用' : '禁用'}角色 ${row.name}`)
138
- }
139
-
140
135
  onMounted(() => {
141
136
  getRoleList()
142
137
  })
@@ -145,8 +140,8 @@ onMounted(() => {
145
140
  <template>
146
141
  <div class="role-page">
147
142
  <!-- 搜索栏 -->
148
- <div class="search-section">
149
- <Form :model="searchForm" inline class="search-form">
143
+ <Card class="search-card">
144
+ <Form :model="searchForm" inline>
150
145
  <FormItem label="关键词">
151
146
  <Input
152
147
  v-model="searchForm.keyword"
@@ -165,145 +160,64 @@ onMounted(() => {
165
160
  </FormItem>
166
161
  <FormItem>
167
162
  <Space>
168
- <Button type="primary" @click="handleSearch">
169
- <template #icon>
170
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
171
- <circle cx="11" cy="11" r="8"/>
172
- <path d="M21 21l-4.35-4.35"/>
173
- </svg>
174
- </template>
175
- 搜索
176
- </Button>
177
- <Button @click="handleReset">
178
- <template #icon>
179
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
180
- <path d="M3 12a9 9 0 109-9 9.75 9.75 0 00-6.74 2.74L3 8"/>
181
- <path d="M3 3v5h5"/>
182
- </svg>
183
- </template>
184
- 重置
185
- </Button>
163
+ <Button type="primary" @click="handleSearch">搜索</Button>
164
+ <Button @click="handleReset">重置</Button>
186
165
  </Space>
187
166
  </FormItem>
188
167
  </Form>
189
- </div>
168
+ </Card>
190
169
 
191
170
  <!-- 表格 -->
192
- <div class="table-section">
171
+ <Card class="table-card">
193
172
  <!-- 工具栏 -->
194
- <div class="table-toolbar">
195
- <div class="toolbar-left">
196
- <Button type="primary" @click="handleAdd">
197
- <template #icon>
198
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
199
- <line x1="12" y1="5" x2="12" y2="19"/>
200
- <line x1="5" y1="12" x2="19" y2="12"/>
201
- </svg>
202
- </template>
203
- 新增角色
204
- </Button>
205
- </div>
206
- <div class="toolbar-right">
207
- <span class="table-count">共 {{ total }} 条数据</span>
208
- </div>
173
+ <div class="toolbar">
174
+ <Button type="primary" @click="handleAdd">新增角色</Button>
209
175
  </div>
210
176
 
211
177
  <!-- 表格 -->
212
- <div class="table-wrapper">
213
- <table class="data-table">
214
- <thead>
215
- <tr>
216
- <th class="col-id">ID</th>
217
- <th class="col-name">角色名称</th>
218
- <th class="col-code">角色编码</th>
219
- <th class="col-desc">描述</th>
220
- <th class="col-status">状态</th>
221
- <th class="col-time">创建时间</th>
222
- <th class="col-actions">操作</th>
223
- </tr>
224
- </thead>
225
- <tbody>
226
- <tr v-if="loading">
227
- <td colspan="7" class="loading-cell">
228
- <div class="loading-content">
229
- <div class="loading-spinner"></div>
230
- <span>加载中...</span>
231
- </div>
232
- </td>
233
- </tr>
234
- <tr v-else-if="roleList.length === 0">
235
- <td colspan="7" class="empty-cell">
236
- <div class="empty-content">
237
- <svg viewBox="0 0 64 41" fill="none">
238
- <g transform="translate(0 1)">
239
- <ellipse fill="#f5f5f5" cx="32" cy="33" rx="32" ry="7"/>
240
- <g stroke="var(--color-text-placeholder)" stroke-width="2">
241
- <path d="M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"/>
242
- <path d="M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35H11.95C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z" fill="var(--color-fill)"/>
243
- </g>
244
- </g>
245
- </svg>
246
- <span>暂无数据</span>
247
- </div>
248
- </td>
249
- </tr>
250
- <tr v-else v-for="row in roleList" :key="row.id" class="data-row">
251
- <td class="col-id">
252
- <span class="id-badge">{{ row.id }}</span>
253
- </td>
254
- <td class="col-name">
255
- <span class="role-name">{{ row.name }}</span>
256
- </td>
257
- <td class="col-code">
258
- <Tag type="primary" size="small">{{ row.code }}</Tag>
259
- </td>
260
- <td class="col-desc">
261
- <span class="desc-text">{{ row.description }}</span>
262
- </td>
263
- <td class="col-status">
264
- <div class="status-switch">
265
- <Switch
266
- :model-value="row.status === Status.ENABLED"
267
- @update:model-value="row.status = $event ? Status.ENABLED : Status.DISABLED; handleStatusChange(row)"
268
- />
269
- <span class="status-text" :class="{ enabled: row.status === Status.ENABLED }">
270
- {{ row.status === Status.ENABLED ? '已启用' : '已禁用' }}
271
- </span>
272
- </div>
273
- </td>
274
- <td class="col-time">
275
- <span class="time-text">{{ row.createTime }}</span>
276
- </td>
277
- <td class="col-actions">
278
- <Space class="action-buttons">
279
- <Button type="primary" link size="small" @click="handleEdit(row)">
280
- <template #icon>
281
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
282
- <path d="M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7"/>
283
- <path d="M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z"/>
284
- </svg>
285
- </template>
286
- 编辑
287
- </Button>
288
- <Popconfirm title="确定删除该角色吗?" @confirm="handleDelete(row.id)">
289
- <Button type="danger" link size="small">
290
- <template #icon>
291
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
292
- <polyline points="3,6 5,6 21,6"/>
293
- <path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/>
294
- <line x1="10" y1="11" x2="10" y2="17"/>
295
- <line x1="14" y1="11" x2="14" y2="17"/>
296
- </svg>
297
- </template>
298
- 删除
299
- </Button>
300
- </Popconfirm>
301
- </Space>
302
- </td>
303
- </tr>
304
- </tbody>
305
- </table>
306
- </div>
178
+ <table class="data-table">
179
+ <thead>
180
+ <tr>
181
+ <th>ID</th>
182
+ <th>角色名称</th>
183
+ <th>角色编码</th>
184
+ <th>描述</th>
185
+ <th>状态</th>
186
+ <th>创建时间</th>
187
+ <th>操作</th>
188
+ </tr>
189
+ </thead>
190
+ <tbody>
191
+ <tr v-if="loading">
192
+ <td colspan="7" class="loading-cell">加载中...</td>
193
+ </tr>
194
+ <tr v-else-if="roleList.length === 0">
195
+ <td colspan="7" class="empty-cell">暂无数据</td>
196
+ </tr>
197
+ <tr v-else v-for="row in roleList" :key="row.id">
198
+ <td>{{ row.id }}</td>
199
+ <td>{{ row.name }}</td>
200
+ <td>
201
+ <Tag type="primary" size="small">{{ row.code }}</Tag>
202
+ </td>
203
+ <td>{{ row.description }}</td>
204
+ <td>
205
+ <Tag :type="row.status === Status.ENABLED ? 'success' : 'danger'" size="small">
206
+ {{ row.status === Status.ENABLED ? '启用' : '禁用' }}
207
+ </Tag>
208
+ </td>
209
+ <td>{{ row.createTime }}</td>
210
+ <td>
211
+ <Space>
212
+ <Button type="primary" link size="small" @click="handleEdit(row)">编辑</Button>
213
+ <Popconfirm title="确定删除该角色吗?" @confirm="handleDelete(row.id)">
214
+ <Button type="danger" link size="small">删除</Button>
215
+ </Popconfirm>
216
+ </Space>
217
+ </td>
218
+ </tr>
219
+ </tbody>
220
+ </table>
307
221
 
308
222
  <!-- 分页 -->
309
223
  <div class="pagination-wrapper">
@@ -317,11 +231,11 @@ onMounted(() => {
317
231
  @size-change="getRoleList"
318
232
  />
319
233
  </div>
320
- </div>
234
+ </Card>
321
235
 
322
236
  <!-- 编辑弹窗 -->
323
- <Modal v-model="modalVisible" :title="modalTitle" width="520px" class="role-modal">
324
- <Form ref="formRef" :model="formData" :rules="rules" label-width="80px" class="role-form">
237
+ <Modal v-model="modalVisible" :title="modalTitle" width="500px">
238
+ <Form ref="formRef" :model="formData" :rules="rules" label-width="80px">
325
239
  <FormItem label="角色名称" prop="name">
326
240
  <Input v-model="formData.name" placeholder="请输入角色名称" />
327
241
  </FormItem>
@@ -332,10 +246,7 @@ onMounted(() => {
332
246
  <Input v-model="formData.description" placeholder="请输入描述" />
333
247
  </FormItem>
334
248
  <FormItem label="状态">
335
- <div class="status-field">
336
- <Switch v-model="formData.status" :active-value="Status.ENABLED" :inactive-value="Status.DISABLED" />
337
- <span class="status-label">{{ formData.status === Status.ENABLED ? '启用' : '禁用' }}</span>
338
- </div>
249
+ <Switch v-model="formData.status" :active-value="Status.ENABLED" :inactive-value="Status.DISABLED" />
339
250
  </FormItem>
340
251
  </Form>
341
252
  <template #footer>
@@ -350,234 +261,44 @@ onMounted(() => {
350
261
 
351
262
  <style lang="scss" scoped>
352
263
  .role-page {
353
- padding: 24px;
354
- background: var(--bg-color-page);
355
- min-height: 100%;
356
- }
357
-
358
- // 搜索区域
359
- .search-section {
360
- background: var(--bg-color);
361
- border-radius: var(--border-radius-large);
362
- padding: 20px 24px;
363
- margin-bottom: 16px;
364
- box-shadow: var(--box-shadow-card);
264
+ padding: 20px;
365
265
 
366
- .search-form {
367
- display: flex;
368
- flex-wrap: wrap;
369
- gap: 16px;
370
-
371
- :deep(.x-form-item) {
372
- margin-bottom: 0;
373
- }
374
-
375
- :deep(.x-input),
376
- :deep(.x-select) {
377
- width: 200px;
378
- }
266
+ .search-card {
267
+ margin-bottom: 20px;
379
268
  }
380
- }
381
269
 
382
- // 表格区域
383
- .table-section {
384
- background: var(--bg-color);
385
- border-radius: var(--border-radius-large);
386
- box-shadow: var(--box-shadow-card);
387
- overflow: hidden;
388
- }
389
-
390
- .table-toolbar {
391
- display: flex;
392
- justify-content: space-between;
393
- align-items: center;
394
- padding: 16px 24px;
395
- border-bottom: 1px solid var(--color-border-lighter);
396
-
397
- .toolbar-left {
398
- display: flex;
399
- gap: 12px;
270
+ .toolbar {
271
+ margin-bottom: 15px;
400
272
  }
401
-
402
- .table-count {
403
- font-size: 14px;
404
- color: var(--color-text-secondary);
405
- }
406
- }
407
-
408
- .table-wrapper {
409
- overflow-x: auto;
410
273
  }
411
274
 
412
- // 表格样式
413
275
  .data-table {
414
276
  width: 100%;
415
277
  border-collapse: collapse;
416
278
 
417
279
  th, td {
418
- padding: 14px 16px;
280
+ padding: 12px;
419
281
  text-align: left;
420
282
  border-bottom: 1px solid var(--color-border-lighter);
421
283
  }
422
284
 
423
285
  th {
424
- font-size: 14px;
425
286
  font-weight: 500;
426
- color: var(--color-text-secondary);
427
- background: var(--color-fill-light);
428
- white-space: nowrap;
429
- }
430
-
431
- .data-row {
432
- transition: background-color 0.2s;
433
-
434
- &:hover {
435
- background: var(--color-primary-light-6);
436
- }
437
- }
438
-
439
- td {
440
- vertical-align: middle;
287
+ color: var(--color-text-regular);
288
+ background-color: var(--color-fill-light);
441
289
  }
442
290
 
443
291
  .loading-cell,
444
292
  .empty-cell {
445
- padding: 60px 20px;
446
- }
447
-
448
- .loading-content,
449
- .empty-content {
450
- display: flex;
451
- flex-direction: column;
452
- align-items: center;
453
- gap: 16px;
454
- color: var(--color-text-placeholder);
455
-
456
- svg {
457
- width: 64px;
458
- height: 41px;
459
- }
460
- }
461
-
462
- .loading-spinner {
463
- width: 32px;
464
- height: 32px;
465
- border: 3px solid var(--color-border-lighter);
466
- border-top-color: var(--color-primary);
467
- border-radius: 50%;
468
- animation: spin 0.8s linear infinite;
469
- }
470
- }
471
-
472
- @keyframes spin {
473
- to { transform: rotate(360deg); }
474
- }
475
-
476
- // 列样式
477
- .col-id {
478
- width: 80px;
479
- }
480
-
481
- .id-badge {
482
- display: inline-block;
483
- min-width: 32px;
484
- padding: 4px 10px;
485
- background: var(--color-fill);
486
- border-radius: 12px;
487
- font-size: 12px;
488
- font-weight: 500;
489
- color: var(--color-text-secondary);
490
- text-align: center;
491
- }
492
-
493
- .col-name {
494
- min-width: 120px;
495
- }
496
-
497
- .role-name {
498
- font-size: 14px;
499
- font-weight: 500;
500
- color: var(--color-text-primary);
501
- }
502
-
503
- .col-code {
504
- min-width: 100px;
505
- }
506
-
507
- .col-desc {
508
- min-width: 150px;
509
- }
510
-
511
- .desc-text {
512
- font-size: 14px;
513
- color: var(--color-text-secondary);
514
- }
515
-
516
- .col-status {
517
- min-width: 120px;
518
- }
519
-
520
- .status-switch {
521
- display: flex;
522
- align-items: center;
523
- gap: 8px;
524
- }
525
-
526
- .status-text {
527
- font-size: 13px;
528
- color: var(--color-text-secondary);
529
-
530
- &.enabled {
531
- color: var(--color-success);
532
- }
533
- }
534
-
535
- .col-time {
536
- min-width: 160px;
537
- }
538
-
539
- .time-text {
540
- font-size: 13px;
541
- color: var(--color-text-secondary);
542
- }
543
-
544
- .col-actions {
545
- min-width: 140px;
546
- }
547
-
548
- .action-buttons {
549
- :deep(.x-button) {
550
- padding: 4px 8px;
551
-
552
- svg {
553
- width: 14px;
554
- height: 14px;
555
- margin-right: 4px;
556
- }
293
+ text-align: center;
294
+ color: var(--color-text-secondary);
295
+ padding: 40px;
557
296
  }
558
297
  }
559
298
 
560
- // 分页
561
299
  .pagination-wrapper {
562
300
  display: flex;
563
301
  justify-content: flex-end;
564
- padding: 16px 24px;
565
- border-top: 1px solid var(--color-border-lighter);
566
- }
567
-
568
- // 弹窗表单
569
- .role-form {
570
- padding: 16px 0;
571
-
572
- .status-field {
573
- display: flex;
574
- align-items: center;
575
- gap: 12px;
576
- }
577
-
578
- .status-label {
579
- font-size: 14px;
580
- color: var(--color-text-secondary);
581
- }
302
+ margin-top: 20px;
582
303
  }
583
- </style>
304
+ </style>