smart-admin-web 10.15.0 → 10.20.0

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 +1 -1
  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 +405 -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 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../src/views/mfa/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, reactive, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n NAlert,\n NButton,\n NCard,\n NForm,\n NFormItem,\n NInput,\n NQrCode,\n NSteps,\n NStep,\n useMessage,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { mfaApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { resetRouter } from '#/router'\nimport { takeRecoveryCodes } from './bindComplete'\n\nconst { t } = useI18n()\nconst route = useRoute()\nconst router = useRouter()\nconst message = useMessage()\nconst userStore = useUserStore()\nconst authStore = useAuthStore()\n\nconst queryMode = route.query.mode === 'recovery' ? 'recovery' : 'bind'\nconst mode = ref<'bind' | 'recovery'>(queryMode)\nconst step = ref(1)\nconst loading = ref(false)\nconst completed = ref(false)\n\nconst queryAccount = typeof route.query.account === 'string' ? route.query.account : ''\nconst knownAccount = queryAccount || userStore.userInfo?.account || ''\nconst bind = reactive({\n account: knownAccount,\n currentPassword: '',\n bindChallengeId: '',\n otpauthUri: '',\n seed: '',\n totpCode: '',\n recoveryCodes: [] as string[],\n})\nconst recovery = reactive({\n account: knownAccount,\n currentPassword: '',\n recoveryCode: '',\n})\nconst canStart = computed(() => !!bind.account.trim() && !!bind.currentPassword)\n\nasync function copy(value: string) {\n try {\n await navigator.clipboard.writeText(value)\n message.success(t('mfa.copied'))\n } catch {\n message.error(t('mfa.copyFailed'))\n }\n}\n\n/** 恢复码下载到本地 txt(一次性展示后用户可离线保管)。 */\nfunction downloadRecoveryCodes() {\n const account = bind.account.trim() || 'account'\n const lines = [\n t('mfa.recoveryDownloadHeader', { account }),\n '',\n ...bind.recoveryCodes,\n '',\n t('mfa.recoveryDownloadFooter'),\n ]\n const blob = new Blob([lines.join('\\n')], { type: 'text/plain;charset=utf-8' })\n const stamp = new Date().toISOString().slice(0, 10)\n const safe = account.replace(/[^\\w.\\-@]+/g, '_')\n triggerBlobDownload(blob, `smart-recovery-codes-${safe}-${stamp}.txt`)\n message.success(t('mfa.recoveryDownloaded'))\n}\n\nasync function startBind() {\n if (!canStart.value) {\n message.warning(t('mfa.bindRequired'))\n return\n }\n loading.value = true\n try {\n const result = await mfaApi.bindStart({\n account: bind.account.trim(),\n currentPassword: bind.currentPassword,\n })\n bind.bindChallengeId = result.bindChallengeId ?? ''\n bind.otpauthUri = result.otpauthUri ?? ''\n bind.seed = result.seed ?? ''\n if (!bind.bindChallengeId || !bind.otpauthUri || !bind.seed)\n throw new Error(t('mfa.bindStartResponseIncomplete'))\n bind.currentPassword = ''\n step.value = 2\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function completeBind() {\n if (!bind.totpCode) {\n message.warning(t('mfa.codeRequired'))\n return\n }\n loading.value = true\n try {\n const result = await mfaApi.bindComplete({\n bindChallengeId: bind.bindChallengeId,\n totpCode: bind.totpCode,\n })\n const codes = takeRecoveryCodes(result)\n if (!codes) throw new Error(t('mfa.bindCompleteResponseIncomplete'))\n bind.recoveryCodes = codes\n bind.seed = ''\n bind.otpauthUri = ''\n bind.totpCode = ''\n completed.value = true\n step.value = 3\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function submitRecovery() {\n if (!recovery.account || !recovery.currentPassword || !recovery.recoveryCode) {\n message.warning(t('mfa.recoveryRequired'))\n return\n }\n loading.value = true\n try {\n await mfaApi.recovery(recovery)\n recovery.currentPassword = ''\n recovery.recoveryCode = ''\n completed.value = true\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nfunction backToLogin() {\n // 绑定页可能仍挂着旧登录会话;清会话后再进登录,避免守卫直接弹回壳子且不重建路由。\n resetRouter()\n authStore.reset()\n userStore.clear()\n router.replace('/login')\n}\n\nfunction switchMode() {\n if (mode.value === 'bind' && step.value === 3) {\n bind.recoveryCodes = []\n step.value = 1\n }\n completed.value = false\n mode.value = mode.value === 'bind' ? 'recovery' : 'bind'\n}\n</script>\n\n<template>\n <main class=\"mfa-page\">\n <n-card class=\"mfa-card\" :bordered=\"true\">\n <template #header>\n <div class=\"mfa-header\">\n <span>{{ mode === 'bind' ? t('mfa.bindTitle') : t('mfa.recoveryTitle') }}</span>\n <n-button text type=\"primary\" @click=\"switchMode\">\n {{ mode === 'bind' ? t('mfa.useRecovery') : t('mfa.backToBind') }}\n </n-button>\n </div>\n </template>\n\n <template v-if=\"mode === 'bind'\">\n <n-steps :current=\"step\" size=\"small\" style=\"margin-bottom: 24px\">\n <n-step :title=\"t('mfa.stepVerify')\" />\n <n-step :title=\"t('mfa.stepAuthenticator')\" />\n <n-step :title=\"t('mfa.stepRecovery')\" />\n </n-steps>\n\n <n-form v-if=\"step === 1\" label-placement=\"top\" @keyup.enter=\"startBind\">\n <n-alert type=\"info\" :bordered=\"false\" style=\"margin-bottom: 16px\">\n {{ t('mfa.bindHint') }}\n </n-alert>\n <n-form-item :label=\"t('mfa.account')\">\n <n-input v-model:value=\"bind.account\" autocomplete=\"username\" />\n </n-form-item>\n <n-form-item :label=\"t('mfa.currentPassword')\">\n <n-input\n v-model:value=\"bind.currentPassword\"\n type=\"password\"\n show-password-on=\"click\"\n autocomplete=\"current-password\"\n />\n </n-form-item>\n <n-button type=\"primary\" block :loading=\"loading\" @click=\"startBind\">\n {{ t('mfa.startBind') }}\n </n-button>\n </n-form>\n\n <n-form v-else-if=\"step === 2\" label-placement=\"top\" @keyup.enter=\"completeBind\">\n <n-alert type=\"info\" :bordered=\"false\" style=\"margin-bottom: 16px\">\n {{ t('mfa.scanSetupHint') }}\n </n-alert>\n <div class=\"mfa-qr-wrap\">\n <n-qr-code :value=\"bind.otpauthUri\" :size=\"200\" error-correction-level=\"M\" />\n </div>\n <n-form-item :label=\"t('mfa.manualKey')\">\n <n-input :value=\"bind.seed\" readonly>\n <template #suffix>\n <n-button text type=\"primary\" @click=\"copy(bind.seed)\">\n {{ t('mfa.copy') }}\n </n-button>\n </template>\n </n-input>\n </n-form-item>\n <p class=\"mfa-manual-hint\">{{ t('mfa.manualSetupHint') }}</p>\n <n-form-item :label=\"t('mfa.authenticatorCode')\">\n <n-input v-model:value=\"bind.totpCode\" :maxlength=\"6\" autocomplete=\"one-time-code\" />\n </n-form-item>\n <n-button type=\"primary\" block :loading=\"loading\" @click=\"completeBind\">\n {{ t('mfa.completeBind') }}\n </n-button>\n </n-form>\n\n <div v-else class=\"recovery-codes\">\n <n-alert type=\"warning\" :bordered=\"false\" style=\"margin-bottom: 16px\">\n {{ t('mfa.recoveryOnce') }}\n </n-alert>\n <div v-for=\"code in bind.recoveryCodes\" :key=\"code\" class=\"recovery-code\">{{ code }}</div>\n <n-button type=\"primary\" block style=\"margin-top: 16px\" @click=\"downloadRecoveryCodes\">\n {{ t('mfa.downloadCodes') }}\n </n-button>\n <n-button block style=\"margin-top: 8px\" @click=\"copy(bind.recoveryCodes.join('\\n'))\">\n {{ t('mfa.copyAll') }}\n </n-button>\n <n-button block style=\"margin-top: 8px\" @click=\"backToLogin\">\n {{ t('mfa.backToLogin') }}\n </n-button>\n </div>\n </template>\n\n <n-form v-else-if=\"!completed\" label-placement=\"top\" @keyup.enter=\"submitRecovery\">\n <n-alert type=\"warning\" :bordered=\"false\" style=\"margin-bottom: 16px\">\n {{ t('mfa.recoveryHint') }}\n </n-alert>\n <n-form-item :label=\"t('mfa.account')\">\n <n-input v-model:value=\"recovery.account\" autocomplete=\"username\" />\n </n-form-item>\n <n-form-item :label=\"t('mfa.currentPassword')\">\n <n-input\n v-model:value=\"recovery.currentPassword\"\n type=\"password\"\n show-password-on=\"click\"\n autocomplete=\"current-password\"\n />\n </n-form-item>\n <n-form-item :label=\"t('mfa.recoveryCode')\">\n <n-input v-model:value=\"recovery.recoveryCode\" autocomplete=\"one-time-code\" />\n </n-form-item>\n <n-button type=\"primary\" block :loading=\"loading\" @click=\"submitRecovery\">\n {{ t('mfa.submitRecovery') }}\n </n-button>\n </n-form>\n <template v-else>\n <n-alert type=\"success\" :bordered=\"false\">{{ t('mfa.recoveryDone') }}</n-alert>\n <n-button type=\"primary\" block style=\"margin-top: 16px\" @click=\"backToLogin\">\n {{ t('mfa.backToLogin') }}\n </n-button>\n </template>\n </n-card>\n </main>\n</template>\n\n<style scoped>\n.mfa-page {\n min-height: 100dvh;\n display: grid;\n place-items: center;\n padding: 24px;\n background: var(--color-body, #f5f7fa);\n}\n.mfa-card {\n width: min(100%, 520px);\n}\n.mfa-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.mfa-qr-wrap {\n display: flex;\n justify-content: center;\n margin: 0 0 16px;\n padding: 16px;\n background: #fff;\n border-radius: 8px;\n border: 1px solid var(--color-border, #e5e7eb);\n}\n.mfa-manual-hint {\n margin: -8px 0 12px;\n font-size: 12px;\n color: var(--color-text-tertiary, #9ca3af);\n line-height: 1.5;\n}\n.recovery-codes {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n}\n.recovery-codes :deep(.n-alert),\n.recovery-codes :deep(.n-button) {\n grid-column: 1 / -1;\n}\n.recovery-code {\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n background: var(--color-hover, #f4f4f5);\n border-radius: 4px;\n}\n@media (max-width: 480px) {\n .mfa-page {\n padding: 12px;\n }\n .recovery-codes {\n grid-template-columns: 1fr;\n }\n}\n</style>\n"],"names":["useI18n","route","useRoute","router","useRouter","message","useMessage","userStore","useUserStore","authStore","useAuthStore","queryMode","mode","ref","step","loading","completed","knownAccount","_a","bind","reactive","recovery","canStart","computed","copy","value","downloadRecoveryCodes","account","lines","blob","stamp","safe","triggerBlobDownload","startBind","result","mfaApi","e","translateError","completeBind","codes","takeRecoveryCodes","submitRecovery","backToLogin","resetRouter","switchMode","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NCard","_createElementVNode","_hoisted_2","_toDisplayString","NButton","_Fragment","NSteps","NStep","_createBlock","NForm","NAlert","NFormItem","NInput","_cache","$event","_hoisted_3","NQrCode","_hoisted_4","_hoisted_5","_renderList","code"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../src/views/mfa/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, reactive, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n NAlert,\n NButton,\n NForm,\n NFormItem,\n NInput,\n NQrCode,\n NSteps,\n NStep,\n useMessage,\n} from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useMediaQuery } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { mfaApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { useSite } from '#/composables/useSite'\nimport { resetRouter } from '#/router'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport LoginDesk from '#/views/login/components/LoginDesk.vue'\nimport { takeRecoveryCodes } from './bindComplete'\n\nconst { t } = useI18n()\nconst route = useRoute()\nconst router = useRouter()\nconst message = useMessage()\nconst userStore = useUserStore()\nconst authStore = useAuthStore()\nconst { site, appVersion } = useSite()\nconst year = new Date().getFullYear()\n// 窄屏(≤ 480)三个步骤标题排不下:只给当前步留标题,其余只留序号\nconst narrow = useMediaQuery('(max-width: 480px)')\n\nconst queryMode = route.query.mode === 'recovery' ? 'recovery' : 'bind'\nconst mode = ref<'bind' | 'recovery'>(queryMode)\nconst step = ref(1)\nconst loading = ref(false)\nconst completed = ref(false)\n\nconst queryAccount = typeof route.query.account === 'string' ? route.query.account : ''\nconst knownAccount = queryAccount || userStore.userInfo?.account || ''\nconst bind = reactive({\n account: knownAccount,\n currentPassword: '',\n bindChallengeId: '',\n otpauthUri: '',\n seed: '',\n totpCode: '',\n recoveryCodes: [] as string[],\n})\nconst recovery = reactive({\n account: knownAccount,\n currentPassword: '',\n recoveryCode: '',\n})\nconst canStart = computed(() => !!bind.account.trim() && !!bind.currentPassword)\n\nasync function copy(value: string) {\n try {\n await navigator.clipboard.writeText(value)\n message.success(t('mfa.copied'))\n } catch {\n message.error(t('mfa.copyFailed'))\n }\n}\n\n/** 恢复码下载到本地 txt(一次性展示后用户可离线保管)。 */\nfunction downloadRecoveryCodes() {\n const account = bind.account.trim() || 'account'\n const lines = [\n t('mfa.recoveryDownloadHeader', { account }),\n '',\n ...bind.recoveryCodes,\n '',\n t('mfa.recoveryDownloadFooter'),\n ]\n const blob = new Blob([lines.join('\\n')], { type: 'text/plain;charset=utf-8' })\n const stamp = new Date().toISOString().slice(0, 10)\n const safe = account.replace(/[^\\w.\\-@]+/g, '_')\n triggerBlobDownload(blob, `smart-recovery-codes-${safe}-${stamp}.txt`)\n message.success(t('mfa.recoveryDownloaded'))\n}\n\nasync function startBind() {\n if (!canStart.value) {\n message.warning(t('mfa.bindRequired'))\n return\n }\n loading.value = true\n try {\n const result = await mfaApi.bindStart({\n account: bind.account.trim(),\n currentPassword: bind.currentPassword,\n })\n bind.bindChallengeId = result.bindChallengeId ?? ''\n bind.otpauthUri = result.otpauthUri ?? ''\n bind.seed = result.seed ?? ''\n if (!bind.bindChallengeId || !bind.otpauthUri || !bind.seed)\n throw new Error(t('mfa.bindStartResponseIncomplete'))\n bind.currentPassword = ''\n step.value = 2\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function completeBind() {\n if (!bind.totpCode) {\n message.warning(t('mfa.codeRequired'))\n return\n }\n loading.value = true\n try {\n const result = await mfaApi.bindComplete({\n bindChallengeId: bind.bindChallengeId,\n totpCode: bind.totpCode,\n })\n const codes = takeRecoveryCodes(result)\n if (!codes) throw new Error(t('mfa.bindCompleteResponseIncomplete'))\n bind.recoveryCodes = codes\n bind.seed = ''\n bind.otpauthUri = ''\n bind.totpCode = ''\n completed.value = true\n step.value = 3\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function submitRecovery() {\n if (!recovery.account || !recovery.currentPassword || !recovery.recoveryCode) {\n message.warning(t('mfa.recoveryRequired'))\n return\n }\n loading.value = true\n try {\n await mfaApi.recovery(recovery)\n recovery.currentPassword = ''\n recovery.recoveryCode = ''\n completed.value = true\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nfunction backToLogin() {\n // 绑定页可能仍挂着旧登录会话;清会话后再进登录,避免守卫直接弹回壳子且不重建路由。\n resetRouter()\n authStore.reset()\n userStore.clear()\n router.replace('/login')\n}\n\nfunction switchMode() {\n if (mode.value === 'bind' && step.value === 3) {\n bind.recoveryCodes = []\n step.value = 1\n }\n completed.value = false\n mode.value = mode.value === 'bind' ? 'recovery' : 'bind'\n}\n</script>\n\n<template>\n <LoginDesk :width=\"440\" content-style=\"padding: 24px 26px 22px\">\n <!-- 卡片上方的站点标志(取值顺序见 SmartLogo) -->\n <template #above>\n <div class=\"login-logo\"><SmartLogo :size=\"56\" /></div>\n </template>\n\n <!-- 卡片头:标题 + 右侧切换链接 -->\n <div class=\"mfa-header\">\n <div class=\"mfa-title\">\n {{ mode === 'bind' ? t('mfa.bindTitle') : t('mfa.recoveryTitle') }}\n </div>\n <n-button text type=\"primary\" class=\"mfa-switch\" @click=\"switchMode\">\n {{ mode === 'bind' ? t('mfa.useRecovery') : t('mfa.backToBind') }}\n </n-button>\n </div>\n\n <template v-if=\"mode === 'bind'\">\n <n-steps :current=\"step\" size=\"small\" class=\"mfa-steps\">\n <n-step\n v-for=\"(key, i) in ['mfa.stepVerify', 'mfa.stepAuthenticator', 'mfa.stepRecovery']\"\n :key=\"key\"\n :title=\"!narrow || step === i + 1 ? t(key) : ''\"\n />\n </n-steps>\n\n <n-form\n v-if=\"step === 1\"\n label-placement=\"top\"\n size=\"large\"\n :show-feedback=\"false\"\n @keyup.enter=\"startBind\"\n >\n <n-alert type=\"info\" :show-icon=\"true\" class=\"mfa-alert\">\n {{ t('mfa.bindHint') }}\n </n-alert>\n <n-form-item :label=\"t('mfa.account')\">\n <n-input v-model:value=\"bind.account\" autocomplete=\"username\" />\n </n-form-item>\n <n-form-item :label=\"t('mfa.currentPassword')\">\n <n-input\n v-model:value=\"bind.currentPassword\"\n type=\"password\"\n show-password-on=\"click\"\n autocomplete=\"current-password\"\n />\n </n-form-item>\n <n-button\n class=\"cta mfa-submit\"\n type=\"primary\"\n size=\"large\"\n block\n :loading=\"loading\"\n @click=\"startBind\"\n >\n {{ t('mfa.startBind') }}\n </n-button>\n </n-form>\n\n <n-form\n v-else-if=\"step === 2\"\n label-placement=\"top\"\n size=\"large\"\n :show-feedback=\"false\"\n @keyup.enter=\"completeBind\"\n >\n <n-alert type=\"info\" :show-icon=\"true\" class=\"mfa-alert\">\n {{ t('mfa.scanSetupHint') }}\n </n-alert>\n <div class=\"mfa-qr-wrap\">\n <!-- 全局 box-sizing: border-box 会让 NQrCode 的内边距挤掉画布(画布溢出白底),还原成 content-box -->\n <n-qr-code\n :value=\"bind.otpauthUri\"\n :size=\"200\"\n error-correction-level=\"M\"\n style=\"box-sizing: content-box\"\n />\n </div>\n <n-form-item :label=\"t('mfa.manualKey')\">\n <n-input :value=\"bind.seed\" readonly class=\"mfa-seed\">\n <template #suffix>\n <n-button text type=\"primary\" @click=\"copy(bind.seed)\">\n {{ t('mfa.copy') }}\n </n-button>\n </template>\n </n-input>\n </n-form-item>\n <p class=\"mfa-manual-hint\">{{ t('mfa.manualSetupHint') }}</p>\n <n-form-item :label=\"t('mfa.authenticatorCode')\">\n <n-input v-model:value=\"bind.totpCode\" :maxlength=\"6\" autocomplete=\"one-time-code\" />\n </n-form-item>\n <n-button\n class=\"cta mfa-submit\"\n type=\"primary\"\n size=\"large\"\n block\n :loading=\"loading\"\n @click=\"completeBind\"\n >\n {{ t('mfa.completeBind') }}\n </n-button>\n </n-form>\n\n <div v-else class=\"recovery-codes\">\n <n-alert type=\"warning\" :show-icon=\"true\" class=\"mfa-alert\">\n {{ t('mfa.recoveryOnce') }}\n </n-alert>\n <div class=\"recovery-grid\">\n <div v-for=\"code in bind.recoveryCodes\" :key=\"code\" class=\"recovery-code\">\n {{ code }}\n </div>\n </div>\n <div class=\"recovery-actions\">\n <n-button class=\"cta\" type=\"primary\" size=\"large\" block @click=\"downloadRecoveryCodes\">\n <template #icon><Icon icon=\"ph:download-simple\" :width=\"18\" /></template>\n {{ t('mfa.downloadCodes') }}\n </n-button>\n <n-button secondary size=\"large\" block @click=\"copy(bind.recoveryCodes.join('\\n'))\">\n <template #icon><Icon icon=\"ph:copy\" :width=\"18\" /></template>\n {{ t('mfa.copyAll') }}\n </n-button>\n <n-button secondary size=\"large\" block @click=\"backToLogin\">\n {{ t('mfa.backToLogin') }}\n </n-button>\n </div>\n </div>\n </template>\n\n <n-form\n v-else-if=\"!completed\"\n label-placement=\"top\"\n size=\"large\"\n :show-feedback=\"false\"\n @keyup.enter=\"submitRecovery\"\n >\n <n-alert type=\"warning\" :show-icon=\"true\" class=\"mfa-alert\">\n {{ t('mfa.recoveryHint') }}\n </n-alert>\n <n-form-item :label=\"t('mfa.account')\">\n <n-input v-model:value=\"recovery.account\" autocomplete=\"username\" />\n </n-form-item>\n <n-form-item :label=\"t('mfa.currentPassword')\">\n <n-input\n v-model:value=\"recovery.currentPassword\"\n type=\"password\"\n show-password-on=\"click\"\n autocomplete=\"current-password\"\n />\n </n-form-item>\n <n-form-item :label=\"t('mfa.recoveryCode')\">\n <n-input v-model:value=\"recovery.recoveryCode\" autocomplete=\"one-time-code\" />\n </n-form-item>\n <n-button\n class=\"cta mfa-submit\"\n type=\"primary\"\n size=\"large\"\n block\n :loading=\"loading\"\n @click=\"submitRecovery\"\n >\n {{ t('mfa.submitRecovery') }}\n </n-button>\n </n-form>\n <template v-else>\n <n-alert type=\"success\" :show-icon=\"true\" class=\"mfa-alert\">\n {{ t('mfa.recoveryDone') }}\n </n-alert>\n <n-button class=\"cta\" type=\"primary\" size=\"large\" block @click=\"backToLogin\">\n {{ t('mfa.backToLogin') }}\n </n-button>\n </template>\n\n <!-- 页脚:版权 + 构建期版本号(同登录页) -->\n <template #after>\n <p class=\"login-foot\">\n <span>© {{ year }} {{ site.copyright || site.title }}</span>\n <span v-if=\"appVersion\" class=\"login-foot-ver\">v{{ appVersion }}</span>\n </p>\n </template>\n </LoginDesk>\n</template>\n\n<style scoped>\n.login-logo {\n display: flex;\n justify-content: center;\n margin: 0 auto 22px;\n}\n.login-logo :deep(.site-logo) {\n border-radius: var(--radius-lg);\n box-shadow: 0 14px 40px -10px var(--signal-glow);\n}\n.mfa-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 18px;\n}\n.mfa-title {\n min-width: 0;\n font-size: 19px;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.35;\n color: var(--text-1);\n}\n.mfa-switch {\n flex: none;\n margin-top: 2px;\n}\n.mfa-steps {\n margin-bottom: 18px;\n}\n.mfa-alert {\n margin-bottom: 16px;\n}\n.mfa-submit {\n margin-top: 4px;\n}\n/* 表单项之间的间距(表单关了反馈行,没有校验规则要显示) */\n:deep(.n-form-item) {\n margin-bottom: 14px;\n}\n.mfa-qr-wrap {\n display: flex;\n justify-content: center;\n margin: 0 0 16px;\n}\n.mfa-seed :deep(input) {\n font-family: var(--font-mono);\n}\n.mfa-manual-hint {\n margin: -8px 0 14px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-3);\n}\n.recovery-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n margin-bottom: 16px;\n}\n.recovery-code {\n padding: 8px 10px;\n border-radius: 4px;\n background: var(--fill);\n text-align: center;\n letter-spacing: 0.04em;\n font-family: var(--font-mono);\n font-size: 13.5px;\n}\n.recovery-actions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n.login-foot {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n margin: 22px 0 0;\n font-size: 13px;\n color: var(--text-3);\n}\n.login-foot-ver {\n opacity: 0.75;\n}\n@media (max-width: 480px) {\n .recovery-grid {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n</style>\n"],"names":["t","useI18n","route","useRoute","router","useRouter","message","useMessage","userStore","useUserStore","authStore","useAuthStore","site","appVersion","useSite","year","narrow","useMediaQuery","queryMode","mode","ref","step","loading","completed","knownAccount","_a","bind","reactive","recovery","canStart","computed","copy","value","downloadRecoveryCodes","account","lines","blob","stamp","safe","triggerBlobDownload","startBind","result","mfaApi","e","translateError","completeBind","codes","takeRecoveryCodes","submitRecovery","backToLogin","resetRouter","switchMode","_createBlock","LoginDesk","_createElementVNode","_hoisted_1","_createVNode","SmartLogo","_hoisted_9","_toDisplayString","_unref","_openBlock","_createElementBlock","_hoisted_10","_hoisted_2","_hoisted_3","NButton","_Fragment","NSteps","_renderList","key","i","NStep","NForm","NAlert","NFormItem","NInput","_cache","$event","_hoisted_4","NQrCode","_hoisted_5","_hoisted_6","_hoisted_7","code","_hoisted_8","Icon","_createTextVNode"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./index2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-f50f3abd"]]);
4
+ const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-fda8bd9b"]]);
5
5
  export {
6
- m as default
6
+ f as default
7
7
  };
8
8
  //# sourceMappingURL=index.vue.js.map
@@ -1,142 +1,175 @@
1
- import { defineComponent as D, ref as S, openBlock as o, createElementBlock as u, createElementVNode as r, createVNode as c, toDisplayString as i, unref as e, createBlock as m, withCtx as l, createCommentVNode as V, createTextVNode as y, Fragment as $, renderList as B, withKeys as v, withModifiers as g, normalizeClass as E } from "vue";
2
- import { useRouter as I } from "vue-router";
3
- import { useMessage as L, NButton as k, NSpin as K, NEmpty as R, NTag as A } from "naive-ui";
4
- import { Icon as x } from "@iconify/vue";
5
- import { useI18n as T } from "vue-i18n";
6
- import { useAuthStore as F } from "../../stores/auth.js";
7
- import { useUserStore as U } from "../../stores/user.js";
8
- import { useModule as C } from "../../composables/useModule.js";
9
- import { beginVoluntaryLogout as j } from "../../composables/useRealtime.js";
10
- import { resetRouter as q } from "../../router/index.js";
11
- import { translateError as b } from "../../utils/error.js";
12
- import { authApi as G } from "../../api/index.js";
13
- import H from "../../components/SmartLogo.vue.js";
14
- const J = { class: "wrap" }, O = { class: "head" }, P = { style: { "margin-left": "4px" } }, Q = {
15
- key: 1,
16
- class: "grid"
17
- }, W = ["onClick", "onKeydown"], X = { class: "ico" }, Y = { class: "body" }, Z = { class: "name" }, ee = { class: "code" }, _e = /* @__PURE__ */ D({
1
+ import { defineComponent as V, ref as B, openBlock as n, createElementBlock as w, createElementVNode as c, createVNode as i, toDisplayString as l, unref as e, createBlock as u, withCtx as r, createCommentVNode as E, createTextVNode as m, normalizeClass as x, Fragment as L, renderList as R, withKeys as C, withModifiers as g } from "vue";
2
+ import { useRouter as T } from "vue-router";
3
+ import { useMessage as A, NButton as f, NTooltip as K, NCard as b, NEmpty as q, NSpin as F, NTag as U } from "naive-ui";
4
+ import { Icon as N } from "@iconify/vue";
5
+ import { useI18n as j } from "vue-i18n";
6
+ import { useAppStore as G } from "../../stores/app.js";
7
+ import { useAuthStore as H } from "../../stores/auth.js";
8
+ import { useUserStore as J } from "../../stores/user.js";
9
+ import { useModule as D } from "../../composables/useModule.js";
10
+ import { beginVoluntaryLogout as O } from "../../composables/useRealtime.js";
11
+ import { resetRouter as P } from "../../router/index.js";
12
+ import { translateError as $ } from "../../utils/error.js";
13
+ import { authApi as Q } from "../../api/index.js";
14
+ import W from "../../components/AppIcon.vue.js";
15
+ import X from "../../components/SmartLogo.vue.js";
16
+ import { translateMenuTitle as Y } from "../../locales/menuTitle.js";
17
+ const Z = { class: "module-wrap" }, ee = { class: "module-head" }, te = { style: { "margin-left": "4px" } }, oe = { class: "grid" }, re = { class: "mod-top" }, se = { class: "name" }, ae = { class: "code" }, Ce = /* @__PURE__ */ V({
18
18
  __name: "index",
19
- setup(te) {
20
- const w = I(), p = L(), { t: s } = T(), n = F(), N = U(), f = S(!1);
19
+ setup(ne) {
20
+ const v = T(), h = A(), { t: o } = j(), p = G(), s = H(), M = J(), y = B(!1), I = (d) => (d || "ph:app-window").replace(/^(ph:.+)-duotone$/, "$1");
21
21
  async function _(d) {
22
- f.value = !0;
22
+ y.value = !0;
23
23
  try {
24
- await C().switchModule(d);
24
+ await D().switchModule(d);
25
25
  } catch (a) {
26
- p.error(b(a));
26
+ h.error($(a));
27
27
  } finally {
28
- f.value = !1;
28
+ y.value = !1;
29
29
  }
30
30
  }
31
- async function z() {
32
- await j();
31
+ async function S() {
32
+ await O();
33
33
  try {
34
- await G.logout();
34
+ await Q.logout();
35
35
  } catch {
36
36
  }
37
- q(), n.reset(), N.clear(), w.replace("/login");
37
+ P(), s.reset(), M.clear(), v.replace("/login");
38
38
  }
39
- async function M(d) {
39
+ async function z(d) {
40
40
  try {
41
- await C().setDefault(d), p.success(s("common.success"));
41
+ await D().setDefault(d), h.success(o("common.success"));
42
42
  } catch (a) {
43
- p.error(b(a));
43
+ h.error($(a));
44
44
  }
45
45
  }
46
- return (d, a) => (o(), u("div", J, [
47
- r("div", O, [
48
- c(H, { size: 34 }),
49
- r("h1", null, i(e(s)("module.choose")), 1),
50
- e(n).routesReady ? (o(), m(e(k), {
46
+ return (d, a) => (n(), w("div", Z, [
47
+ c("div", ee, [
48
+ i(X, { size: 34 }),
49
+ c("h1", null, l(e(o)("module.choose")), 1),
50
+ e(s).routesReady ? (n(), u(e(f), {
51
51
  key: 0,
52
52
  text: "",
53
- size: "small",
54
- class: "back",
55
- onClick: a[0] || (a[0] = (t) => e(w).back())
53
+ class: "module-back",
54
+ onClick: a[0] || (a[0] = (t) => e(v).back())
56
55
  }, {
57
- default: l(() => [
58
- c(e(x), {
56
+ default: r(() => [
57
+ i(e(N), {
59
58
  icon: "ph:arrow-left",
60
- width: 16
59
+ width: 15
61
60
  }),
62
- r("span", P, i(e(s)("module.back")), 1)
61
+ c("span", te, l(e(o)("module.back")), 1)
63
62
  ]),
64
63
  _: 1
65
- })) : V("", !0)
64
+ })) : E("", !0),
65
+ i(e(K), null, {
66
+ trigger: r(() => [
67
+ i(e(f), {
68
+ quaternary: "",
69
+ circle: "",
70
+ class: x({ "module-theme": !e(s).routesReady }),
71
+ "aria-label": e(p).isDark ? e(o)("app.light") : e(o)("app.dark"),
72
+ onClick: a[1] || (a[1] = (t) => e(p).toggleDark())
73
+ }, {
74
+ icon: r(() => [
75
+ i(e(N), {
76
+ icon: e(p).isDark ? "ph:moon" : "ph:sun",
77
+ width: 18
78
+ }, null, 8, ["icon"])
79
+ ]),
80
+ _: 1
81
+ }, 8, ["class", "aria-label"])
82
+ ]),
83
+ default: r(() => [
84
+ m(" " + l(e(p).isDark ? e(o)("app.light") : e(o)("app.dark")), 1)
85
+ ]),
86
+ _: 1
87
+ })
66
88
  ]),
67
- c(e(K), { show: f.value }, {
68
- default: l(() => [
69
- e(n).modules.length ? (o(), u("div", Q, [
70
- (o(!0), u($, null, B(e(n).modules, (t) => (o(), u("div", {
89
+ e(s).modules.length ? (n(), u(e(F), {
90
+ key: 1,
91
+ show: y.value,
92
+ class: "module-spin"
93
+ }, {
94
+ default: r(() => [
95
+ c("div", oe, [
96
+ (n(!0), w(L, null, R(e(s).modules, (t) => (n(), u(e(b), {
71
97
  key: t.id,
72
- class: E(["card", { current: t.id === e(n).currentModuleId }]),
98
+ class: x(["mod-card", { current: t.id === e(s).currentModuleId }]),
99
+ "content-style": "padding: 20px",
73
100
  role: "button",
74
101
  tabindex: "0",
75
- onClick: (h) => _(t.id),
102
+ "aria-current": t.id === e(s).currentModuleId ? "true" : void 0,
103
+ onClick: (k) => _(t.id),
76
104
  onKeydown: [
77
- v((h) => _(t.id), ["enter"]),
78
- v(g((h) => _(t.id), ["prevent"]), ["space"])
105
+ C(g((k) => _(t.id), ["self", "prevent"]), ["enter"]),
106
+ C(g((k) => _(t.id), ["self", "prevent"]), ["space"])
79
107
  ]
80
- }, [
81
- r("div", X, [
82
- c(e(x), {
83
- icon: t.icon || "ph:app-window-duotone",
84
- width: 28
85
- }, null, 8, ["icon"])
86
- ]),
87
- r("div", Y, [
88
- r("div", Z, i(t.title), 1),
89
- r("div", ee, i(t.code), 1)
90
- ]),
91
- t.id === e(n).defaultModuleId ? (o(), m(e(A), {
92
- key: 0,
93
- size: "small",
94
- type: "primary",
95
- bordered: !1,
96
- class: "def"
97
- }, {
98
- default: l(() => [
99
- y(i(e(s)("module.isDefault")), 1)
100
- ]),
101
- _: 1
102
- })) : (o(), m(e(k), {
103
- key: 1,
104
- text: "",
105
- size: "tiny",
106
- class: "def",
107
- onClick: g((h) => M(t.id), ["stop"])
108
- }, {
109
- default: l(() => [
110
- y(i(e(s)("module.setDefault")), 1)
108
+ }, {
109
+ default: r(() => [
110
+ c("div", re, [
111
+ i(W, {
112
+ icon: I(t.icon),
113
+ size: 28,
114
+ class: "ico"
115
+ }, null, 8, ["icon"]),
116
+ t.id === e(s).defaultModuleId ? (n(), u(e(U), {
117
+ key: 0,
118
+ size: "small",
119
+ type: "primary",
120
+ bordered: !1
121
+ }, {
122
+ default: r(() => [
123
+ m(l(e(o)("module.isDefault")), 1)
124
+ ]),
125
+ _: 1
126
+ })) : (n(), u(e(f), {
127
+ key: 1,
128
+ text: "",
129
+ size: "tiny",
130
+ class: "def",
131
+ onClick: g((k) => z(t.id), ["stop"])
132
+ }, {
133
+ default: r(() => [
134
+ m(l(e(o)("module.setDefault")), 1)
135
+ ]),
136
+ _: 1
137
+ }, 8, ["onClick"]))
111
138
  ]),
112
- _: 1
113
- }, 8, ["onClick"]))
114
- ], 42, W))), 128))
115
- ])) : (o(), m(e(R), {
116
- key: 0,
117
- description: e(s)("module.empty"),
118
- style: { padding: "60px 0" }
139
+ c("div", se, l(e(Y)(t.title)), 1),
140
+ c("div", ae, l(t.code), 1)
141
+ ]),
142
+ _: 2
143
+ }, 1032, ["class", "aria-current", "onClick", "onKeydown"]))), 128))
144
+ ])
145
+ ]),
146
+ _: 1
147
+ }, 8, ["show"])) : (n(), u(e(b), {
148
+ key: 0,
149
+ class: "module-empty",
150
+ "content-style": "padding: 48px 24px"
151
+ }, {
152
+ default: r(() => [
153
+ i(e(q), {
154
+ description: e(o)("module.empty")
119
155
  }, {
120
- extra: l(() => [
121
- c(e(k), {
122
- size: "small",
123
- onClick: z
124
- }, {
125
- default: l(() => [
126
- y(i(e(s)("app.logout")), 1)
156
+ extra: r(() => [
157
+ i(e(f), { onClick: S }, {
158
+ default: r(() => [
159
+ m(l(e(o)("app.logout")), 1)
127
160
  ]),
128
161
  _: 1
129
162
  })
130
163
  ]),
131
164
  _: 1
132
- }, 8, ["description"]))
165
+ }, 8, ["description"])
133
166
  ]),
134
167
  _: 1
135
- }, 8, ["show"])
168
+ }))
136
169
  ]));
137
170
  }
138
171
  });
139
172
  export {
140
- _e as default
173
+ Ce as default
141
174
  };
142
175
  //# sourceMappingURL=index2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../src/views/module/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NButton, NEmpty, NSpin, NTag, useMessage } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAuthStore } from '#/stores/auth'\nimport { useUserStore } from '#/stores/user'\nimport { useModule } from '#/composables/useModule'\nimport { beginVoluntaryLogout } from '#/composables/useRealtime'\nimport { resetRouter } from '#/router'\nimport { translateError } from '#/utils/error'\nimport { authApi } from '#/api'\nimport SmartLogo from '#/components/SmartLogo.vue'\n\nconst router = useRouter()\nconst message = useMessage()\nconst { t } = useI18n()\nconst auth = useAuthStore()\nconst user = useUserStore()\nconst busy = ref(false)\n\nasync function pick(id: number) {\n busy.value = true\n try {\n // switchModule = 建路由 + 清标签 + 落新应用首页(旧应用的标签在新应用里都是死链)\n await useModule().switchModule(id)\n } catch (e) {\n message.error(translateError(e))\n } finally {\n busy.value = false\n }\n}\n\nasync function handleLogout() {\n await beginVoluntaryLogout()\n try {\n await authApi.logout()\n } catch {}\n resetRouter()\n auth.reset()\n user.clear()\n router.replace('/login')\n}\n\nasync function setDefault(id: number) {\n try {\n await useModule().setDefault(id)\n message.success(t('common.success'))\n } catch (e) {\n message.error(translateError(e))\n }\n}\n</script>\n\n<template>\n <div class=\"wrap\">\n <div class=\"head\">\n <SmartLogo :size=\"34\" />\n <h1>{{ t('module.choose') }}</h1>\n <!-- 从应用内点九宫格进来的(路由已就绪)才给返回;登录直落选择页时无处可返。 -->\n <n-button v-if=\"auth.routesReady\" text size=\"small\" class=\"back\" @click=\"router.back()\">\n <Icon icon=\"ph:arrow-left\" :width=\"16\" />\n <span style=\"margin-left: 4px\">{{ t('module.back') }}</span>\n </n-button>\n </div>\n\n <n-spin :show=\"busy\">\n <n-empty v-if=\"!auth.modules.length\" :description=\"t('module.empty')\" style=\"padding: 60px 0\">\n <template #extra>\n <n-button size=\"small\" @click=\"handleLogout\">{{ t('app.logout') }}</n-button>\n </template>\n </n-empty>\n <div v-else class=\"grid\">\n <!-- 卡片是可点 div:补 role/tabindex/键盘激活,让键盘用户也能选应用(a11y) -->\n <div\n v-for=\"m in auth.modules\"\n :key=\"m.id\"\n class=\"card\"\n :class=\"{ current: m.id === auth.currentModuleId }\"\n role=\"button\"\n tabindex=\"0\"\n @click=\"pick(m.id)\"\n @keydown.enter=\"pick(m.id)\"\n @keydown.space.prevent=\"pick(m.id)\"\n >\n <div class=\"ico\"><Icon :icon=\"m.icon || 'ph:app-window-duotone'\" :width=\"28\" /></div>\n <div class=\"body\">\n <div class=\"name\">{{ m.title }}</div>\n <div class=\"code\">{{ m.code }}</div>\n </div>\n <n-tag\n v-if=\"m.id === auth.defaultModuleId\"\n size=\"small\"\n type=\"primary\"\n :bordered=\"false\"\n class=\"def\"\n >\n {{ t('module.isDefault') }}\n </n-tag>\n <n-button v-else text size=\"tiny\" class=\"def\" @click.stop=\"setDefault(m.id)\">\n {{ t('module.setDefault') }}\n </n-button>\n </div>\n </div>\n </n-spin>\n </div>\n</template>\n\n<style scoped>\n.wrap {\n min-height: 100dvh;\n background: var(--color-bg-body);\n padding: 80px 24px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.head {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 32px;\n}\n.head h1 {\n font-size: var(--font-size-xl);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: var(--gap-card);\n width: 100%;\n max-width: 900px;\n}\n.card {\n position: relative;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 20px;\n background: var(--color-bg-container);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-1);\n cursor: pointer;\n transition:\n transform var(--transition-fast),\n border-color var(--transition-fast);\n}\n.card.current {\n border-color: var(--color-primary);\n}\n.card:hover {\n transform: translateY(-3px);\n border-color: var(--color-primary);\n box-shadow: var(--shadow-2);\n}\n.card:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.ico {\n color: var(--color-primary);\n}\n.name {\n font-size: var(--font-size-md);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.code {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n font-family: var(--font-family-mono);\n}\n.def {\n position: absolute;\n top: 10px;\n right: 12px;\n}\n</style>\n"],"names":["router","useRouter","message","useMessage","t","useI18n","auth","useAuthStore","user","useUserStore","busy","ref","pick","id","useModule","e","translateError","handleLogout","beginVoluntaryLogout","authApi","resetRouter","setDefault","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","SmartLogo","_unref","_createBlock","NButton","_cache","$event","Icon","_hoisted_3","_toDisplayString","NSpin","_hoisted_4","_Fragment","_renderList","m","_normalizeClass","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","NTag","_withModifiers","NEmpty"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../src/views/module/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NButton, NCard, NEmpty, NSpin, NTag, NTooltip, useMessage } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore } from '#/stores/app'\nimport { useAuthStore } from '#/stores/auth'\nimport { useUserStore } from '#/stores/user'\nimport { useModule } from '#/composables/useModule'\nimport { beginVoluntaryLogout } from '#/composables/useRealtime'\nimport { resetRouter } from '#/router'\nimport { translateError } from '#/utils/error'\nimport { authApi } from '#/api'\nimport AppIcon from '#/components/AppIcon.vue'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { translateMenuTitle } from '#/locales/menuTitle'\n\nconst router = useRouter()\nconst message = useMessage()\nconst { t } = useI18n()\nconst app = useAppStore()\nconst auth = useAuthStore()\nconst user = useUserStore()\nconst busy = ref(false)\n\n/** 应用图标取线条款:库里配的 duotone 款去掉后缀(其余图标集名字原样) */\nconst lineIcon = (icon?: string | null) =>\n (icon || 'ph:app-window').replace(/^(ph:.+)-duotone$/, '$1')\n\nasync function pick(id: number) {\n busy.value = true\n try {\n // switchModule = 建路由 + 清标签 + 落新应用首页(旧应用的标签在新应用里都是死链)\n await useModule().switchModule(id)\n } catch (e) {\n message.error(translateError(e))\n } finally {\n busy.value = false\n }\n}\n\nasync function handleLogout() {\n await beginVoluntaryLogout()\n try {\n await authApi.logout()\n } catch {}\n resetRouter()\n auth.reset()\n user.clear()\n router.replace('/login')\n}\n\nasync function setDefault(id: number) {\n try {\n await useModule().setDefault(id)\n message.success(t('common.success'))\n } catch (e) {\n message.error(translateError(e))\n }\n}\n</script>\n\n<template>\n <div class=\"module-wrap\">\n <!-- 页头:站点标志 + 标题 + 返回 + 主题切换(整屏页没有顶栏) -->\n <div class=\"module-head\">\n <SmartLogo :size=\"34\" />\n <h1>{{ t('module.choose') }}</h1>\n <!-- 从应用内点九宫格进来的(路由已就绪)才给返回;登录直落选择页时无处可返。 -->\n <n-button v-if=\"auth.routesReady\" text class=\"module-back\" @click=\"router.back()\">\n <Icon icon=\"ph:arrow-left\" :width=\"15\" />\n <span style=\"margin-left: 4px\">{{ t('module.back') }}</span>\n </n-button>\n <n-tooltip>\n <template #trigger>\n <n-button\n quaternary\n circle\n :class=\"{ 'module-theme': !auth.routesReady }\"\n :aria-label=\"app.isDark ? t('app.light') : t('app.dark')\"\n @click=\"app.toggleDark()\"\n >\n <template #icon>\n <Icon :icon=\"app.isDark ? 'ph:moon' : 'ph:sun'\" :width=\"18\" />\n </template>\n </n-button>\n </template>\n {{ app.isDark ? t('app.light') : t('app.dark') }}\n </n-tooltip>\n </div>\n\n <!-- 空态:没有任何可访问的应用 -->\n <n-card v-if=\"!auth.modules.length\" class=\"module-empty\" content-style=\"padding: 48px 24px\">\n <n-empty :description=\"t('module.empty')\">\n <template #extra>\n <n-button @click=\"handleLogout\">{{ t('app.logout') }}</n-button>\n </template>\n </n-empty>\n </n-card>\n\n <!-- 卡片网格:切换中整个网格盖加载圈 -->\n <n-spin v-else :show=\"busy\" class=\"module-spin\">\n <div class=\"grid\">\n <!-- 卡片是可点 div:补 role/tabindex/键盘激活,让键盘用户也能选应用(a11y)。\n 键盘事件只认卡片自身(.self),卡内「设为默认」按钮上的回车 / 空格不会连带切换应用 -->\n <n-card\n v-for=\"m in auth.modules\"\n :key=\"m.id\"\n class=\"mod-card\"\n :class=\"{ current: m.id === auth.currentModuleId }\"\n content-style=\"padding: 20px\"\n role=\"button\"\n tabindex=\"0\"\n :aria-current=\"m.id === auth.currentModuleId ? 'true' : undefined\"\n @click=\"pick(m.id)\"\n @keydown.enter.self.prevent=\"pick(m.id)\"\n @keydown.space.self.prevent=\"pick(m.id)\"\n >\n <div class=\"mod-top\">\n <AppIcon :icon=\"lineIcon(m.icon)\" :size=\"28\" class=\"ico\" />\n <n-tag\n v-if=\"m.id === auth.defaultModuleId\"\n size=\"small\"\n type=\"primary\"\n :bordered=\"false\"\n >\n {{ t('module.isDefault') }}\n </n-tag>\n <n-button v-else text size=\"tiny\" class=\"def\" @click.stop=\"setDefault(m.id)\">\n {{ t('module.setDefault') }}\n </n-button>\n </div>\n <div class=\"name\">{{ translateMenuTitle(m.title) }}</div>\n <div class=\"code\">{{ m.code }}</div>\n </n-card>\n </div>\n </n-spin>\n </div>\n</template>\n\n<style scoped>\n.module-wrap {\n min-height: 100dvh;\n padding: clamp(32px, 9vh, 80px) 24px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.module-head {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n max-width: 900px;\n margin-bottom: 24px;\n}\n.module-head h1 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n letter-spacing: -0.02em;\n color: var(--text-1);\n}\n/* 返回把右边的主题按钮一起推到最右;没有返回时由主题按钮自己推 */\n.module-back {\n min-height: 32px;\n margin-left: auto;\n}\n.module-theme {\n margin-left: auto;\n}\n.module-empty,\n.module-spin {\n width: 100%;\n max-width: 900px;\n}\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n width: 100%;\n}\n.mod-card {\n cursor: pointer;\n transition: box-shadow 0.25s var(--ease);\n}\n/* macOS 的卡片悬停不位移,只让投影加深一档 */\n.mod-card:hover {\n box-shadow: var(--shadow-2);\n}\n/* 当前所在应用:与当前页签、侧栏选中同一套选中态——强调色淡底 + 1px 描边 + 外光晕,不用粗实线框 */\n.mod-card.current {\n background-image: linear-gradient(var(--sel-bg), var(--sel-bg));\n box-shadow:\n 0 0 0 1px var(--sel-ring),\n 0 0 0 4px var(--sel-halo),\n var(--shadow-1);\n}\n.mod-card.current .name {\n color: var(--sel-fg);\n}\n.mod-card:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: 2px;\n}\n.mod-top {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n min-height: 32px;\n margin-bottom: 8px;\n}\n.ico {\n color: var(--signal);\n}\n/* 「设为默认」:触摸目标 32px 高,贴齐卡片右上角 */\n.def {\n height: 32px;\n margin: -4px -6px 0 0;\n padding: 0 6px;\n}\n.name {\n font-size: 16px;\n font-weight: 600;\n color: var(--text-1);\n}\n.code {\n margin-top: 4px;\n font-family: var(--font-mono);\n font-size: 13px;\n color: var(--text-3);\n}\n@media (prefers-reduced-motion: reduce) {\n .mod-card:hover {\n transform: none;\n }\n}\n</style>\n"],"names":["router","useRouter","message","useMessage","t","useI18n","app","useAppStore","auth","useAuthStore","user","useUserStore","busy","ref","lineIcon","icon","pick","id","useModule","e","translateError","handleLogout","beginVoluntaryLogout","authApi","resetRouter","setDefault","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","SmartLogo","_unref","_createBlock","NButton","_cache","$event","Icon","_hoisted_3","_toDisplayString","NTooltip","_normalizeClass","_createTextVNode","NSpin","_hoisted_4","_Fragment","_renderList","m","NCard","_hoisted_5","AppIcon","NTag","_withModifiers","_hoisted_6","_hoisted_7","NEmpty"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./callback2.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-843f1b99"]]);
4
+ const r = /* @__PURE__ */ t(o, [["__scopeId", "data-v-dd5ff9cd"]]);
5
5
  export {
6
- f as default
6
+ r as default
7
7
  };
8
8
  //# sourceMappingURL=callback.vue.js.map