smart-admin-web 10.15.0 → 10.20.1

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 (432) hide show
  1. package/README.md +1 -1
  2. package/dist/api/index.d.ts +4 -2
  3. package/dist/api/index.js +1 -1
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +39 -5
  6. package/dist/assets/icons/ph-subset.json.js +5 -5
  7. package/dist/components/AppIcon.vue.js +9 -9
  8. package/dist/components/AppIcon.vue.js.map +1 -1
  9. package/dist/components/AppWatermark.vue.d.ts +14 -0
  10. package/dist/components/AppWatermark.vue.js +38 -0
  11. package/dist/components/AppWatermark.vue.js.map +1 -0
  12. package/dist/components/AppWatermark2.vue.js +5 -0
  13. package/dist/components/AppWatermark2.vue.js.map +1 -0
  14. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  15. package/dist/components/Chart/echarts.js +15 -20
  16. package/dist/components/Chart/echarts.js.map +1 -1
  17. package/dist/components/CronEditor/index.vue.js +1 -1
  18. package/dist/components/CronEditor/index2.vue.js +2 -1
  19. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  20. package/dist/components/DetailPage/index.vue.js +2 -2
  21. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  22. package/dist/components/DictTag/index.vue.js.map +1 -1
  23. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  24. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  25. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  26. package/dist/components/FormContainer/index.vue.js +91 -56
  27. package/dist/components/FormContainer/index.vue.js.map +1 -1
  28. package/dist/components/ImportWizard/index.vue.js +1 -1
  29. package/dist/components/ImportWizard/index2.vue.js +44 -41
  30. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  31. package/dist/components/MenuSearch.vue.js +2 -2
  32. package/dist/components/MenuSearch2.vue.js +19 -18
  33. package/dist/components/MenuSearch2.vue.js.map +1 -1
  34. package/dist/components/PasswordStrength/index.vue.js +2 -2
  35. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  36. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  37. package/dist/components/TableTotal/index.vue.d.ts +6 -0
  38. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  39. package/dist/components/TableTotal/index2.vue.js +16 -0
  40. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  41. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  42. package/dist/components/UserPicker/index.vue.js +2 -2
  43. package/dist/components/UserPicker/index2.vue.js +176 -117
  44. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  45. package/dist/composables/useBatchDelete.js.map +1 -1
  46. package/dist/composables/useLayoutMenu.js +17 -16
  47. package/dist/composables/useLayoutMenu.js.map +1 -1
  48. package/dist/composables/useModule.js +39 -29
  49. package/dist/composables/useModule.js.map +1 -1
  50. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  51. package/dist/composables/useShellBreakpoint.js +37 -0
  52. package/dist/composables/useShellBreakpoint.js.map +1 -0
  53. package/dist/composables/useSite.d.ts +15 -0
  54. package/dist/composables/useSite.js +16 -14
  55. package/dist/composables/useSite.js.map +1 -1
  56. package/dist/composables/useTabTitle.js.map +1 -1
  57. package/dist/composables/useTableTitle.d.ts +6 -0
  58. package/dist/composables/useTableTitle.js +11 -0
  59. package/dist/composables/useTableTitle.js.map +1 -0
  60. package/dist/composables/useTableZoom.d.ts +5 -0
  61. package/dist/composables/useTableZoom.js.map +1 -1
  62. package/dist/composables/useTheme.d.ts +2 -2
  63. package/dist/composables/useTheme.js +23 -20
  64. package/dist/composables/useTheme.js.map +1 -1
  65. package/dist/createSmartAdmin.d.ts +12 -2
  66. package/dist/createSmartAdmin.js +72 -60
  67. package/dist/createSmartAdmin.js.map +1 -1
  68. package/dist/index.d.ts +5 -2
  69. package/dist/index.js +219 -205
  70. package/dist/index.js.map +1 -1
  71. package/dist/layouts/AccentPicker.vue.js +8 -0
  72. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  73. package/dist/layouts/AccentPicker2.vue.js +131 -0
  74. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  75. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  76. package/dist/layouts/AppHeader.vue.js +2 -2
  77. package/dist/layouts/AppHeader2.vue.js +317 -235
  78. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  79. package/dist/layouts/NoticeBell.vue.js +2 -2
  80. package/dist/layouts/NoticeBell2.vue.js +19 -18
  81. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  82. package/dist/layouts/PersonalLayout.vue.js +2 -2
  83. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  84. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  85. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  86. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  87. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  88. package/dist/layouts/TabsBar.vue.js +2 -2
  89. package/dist/layouts/TabsBar2.vue.js +97 -69
  90. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  91. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  92. package/dist/layouts/components/SideNav.vue.js +1 -1
  93. package/dist/layouts/components/SideNav2.vue.js +54 -26
  94. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  95. package/dist/layouts/default.vue.js +1 -1
  96. package/dist/layouts/default2.vue.js +170 -140
  97. package/dist/layouts/default2.vue.js.map +1 -1
  98. package/dist/lib/loginHero.d.ts +2 -2
  99. package/dist/lib/loginHero.js.map +1 -1
  100. package/dist/lib/runtime.js +1 -1
  101. package/dist/lib/watermark.d.ts +110 -0
  102. package/dist/lib/watermark.js +151 -0
  103. package/dist/lib/watermark.js.map +1 -0
  104. package/dist/locales/en-US.d.ts +221 -15
  105. package/dist/locales/en-US.js +230 -21
  106. package/dist/locales/en-US.js.map +1 -1
  107. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  108. package/dist/locales/kernelMenuTitles.js +128 -0
  109. package/dist/locales/kernelMenuTitles.js.map +1 -0
  110. package/dist/locales/menuTitle.d.ts +3 -0
  111. package/dist/locales/menuTitle.js +14 -12
  112. package/dist/locales/menuTitle.js.map +1 -1
  113. package/dist/locales/zh-CN.d.ts +221 -15
  114. package/dist/locales/zh-CN.js +238 -28
  115. package/dist/locales/zh-CN.js.map +1 -1
  116. package/dist/router/index.js +41 -32
  117. package/dist/router/index.js.map +1 -1
  118. package/dist/router/namedPage.d.ts +4 -0
  119. package/dist/router/namedPage.js +7 -7
  120. package/dist/router/namedPage.js.map +1 -1
  121. package/dist/router/viewRegistry.js +8 -8
  122. package/dist/router/viewRegistry.js.map +1 -1
  123. package/dist/stores/app.d.ts +0 -12
  124. package/dist/stores/app.js +11 -12
  125. package/dist/stores/app.js.map +1 -1
  126. package/dist/stores/tabs.js.map +1 -1
  127. package/dist/stores/user.d.ts +10 -0
  128. package/dist/stores/user.js.map +1 -1
  129. package/dist/style.css +1 -1
  130. package/dist/theme/accentTokens.d.ts +27 -0
  131. package/dist/theme/accentTokens.js +54 -0
  132. package/dist/theme/accentTokens.js.map +1 -0
  133. package/dist/theme/accents.d.ts +21 -1
  134. package/dist/theme/accents.js +11 -2
  135. package/dist/theme/accents.js.map +1 -1
  136. package/dist/theme/mix.d.ts +58 -7
  137. package/dist/theme/mix.js +115 -30
  138. package/dist/theme/mix.js.map +1 -1
  139. package/dist/theme/naive-theme.d.ts +5 -2
  140. package/dist/theme/naive-theme.js +407 -75
  141. package/dist/theme/naive-theme.js.map +1 -1
  142. package/dist/utils/jwt.d.ts +8 -0
  143. package/dist/utils/jwt.js +14 -0
  144. package/dist/utils/jwt.js.map +1 -0
  145. package/dist/utils/menuIcon.d.ts +2 -0
  146. package/dist/utils/menuIcon.js +8 -0
  147. package/dist/utils/menuIcon.js.map +1 -0
  148. package/dist/utils/oauthBrand.js.map +1 -1
  149. package/dist/utils/tableFilter.d.ts +88 -0
  150. package/dist/utils/tableFilter.js +116 -0
  151. package/dist/utils/tableFilter.js.map +1 -0
  152. package/dist/utils/tableToolbar.d.ts +18 -0
  153. package/dist/utils/tableToolbar.js +11 -0
  154. package/dist/utils/tableToolbar.js.map +1 -0
  155. package/dist/utils/treeFilter.d.ts +20 -0
  156. package/dist/utils/treeFilter.js +24 -0
  157. package/dist/utils/treeFilter.js.map +1 -0
  158. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  159. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  160. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  161. package/dist/views/dashboard/biz.vue.js +1 -1
  162. package/dist/views/dashboard/biz2.vue.js +310 -257
  163. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  164. package/dist/views/dashboard/workbench.vue.js +2 -2
  165. package/dist/views/dashboard/workbench2.vue.js +141 -155
  166. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  167. package/dist/views/embed/iframe.vue.js +2 -2
  168. package/dist/views/embed/iframe2.vue.js +22 -15
  169. package/dist/views/embed/iframe2.vue.js.map +1 -1
  170. package/dist/views/error/404.vue.js +2 -2
  171. package/dist/views/error/4042.vue.js +33 -24
  172. package/dist/views/error/4042.vue.js.map +1 -1
  173. package/dist/views/error/BootError.vue.js +1 -1
  174. package/dist/views/error/BootError2.vue.js +59 -48
  175. package/dist/views/error/BootError2.vue.js.map +1 -1
  176. package/dist/views/error/MissingRoute.vue.js +2 -2
  177. package/dist/views/error/MissingRoute2.vue.js +34 -15
  178. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  179. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  180. package/dist/views/login/LoginForm.vue.js +2 -2
  181. package/dist/views/login/LoginForm2.vue.js +580 -488
  182. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  183. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  184. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  185. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  186. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  187. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  188. package/dist/views/login/components/LoginHeroPanel.vue.js +3 -3
  189. package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
  190. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  191. package/dist/views/login/index.vue.js +1 -1
  192. package/dist/views/login/index2.vue.js +141 -71
  193. package/dist/views/login/index2.vue.js.map +1 -1
  194. package/dist/views/login/layout.d.ts +11 -0
  195. package/dist/views/login/layout.js +27 -0
  196. package/dist/views/login/layout.js.map +1 -0
  197. package/dist/views/mfa/index.vue.js +2 -2
  198. package/dist/views/mfa/index2.vue.js +367 -321
  199. package/dist/views/mfa/index2.vue.js.map +1 -1
  200. package/dist/views/module/index.vue.js +2 -2
  201. package/dist/views/module/index2.vue.js +132 -99
  202. package/dist/views/module/index2.vue.js.map +1 -1
  203. package/dist/views/oauth/callback.vue.js +2 -2
  204. package/dist/views/oauth/callback2.vue.js +65 -51
  205. package/dist/views/oauth/callback2.vue.js.map +1 -1
  206. package/dist/views/personal/bindings.vue.js +2 -2
  207. package/dist/views/personal/bindings2.vue.js +98 -94
  208. package/dist/views/personal/bindings2.vue.js.map +1 -1
  209. package/dist/views/personal/notice2.vue.js +103 -76
  210. package/dist/views/personal/notice2.vue.js.map +1 -1
  211. package/dist/views/personal/password2.vue.js +47 -40
  212. package/dist/views/personal/password2.vue.js.map +1 -1
  213. package/dist/views/personal/profile.vue.js +3 -3
  214. package/dist/views/personal/profile2.vue.js +24 -18
  215. package/dist/views/personal/profile2.vue.js.map +1 -1
  216. package/dist/views/personal/security.vue.js +2 -2
  217. package/dist/views/personal/security2.vue.js +65 -53
  218. package/dist/views/personal/security2.vue.js.map +1 -1
  219. package/dist/views/personal/sessions.vue.js +2 -2
  220. package/dist/views/personal/sessions2.vue.js +67 -62
  221. package/dist/views/personal/sessions2.vue.js.map +1 -1
  222. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  223. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  224. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  225. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  226. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  227. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  228. package/dist/views/system/ai-model/index.vue.js +2 -2
  229. package/dist/views/system/ai-model/index2.vue.js +99 -99
  230. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  231. package/dist/views/system/ai-model/presets.d.ts +1 -1
  232. package/dist/views/system/ai-model/presets.js +18 -18
  233. package/dist/views/system/ai-model/presets.js.map +1 -1
  234. package/dist/views/system/ai-usage/index.vue.js +2 -2
  235. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  236. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  237. package/dist/views/system/api-docs/index.vue.js +5 -2
  238. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  239. package/dist/views/system/api-docs/index2.vue.js +92 -42
  240. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  241. package/dist/views/system/cache/index.vue.js +2 -2
  242. package/dist/views/system/cache/index2.vue.js +74 -80
  243. package/dist/views/system/cache/index2.vue.js.map +1 -1
  244. package/dist/views/system/config/components/AdminMock.vue.js +2 -2
  245. package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
  246. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
  247. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
  248. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
  249. package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
  250. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  251. package/dist/views/system/config/components/BrandSection.vue.js +2 -2
  252. package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
  253. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
  254. package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
  255. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
  256. package/dist/views/system/config/components/CfgRow.vue.js +1 -1
  257. package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
  258. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
  259. package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
  260. package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
  261. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
  262. package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
  263. package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
  264. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  265. package/dist/views/system/config/components/JobSection.vue.js +2 -2
  266. package/dist/views/system/config/components/JobSection2.vue.js +46 -44
  267. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
  268. package/dist/views/system/config/components/LoginMock.vue.js +3 -3
  269. package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
  270. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
  272. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
  273. package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
  274. package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
  275. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
  276. package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
  277. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
  278. package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
  279. package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
  280. package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
  281. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
  282. package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
  283. package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
  284. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
  285. package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
  286. package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
  287. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
  288. package/dist/views/system/config/components/UploadSection.vue.js +2 -2
  289. package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
  290. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
  291. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  292. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  293. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  294. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  295. package/dist/views/system/config/draft.d.ts +2 -2
  296. package/dist/views/system/config/draft.js.map +1 -1
  297. package/dist/views/system/config/groups.d.ts +4 -1
  298. package/dist/views/system/config/groups.js +54 -49
  299. package/dist/views/system/config/groups.js.map +1 -1
  300. package/dist/views/system/config/index.vue.js +3 -2
  301. package/dist/views/system/config/index.vue.js.map +1 -1
  302. package/dist/views/system/config/index2.vue.js +173 -148
  303. package/dist/views/system/config/index2.vue.js.map +1 -1
  304. package/dist/views/system/config/layoutMode.d.ts +23 -0
  305. package/dist/views/system/config/layoutMode.js +28 -0
  306. package/dist/views/system/config/layoutMode.js.map +1 -0
  307. package/dist/views/system/dict/index.vue.js +2 -2
  308. package/dist/views/system/dict/index2.vue.js +471 -366
  309. package/dist/views/system/dict/index2.vue.js.map +1 -1
  310. package/dist/views/system/file/index2.vue.js +91 -76
  311. package/dist/views/system/file/index2.vue.js.map +1 -1
  312. package/dist/views/system/job/index.vue.js +3 -3
  313. package/dist/views/system/job/index2.vue.js +897 -828
  314. package/dist/views/system/job/index2.vue.js.map +1 -1
  315. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  316. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  317. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  318. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  319. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  320. package/dist/views/system/job-log/index.vue.js +2 -2
  321. package/dist/views/system/job-log/index2.vue.js +193 -207
  322. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  323. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  324. package/dist/views/system/job-log/runStatus.js +26 -0
  325. package/dist/views/system/job-log/runStatus.js.map +1 -0
  326. package/dist/views/system/job-monitor/index.vue.js +2 -2
  327. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  328. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  329. package/dist/views/system/log/exception/index.vue.js +2 -2
  330. package/dist/views/system/log/exception/index2.vue.js +135 -96
  331. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  332. package/dist/views/system/log/login/index2.vue.js +62 -41
  333. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  334. package/dist/views/system/log/op/index.vue.js +2 -2
  335. package/dist/views/system/log/op/index2.vue.js +200 -162
  336. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  337. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  338. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  339. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  340. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  341. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  342. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  343. package/dist/views/system/menu/index.vue.js +1 -1
  344. package/dist/views/system/menu/index2.vue.js +216 -183
  345. package/dist/views/system/menu/index2.vue.js.map +1 -1
  346. package/dist/views/system/module/index.vue.js +1 -1
  347. package/dist/views/system/module/index2.vue.js +177 -144
  348. package/dist/views/system/module/index2.vue.js.map +1 -1
  349. package/dist/views/system/monitor/index.vue.js +2 -2
  350. package/dist/views/system/monitor/index2.vue.js +134 -149
  351. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  352. package/dist/views/system/notice/index.vue.js +1 -1
  353. package/dist/views/system/notice/index2.vue.js +209 -181
  354. package/dist/views/system/notice/index2.vue.js.map +1 -1
  355. package/dist/views/system/org/index.vue.js +1 -1
  356. package/dist/views/system/org/index2.vue.js +278 -248
  357. package/dist/views/system/org/index2.vue.js.map +1 -1
  358. package/dist/views/system/position/index.vue.js +5 -2
  359. package/dist/views/system/position/index.vue.js.map +1 -1
  360. package/dist/views/system/position/index2.vue.js +128 -92
  361. package/dist/views/system/position/index2.vue.js.map +1 -1
  362. package/dist/views/system/recycle/index.vue.js +2 -2
  363. package/dist/views/system/recycle/index2.vue.js +90 -67
  364. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  365. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  366. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  367. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  368. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  369. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  370. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  371. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  372. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  373. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  374. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  375. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  376. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  377. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  378. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  379. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  380. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  381. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  382. package/dist/views/system/role/index.vue.js +5 -2
  383. package/dist/views/system/role/index.vue.js.map +1 -1
  384. package/dist/views/system/role/index2.vue.js +181 -165
  385. package/dist/views/system/role/index2.vue.js.map +1 -1
  386. package/dist/views/system/session/index2.vue.js +75 -49
  387. package/dist/views/system/session/index2.vue.js.map +1 -1
  388. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  389. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  390. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  391. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  392. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  393. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  394. package/dist/views/system/user/index.vue.js +2 -2
  395. package/dist/views/system/user/index2.vue.js +362 -275
  396. package/dist/views/system/user/index2.vue.js.map +1 -1
  397. package/package.json +3 -5
  398. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  399. package/dist/components/SelectTable/index2.vue.js +0 -256
  400. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  401. package/dist/composables/useTableRowSort.d.ts +0 -20
  402. package/dist/composables/useTableRowSort.js +0 -59
  403. package/dist/composables/useTableRowSort.js.map +0 -1
  404. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  405. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  406. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  407. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  408. package/dist/layouts/SettingRow.vue.d.ts +0 -16
  409. package/dist/layouts/SettingRow.vue.js +0 -8
  410. package/dist/layouts/SettingRow.vue.js.map +0 -1
  411. package/dist/layouts/SettingRow2.vue.js +0 -23
  412. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  413. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  414. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  415. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  416. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  417. package/dist/views/login/skins/SplitPanel.vue.d.ts +0 -3
  418. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  419. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  420. package/dist/views/login/skins/SplitPanel2.vue.js +0 -65
  421. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  422. package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
  423. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  424. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  425. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  426. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  427. package/dist/views/login/skins.d.ts +0 -8
  428. package/dist/views/login/skins.js +0 -13
  429. package/dist/views/login/skins.js.map +0 -1
  430. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  431. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  432. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/WatermarkSection.vue.d.ts} +0 -0
@@ -1,16 +1,16 @@
1
- import { defineComponent as x, ref as s, reactive as C, onMounted as $, openBlock as k, createBlock as B, unref as e, withCtx as t, createVNode as l, createElementVNode as V, createElementBlock as z, Fragment as A, createTextVNode as m, toDisplayString as f, createCommentVNode as E } from "vue";
2
- import { useMessage as F, NCard as S, NSpin as M, NForm as R, NFormItem as u, NAvatar as q, NButton as y, NInput as d } from "naive-ui";
1
+ import { defineComponent as I, ref as s, reactive as C, onMounted as $, openBlock as k, createBlock as B, unref as e, withCtx as t, createVNode as l, createElementVNode as V, createElementBlock as z, Fragment as A, createTextVNode as m, toDisplayString as f, createCommentVNode as E } from "vue";
2
+ import { useMessage as F, NCard as S, NSpin as q, NForm as M, NFormItem as u, NAvatar as R, NButton as y, NInput as d } from "naive-ui";
3
3
  import { useI18n as D } from "vue-i18n";
4
4
  import { personalApi as N } from "../../api/index.js";
5
5
  import { useUserStore as L } from "../../stores/user.js";
6
- import { translateError as U } from "../../utils/error.js";
6
+ import { translateError as w } from "../../utils/error.js";
7
7
  import P from "../../components/DictSelect/index.vue.js";
8
8
  import T from "../../components/FileUpload/index.vue.js";
9
9
  import j from "../../components/AppIcon.vue.js";
10
- const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
10
+ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ I({
11
11
  __name: "profile",
12
12
  setup(H) {
13
- const { t: r } = D(), v = F(), c = L(), b = s(!0), g = s(!1), p = s(!1), h = s(null), a = C({
13
+ const { t: r } = D(), c = F(), v = L(), b = s(!0), g = s(!1), p = s(!1), h = s(null), a = C({
14
14
  account: "",
15
15
  name: "",
16
16
  nickname: "",
@@ -20,7 +20,7 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
20
20
  avatar: null,
21
21
  org: "",
22
22
  position: ""
23
- }), w = {
23
+ }), U = {
24
24
  phone: {
25
25
  validator: (n, o) => !o || /^1[3-9]\d{9}$/.test(o),
26
26
  message: () => r("profile.phoneInvalid"),
@@ -37,12 +37,12 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
37
37
  const n = await N.profile();
38
38
  a.account = n.account, a.name = n.name, a.nickname = n.nickname ?? "", a.phone = n.phone ?? "", a.email = n.email ?? "", a.gender = n.gender ?? null, a.avatar = n.avatar ?? null, a.org = n.orgName ?? "—", a.position = n.positionName ?? "—";
39
39
  } catch (n) {
40
- v.error(U(n));
40
+ c.error(w(n));
41
41
  } finally {
42
42
  b.value = !1;
43
43
  }
44
44
  });
45
- async function I() {
45
+ async function x() {
46
46
  var n;
47
47
  try {
48
48
  await ((n = h.value) == null ? void 0 : n.validate());
@@ -58,28 +58,31 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
58
58
  email: a.email || null,
59
59
  gender: a.gender,
60
60
  avatar: a.avatar
61
- }), c.userInfo && (c.userInfo.name = a.name, c.userInfo.avatar = a.avatar), v.success(r("profile.saved"));
61
+ }), v.userInfo && (v.userInfo.name = a.name, v.userInfo.avatar = a.avatar), c.success(r("profile.saved"));
62
62
  } catch (o) {
63
- v.error(U(o));
63
+ c.error(w(o));
64
64
  } finally {
65
65
  g.value = !1;
66
66
  }
67
67
  }
68
68
  return (n, o) => (k(), B(e(S), {
69
+ class: "a-card",
69
70
  bordered: !0,
70
71
  title: e(r)("profile.title"),
71
- style: { "max-width": "560px" }
72
+ "content-style": "padding: 20px 24px",
73
+ style: { "max-width": "560px", width: "100%" }
72
74
  }, {
73
75
  default: t(() => [
74
- l(e(M), { show: b.value }, {
76
+ l(e(q), { show: b.value }, {
75
77
  default: t(() => [
76
- l(e(R), {
78
+ l(e(M), {
77
79
  ref_key: "formRef",
78
80
  ref: h,
79
81
  model: a,
80
- rules: w,
82
+ rules: U,
81
83
  "label-placement": "left",
82
- "label-width": 80
84
+ "label-width": 80,
85
+ "require-mark-placement": "left"
83
86
  }, {
84
87
  default: t(() => [
85
88
  l(e(u), {
@@ -87,7 +90,7 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
87
90
  }, {
88
91
  default: t(() => [
89
92
  V("div", G, [
90
- l(e(q), {
93
+ l(e(R), {
91
94
  round: "",
92
95
  size: 48,
93
96
  style: { "flex-shrink": "0" },
@@ -231,13 +234,16 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
231
234
  ]),
232
235
  _: 1
233
236
  }, 8, ["label"]),
234
- l(e(u), { label: " " }, {
237
+ l(e(u), {
238
+ label: " ",
239
+ "show-feedback": !1
240
+ }, {
235
241
  default: t(() => [
236
242
  l(e(y), {
237
243
  type: "primary",
238
244
  loading: g.value,
239
245
  disabled: !a.name.trim(),
240
- onClick: I
246
+ onClick: x
241
247
  }, {
242
248
  default: t(() => [
243
249
  m(f(e(r)("common.save")), 1)
@@ -1 +1 @@
1
- {"version":3,"file":"profile2.vue.js","sources":["../../../src/views/personal/profile.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人资料:自己能改的字段全在这(姓名/昵称/性别/手机/邮箱/头像);机构/职位由管理员维护,只读展示。\n// 提交是全量替换语义(后端 UpdateProfileInput):整表单一把梭,别做单字段 PATCH。\n// 手机/邮箱直接改不做二次验证——内核无短信/邮件通道,管理员本可在用户管理任改,操作日志留痕(后端注释同款理由)。\nimport { onMounted, reactive, ref } from 'vue'\nimport {\n NCard,\n NForm,\n NFormItem,\n NInput,\n NButton,\n NSpin,\n NAvatar,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { personalApi } from '#/api'\nimport { useUserStore } from '#/stores/user'\nimport { translateError } from '#/utils/error'\nimport DictSelect from '#/components/DictSelect/index.vue'\nimport FileUpload from '#/components/FileUpload/index.vue'\nimport AppIcon from '#/components/AppIcon.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst user = useUserStore()\n\nconst loading = ref(true)\nconst saving = ref(false)\nconst avatarUploading = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst model = reactive({\n account: '',\n name: '',\n nickname: '',\n phone: '',\n email: '',\n gender: null as string | null,\n avatar: null as string | null,\n org: '',\n position: '',\n})\n\n// 手机/邮箱选填,填了才校验格式(与管理端 user 页同规则;后端存自由字符串)\nconst rules: FormRules = {\n phone: {\n validator: (_r, v: string) => !v || /^1[3-9]\\d{9}$/.test(v),\n message: () => t('profile.phoneInvalid'),\n trigger: ['input', 'blur'],\n },\n email: {\n validator: (_r, v: string) => !v || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(v),\n message: () => t('profile.emailInvalid'),\n trigger: ['input', 'blur'],\n },\n}\n\nconst initial = (name: string) => name.trim().charAt(0).toUpperCase() || '?'\n\nonMounted(async () => {\n try {\n const p = await personalApi.profile()\n model.account = p.account\n model.name = p.name\n model.nickname = p.nickname ?? ''\n model.phone = p.phone ?? ''\n model.email = p.email ?? ''\n model.gender = p.gender ?? null\n model.avatar = p.avatar ?? null\n // 展示名称而非 Id:雪花主键是 14 位数字,甩给用户看没有任何意义。\n // 名称由 /personal/profile 一并返回(该端点是 [ActiveSession],人人可读);机构/职位被删则回落占位符。\n model.org = p.orgName ?? '—'\n model.position = p.positionName ?? '—'\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n})\n\nasync function save() {\n try {\n await formRef.value?.validate()\n } catch {\n return // 校验失败:表单项已就地标红,不另叠 toast\n }\n saving.value = true\n try {\n await personalApi.updateProfile({\n name: model.name,\n nickname: model.nickname || null,\n phone: model.phone || null,\n email: model.email || null,\n gender: model.gender,\n avatar: model.avatar,\n })\n if (user.userInfo) {\n user.userInfo.name = model.name\n user.userInfo.avatar = model.avatar // 顶栏头像即时同步,不等下次 enterInitial\n }\n message.success(t('profile.saved'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-card :bordered=\"true\" :title=\"t('profile.title')\" style=\"max-width: 560px\">\n <n-spin :show=\"loading\">\n <n-form ref=\"formRef\" :model=\"model\" :rules=\"rules\" label-placement=\"left\" :label-width=\"80\">\n <n-form-item :label=\"t('profile.avatar')\">\n <div class=\"avatar-field\">\n <n-avatar round :size=\"48\" style=\"flex-shrink: 0\" :src=\"model.avatar || undefined\">\n <template #fallback>{{ initial(model.name) }}</template>\n <template v-if=\"!model.avatar\">{{ initial(model.name) }}</template>\n </n-avatar>\n <FileUpload\n accept=\"image/*\"\n :show-file-list=\"false\"\n @loading-change=\"v => (avatarUploading = v)\"\n @uploaded=\"o => (model.avatar = o.viewUrl ?? null)\"\n >\n <n-button size=\"small\" :loading=\"avatarUploading\" :disabled=\"avatarUploading\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"14\" /></template>\n {{ avatarUploading ? t('profile.avatarUploading') : t('profile.avatar') }}\n </n-button>\n </FileUpload>\n </div>\n </n-form-item>\n <n-form-item :label=\"t('profile.account')\">\n <n-input :value=\"model.account\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.name')\" required>\n <n-input v-model:value=\"model.name\" :placeholder=\"t('profile.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.nickname')\">\n <n-input v-model:value=\"model.nickname\" :placeholder=\"t('profile.nickname')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.gender')\">\n <DictSelect\n v-model:value=\"model.gender\"\n type-code=\"gender\"\n clearable\n :placeholder=\"t('profile.gender')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('profile.phone')\" path=\"phone\">\n <n-input v-model:value=\"model.phone\" :placeholder=\"t('profile.phone')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.email')\" path=\"email\">\n <n-input v-model:value=\"model.email\" :placeholder=\"t('profile.email')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.org')\">\n <n-input :value=\"model.org\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.position')\">\n <n-input :value=\"model.position\" disabled />\n </n-form-item>\n <n-form-item :label=\"' '\">\n <n-button type=\"primary\" :loading=\"saving\" :disabled=\"!model.name.trim()\" @click=\"save\">\n {{ t('common.save') }}\n </n-button>\n </n-form-item>\n </n-form>\n </n-spin>\n </n-card>\n</template>\n\n<style scoped>\n.avatar-field {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","user","useUserStore","loading","ref","saving","avatarUploading","formRef","model","reactive","rules","_r","v","initial","name","onMounted","p","personalApi","e","translateError","save","_a","_createBlock","_unref","NCard","_createVNode","NSpin","NForm","NFormItem","_createElementVNode","_hoisted_1","NAvatar","_createElementBlock","_Fragment","FileUpload","_cache","o","NButton","AppIcon","_createTextVNode","_toDisplayString","NInput","$event","DictSelect"],"mappings":"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"}
1
+ {"version":3,"file":"profile2.vue.js","sources":["../../../src/views/personal/profile.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人资料:自己能改的字段全在这(姓名/昵称/性别/手机/邮箱/头像);机构/职位由管理员维护,只读展示。\n// 提交是全量替换语义(后端 UpdateProfileInput):整表单一把梭,别做单字段 PATCH。\n// 手机/邮箱直接改不做二次验证——内核无短信/邮件通道,管理员本可在用户管理任改,操作日志留痕(后端注释同款理由)。\nimport { onMounted, reactive, ref } from 'vue'\nimport {\n NCard,\n NForm,\n NFormItem,\n NInput,\n NButton,\n NSpin,\n NAvatar,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { personalApi } from '#/api'\nimport { useUserStore } from '#/stores/user'\nimport { translateError } from '#/utils/error'\nimport DictSelect from '#/components/DictSelect/index.vue'\nimport FileUpload from '#/components/FileUpload/index.vue'\nimport AppIcon from '#/components/AppIcon.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst user = useUserStore()\n\nconst loading = ref(true)\nconst saving = ref(false)\nconst avatarUploading = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst model = reactive({\n account: '',\n name: '',\n nickname: '',\n phone: '',\n email: '',\n gender: null as string | null,\n avatar: null as string | null,\n org: '',\n position: '',\n})\n\n// 手机/邮箱选填,填了才校验格式(与管理端 user 页同规则;后端存自由字符串)\nconst rules: FormRules = {\n phone: {\n validator: (_r, v: string) => !v || /^1[3-9]\\d{9}$/.test(v),\n message: () => t('profile.phoneInvalid'),\n trigger: ['input', 'blur'],\n },\n email: {\n validator: (_r, v: string) => !v || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(v),\n message: () => t('profile.emailInvalid'),\n trigger: ['input', 'blur'],\n },\n}\n\nconst initial = (name: string) => name.trim().charAt(0).toUpperCase() || '?'\n\nonMounted(async () => {\n try {\n const p = await personalApi.profile()\n model.account = p.account\n model.name = p.name\n model.nickname = p.nickname ?? ''\n model.phone = p.phone ?? ''\n model.email = p.email ?? ''\n model.gender = p.gender ?? null\n model.avatar = p.avatar ?? null\n // 展示名称而非 Id:雪花主键是 14 位数字,甩给用户看没有任何意义。\n // 名称由 /personal/profile 一并返回(该端点是 [ActiveSession],人人可读);机构/职位被删则回落占位符。\n model.org = p.orgName ?? '—'\n model.position = p.positionName ?? '—'\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n})\n\nasync function save() {\n try {\n await formRef.value?.validate()\n } catch {\n return // 校验失败:表单项已就地标红,不另叠 toast\n }\n saving.value = true\n try {\n await personalApi.updateProfile({\n name: model.name,\n nickname: model.nickname || null,\n phone: model.phone || null,\n email: model.email || null,\n gender: model.gender,\n avatar: model.avatar,\n })\n if (user.userInfo) {\n user.userInfo.name = model.name\n user.userInfo.avatar = model.avatar // 顶栏头像即时同步,不等下次 enterInitial\n }\n message.success(t('profile.saved'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-card\n class=\"a-card\"\n :bordered=\"true\"\n :title=\"t('profile.title')\"\n content-style=\"padding: 20px 24px\"\n style=\"max-width: 560px; width: 100%\"\n >\n <n-spin :show=\"loading\">\n <n-form\n ref=\"formRef\"\n :model=\"model\"\n :rules=\"rules\"\n label-placement=\"left\"\n :label-width=\"80\"\n require-mark-placement=\"left\"\n >\n <n-form-item :label=\"t('profile.avatar')\">\n <div class=\"avatar-field\">\n <n-avatar round :size=\"48\" style=\"flex-shrink: 0\" :src=\"model.avatar || undefined\">\n <template #fallback>{{ initial(model.name) }}</template>\n <template v-if=\"!model.avatar\">{{ initial(model.name) }}</template>\n </n-avatar>\n <FileUpload\n accept=\"image/*\"\n :show-file-list=\"false\"\n @loading-change=\"v => (avatarUploading = v)\"\n @uploaded=\"o => (model.avatar = o.viewUrl ?? null)\"\n >\n <n-button size=\"small\" :loading=\"avatarUploading\" :disabled=\"avatarUploading\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"14\" /></template>\n {{ avatarUploading ? t('profile.avatarUploading') : t('profile.avatar') }}\n </n-button>\n </FileUpload>\n </div>\n </n-form-item>\n <n-form-item :label=\"t('profile.account')\">\n <n-input :value=\"model.account\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.name')\" required>\n <n-input v-model:value=\"model.name\" :placeholder=\"t('profile.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.nickname')\">\n <n-input v-model:value=\"model.nickname\" :placeholder=\"t('profile.nickname')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.gender')\">\n <DictSelect\n v-model:value=\"model.gender\"\n type-code=\"gender\"\n clearable\n :placeholder=\"t('profile.gender')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('profile.phone')\" path=\"phone\">\n <n-input v-model:value=\"model.phone\" :placeholder=\"t('profile.phone')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.email')\" path=\"email\">\n <n-input v-model:value=\"model.email\" :placeholder=\"t('profile.email')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.org')\">\n <n-input :value=\"model.org\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.position')\">\n <n-input :value=\"model.position\" disabled />\n </n-form-item>\n <n-form-item :label=\"' '\" :show-feedback=\"false\">\n <n-button type=\"primary\" :loading=\"saving\" :disabled=\"!model.name.trim()\" @click=\"save\">\n {{ t('common.save') }}\n </n-button>\n </n-form-item>\n </n-form>\n </n-spin>\n </n-card>\n</template>\n\n<style scoped>\n.avatar-field {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","user","useUserStore","loading","ref","saving","avatarUploading","formRef","model","reactive","rules","_r","v","initial","name","onMounted","p","personalApi","e","translateError","save","_a","_createBlock","_unref","NCard","_createVNode","NSpin","NForm","NFormItem","_createElementVNode","_hoisted_1","NAvatar","_createElementBlock","_Fragment","FileUpload","_cache","o","NButton","AppIcon","_createTextVNode","_toDisplayString","NInput","$event","DictSelect"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./security2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.js";
4
- const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-7afb110e"]]);
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-339c19c7"]]);
5
5
  export {
6
- f as default
6
+ p as default
7
7
  };
8
8
  //# sourceMappingURL=security.vue.js.map
@@ -1,82 +1,94 @@
1
- import { defineComponent as v, computed as x, openBlock as p, createBlock as l, unref as e, withCtx as o, createVNode as a, createTextVNode as i, toDisplayString as n, createCommentVNode as N, createElementVNode as d } from "vue";
2
- import { useRouter as b } from "vue-router";
3
- import { NCard as g, NAlert as m, NSpace as C, NButton as y } from "naive-ui";
4
- import { useI18n as k } from "vue-i18n";
5
- import { useUserStore as w } from "../../stores/user.js";
1
+ import { defineComponent as x, computed as k, openBlock as p, createBlock as l, unref as e, withCtx as r, createElementVNode as c, createVNode as s, createTextVNode as a, toDisplayString as n, createCommentVNode as w } from "vue";
2
+ import { useRouter as N } from "vue-router";
3
+ import { NCard as g, NAlert as m, NButton as y } from "naive-ui";
4
+ import { Icon as f } from "@iconify/vue";
5
+ import { useI18n as C } from "vue-i18n";
6
+ import { useUserStore as b } from "../../stores/user.js";
6
7
  import { useAuthStore as A } from "../../stores/auth.js";
7
- const B = { class: "sec-desc" }, V = { class: "sec-note" }, $ = /* @__PURE__ */ v({
8
+ const B = { class: "sec" }, V = { class: "sec-desc" }, I = { class: "sec-actions" }, q = { class: "sec-note" }, U = /* @__PURE__ */ x({
8
9
  __name: "security",
9
- setup(q) {
10
- const { t } = k(), f = b(), _ = w(), S = A(), h = x(() => S.hasPerm("GET:/api/v1/sys/config/page"));
11
- function u(c) {
12
- var s;
13
- const r = (s = _.userInfo) == null ? void 0 : s.account;
14
- f.push({
10
+ setup(D) {
11
+ const { t } = C(), h = N(), _ = b(), v = A(), S = k(() => v.hasPerm("GET:/api/v1/sys/config/page"));
12
+ function u(d) {
13
+ var i;
14
+ const o = (i = _.userInfo) == null ? void 0 : i.account;
15
+ h.push({
15
16
  path: "/mfa/bind",
16
17
  query: {
17
- ...r ? { account: r } : {},
18
- ...c === "recovery" ? { mode: "recovery" } : {}
18
+ ...o ? { account: o } : {},
19
+ ...d === "recovery" ? { mode: "recovery" } : {}
19
20
  }
20
21
  });
21
22
  }
22
- return (c, r) => (p(), l(e(g), {
23
+ return (d, o) => (p(), l(e(g), {
24
+ class: "a-card",
23
25
  bordered: !0,
24
26
  title: e(t)("personalSecurity.title"),
25
- style: { "max-width": "560px" }
27
+ "content-style": "padding: 20px 24px",
28
+ style: { "max-width": "560px", width: "100%" }
26
29
  }, {
27
- default: o(() => [
28
- a(e(m), {
29
- type: "info",
30
- bordered: !1,
31
- style: { "margin-bottom": "16px" }
32
- }, {
33
- default: o(() => [
34
- i(n(e(t)("personalSecurity.hint")), 1)
35
- ]),
36
- _: 1
37
- }),
38
- h.value ? (p(), l(e(m), {
39
- key: 0,
40
- type: "warning",
41
- bordered: !1,
42
- style: { "margin-bottom": "16px" }
43
- }, {
44
- default: o(() => [
45
- i(n(e(t)("personalSecurity.adminHint")), 1)
46
- ]),
47
- _: 1
48
- })) : N("", !0),
49
- d("p", B, n(e(t)("personalSecurity.bindDesc")), 1),
50
- a(e(C), null, {
51
- default: o(() => [
52
- a(e(y), {
30
+ default: r(() => [
31
+ c("div", B, [
32
+ s(e(m), {
33
+ type: "info",
34
+ bordered: !1
35
+ }, {
36
+ default: r(() => [
37
+ a(n(e(t)("personalSecurity.hint")), 1)
38
+ ]),
39
+ _: 1
40
+ }),
41
+ S.value ? (p(), l(e(m), {
42
+ key: 0,
43
+ type: "warning",
44
+ bordered: !1
45
+ }, {
46
+ default: r(() => [
47
+ a(n(e(t)("personalSecurity.adminHint")), 1)
48
+ ]),
49
+ _: 1
50
+ })) : w("", !0),
51
+ c("p", V, n(e(t)("personalSecurity.bindDesc")), 1),
52
+ c("div", I, [
53
+ s(e(y), {
53
54
  type: "primary",
54
- onClick: r[0] || (r[0] = (s) => u())
55
+ onClick: o[0] || (o[0] = (i) => u())
55
56
  }, {
56
- default: o(() => [
57
- i(n(e(t)("personalSecurity.setupAuthenticator")), 1)
57
+ icon: r(() => [
58
+ s(e(f), {
59
+ icon: "ph:shield-check",
60
+ width: 16
61
+ })
62
+ ]),
63
+ default: r(() => [
64
+ a(" " + n(e(t)("personalSecurity.setupAuthenticator")), 1)
58
65
  ]),
59
66
  _: 1
60
67
  }),
61
- a(e(y), {
68
+ s(e(y), {
62
69
  quaternary: "",
63
- onClick: r[1] || (r[1] = (s) => u("recovery"))
70
+ onClick: o[1] || (o[1] = (i) => u("recovery"))
64
71
  }, {
65
- default: o(() => [
66
- i(n(e(t)("personalSecurity.useRecovery")), 1)
72
+ icon: r(() => [
73
+ s(e(f), {
74
+ icon: "ph:key",
75
+ width: 16
76
+ })
77
+ ]),
78
+ default: r(() => [
79
+ a(" " + n(e(t)("personalSecurity.useRecovery")), 1)
67
80
  ]),
68
81
  _: 1
69
82
  })
70
83
  ]),
71
- _: 1
72
- }),
73
- d("p", V, n(e(t)("personalSecurity.note")), 1)
84
+ c("div", q, n(e(t)("personalSecurity.note")), 1)
85
+ ])
74
86
  ]),
75
87
  _: 1
76
88
  }, 8, ["title"]));
77
89
  }
78
90
  });
79
91
  export {
80
- $ as default
92
+ U as default
81
93
  };
82
94
  //# sourceMappingURL=security2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security2.vue.js","sources":["../../../src/views/personal/security.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人安全:TOTP 自助绑定/恢复入口(ADR 0006)。不进业务菜单,顶栏用户下拉进入。\n// 管理员配置路径类文案(系统配置/安全策略)只给能进配置的人看,普通用户不暴露运维指引。\nimport { computed } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NCard, NButton, NAlert, NSpace } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst user = useUserStore()\nconst auth = useAuthStore()\n\n// hasPerm 对超管恒 true;普通用户须具备系统配置读权限才看运维提示。\nconst showAdminHint = computed(() => auth.hasPerm('GET:/api/v1/sys/config/page'))\n\nfunction goBind(mode?: 'recovery') {\n const account = user.userInfo?.account\n router.push({\n path: '/mfa/bind',\n query: {\n ...(account ? { account } : {}),\n ...(mode === 'recovery' ? { mode: 'recovery' } : {}),\n },\n })\n}\n</script>\n\n<template>\n <n-card :bordered=\"true\" :title=\"t('personalSecurity.title')\" style=\"max-width: 560px\">\n <n-alert type=\"info\" :bordered=\"false\" style=\"margin-bottom: 16px\">\n {{ t('personalSecurity.hint') }}\n </n-alert>\n <n-alert v-if=\"showAdminHint\" type=\"warning\" :bordered=\"false\" style=\"margin-bottom: 16px\">\n {{ t('personalSecurity.adminHint') }}\n </n-alert>\n <p class=\"sec-desc\">{{ t('personalSecurity.bindDesc') }}</p>\n <n-space>\n <n-button type=\"primary\" @click=\"goBind()\">\n {{ t('personalSecurity.setupAuthenticator') }}\n </n-button>\n <n-button quaternary @click=\"goBind('recovery')\">\n {{ t('personalSecurity.useRecovery') }}\n </n-button>\n </n-space>\n <p class=\"sec-note\">{{ t('personalSecurity.note') }}</p>\n </n-card>\n</template>\n\n<style scoped>\n.sec-desc {\n margin: 0 0 16px;\n color: var(--color-text-2, #666);\n line-height: 1.5;\n}\n.sec-note {\n margin: 20px 0 0;\n font-size: 12px;\n color: var(--color-text-3, #999);\n line-height: 1.5;\n}\n</style>\n"],"names":["useI18n","router","useRouter","user","useUserStore","auth","useAuthStore","showAdminHint","computed","goBind","mode","account","_a","_createBlock","_unref","NCard","_createVNode","NAlert","_createElementVNode","_hoisted_1","_toDisplayString","NSpace","NButton","_hoisted_2"],"mappings":";;;;;;;;;AAUA,UAAM,EAAE,EAAA,IAAMA,EAAA,GACRC,IAASC,EAAA,GACTC,IAAOC,EAAA,GACPC,IAAOC,EAAA,GAGPC,IAAgBC,EAAS,MAAMH,EAAK,QAAQ,6BAA6B,CAAC;AAEhF,aAASI,EAAOC,GAAmB;;AACjC,YAAMC,KAAUC,IAAAT,EAAK,aAAL,gBAAAS,EAAe;AAC/B,MAAAX,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,UACL,GAAIU,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAAA,UAC5B,GAAID,MAAS,aAAa,EAAE,MAAM,WAAA,IAAe,CAAA;AAAA,QAAC;AAAA,MACpD,CACD;AAAA,IACH;2BAIEG,EAiBSC,EAAAC,CAAA,GAAA;AAAA,MAjBA,UAAU;AAAA,MAAO,OAAOD,EAAA,CAAA,EAAC,wBAAA;AAAA,MAA4B,OAAA,EAAA,aAAA,QAAA;AAAA,IAAA;iBAC5D,MAEU;AAAA,QAFVE,EAEUF,EAAAG,CAAA,GAAA;AAAA,UAFD,MAAK;AAAA,UAAQ,UAAU;AAAA,UAAO,OAAA,EAAA,iBAAA,OAAA;AAAA,QAAA;qBACrC,MAAgC;AAAA,gBAA7BH,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;QAESP,EAAA,cAAfM,EAEUC,EAAAG,CAAA,GAAA;AAAA;UAFoB,MAAK;AAAA,UAAW,UAAU;AAAA,UAAO,OAAA,EAAA,iBAAA,OAAA;AAAA,QAAA;qBAC7D,MAAqC;AAAA,gBAAlCH,EAAA,CAAA,EAAC,4BAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;QAENI,EAA4D,KAA5DC,GAA4DC,EAArCN,EAAA,CAAA,EAAC,2BAAA,CAAA,GAAA,CAAA;AAAA,QACxBE,EAOUF,EAAAO,CAAA,GAAA,MAAA;AAAA,qBANR,MAEW;AAAA,YAFXL,EAEWF,EAAAQ,CAAA,GAAA;AAAA,cAFD,MAAK;AAAA,cAAW,gCAAOb,EAAA;AAAA,YAAM;yBACrC,MAA8C;AAAA,oBAA3CK,EAAA,CAAA,EAAC,qCAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAENE,EAEWF,EAAAQ,CAAA,GAAA;AAAA,cAFD,YAAA;AAAA,cAAY,gCAAOb,EAAM,UAAA;AAAA,YAAA;yBACjC,MAAuC;AAAA,oBAApCK,EAAA,CAAA,EAAC,8BAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;QAGRI,EAAwD,KAAxDK,GAAwDH,EAAjCN,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,MAAA;;;;;"}
1
+ {"version":3,"file":"security2.vue.js","sources":["../../../src/views/personal/security.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人安全:TOTP 自助绑定/恢复入口。不进业务菜单,顶栏用户下拉进入。\n// 管理员配置路径类文案(系统配置/安全策略)只给能进配置的人看,普通用户不暴露运维指引。\nimport { computed } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NCard, NButton, NAlert } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst user = useUserStore()\nconst auth = useAuthStore()\n\n// hasPerm 对超管恒 true;普通用户须具备系统配置读权限才看运维提示。\nconst showAdminHint = computed(() => auth.hasPerm('GET:/api/v1/sys/config/page'))\n\nfunction goBind(mode?: 'recovery') {\n const account = user.userInfo?.account\n router.push({\n path: '/mfa/bind',\n query: {\n ...(account ? { account } : {}),\n ...(mode === 'recovery' ? { mode: 'recovery' } : {}),\n },\n })\n}\n</script>\n\n<template>\n <n-card\n class=\"a-card\"\n :bordered=\"true\"\n :title=\"t('personalSecurity.title')\"\n content-style=\"padding: 20px 24px\"\n style=\"max-width: 560px; width: 100%\"\n >\n <div class=\"sec\">\n <n-alert type=\"info\" :bordered=\"false\">\n {{ t('personalSecurity.hint') }}\n </n-alert>\n <n-alert v-if=\"showAdminHint\" type=\"warning\" :bordered=\"false\">\n {{ t('personalSecurity.adminHint') }}\n </n-alert>\n <p class=\"sec-desc\">{{ t('personalSecurity.bindDesc') }}</p>\n <div class=\"sec-actions\">\n <n-button type=\"primary\" @click=\"goBind()\">\n <template #icon><Icon icon=\"ph:shield-check\" :width=\"16\" /></template>\n {{ t('personalSecurity.setupAuthenticator') }}\n </n-button>\n <n-button quaternary @click=\"goBind('recovery')\">\n <template #icon><Icon icon=\"ph:key\" :width=\"16\" /></template>\n {{ t('personalSecurity.useRecovery') }}\n </n-button>\n </div>\n <div class=\"sec-note\">{{ t('personalSecurity.note') }}</div>\n </div>\n </n-card>\n</template>\n\n<style scoped>\n.sec {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.sec-desc {\n margin: 4px 0 0;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-2);\n}\n.sec-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n.sec-note {\n font-size: 13px;\n line-height: 1.6;\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","router","useRouter","user","useUserStore","auth","useAuthStore","showAdminHint","computed","goBind","mode","account","_a","_createBlock","_unref","NCard","_createElementVNode","_hoisted_1","_createVNode","NAlert","_hoisted_2","_toDisplayString","_hoisted_3","NButton","Icon","_createTextVNode","_hoisted_4"],"mappings":";;;;;;;;;;AAWA,UAAM,EAAE,EAAA,IAAMA,EAAA,GACRC,IAASC,EAAA,GACTC,IAAOC,EAAA,GACPC,IAAOC,EAAA,GAGPC,IAAgBC,EAAS,MAAMH,EAAK,QAAQ,6BAA6B,CAAC;AAEhF,aAASI,EAAOC,GAAmB;;AACjC,YAAMC,KAAUC,IAAAT,EAAK,aAAL,gBAAAS,EAAe;AAC/B,MAAAX,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,UACL,GAAIU,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAAA,UAC5B,GAAID,MAAS,aAAa,EAAE,MAAM,WAAA,IAAe,CAAA;AAAA,QAAC;AAAA,MACpD,CACD;AAAA,IACH;2BAIEG,EA2BSC,EAAAC,CAAA,GAAA;AAAA,MA1BP,OAAM;AAAA,MACL,UAAU;AAAA,MACV,OAAOD,EAAA,CAAA,EAAC,wBAAA;AAAA,MACT,iBAAc;AAAA,MACd,OAAA,EAAA,aAAA,SAAA,OAAA,OAAA;AAAA,IAAA;iBAEA,MAmBM;AAAA,QAnBNE,EAmBM,OAnBNC,GAmBM;AAAA,UAlBJC,EAEUJ,EAAAK,CAAA,GAAA;AAAA,YAFD,MAAK;AAAA,YAAQ,UAAU;AAAA,UAAA;uBAC9B,MAAgC;AAAA,kBAA7BL,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAESP,EAAA,cAAfM,EAEUC,EAAAK,CAAA,GAAA;AAAA;YAFoB,MAAK;AAAA,YAAW,UAAU;AAAA,UAAA;uBACtD,MAAqC;AAAA,kBAAlCL,EAAA,CAAA,EAAC,4BAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAENE,EAA4D,KAA5DI,GAA4DC,EAArCP,EAAA,CAAA,EAAC,2BAAA,CAAA,GAAA,CAAA;AAAA,UACxBE,EASM,OATNM,GASM;AAAA,YARJJ,EAGWJ,EAAAS,CAAA,GAAA;AAAA,cAHD,MAAK;AAAA,cAAW,gCAAOd,EAAA;AAAA,YAAM;cAC1B,QAAK,MAA2C;AAAA,gBAA3CS,EAA2CJ,EAAAU,CAAA,GAAA;AAAA,kBAArC,MAAK;AAAA,kBAAmB,OAAO;AAAA,gBAAA;;yBAAiB,MACtE;AAAA,gBADsEC,EAAA,QACnEX,EAAA,CAAA,EAAC,qCAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAENI,EAGWJ,EAAAS,CAAA,GAAA;AAAA,cAHD,YAAA;AAAA,cAAY,gCAAOd,EAAM,UAAA;AAAA,YAAA;cACtB,QAAK,MAAkC;AAAA,gBAAlCS,EAAkCJ,EAAAU,CAAA,GAAA;AAAA,kBAA5B,MAAK;AAAA,kBAAU,OAAO;AAAA,gBAAA;;yBAAiB,MAC7D;AAAA,gBAD6DC,EAAA,QAC1DX,EAAA,CAAA,EAAC,8BAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAGRE,EAA4D,OAA5DU,GAA4DL,EAAnCP,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,QAAA;;;;;;"}
@@ -1,8 +1,8 @@
1
1
  import o from "./sessions2.vue.js";
2
2
  /* empty css */
3
3
  import s from "../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ s(o, [["__scopeId", "data-v-83e5e6b1"]]);
4
+ const a = /* @__PURE__ */ s(o, [["__scopeId", "data-v-6e7e3dea"]]);
5
5
  export {
6
- m as default
6
+ a as default
7
7
  };
8
8
  //# sourceMappingURL=sessions.vue.js.map
@@ -1,101 +1,106 @@
1
- import { defineComponent as y, ref as l, onMounted as w, openBlock as g, createBlock as h, unref as n, withCtx as _, createVNode as v, h as i } from "vue";
2
- import { useMessage as x, NCard as C, NDataTable as N, NTag as T, NButton as A } from "naive-ui";
1
+ import { defineComponent as k, ref as c, onMounted as y, openBlock as _, createElementBlock as w, createVNode as m, unref as r, withCtx as T, h as t } from "vue";
2
+ import { useMessage as v, NTag as x, NButton as A } from "naive-ui";
3
3
  import { useI18n as b } from "vue-i18n";
4
- import { personalApi as c } from "../../api/index.js";
5
- import { uaSummary as M } from "../../utils/ua.js";
6
- import { useConfirm as B } from "../../composables/useConfirm.js";
7
- import { translateError as I } from "../../utils/error.js";
8
- import { fmtDateTime as m } from "../../utils/format.js";
9
- const G = /* @__PURE__ */ y({
4
+ import { SmartTable as C } from "smart-naive-table";
5
+ import { personalApi as d } from "../../api/index.js";
6
+ import { uaSummary as B } from "../../utils/ua.js";
7
+ import { useConfirm as I } from "../../composables/useConfirm.js";
8
+ import { translateError as E } from "../../utils/error.js";
9
+ import { fmtDateTime as p } from "../../utils/format.js";
10
+ import { TABLE_MIN_ROW_HEIGHT as M, TABLE_TOOLBAR as N } from "../../utils/tableToolbar.js";
11
+ import S from "../../components/TableTotal/index.vue.js";
12
+ import { deriveHeaderFilters as H } from "../../utils/tableFilter.js";
13
+ const L = { class: "fill-page" }, Q = /* @__PURE__ */ k({
10
14
  __name: "sessions",
11
- setup(z) {
12
- const { t: s } = b(), d = x(), { confirm: u } = B(), o = l(!0), r = l([]), p = (e) => e.sessionId;
13
- async function a() {
14
- o.value = !0;
15
+ setup(O) {
16
+ const { t: o } = b(), u = v(), { confirm: f } = I(), i = c(!0), s = c([]);
17
+ async function n() {
18
+ i.value = !0;
15
19
  try {
16
- r.value = await c.sessions();
20
+ s.value = await d.sessions();
17
21
  } catch (e) {
18
- d.error(I(e));
22
+ u.error(E(e));
19
23
  } finally {
20
- o.value = !1;
24
+ i.value = !1;
21
25
  }
22
26
  }
23
- w(a);
24
- function f(e) {
25
- u({
27
+ y(n);
28
+ function g(e) {
29
+ f({
26
30
  type: "warning",
27
- content: s("session.kickMineConfirm"),
28
- action: () => c.kickSession(e.sessionId),
29
- successMsg: s("session.kicked")
30
- }).then((t) => {
31
- t && a();
31
+ content: o("session.kickMineConfirm"),
32
+ action: () => d.kickSession(e.sessionId),
33
+ successMsg: o("session.kicked")
34
+ }).then((l) => {
35
+ l && n();
32
36
  });
33
37
  }
34
- const k = [
38
+ const a = [
39
+ { type: "index", title: () => o("common.rowNo"), width: 64, align: "center" },
35
40
  {
36
- key: "rowNo",
37
- title: () => s("common.rowNo"),
38
- width: 64,
39
- align: "center",
40
- render: (e, t) => t + 1
41
- },
42
- {
43
- key: "device",
44
- title: () => s("session.device"),
45
- render: (e) => i("div", { class: "device-cell" }, [
46
- i("span", M(e.userAgent)),
47
- e.isCurrent ? i(T, { type: "success", size: "small", bordered: !1 }, () => s("session.current")) : null
41
+ // 搜索按原始 UA 字符串「包含」求值(输入 Chrome / Windows 都能命中);单元格显示解析后的「浏览器 · 系统」
42
+ key: "userAgent",
43
+ title: () => o("session.device"),
44
+ search: {},
45
+ render: (e) => t("div", { class: "device-cell" }, [
46
+ t("span", B(e.userAgent)),
47
+ e.isCurrent ? t(x, { type: "success", size: "small", bordered: !1 }, () => o("session.current")) : null
48
48
  ])
49
49
  },
50
- { key: "ip", title: () => s("session.ip"), width: 140, render: (e) => e.ip || "—" },
50
+ { key: "ip", title: () => o("session.ip"), width: 140, search: {}, render: (e) => e.ip || "—" },
51
51
  {
52
52
  key: "loginTime",
53
- title: () => s("session.loginTime"),
53
+ title: () => o("session.loginTime"),
54
54
  width: 180,
55
- render: (e) => m(e.loginTime)
55
+ render: (e) => p(e.loginTime)
56
56
  },
57
57
  {
58
58
  key: "expiresAt",
59
- title: () => s("session.expiresAt"),
59
+ title: () => o("session.expiresAt"),
60
60
  width: 180,
61
- render: (e) => m(e.expiresAt)
61
+ render: (e) => p(e.expiresAt)
62
62
  },
63
63
  {
64
64
  key: "op",
65
- title: () => s("common.operation"),
65
+ title: () => o("common.operation"),
66
66
  width: 110,
67
- render: (e) => i(
67
+ fixed: "right",
68
+ hideInSetting: !0,
69
+ render: (e) => t(
68
70
  A,
69
71
  {
70
72
  size: "small",
71
73
  quaternary: !0,
72
74
  type: "error",
73
75
  disabled: e.isCurrent,
74
- onClick: () => f(e)
76
+ onClick: () => g(e)
75
77
  },
76
- () => s("session.kick")
78
+ () => o("session.kick")
77
79
  )
78
80
  }
79
81
  ];
80
- return (e, t) => (g(), h(n(C), {
81
- bordered: !0,
82
- title: n(s)("session.mineTitle"),
83
- style: { "max-width": "960px" }
84
- }, {
85
- default: _(() => [
86
- v(n(N), {
87
- columns: k,
88
- data: r.value,
89
- loading: o.value,
90
- "row-key": p,
91
- pagination: !1
92
- }, null, 8, ["data", "loading"])
93
- ]),
94
- _: 1
95
- }, 8, ["title"]));
82
+ return H(a), (e, l) => (_(), w("div", L, [
83
+ m(r(C), {
84
+ columns: a,
85
+ data: s.value,
86
+ "row-key": "sessionId",
87
+ loading: i.value,
88
+ toolbar: r(N),
89
+ search: { container: "table" },
90
+ "fill-height": "",
91
+ "min-row-height": r(M),
92
+ "card-on-narrow": "",
93
+ "storage-key": "personal-sessions"
94
+ }, {
95
+ "pagination-prefix": T(({ itemCount: h }) => [
96
+ m(S, { count: h }, null, 8, ["count"])
97
+ ]),
98
+ _: 1
99
+ }, 8, ["data", "loading", "toolbar", "min-row-height"])
100
+ ]));
96
101
  }
97
102
  });
98
103
  export {
99
- G as default
104
+ Q as default
100
105
  };
101
106
  //# sourceMappingURL=sessions2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions2.vue.js","sources":["../../../src/views/personal/sessions.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 我的会话(个人视角的\"登录设备\"):[ActiveSession] 人人可用,静态路由不进菜单(理由同 notice)。\n// 数据量受会话并发上限约束(个位数)→ 不用 SmartTable,onMounted 拉一次 + n-data-table 静态渲染。\n// 踢当前设备置灰:那等于自杀,请走\"退出登录\";管理端全量视角在 system/session。\nimport { h, onMounted, ref } from 'vue'\nimport { NCard, NDataTable, NButton, NTag, useMessage, type DataTableColumns } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { personalApi } from '#/api'\nimport type { MySessionItem } from '#/types/api'\nimport { uaSummary } from '#/utils/ua'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateError } from '#/utils/error'\nimport { fmtDateTime } from '#/utils/format'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\n\nconst loading = ref(true)\nconst rows = ref<MySessionItem[]>([])\nconst rowKey = (r: MySessionItem) => r.sessionId\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await personalApi.sessions()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\nfunction kick(r: MySessionItem) {\n confirm({\n type: 'warning',\n content: t('session.kickMineConfirm'),\n action: () => personalApi.kickSession(r.sessionId),\n successMsg: t('session.kicked'),\n }).then(ok => {\n if (ok) load()\n })\n}\n\nconst columns: DataTableColumns<MySessionItem> = [\n {\n key: 'rowNo',\n title: () => t('common.rowNo'),\n width: 64,\n align: 'center',\n render: (_row, index) => index + 1,\n },\n {\n key: 'device',\n title: () => t('session.device'),\n render: r =>\n h('div', { class: 'device-cell' }, [\n h('span', uaSummary(r.userAgent)),\n r.isCurrent\n ? h(NTag, { type: 'success', size: 'small', bordered: false }, () => t('session.current'))\n : null,\n ]),\n },\n { key: 'ip', title: () => t('session.ip'), width: 140, render: r => r.ip || '—' },\n {\n key: 'loginTime',\n title: () => t('session.loginTime'),\n width: 180,\n render: r => fmtDateTime(r.loginTime),\n },\n {\n key: 'expiresAt',\n title: () => t('session.expiresAt'),\n width: 180,\n render: r => fmtDateTime(r.expiresAt),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 110,\n render: r =>\n h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'error',\n disabled: r.isCurrent,\n onClick: () => kick(r),\n },\n () => t('session.kick'),\n ),\n },\n]\n</script>\n\n<template>\n <n-card :bordered=\"true\" :title=\"t('session.mineTitle')\" style=\"max-width: 960px\">\n <n-data-table\n :columns=\"columns\"\n :data=\"rows\"\n :loading=\"loading\"\n :row-key=\"rowKey\"\n :pagination=\"false\"\n />\n </n-card>\n</template>\n\n<style scoped>\n:deep(.device-cell) {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","loading","ref","rows","rowKey","r","load","personalApi","translateError","onMounted","kick","ok","columns","_row","index","h","uaSummary","NTag","fmtDateTime","NButton","_createBlock","_unref","NCard","_createVNode","NDataTable"],"mappings":";;;;;;;;;;;AAcA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAA,GACV,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAEdC,IAAUC,EAAI,EAAI,GAClBC,IAAOD,EAAqB,EAAE,GAC9BE,IAAS,CAACC,MAAqBA,EAAE;AAEvC,mBAAeC,IAAO;AACpB,MAAAL,EAAQ,QAAQ;AAChB,UAAI;AACF,QAAAE,EAAK,QAAQ,MAAMI,EAAY,SAAA;AAAA,MACjC,SAAS,GAAG;AACV,QAAAV,EAAQ,MAAMW,EAAe,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAP,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AACA,IAAAQ,EAAUH,CAAI;AAEd,aAASI,EAAKL,GAAkB;AAC9B,MAAAN,EAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAASJ,EAAE,yBAAyB;AAAA,QACpC,QAAQ,MAAMY,EAAY,YAAYF,EAAE,SAAS;AAAA,QACjD,YAAYV,EAAE,gBAAgB;AAAA,MAAA,CAC/B,EAAE,KAAK,CAAAgB,MAAM;AACZ,QAAIA,KAAIL,EAAA;AAAA,MACV,CAAC;AAAA,IACH;AAEA,UAAMM,IAA2C;AAAA,MAC/C;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMjB,EAAE,cAAc;AAAA,QAC7B,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ,CAACkB,GAAMC,MAAUA,IAAQ;AAAA,MAAA;AAAA,MAEnC;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMnB,EAAE,gBAAgB;AAAA,QAC/B,QAAQ,CAAAU,MACNU,EAAE,OAAO,EAAE,OAAO,iBAAiB;AAAA,UACjCA,EAAE,QAAQC,EAAUX,EAAE,SAAS,CAAC;AAAA,UAChCA,EAAE,YACEU,EAAEE,GAAM,EAAE,MAAM,WAAW,MAAM,SAAS,UAAU,MAAS,MAAMtB,EAAE,iBAAiB,CAAC,IACvF;AAAA,QAAA,CACL;AAAA,MAAA;AAAA,MAEL,EAAE,KAAK,MAAM,OAAO,MAAMA,EAAE,YAAY,GAAG,OAAO,KAAK,QAAQ,CAAAU,MAAKA,EAAE,MAAM,IAAA;AAAA,MAC5E;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMV,EAAE,mBAAmB;AAAA,QAClC,OAAO;AAAA,QACP,QAAQ,CAAAU,MAAKa,EAAYb,EAAE,SAAS;AAAA,MAAA;AAAA,MAEtC;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMV,EAAE,mBAAmB;AAAA,QAClC,OAAO;AAAA,QACP,QAAQ,CAAAU,MAAKa,EAAYb,EAAE,SAAS;AAAA,MAAA;AAAA,MAEtC;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMV,EAAE,kBAAkB;AAAA,QACjC,OAAO;AAAA,QACP,QAAQ,CAAAU,MACNU;AAAA,UACEI;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,MAAM;AAAA,YACN,UAAUd,EAAE;AAAA,YACZ,SAAS,MAAMK,EAAKL,CAAC;AAAA,UAAA;AAAA,UAEvB,MAAMV,EAAE,cAAc;AAAA,QAAA;AAAA,MACxB;AAAA,IACJ;2BAKAyB,EAQSC,EAAAC,CAAA,GAAA;AAAA,MARA,UAAU;AAAA,MAAO,OAAOD,EAAA1B,CAAA,EAAC,mBAAA;AAAA,MAAuB,OAAA,EAAA,aAAA,QAAA;AAAA,IAAA;iBACvD,MAME;AAAA,QANF4B,EAMEF,EAAAG,CAAA,GAAA;AAAA,UALC,SAAAZ;AAAA,UACA,MAAMT,EAAA;AAAA,UACN,SAASF,EAAA;AAAA,UACT,WAASG;AAAA,UACT,YAAY;AAAA,QAAA;;;;;;"}
1
+ {"version":3,"file":"sessions2.vue.js","sources":["../../../src/views/personal/sessions.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 我的会话(个人视角的\"登录设备\"):[ActiveSession] 人人可用,静态路由不进菜单(理由同 notice)。\n// 数据量受会话并发上限约束(个位数)→ onMounted 拉一次,交给 SmartTable 的静态数据模式\n// (前端分页 / 前端求值搜索 / 窄档卡片列表都是它内置的)。\n// 踢当前设备置灰:那等于自杀,请走\"退出登录\";管理端全量视角在 system/session。\nimport { h, onMounted, ref } from 'vue'\nimport { NButton, NTag, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { personalApi } from '#/api'\nimport type { MySessionItem } from '#/types/api'\nimport { uaSummary } from '#/utils/ua'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateError } from '#/utils/error'\nimport { fmtDateTime } from '#/utils/format'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\n\nimport { deriveHeaderFilters } from '#/utils/tableFilter'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\n\nconst loading = ref(true)\nconst rows = ref<MySessionItem[]>([])\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await personalApi.sessions()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\nfunction kick(r: MySessionItem) {\n confirm({\n type: 'warning',\n content: t('session.kickMineConfirm'),\n action: () => personalApi.kickSession(r.sessionId),\n successMsg: t('session.kicked'),\n }).then(ok => {\n if (ok) load()\n })\n}\n\nconst columns: SmartTableColumn<MySessionItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n // 搜索按原始 UA 字符串「包含」求值(输入 Chrome / Windows 都能命中);单元格显示解析后的「浏览器 · 系统」\n key: 'userAgent',\n title: () => t('session.device'),\n search: {},\n render: r =>\n h('div', { class: 'device-cell' }, [\n h('span', uaSummary(r.userAgent)),\n r.isCurrent\n ? h(NTag, { type: 'success', size: 'small', bordered: false }, () => t('session.current'))\n : null,\n ]),\n },\n { key: 'ip', title: () => t('session.ip'), width: 140, search: {}, render: r => r.ip || '—' },\n {\n key: 'loginTime',\n title: () => t('session.loginTime'),\n width: 180,\n render: r => fmtDateTime(r.loginTime),\n },\n {\n key: 'expiresAt',\n title: () => t('session.expiresAt'),\n width: 180,\n render: r => fmtDateTime(r.expiresAt),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 110,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'error',\n disabled: r.isCurrent,\n onClick: () => kick(r),\n },\n () => t('session.kick'),\n ),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- .fill-page:高度链在 styles/layout.css,卡片吃满内容区,滚动只发生在表体里。 -->\n <div class=\"fill-page\">\n <SmartTable\n :columns=\"columns\"\n :data=\"rows\"\n row-key=\"sessionId\"\n :loading=\"loading\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"personal-sessions\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n </div>\n</template>\n\n<style scoped>\n:deep(.device-cell) {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","loading","ref","rows","load","personalApi","translateError","onMounted","kick","r","ok","columns","h","uaSummary","NTag","fmtDateTime","NButton","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_withCtx","itemCount","TableTotal"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./ProviderCard2.vue.js";
2
2
  /* empty css */
3
3
  import r from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const e = /* @__PURE__ */ r(o, [["__scopeId", "data-v-659dbae9"]]);
4
+ const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-a5f75b1c"]]);
5
5
  export {
6
- e as default
6
+ m as default
7
7
  };
8
8
  //# sourceMappingURL=ProviderCard.vue.js.map