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'
@@ -155,8 +155,8 @@ onMounted(() => {
155
155
  <template>
156
156
  <div class="user-page">
157
157
  <!-- 搜索栏 -->
158
- <div class="search-section">
159
- <Form :model="searchForm" inline class="search-form">
158
+ <Card class="search-card">
159
+ <Form :model="searchForm" inline>
160
160
  <FormItem label="关键词">
161
161
  <Input
162
162
  v-model="searchForm.keyword"
@@ -175,158 +175,69 @@ onMounted(() => {
175
175
  </FormItem>
176
176
  <FormItem>
177
177
  <Space>
178
- <Button type="primary" @click="handleSearch">
179
- <template #icon>
180
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
181
- <circle cx="11" cy="11" r="8"/>
182
- <path d="M21 21l-4.35-4.35"/>
183
- </svg>
184
- </template>
185
- 搜索
186
- </Button>
187
- <Button @click="handleReset">
188
- <template #icon>
189
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
190
- <path d="M3 12a9 9 0 109-9 9.75 9.75 0 00-6.74 2.74L3 8"/>
191
- <path d="M3 3v5h5"/>
192
- </svg>
193
- </template>
194
- 重置
195
- </Button>
178
+ <Button type="primary" @click="handleSearch">搜索</Button>
179
+ <Button @click="handleReset">重置</Button>
196
180
  </Space>
197
181
  </FormItem>
198
182
  </Form>
199
- </div>
183
+ </Card>
200
184
 
201
185
  <!-- 表格 -->
202
- <div class="table-section">
186
+ <Card class="table-card">
203
187
  <!-- 工具栏 -->
204
- <div class="table-toolbar">
205
- <div class="toolbar-left">
206
- <Button type="primary" @click="handleAdd">
207
- <template #icon>
208
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
209
- <line x1="12" y1="5" x2="12" y2="19"/>
210
- <line x1="5" y1="12" x2="19" y2="12"/>
211
- </svg>
212
- </template>
213
- 新增用户
214
- </Button>
215
- </div>
216
- <div class="toolbar-right">
217
- <span class="table-count">共 {{ total }} 条数据</span>
218
- </div>
188
+ <div class="toolbar">
189
+ <Button type="primary" @click="handleAdd">新增用户</Button>
219
190
  </div>
220
191
 
221
192
  <!-- 表格 -->
222
- <div class="table-wrapper">
223
- <table class="data-table">
224
- <thead>
225
- <tr>
226
- <th class="col-id">ID</th>
227
- <th class="col-user">用户信息</th>
228
- <th class="col-contact">联系方式</th>
229
- <th class="col-roles">角色</th>
230
- <th class="col-status">状态</th>
231
- <th class="col-time">创建时间</th>
232
- <th class="col-actions">操作</th>
233
- </tr>
234
- </thead>
235
- <tbody>
236
- <tr v-if="loading">
237
- <td colspan="7" class="loading-cell">
238
- <div class="loading-content">
239
- <div class="loading-spinner"></div>
240
- <span>加载中...</span>
241
- </div>
242
- </td>
243
- </tr>
244
- <tr v-else-if="userList.length === 0">
245
- <td colspan="7" class="empty-cell">
246
- <div class="empty-content">
247
- <svg viewBox="0 0 64 41" fill="none">
248
- <g transform="translate(0 1)">
249
- <ellipse fill="#f5f5f5" cx="32" cy="33" rx="32" ry="7"/>
250
- <g stroke="var(--color-text-placeholder)" stroke-width="2">
251
- <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"/>
252
- <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)"/>
253
- </g>
254
- </g>
255
- </svg>
256
- <span>暂无数据</span>
257
- </div>
258
- </td>
259
- </tr>
260
- <tr v-else v-for="row in userList" :key="row.id" class="data-row">
261
- <td class="col-id">
262
- <span class="id-badge">{{ row.id }}</span>
263
- </td>
264
- <td class="col-user">
265
- <div class="user-info">
266
- <div class="user-avatar">{{ row.nickname.charAt(0) }}</div>
267
- <div class="user-detail">
268
- <span class="user-nickname">{{ row.nickname }}</span>
269
- <span class="user-username">@{{ row.username }}</span>
270
- </div>
271
- </div>
272
- </td>
273
- <td class="col-contact">
274
- <div class="contact-info">
275
- <span class="contact-email">{{ row.email }}</span>
276
- <span class="contact-phone">{{ row.phone }}</span>
277
- </div>
278
- </td>
279
- <td class="col-roles">
280
- <div class="role-tags">
281
- <Tag v-for="role in row.roles" :key="role" size="small" :type="role === 'admin' ? 'primary' : 'info'">
282
- {{ role }}
283
- </Tag>
284
- </div>
285
- </td>
286
- <td class="col-status">
287
- <div class="status-switch">
288
- <Switch
289
- :model-value="row.status === Status.ENABLED"
290
- @update:model-value="row.status = $event ? Status.ENABLED : Status.DISABLED; handleStatusChange(row)"
291
- />
292
- <span class="status-text" :class="{ enabled: row.status === Status.ENABLED }">
293
- {{ row.status === Status.ENABLED ? '已启用' : '已禁用' }}
294
- </span>
295
- </div>
296
- </td>
297
- <td class="col-time">
298
- <span class="time-text">{{ row.createTime }}</span>
299
- </td>
300
- <td class="col-actions">
301
- <Space class="action-buttons">
302
- <Button type="primary" link size="small" @click="handleEdit(row)">
303
- <template #icon>
304
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
305
- <path d="M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7"/>
306
- <path d="M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z"/>
307
- </svg>
308
- </template>
309
- 编辑
310
- </Button>
311
- <Popconfirm title="确定删除该用户吗?" @confirm="handleDelete(row.id)">
312
- <Button type="danger" link size="small">
313
- <template #icon>
314
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
315
- <polyline points="3,6 5,6 21,6"/>
316
- <path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/>
317
- <line x1="10" y1="11" x2="10" y2="17"/>
318
- <line x1="14" y1="11" x2="14" y2="17"/>
319
- </svg>
320
- </template>
321
- 删除
322
- </Button>
323
- </Popconfirm>
324
- </Space>
325
- </td>
326
- </tr>
327
- </tbody>
328
- </table>
329
- </div>
193
+ <table class="data-table">
194
+ <thead>
195
+ <tr>
196
+ <th>ID</th>
197
+ <th>用户名</th>
198
+ <th>昵称</th>
199
+ <th>邮箱</th>
200
+ <th>手机号</th>
201
+ <th>角色</th>
202
+ <th>状态</th>
203
+ <th>创建时间</th>
204
+ <th>操作</th>
205
+ </tr>
206
+ </thead>
207
+ <tbody>
208
+ <tr v-if="loading">
209
+ <td colspan="9" class="loading-cell">加载中...</td>
210
+ </tr>
211
+ <tr v-else-if="userList.length === 0">
212
+ <td colspan="9" class="empty-cell">暂无数据</td>
213
+ </tr>
214
+ <tr v-else v-for="row in userList" :key="row.id">
215
+ <td>{{ row.id }}</td>
216
+ <td>{{ row.username }}</td>
217
+ <td>{{ row.nickname }}</td>
218
+ <td>{{ row.email }}</td>
219
+ <td>{{ row.phone }}</td>
220
+ <td>
221
+ <Tag v-for="role in row.roles" :key="role" size="small">{{ role }}</Tag>
222
+ </td>
223
+ <td>
224
+ <Switch
225
+ :model-value="row.status === Status.ENABLED"
226
+ @update:model-value="row.status = $event ? Status.ENABLED : Status.DISABLED; handleStatusChange(row)"
227
+ />
228
+ </td>
229
+ <td>{{ row.createTime }}</td>
230
+ <td>
231
+ <Space>
232
+ <Button type="primary" link size="small" @click="handleEdit(row)">编辑</Button>
233
+ <Popconfirm title="确定删除该用户吗?" @confirm="handleDelete(row.id)">
234
+ <Button type="danger" link size="small">删除</Button>
235
+ </Popconfirm>
236
+ </Space>
237
+ </td>
238
+ </tr>
239
+ </tbody>
240
+ </table>
330
241
 
331
242
  <!-- 分页 -->
332
243
  <div class="pagination-wrapper">
@@ -340,11 +251,11 @@ onMounted(() => {
340
251
  @size-change="getUserList"
341
252
  />
342
253
  </div>
343
- </div>
254
+ </Card>
344
255
 
345
256
  <!-- 编辑弹窗 -->
346
- <Modal v-model="modalVisible" :title="modalTitle" width="520px" class="user-modal">
347
- <Form ref="formRef" :model="formData" :rules="rules" label-width="80px" class="user-form">
257
+ <Modal v-model="modalVisible" :title="modalTitle" width="500px">
258
+ <Form ref="formRef" :model="formData" :rules="rules" label-width="80px">
348
259
  <FormItem label="用户名" prop="username">
349
260
  <Input v-model="formData.username" placeholder="请输入用户名" />
350
261
  </FormItem>
@@ -358,10 +269,7 @@ onMounted(() => {
358
269
  <Input v-model="formData.phone" placeholder="请输入手机号" />
359
270
  </FormItem>
360
271
  <FormItem label="状态">
361
- <div class="status-field">
362
- <Switch v-model="formData.status" :active-value="Status.ENABLED" :inactive-value="Status.DISABLED" />
363
- <span class="status-label">{{ formData.status === Status.ENABLED ? '启用' : '禁用' }}</span>
364
- </div>
272
+ <Switch v-model="formData.status" :active-value="Status.ENABLED" :inactive-value="Status.DISABLED" />
365
273
  </FormItem>
366
274
  </Form>
367
275
  <template #footer>
@@ -376,281 +284,44 @@ onMounted(() => {
376
284
 
377
285
  <style lang="scss" scoped>
378
286
  .user-page {
379
- padding: 24px;
380
- background: var(--bg-color-page);
381
- min-height: 100%;
382
- }
383
-
384
- // 搜索区域
385
- .search-section {
386
- background: var(--bg-color);
387
- border-radius: var(--border-radius-large);
388
- padding: 20px 24px;
389
- margin-bottom: 16px;
390
- box-shadow: var(--box-shadow-card);
391
-
392
- .search-form {
393
- display: flex;
394
- flex-wrap: wrap;
395
- gap: 16px;
396
-
397
- :deep(.x-form-item) {
398
- margin-bottom: 0;
399
- }
400
-
401
- :deep(.x-input),
402
- :deep(.x-select) {
403
- width: 200px;
404
- }
405
- }
406
- }
407
-
408
- // 表格区域
409
- .table-section {
410
- background: var(--bg-color);
411
- border-radius: var(--border-radius-large);
412
- box-shadow: var(--box-shadow-card);
413
- overflow: hidden;
414
- }
287
+ padding: 20px;
415
288
 
416
- .table-toolbar {
417
- display: flex;
418
- justify-content: space-between;
419
- align-items: center;
420
- padding: 16px 24px;
421
- border-bottom: 1px solid var(--color-border-lighter);
422
-
423
- .toolbar-left {
424
- display: flex;
425
- gap: 12px;
289
+ .search-card {
290
+ margin-bottom: 20px;
426
291
  }
427
292
 
428
- .table-count {
429
- font-size: 14px;
430
- color: var(--color-text-secondary);
293
+ .toolbar {
294
+ margin-bottom: 15px;
431
295
  }
432
296
  }
433
297
 
434
- .table-wrapper {
435
- overflow-x: auto;
436
- }
437
-
438
- // 表格样式
439
298
  .data-table {
440
299
  width: 100%;
441
300
  border-collapse: collapse;
442
301
 
443
302
  th, td {
444
- padding: 14px 16px;
303
+ padding: 12px;
445
304
  text-align: left;
446
305
  border-bottom: 1px solid var(--color-border-lighter);
447
306
  }
448
307
 
449
308
  th {
450
- font-size: 14px;
451
309
  font-weight: 500;
452
- color: var(--color-text-secondary);
453
- background: var(--color-fill-light);
454
- white-space: nowrap;
455
- }
456
-
457
- .data-row {
458
- transition: background-color 0.2s;
459
-
460
- &:hover {
461
- background: var(--color-primary-light-6);
462
- }
463
- }
464
-
465
- td {
466
- vertical-align: middle;
310
+ color: var(--color-text-regular);
311
+ background-color: var(--color-fill-light);
467
312
  }
468
313
 
469
314
  .loading-cell,
470
315
  .empty-cell {
471
- padding: 60px 20px;
472
- }
473
-
474
- .loading-content,
475
- .empty-content {
476
- display: flex;
477
- flex-direction: column;
478
- align-items: center;
479
- gap: 16px;
480
- color: var(--color-text-placeholder);
481
-
482
- svg {
483
- width: 64px;
484
- height: 41px;
485
- }
486
- }
487
-
488
- .loading-spinner {
489
- width: 32px;
490
- height: 32px;
491
- border: 3px solid var(--color-border-lighter);
492
- border-top-color: var(--color-primary);
493
- border-radius: 50%;
494
- animation: spin 0.8s linear infinite;
495
- }
496
- }
497
-
498
- @keyframes spin {
499
- to { transform: rotate(360deg); }
500
- }
501
-
502
- // 列样式
503
- .col-id {
504
- width: 80px;
505
- }
506
-
507
- .id-badge {
508
- display: inline-block;
509
- min-width: 32px;
510
- padding: 4px 10px;
511
- background: var(--color-fill);
512
- border-radius: 12px;
513
- font-size: 12px;
514
- font-weight: 500;
515
- color: var(--color-text-secondary);
516
- text-align: center;
517
- }
518
-
519
- .col-user {
520
- min-width: 180px;
521
- }
522
-
523
- .user-info {
524
- display: flex;
525
- align-items: center;
526
- gap: 12px;
527
- }
528
-
529
- .user-avatar {
530
- width: 40px;
531
- height: 40px;
532
- display: flex;
533
- align-items: center;
534
- justify-content: center;
535
- background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-light-1) 100%);
536
- border-radius: 50%;
537
- font-size: 16px;
538
- font-weight: 500;
539
- color: #fff;
540
- flex-shrink: 0;
541
- }
542
-
543
- .user-detail {
544
- display: flex;
545
- flex-direction: column;
546
- gap: 2px;
547
- }
548
-
549
- .user-nickname {
550
- font-size: 14px;
551
- font-weight: 500;
552
- color: var(--color-text-primary);
553
- }
554
-
555
- .user-username {
556
- font-size: 12px;
557
- color: var(--color-text-placeholder);
558
- }
559
-
560
- .col-contact {
561
- min-width: 180px;
562
- }
563
-
564
- .contact-info {
565
- display: flex;
566
- flex-direction: column;
567
- gap: 4px;
568
- }
569
-
570
- .contact-email,
571
- .contact-phone {
572
- font-size: 13px;
573
- color: var(--color-text-regular);
574
- }
575
-
576
- .contact-phone {
577
- color: var(--color-text-secondary);
578
- }
579
-
580
- .col-roles {
581
- min-width: 100px;
582
- }
583
-
584
- .role-tags {
585
- display: flex;
586
- gap: 6px;
587
- }
588
-
589
- .col-status {
590
- min-width: 120px;
591
- }
592
-
593
- .status-switch {
594
- display: flex;
595
- align-items: center;
596
- gap: 8px;
597
- }
598
-
599
- .status-text {
600
- font-size: 13px;
601
- color: var(--color-text-secondary);
602
-
603
- &.enabled {
604
- color: var(--color-success);
605
- }
606
- }
607
-
608
- .col-time {
609
- min-width: 160px;
610
- }
611
-
612
- .time-text {
613
- font-size: 13px;
614
- color: var(--color-text-secondary);
615
- }
616
-
617
- .col-actions {
618
- min-width: 140px;
619
- }
620
-
621
- .action-buttons {
622
- :deep(.x-button) {
623
- padding: 4px 8px;
624
-
625
- svg {
626
- width: 14px;
627
- height: 14px;
628
- margin-right: 4px;
629
- }
316
+ text-align: center;
317
+ color: var(--color-text-secondary);
318
+ padding: 40px;
630
319
  }
631
320
  }
632
321
 
633
- // 分页
634
322
  .pagination-wrapper {
635
323
  display: flex;
636
324
  justify-content: flex-end;
637
- padding: 16px 24px;
638
- border-top: 1px solid var(--color-border-lighter);
639
- }
640
-
641
- // 弹窗表单
642
- .user-form {
643
- padding: 16px 0;
644
-
645
- .status-field {
646
- display: flex;
647
- align-items: center;
648
- gap: 12px;
649
- }
650
-
651
- .status-label {
652
- font-size: 14px;
653
- color: var(--color-text-secondary);
654
- }
325
+ margin-top: 20px;
655
326
  }
656
327
  </style>