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,545 +1,283 @@
1
1
  <script setup lang="ts">
2
2
  import { ref } from 'vue'
3
- import { Progress } from '@xto/data'
3
+ import { Card, Tag, Progress } from '@xto/data'
4
4
 
5
5
  const stats = ref([
6
- { title: '用户总数', value: 1234, icon: '👥', color: '#1677ff', trend: '+12.5%', trendUp: true },
7
- { title: '今日访问', value: 567, icon: '👀', color: '#52c41a', trend: '+8.2%', trendUp: true },
8
- { title: '订单数量', value: 890, icon: '📦', color: '#faad14', trend: '-3.1%', trendUp: false },
9
- { title: '销售金额', value: 123456, icon: '💰', color: '#ff4d4f', trend: '+15.8%', trendUp: true }
6
+ { title: '用户总数', value: 1234, icon: '👥', color: '#409eff' },
7
+ { title: '今日访问', value: 567, icon: '👀', color: '#67c23a' },
8
+ { title: '订单数量', value: 890, icon: '📦', color: '#e6a23c' },
9
+ { title: '销售金额', value: 123456, icon: '💰', color: '#f56c6c' }
10
10
  ])
11
11
 
12
12
  const activities = ref([
13
- { user: '张三', action: '登录系统', time: '2分钟前', type: 'success', avatar: '张' },
14
- { user: '李四', action: '修改了用户信息', time: '5分钟前', type: 'warning', avatar: '李' },
15
- { user: '王五', action: '创建了新订单', time: '10分钟前', type: 'info', avatar: '王' },
16
- { user: '赵六', action: '删除了测试数据', time: '30分钟前', type: 'danger', avatar: '赵' },
17
- { user: '钱七', action: '更新了系统配置', time: '1小时前', type: 'primary', avatar: '钱' }
13
+ { user: '张三', action: '登录系统', time: '2分钟前', type: 'success' },
14
+ { user: '李四', action: '修改了用户信息', time: '5分钟前', type: 'warning' },
15
+ { user: '王五', action: '创建了新订单', time: '10分钟前', type: 'info' },
16
+ { user: '赵六', action: '删除了测试数据', time: '30分钟前', type: 'danger' },
17
+ { user: '钱七', action: '更新了系统配置', time: '1小时前', type: 'primary' }
18
18
  ])
19
19
 
20
20
  const quickLinks = ref([
21
- { title: '用户管理', path: '/system/user', icon: '👤', desc: '管理系统用户' },
22
- { title: '角色管理', path: '/system/role', icon: '👥', desc: '角色权限配置' },
23
- { title: '菜单管理', path: '/system/menu', icon: '📋', desc: '菜单路由管理' },
24
- { title: '系统设置', path: '/system', icon: '⚙️', desc: '系统参数配置' }
25
- ])
26
-
27
- const systemInfo = ref([
28
- { label: '系统版本', value: 'v1.0.0' },
29
- { label: 'Vue 版本', value: '3.4.21' },
30
- { label: '构建工具', value: 'Vite 5' },
31
- { label: 'UI 组件库', value: 'XTO UI' }
21
+ { title: '用户管理', path: '/system/user', icon: '👤' },
22
+ { title: '角色管理', path: '/system/role', icon: '👥' },
23
+ { title: '菜单管理', path: '/system/menu', icon: '📋' },
24
+ { title: '系统设置', path: '/system', icon: '⚙️' }
32
25
  ])
33
26
  </script>
34
27
 
35
28
  <template>
36
29
  <div class="dashboard">
37
30
  <!-- 统计卡片 -->
38
- <div class="stats-section">
39
- <div v-for="stat in stats" :key="stat.title" class="stat-card">
40
- <div class="stat-icon" :style="{ background: `linear-gradient(135deg, ${stat.color}20 0%, ${stat.color}10 100%)` }">
41
- <span>{{ stat.icon }}</span>
42
- </div>
43
- <div class="stat-content">
44
- <div class="stat-title">{{ stat.title }}</div>
45
- <div class="stat-value" :style="{ color: stat.color }">
46
- {{ stat.value.toLocaleString() }}
31
+ <div class="dashboard__stats">
32
+ <Card v-for="stat in stats" :key="stat.title" class="stat-card">
33
+ <div class="stat-card__content">
34
+ <div class="stat-card__icon" :style="{ backgroundColor: stat.color + '20' }">
35
+ {{ stat.icon }}
47
36
  </div>
48
- <div class="stat-trend" :class="{ up: stat.trendUp, down: !stat.trendUp }">
49
- <svg v-if="stat.trendUp" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
50
- <path d="M7 17l5-5 5 5M7 7l5 5 5-5"/>
51
- </svg>
52
- <svg v-else viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
53
- <path d="M7 7l5 5 5-5M7 17l5-5 5 5"/>
54
- </svg>
55
- <span>{{ stat.trend }}</span>
37
+ <div class="stat-card__info">
38
+ <div class="stat-card__title">{{ stat.title }}</div>
39
+ <div class="stat-card__value" :style="{ color: stat.color }">
40
+ {{ stat.value.toLocaleString() }}
41
+ </div>
56
42
  </div>
57
43
  </div>
58
- <div class="stat-decoration" :style="{ background: `linear-gradient(135deg, ${stat.color}08 0%, transparent 100%)` }"></div>
59
- </div>
44
+ </Card>
60
45
  </div>
61
46
 
62
47
  <!-- 主体内容 -->
63
- <div class="main-section">
48
+ <div class="dashboard__main">
64
49
  <!-- 快捷入口 -->
65
- <div class="quick-section">
66
- <div class="section-header">
67
- <h3>快捷入口</h3>
68
- <span class="section-badge">4 个入口</span>
69
- </div>
70
- <div class="quick-grid">
50
+ <Card class="dashboard__quick">
51
+ <template #header>
52
+ <span class="card-title">快捷入口</span>
53
+ </template>
54
+ <div class="quick-links">
71
55
  <router-link
72
56
  v-for="link in quickLinks"
73
57
  :key="link.path"
74
58
  :to="link.path"
75
- class="quick-card"
59
+ class="quick-link"
76
60
  >
77
- <div class="quick-icon">{{ link.icon }}</div>
78
- <div class="quick-info">
79
- <div class="quick-title">{{ link.title }}</div>
80
- <div class="quick-desc">{{ link.desc }}</div>
81
- </div>
82
- <div class="quick-arrow">
83
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
84
- <path d="M9 18l6-6-6-6"/>
85
- </svg>
86
- </div>
61
+ <span class="quick-link__icon">{{ link.icon }}</span>
62
+ <span class="quick-link__title">{{ link.title }}</span>
87
63
  </router-link>
88
64
  </div>
89
- </div>
65
+ </Card>
90
66
 
91
67
  <!-- 最近活动 -->
92
- <div class="activity-section">
93
- <div class="section-header">
94
- <h3>最近活动</h3>
95
- <a href="#" class="section-link">查看全部</a>
96
- </div>
68
+ <Card class="dashboard__activity">
69
+ <template #header>
70
+ <span class="card-title">最近活动</span>
71
+ </template>
97
72
  <div class="activity-list">
98
73
  <div v-for="(activity, index) in activities" :key="index" class="activity-item">
99
- <div class="activity-avatar" :class="activity.type">
100
- {{ activity.avatar }}
101
- </div>
102
- <div class="activity-content">
103
- <div class="activity-main">
104
- <span class="activity-user">{{ activity.user }}</span>
105
- <span class="activity-action">{{ activity.action }}</span>
106
- </div>
107
- <div class="activity-time">{{ activity.time }}</div>
108
- </div>
109
- <div class="activity-dot" :class="activity.type"></div>
74
+ <Tag :type="activity.type as any" size="small">{{ activity.user }}</Tag>
75
+ <span class="activity-item__action">{{ activity.action }}</span>
76
+ <span class="activity-item__time">{{ activity.time }}</span>
110
77
  </div>
111
78
  </div>
112
- </div>
79
+ </Card>
113
80
  </div>
114
81
 
115
82
  <!-- 系统信息 -->
116
- <div class="system-section">
117
- <div class="section-header">
118
- <h3>系统信息</h3>
119
- </div>
120
- <div class="system-grid">
121
- <div class="system-info-list">
122
- <div v-for="info in systemInfo" :key="info.label" class="info-item">
123
- <span class="info-label">{{ info.label }}</span>
124
- <span class="info-value">{{ info.value }}</span>
125
- </div>
83
+ <Card class="dashboard__system">
84
+ <template #header>
85
+ <span class="card-title">系统信息</span>
86
+ </template>
87
+ <div class="system-info">
88
+ <div class="system-info__item">
89
+ <span class="system-info__label">系统版本</span>
90
+ <span class="system-info__value">v1.0.0</span>
126
91
  </div>
127
- <div class="system-status">
128
- <div class="status-item">
129
- <div class="status-header">
130
- <span class="status-label">服务器状态</span>
131
- <span class="status-value">75%</span>
132
- </div>
133
- <Progress :percentage="75" status="success" />
134
- </div>
135
- <div class="status-item">
136
- <div class="status-header">
137
- <span class="status-label">内存使用</span>
138
- <span class="status-value">45%</span>
139
- </div>
140
- <Progress :percentage="45" />
141
- </div>
142
- <div class="status-item">
143
- <div class="status-header">
144
- <span class="status-label">CPU 使用率</span>
145
- <span class="status-value">32%</span>
146
- </div>
147
- <Progress :percentage="32" />
148
- </div>
92
+ <div class="system-info__item">
93
+ <span class="system-info__label">Vue 版本</span>
94
+ <span class="system-info__value">3.4.21</span>
95
+ </div>
96
+ <div class="system-info__item">
97
+ <span class="system-info__label">构建工具</span>
98
+ <span class="system-info__value">Vite 5</span>
99
+ </div>
100
+ <div class="system-info__item">
101
+ <span class="system-info__label">UI 组件库</span>
102
+ <span class="system-info__value">xto</span>
103
+ </div>
104
+ <div class="system-info__item">
105
+ <span class="system-info__label">服务器状态</span>
106
+ <Progress :percentage="75" status="success" />
107
+ </div>
108
+ <div class="system-info__item">
109
+ <span class="system-info__label">内存使用</span>
110
+ <Progress :percentage="45" />
149
111
  </div>
150
112
  </div>
151
- </div>
113
+ </Card>
152
114
  </div>
153
115
  </template>
154
116
 
155
117
  <style lang="scss" scoped>
156
118
  .dashboard {
157
- padding: 24px;
158
- background: var(--bg-color-page);
159
- min-height: 100%;
160
- }
119
+ padding: 20px;
161
120
 
162
- // 统计卡片
163
- .stats-section {
164
- display: grid;
165
- grid-template-columns: repeat(4, 1fr);
166
- gap: 20px;
167
- margin-bottom: 24px;
121
+ &__stats {
122
+ display: grid;
123
+ grid-template-columns: repeat(4, 1fr);
124
+ gap: 20px;
125
+ margin-bottom: 20px;
126
+
127
+ @media (max-width: 1200px) {
128
+ grid-template-columns: repeat(2, 1fr);
129
+ }
168
130
 
169
- @media (max-width: 1200px) {
131
+ @media (max-width: 768px) {
132
+ grid-template-columns: 1fr;
133
+ }
134
+ }
135
+
136
+ &__main {
137
+ display: grid;
170
138
  grid-template-columns: repeat(2, 1fr);
139
+ gap: 20px;
140
+ margin-bottom: 20px;
141
+
142
+ @media (max-width: 992px) {
143
+ grid-template-columns: 1fr;
144
+ }
171
145
  }
172
146
 
173
- @media (max-width: 768px) {
174
- grid-template-columns: 1fr;
147
+ &__quick,
148
+ &__activity {
149
+ min-height: 300px;
175
150
  }
176
151
  }
177
152
 
178
- .stat-card {
179
- position: relative;
180
- display: flex;
181
- align-items: flex-start;
182
- gap: 16px;
183
- padding: 20px;
184
- background: var(--bg-color);
185
- border-radius: var(--border-radius-large);
186
- box-shadow: var(--box-shadow-card);
187
- transition: all 0.3s ease;
188
- overflow: hidden;
189
-
190
- &:hover {
191
- box-shadow: var(--box-shadow-card-hover);
192
- transform: translateY(-4px);
153
+ .card-title {
154
+ font-size: 16px;
155
+ font-weight: 500;
156
+ }
193
157
 
194
- .stat-decoration {
195
- opacity: 1;
196
- }
158
+ .stat-card {
159
+ &__content {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 15px;
197
163
  }
198
164
 
199
- .stat-icon {
200
- width: 52px;
201
- height: 52px;
165
+ &__icon {
166
+ width: 50px;
167
+ height: 50px;
202
168
  display: flex;
203
169
  align-items: center;
204
170
  justify-content: center;
205
- border-radius: var(--border-radius-large);
206
- flex-shrink: 0;
207
-
208
- span {
209
- font-size: 26px;
210
- }
171
+ font-size: 24px;
172
+ border-radius: var(--border-radius-base);
211
173
  }
212
174
 
213
- .stat-content {
175
+ &__info {
214
176
  flex: 1;
215
- min-width: 0;
216
177
  }
217
178
 
218
- .stat-title {
179
+ &__title {
219
180
  font-size: 14px;
220
181
  color: var(--color-text-secondary);
221
- margin-bottom: 8px;
182
+ margin-bottom: 5px;
222
183
  }
223
184
 
224
- .stat-value {
225
- font-size: 28px;
185
+ &__value {
186
+ font-size: 24px;
226
187
  font-weight: 600;
227
- line-height: 1.2;
228
- margin-bottom: 8px;
229
- }
230
-
231
- .stat-trend {
232
- display: inline-flex;
233
- align-items: center;
234
- gap: 4px;
235
- font-size: 12px;
236
- padding: 2px 8px;
237
- border-radius: 12px;
238
-
239
- svg {
240
- width: 14px;
241
- height: 14px;
242
- }
243
-
244
- &.up {
245
- color: var(--color-success);
246
- background: var(--color-success-lighter);
247
- }
248
-
249
- &.down {
250
- color: var(--color-danger);
251
- background: var(--color-danger-lighter);
252
- }
253
- }
254
-
255
- .stat-decoration {
256
- position: absolute;
257
- top: 0;
258
- right: 0;
259
- width: 100px;
260
- height: 100px;
261
- border-radius: 50%;
262
- opacity: 0;
263
- transition: opacity 0.3s ease;
264
188
  }
265
189
  }
266
190
 
267
- // 主体内容
268
- .main-section {
191
+ .quick-links {
269
192
  display: grid;
270
- grid-template-columns: repeat(2, 1fr);
271
- gap: 24px;
272
- margin-bottom: 24px;
273
-
274
- @media (max-width: 992px) {
275
- grid-template-columns: 1fr;
276
- }
277
- }
278
-
279
- .section-header {
280
- display: flex;
281
- justify-content: space-between;
282
- align-items: center;
283
- margin-bottom: 20px;
284
-
285
- h3 {
286
- font-size: 16px;
287
- font-weight: 600;
288
- color: var(--color-text-primary);
289
- }
290
-
291
- .section-badge {
292
- font-size: 12px;
293
- color: var(--color-text-placeholder);
294
- background: var(--color-fill);
295
- padding: 4px 10px;
296
- border-radius: 12px;
297
- }
298
-
299
- .section-link {
300
- font-size: 14px;
301
- color: var(--color-primary);
302
- text-decoration: none;
303
- transition: color 0.2s;
193
+ grid-template-columns: repeat(4, 1fr);
194
+ gap: 15px;
304
195
 
305
- &:hover {
306
- color: var(--color-primary-dark-1);
307
- }
196
+ @media (max-width: 768px) {
197
+ grid-template-columns: repeat(2, 1fr);
308
198
  }
309
199
  }
310
200
 
311
- // 快捷入口
312
- .quick-section {
313
- background: var(--bg-color);
314
- border-radius: var(--border-radius-large);
315
- padding: 20px;
316
- box-shadow: var(--box-shadow-card);
317
- }
318
-
319
- .quick-grid {
201
+ .quick-link {
320
202
  display: flex;
321
203
  flex-direction: column;
322
- gap: 12px;
323
- }
324
-
325
- .quick-card {
326
- display: flex;
327
204
  align-items: center;
328
- gap: 16px;
329
- padding: 16px;
330
- background: var(--color-fill-light);
205
+ justify-content: center;
206
+ padding: 20px;
331
207
  border-radius: var(--border-radius-base);
208
+ background-color: var(--color-fill);
332
209
  text-decoration: none;
333
- transition: all 0.2s ease;
210
+ transition: all var(--transition-duration-fast);
334
211
 
335
212
  &:hover {
336
- background: var(--color-primary-light-6);
337
- transform: translateX(4px);
338
-
339
- .quick-arrow {
340
- color: var(--color-primary);
341
- transform: translateX(4px);
342
- }
213
+ background-color: var(--color-primary-light-9);
214
+ transform: translateY(-2px);
343
215
  }
344
216
 
345
- .quick-icon {
346
- width: 44px;
347
- height: 44px;
348
- display: flex;
349
- align-items: center;
350
- justify-content: center;
351
- background: var(--bg-color);
352
- border-radius: var(--border-radius-base);
353
- font-size: 22px;
354
- flex-shrink: 0;
355
- }
356
-
357
- .quick-info {
358
- flex: 1;
359
- min-width: 0;
217
+ &__icon {
218
+ font-size: 28px;
219
+ margin-bottom: 10px;
360
220
  }
361
221
 
362
- .quick-title {
363
- font-size: 15px;
364
- font-weight: 500;
222
+ &__title {
223
+ font-size: 14px;
365
224
  color: var(--color-text-primary);
366
- margin-bottom: 4px;
367
- }
368
-
369
- .quick-desc {
370
- font-size: 13px;
371
- color: var(--color-text-secondary);
372
225
  }
373
-
374
- .quick-arrow {
375
- width: 24px;
376
- height: 24px;
377
- display: flex;
378
- align-items: center;
379
- justify-content: center;
380
- color: var(--color-text-placeholder);
381
- transition: all 0.2s ease;
382
-
383
- svg {
384
- width: 16px;
385
- height: 16px;
386
- }
387
- }
388
- }
389
-
390
- // 最近活动
391
- .activity-section {
392
- background: var(--bg-color);
393
- border-radius: var(--border-radius-large);
394
- padding: 20px;
395
- box-shadow: var(--box-shadow-card);
396
226
  }
397
227
 
398
228
  .activity-list {
399
229
  display: flex;
400
230
  flex-direction: column;
231
+ gap: 15px;
401
232
  }
402
233
 
403
234
  .activity-item {
404
235
  display: flex;
405
- align-items: flex-start;
406
- gap: 12px;
407
- padding: 14px 0;
236
+ align-items: center;
237
+ gap: 10px;
238
+ padding-bottom: 15px;
408
239
  border-bottom: 1px solid var(--color-border-lighter);
409
- position: relative;
410
240
 
411
241
  &:last-child {
412
242
  border-bottom: none;
243
+ padding-bottom: 0;
413
244
  }
414
- }
415
-
416
- .activity-avatar {
417
- width: 36px;
418
- height: 36px;
419
- display: flex;
420
- align-items: center;
421
- justify-content: center;
422
- border-radius: 50%;
423
- font-size: 14px;
424
- font-weight: 500;
425
- flex-shrink: 0;
426
-
427
- &.success { background: var(--color-success-lighter); color: var(--color-success); }
428
- &.warning { background: var(--color-warning-lighter); color: var(--color-warning); }
429
- &.info { background: var(--color-info-lighter); color: var(--color-info); }
430
- &.danger { background: var(--color-danger-lighter); color: var(--color-danger); }
431
- &.primary { background: var(--color-primary-light-6); color: var(--color-primary); }
432
- }
433
245
 
434
- .activity-content {
435
- flex: 1;
436
- min-width: 0;
437
- }
438
-
439
- .activity-main {
440
- margin-bottom: 4px;
441
- }
442
-
443
- .activity-user {
444
- font-size: 14px;
445
- font-weight: 500;
446
- color: var(--color-text-primary);
447
- margin-right: 8px;
448
- }
449
-
450
- .activity-action {
451
- font-size: 14px;
452
- color: var(--color-text-secondary);
453
- }
454
-
455
- .activity-time {
456
- font-size: 12px;
457
- color: var(--color-text-placeholder);
458
- }
459
-
460
- .activity-dot {
461
- position: absolute;
462
- left: -20px;
463
- top: 50%;
464
- transform: translateY(-50%);
465
- width: 8px;
466
- height: 8px;
467
- border-radius: 50%;
468
- opacity: 0.6;
469
-
470
- &.success { background: var(--color-success); }
471
- &.warning { background: var(--color-warning); }
472
- &.info { background: var(--color-info); }
473
- &.danger { background: var(--color-danger); }
474
- &.primary { background: var(--color-primary); }
475
- }
246
+ &__action {
247
+ flex: 1;
248
+ font-size: 14px;
249
+ color: var(--color-text-regular);
250
+ }
476
251
 
477
- // 系统信息
478
- .system-section {
479
- background: var(--bg-color);
480
- border-radius: var(--border-radius-large);
481
- padding: 20px;
482
- box-shadow: var(--box-shadow-card);
252
+ &__time {
253
+ font-size: 12px;
254
+ color: var(--color-text-placeholder);
255
+ }
483
256
  }
484
257
 
485
- .system-grid {
258
+ .system-info {
486
259
  display: grid;
487
- grid-template-columns: 1fr 1.5fr;
488
- gap: 24px;
260
+ grid-template-columns: repeat(2, 1fr);
261
+ gap: 20px;
489
262
 
490
263
  @media (max-width: 768px) {
491
264
  grid-template-columns: 1fr;
492
265
  }
493
- }
494
-
495
- .system-info-list {
496
- display: flex;
497
- flex-direction: column;
498
- gap: 12px;
499
- }
500
-
501
- .info-item {
502
- display: flex;
503
- justify-content: space-between;
504
- align-items: center;
505
- padding: 12px 16px;
506
- background: var(--color-fill-light);
507
- border-radius: var(--border-radius-base);
508
-
509
- .info-label {
510
- font-size: 14px;
511
- color: var(--color-text-secondary);
512
- }
513
-
514
- .info-value {
515
- font-size: 14px;
516
- font-weight: 500;
517
- color: var(--color-text-primary);
518
- }
519
- }
520
-
521
- .system-status {
522
- display: flex;
523
- flex-direction: column;
524
- gap: 16px;
525
- }
526
266
 
527
- .status-item {
528
- .status-header {
267
+ &__item {
529
268
  display: flex;
530
- justify-content: space-between;
531
269
  align-items: center;
532
- margin-bottom: 8px;
270
+ gap: 10px;
533
271
  }
534
272
 
535
- .status-label {
273
+ &__label {
536
274
  font-size: 14px;
537
275
  color: var(--color-text-secondary);
276
+ min-width: 80px;
538
277
  }
539
278
 
540
- .status-value {
279
+ &__value {
541
280
  font-size: 14px;
542
- font-weight: 500;
543
281
  color: var(--color-text-primary);
544
282
  }
545
283
  }