smart-admin-web 10.5.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 (718) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +78 -0
  3. package/dist/App.vue.d.ts +3 -0
  4. package/dist/App.vue.js +54 -0
  5. package/dist/App.vue.js.map +1 -0
  6. package/dist/App2.vue.js +5 -0
  7. package/dist/App2.vue.js.map +1 -0
  8. package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
  9. package/dist/_virtual/_plugin-vue_export-helper.js.map +1 -0
  10. package/dist/api/client.d.ts +29 -0
  11. package/dist/api/client.js +139 -0
  12. package/dist/api/client.js.map +1 -0
  13. package/dist/api/index.d.ts +672 -0
  14. package/dist/api/index.js +638 -0
  15. package/dist/api/index.js.map +1 -0
  16. package/dist/api/reauthGate.d.ts +16 -0
  17. package/dist/api/reauthGate.js +21 -0
  18. package/dist/api/reauthGate.js.map +1 -0
  19. package/dist/api/schema.d.ts +10230 -0
  20. package/dist/assets/icons/ph-subset.json.js +16 -0
  21. package/dist/assets/icons/ph-subset.json.js.map +1 -0
  22. package/dist/assets/oauth/dingtalk.svg.js +5 -0
  23. package/dist/assets/oauth/dingtalk.svg.js.map +1 -0
  24. package/dist/assets/oauth/gitee.svg.js +5 -0
  25. package/dist/assets/oauth/gitee.svg.js.map +1 -0
  26. package/dist/assets/oauth/github.svg.js +5 -0
  27. package/dist/assets/oauth/github.svg.js.map +1 -0
  28. package/dist/assets/oauth/qq.svg.js +5 -0
  29. package/dist/assets/oauth/qq.svg.js.map +1 -0
  30. package/dist/assets/oauth/wechat.svg.js +5 -0
  31. package/dist/assets/oauth/wechat.svg.js.map +1 -0
  32. package/dist/assets/oauth/wecom.svg.js +5 -0
  33. package/dist/assets/oauth/wecom.svg.js.map +1 -0
  34. package/dist/assets/svg/star.svg.js +6 -0
  35. package/dist/assets/svg/star.svg.js.map +1 -0
  36. package/dist/components/ApiSelect/index.vue.d.ts +22 -0
  37. package/dist/components/ApiSelect/index.vue.js +50 -0
  38. package/dist/components/ApiSelect/index.vue.js.map +1 -0
  39. package/dist/components/ApiSelect/index2.vue.js +5 -0
  40. package/dist/components/ApiSelect/index2.vue.js.map +1 -0
  41. package/dist/components/AppIcon.vue.d.ts +7 -0
  42. package/dist/components/AppIcon.vue.js +33 -0
  43. package/dist/components/AppIcon.vue.js.map +1 -0
  44. package/dist/components/AppIcon2.vue.js +5 -0
  45. package/dist/components/AppIcon2.vue.js.map +1 -0
  46. package/dist/components/Chart/BarChart.vue.d.ts +13 -0
  47. package/dist/components/Chart/BarChart.vue.js +27 -0
  48. package/dist/components/Chart/BarChart.vue.js.map +1 -0
  49. package/dist/components/Chart/BarChart2.vue.js +5 -0
  50. package/dist/components/Chart/BarChart2.vue.js.map +1 -0
  51. package/dist/components/Chart/LineChart.vue.d.ts +15 -0
  52. package/dist/components/Chart/LineChart.vue.js +33 -0
  53. package/dist/components/Chart/LineChart.vue.js.map +1 -0
  54. package/dist/components/Chart/LineChart2.vue.js +5 -0
  55. package/dist/components/Chart/LineChart2.vue.js.map +1 -0
  56. package/dist/components/Chart/PieChart.vue.d.ts +14 -0
  57. package/dist/components/Chart/PieChart.vue.js +31 -0
  58. package/dist/components/Chart/PieChart.vue.js.map +1 -0
  59. package/dist/components/Chart/PieChart2.vue.js +5 -0
  60. package/dist/components/Chart/PieChart2.vue.js.map +1 -0
  61. package/dist/components/Chart/echarts.d.ts +57 -0
  62. package/dist/components/Chart/echarts.js +47 -0
  63. package/dist/components/Chart/echarts.js.map +1 -0
  64. package/dist/components/Chart/index.vue.d.ts +12 -0
  65. package/dist/components/Chart/index.vue.js +8 -0
  66. package/dist/components/Chart/index.vue.js.map +1 -0
  67. package/dist/components/Chart/index2.vue.js +27 -0
  68. package/dist/components/Chart/index2.vue.js.map +1 -0
  69. package/dist/components/CodeBlock/index.vue.d.ts +17 -0
  70. package/dist/components/CodeBlock/index.vue.js +8 -0
  71. package/dist/components/CodeBlock/index.vue.js.map +1 -0
  72. package/dist/components/CodeBlock/index2.vue.js +48 -0
  73. package/dist/components/CodeBlock/index2.vue.js.map +1 -0
  74. package/dist/components/CronEditor/index.vue.d.ts +15 -0
  75. package/dist/components/CronEditor/index.vue.js +8 -0
  76. package/dist/components/CronEditor/index.vue.js.map +1 -0
  77. package/dist/components/CronEditor/index2.vue.js +528 -0
  78. package/dist/components/CronEditor/index2.vue.js.map +1 -0
  79. package/dist/components/DetailPage/index.vue.d.ts +26 -0
  80. package/dist/components/DetailPage/index.vue.js +8 -0
  81. package/dist/components/DetailPage/index.vue.js.map +1 -0
  82. package/dist/components/DetailPage/index2.vue.js +51 -0
  83. package/dist/components/DetailPage/index2.vue.js.map +1 -0
  84. package/dist/components/DictCheckbox/index.vue.d.ts +6 -0
  85. package/dist/components/DictCheckbox/index.vue.js +43 -0
  86. package/dist/components/DictCheckbox/index.vue.js.map +1 -0
  87. package/dist/components/DictCheckbox/index2.vue.js +5 -0
  88. package/dist/components/DictCheckbox/index2.vue.js.map +1 -0
  89. package/dist/components/DictRadio/index.vue.d.ts +6 -0
  90. package/dist/components/DictRadio/index.vue.js +38 -0
  91. package/dist/components/DictRadio/index.vue.js.map +1 -0
  92. package/dist/components/DictRadio/index2.vue.js +5 -0
  93. package/dist/components/DictRadio/index2.vue.js.map +1 -0
  94. package/dist/components/DictSelect/index.vue.d.ts +6 -0
  95. package/dist/components/DictSelect/index.vue.js +37 -0
  96. package/dist/components/DictSelect/index.vue.js.map +1 -0
  97. package/dist/components/DictSelect/index2.vue.js +5 -0
  98. package/dist/components/DictSelect/index2.vue.js.map +1 -0
  99. package/dist/components/DictTag/index.vue.d.ts +10 -0
  100. package/dist/components/DictTag/index.vue.js +48 -0
  101. package/dist/components/DictTag/index.vue.js.map +1 -0
  102. package/dist/components/DictTag/index2.vue.js +5 -0
  103. package/dist/components/DictTag/index2.vue.js.map +1 -0
  104. package/dist/components/ErrorBoundary/index.vue.d.ts +13 -0
  105. package/dist/components/ErrorBoundary/index.vue.js +8 -0
  106. package/dist/components/ErrorBoundary/index.vue.js.map +1 -0
  107. package/dist/components/ErrorBoundary/index2.vue.js +61 -0
  108. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -0
  109. package/dist/components/ExportColumnsModal/index.vue.d.ts +19 -0
  110. package/dist/components/ExportColumnsModal/index.vue.js +8 -0
  111. package/dist/components/ExportColumnsModal/index.vue.js.map +1 -0
  112. package/dist/components/ExportColumnsModal/index2.vue.js +121 -0
  113. package/dist/components/ExportColumnsModal/index2.vue.js.map +1 -0
  114. package/dist/components/FileUpload/index.vue.d.ts +24 -0
  115. package/dist/components/FileUpload/index.vue.js +42 -0
  116. package/dist/components/FileUpload/index.vue.js.map +1 -0
  117. package/dist/components/FileUpload/index2.vue.js +5 -0
  118. package/dist/components/FileUpload/index2.vue.js.map +1 -0
  119. package/dist/components/FormContainer/index.vue.d.ts +51 -0
  120. package/dist/components/FormContainer/index.vue.js +160 -0
  121. package/dist/components/FormContainer/index.vue.js.map +1 -0
  122. package/dist/components/FormContainer/index3.vue.js +6 -0
  123. package/dist/components/FormContainer/index3.vue.js.map +1 -0
  124. package/dist/components/IconPicker/index.vue.d.ts +18 -0
  125. package/dist/components/IconPicker/index.vue.js +43 -0
  126. package/dist/components/IconPicker/index.vue.js.map +1 -0
  127. package/dist/components/IconPicker/index2.vue.js +5 -0
  128. package/dist/components/IconPicker/index2.vue.js.map +1 -0
  129. package/dist/components/ImportWizard/index.vue.d.ts +39 -0
  130. package/dist/components/ImportWizard/index.vue.js +8 -0
  131. package/dist/components/ImportWizard/index.vue.js.map +1 -0
  132. package/dist/components/ImportWizard/index2.vue.js +634 -0
  133. package/dist/components/ImportWizard/index2.vue.js.map +1 -0
  134. package/dist/components/JsonEditor/index.vue.d.ts +12 -0
  135. package/dist/components/JsonEditor/index.vue.js +87 -0
  136. package/dist/components/JsonEditor/index.vue.js.map +1 -0
  137. package/dist/components/JsonEditor/index2.vue.js +5 -0
  138. package/dist/components/JsonEditor/index2.vue.js.map +1 -0
  139. package/dist/components/MarkdownEditor/MarkdownView.vue.d.ts +6 -0
  140. package/dist/components/MarkdownEditor/MarkdownView.vue.js +33 -0
  141. package/dist/components/MarkdownEditor/MarkdownView.vue.js.map +1 -0
  142. package/dist/components/MarkdownEditor/MarkdownView2.vue.js +5 -0
  143. package/dist/components/MarkdownEditor/MarkdownView2.vue.js.map +1 -0
  144. package/dist/components/MarkdownEditor/index.vue.d.ts +10 -0
  145. package/dist/components/MarkdownEditor/index.vue.js +35 -0
  146. package/dist/components/MarkdownEditor/index.vue.js.map +1 -0
  147. package/dist/components/MarkdownEditor/index2.vue.js +5 -0
  148. package/dist/components/MarkdownEditor/index2.vue.js.map +1 -0
  149. package/dist/components/MenuSearch.vue.d.ts +10 -0
  150. package/dist/components/MenuSearch.vue.js +8 -0
  151. package/dist/components/MenuSearch.vue.js.map +1 -0
  152. package/dist/components/MenuSearch2.vue.js +121 -0
  153. package/dist/components/MenuSearch2.vue.js.map +1 -0
  154. package/dist/components/OrgTreeSelect/index.vue.d.ts +6 -0
  155. package/dist/components/OrgTreeSelect/index.vue.js +42 -0
  156. package/dist/components/OrgTreeSelect/index.vue.js.map +1 -0
  157. package/dist/components/OrgTreeSelect/index2.vue.js +5 -0
  158. package/dist/components/OrgTreeSelect/index2.vue.js.map +1 -0
  159. package/dist/components/PasswordStrength/index.vue.d.ts +6 -0
  160. package/dist/components/PasswordStrength/index.vue.js +8 -0
  161. package/dist/components/PasswordStrength/index.vue.js.map +1 -0
  162. package/dist/components/PasswordStrength/index2.vue.js +91 -0
  163. package/dist/components/PasswordStrength/index2.vue.js.map +1 -0
  164. package/dist/components/ReauthModal.vue.d.ts +3 -0
  165. package/dist/components/ReauthModal.vue.js +8 -0
  166. package/dist/components/ReauthModal.vue.js.map +1 -0
  167. package/dist/components/ReauthModal2.vue.js +139 -0
  168. package/dist/components/ReauthModal2.vue.js.map +1 -0
  169. package/dist/components/RoleSelect/index.vue.d.ts +8 -0
  170. package/dist/components/RoleSelect/index.vue.js +26 -0
  171. package/dist/components/RoleSelect/index.vue.js.map +1 -0
  172. package/dist/components/RoleSelect/index2.vue.js +5 -0
  173. package/dist/components/RoleSelect/index2.vue.js.map +1 -0
  174. package/dist/components/SelectTable/index.vue.d.ts +76 -0
  175. package/dist/components/SelectTable/index.vue.js +8 -0
  176. package/dist/components/SelectTable/index.vue.js.map +1 -0
  177. package/dist/components/SelectTable/index2.vue.js +256 -0
  178. package/dist/components/SelectTable/index2.vue.js.map +1 -0
  179. package/dist/components/SmartLogo.vue.d.ts +8 -0
  180. package/dist/components/SmartLogo.vue.js +8 -0
  181. package/dist/components/SmartLogo.vue.js.map +1 -0
  182. package/dist/components/SmartLogo2.vue.js +74 -0
  183. package/dist/components/SmartLogo2.vue.js.map +1 -0
  184. package/dist/components/StatusSwitch/index.vue.d.ts +21 -0
  185. package/dist/components/StatusSwitch/index.vue.js +45 -0
  186. package/dist/components/StatusSwitch/index.vue.js.map +1 -0
  187. package/dist/components/StatusSwitch/index2.vue.js +5 -0
  188. package/dist/components/StatusSwitch/index2.vue.js.map +1 -0
  189. package/dist/components/TableZoomButton/index.vue.d.ts +13 -0
  190. package/dist/components/TableZoomButton/index.vue.js +42 -0
  191. package/dist/components/TableZoomButton/index.vue.js.map +1 -0
  192. package/dist/components/TableZoomButton/index2.vue.js +5 -0
  193. package/dist/components/TableZoomButton/index2.vue.js.map +1 -0
  194. package/dist/components/UserPicker/index.vue.d.ts +13 -0
  195. package/dist/components/UserPicker/index.vue.js +8 -0
  196. package/dist/components/UserPicker/index.vue.js.map +1 -0
  197. package/dist/components/UserPicker/index2.vue.js +214 -0
  198. package/dist/components/UserPicker/index2.vue.js.map +1 -0
  199. package/dist/components/UserSelect/index.vue.d.ts +9 -0
  200. package/dist/components/UserSelect/index.vue.js +32 -0
  201. package/dist/components/UserSelect/index.vue.js.map +1 -0
  202. package/dist/components/UserSelect/index2.vue.js +5 -0
  203. package/dist/components/UserSelect/index2.vue.js.map +1 -0
  204. package/dist/components/oauth/BrandIcon.vue.d.ts +12 -0
  205. package/dist/components/oauth/BrandIcon.vue.js +8 -0
  206. package/dist/components/oauth/BrandIcon.vue.js.map +1 -0
  207. package/dist/components/oauth/BrandIcon2.vue.js +95 -0
  208. package/dist/components/oauth/BrandIcon2.vue.js.map +1 -0
  209. package/dist/composables/authMenuRoute.d.ts +32 -0
  210. package/dist/composables/authMenuRoute.js +37 -0
  211. package/dist/composables/authMenuRoute.js.map +1 -0
  212. package/dist/composables/clearClientCache.d.ts +10 -0
  213. package/dist/composables/clearClientCache.js +17 -0
  214. package/dist/composables/clearClientCache.js.map +1 -0
  215. package/dist/composables/useAuthMenu.d.ts +3 -0
  216. package/dist/composables/useAuthMenu.js +61 -0
  217. package/dist/composables/useAuthMenu.js.map +1 -0
  218. package/dist/composables/useBatchDelete.d.ts +18 -0
  219. package/dist/composables/useBatchDelete.js +21 -0
  220. package/dist/composables/useBatchDelete.js.map +1 -0
  221. package/dist/composables/useCompactScreen.d.ts +12 -0
  222. package/dist/composables/useCompactScreen.js +17 -0
  223. package/dist/composables/useCompactScreen.js.map +1 -0
  224. package/dist/composables/useConfirm.d.ts +18 -0
  225. package/dist/composables/useConfirm.js +61 -0
  226. package/dist/composables/useConfirm.js.map +1 -0
  227. package/dist/composables/useFullscreenToggle.d.ts +11 -0
  228. package/dist/composables/useFullscreenToggle.js +64 -0
  229. package/dist/composables/useFullscreenToggle.js.map +1 -0
  230. package/dist/composables/useHeaderTools.d.ts +31 -0
  231. package/dist/composables/useHeaderTools.js +15 -0
  232. package/dist/composables/useHeaderTools.js.map +1 -0
  233. package/dist/composables/useLayoutMenu.d.ts +17 -0
  234. package/dist/composables/useLayoutMenu.js +93 -0
  235. package/dist/composables/useLayoutMenu.js.map +1 -0
  236. package/dist/composables/useMenuBadge.d.ts +11 -0
  237. package/dist/composables/useMenuBadge.js +17 -0
  238. package/dist/composables/useMenuBadge.js.map +1 -0
  239. package/dist/composables/useMenuFlat.d.ts +8 -0
  240. package/dist/composables/useMenuFlat.js +29 -0
  241. package/dist/composables/useMenuFlat.js.map +1 -0
  242. package/dist/composables/useModule.d.ts +16 -0
  243. package/dist/composables/useModule.js +44 -0
  244. package/dist/composables/useModule.js.map +1 -0
  245. package/dist/composables/useNoticeAction.d.ts +8 -0
  246. package/dist/composables/useNoticeAction.js +79 -0
  247. package/dist/composables/useNoticeAction.js.map +1 -0
  248. package/dist/composables/usePageTitle.d.ts +1 -0
  249. package/dist/composables/usePageTitle.js +20 -0
  250. package/dist/composables/usePageTitle.js.map +1 -0
  251. package/dist/composables/useRealtime.d.ts +31 -0
  252. package/dist/composables/useRealtime.js +59 -0
  253. package/dist/composables/useRealtime.js.map +1 -0
  254. package/dist/composables/useSite.d.ts +24 -0
  255. package/dist/composables/useSite.js +27 -0
  256. package/dist/composables/useSite.js.map +1 -0
  257. package/dist/composables/useTabTitle.d.ts +1 -0
  258. package/dist/composables/useTabTitle.js +10 -0
  259. package/dist/composables/useTabTitle.js.map +1 -0
  260. package/dist/composables/useTableRowSort.d.ts +20 -0
  261. package/dist/composables/useTableRowSort.js +59 -0
  262. package/dist/composables/useTableRowSort.js.map +1 -0
  263. package/dist/composables/useTableZoom.d.ts +5 -0
  264. package/dist/composables/useTableZoom.js +30 -0
  265. package/dist/composables/useTableZoom.js.map +1 -0
  266. package/dist/composables/useTheme.d.ts +13 -0
  267. package/dist/composables/useTheme.js +30 -0
  268. package/dist/composables/useTheme.js.map +1 -0
  269. package/dist/composables/useVisualViewportHeight.d.ts +3 -0
  270. package/dist/composables/useVisualViewportHeight.js +16 -0
  271. package/dist/composables/useVisualViewportHeight.js.map +1 -0
  272. package/dist/createSmartAdmin.d.ts +56 -0
  273. package/dist/createSmartAdmin.js +76 -0
  274. package/dist/createSmartAdmin.js.map +1 -0
  275. package/dist/directives/auth.d.ts +16 -0
  276. package/dist/directives/auth.js +19 -0
  277. package/dist/directives/auth.js.map +1 -0
  278. package/dist/env.d.ts +10 -0
  279. package/dist/index.d.ts +90 -0
  280. package/dist/index.js +273 -0
  281. package/dist/index.js.map +1 -0
  282. package/dist/layouts/AppHeader.vue.d.ts +12 -0
  283. package/dist/layouts/AppHeader.vue.js +8 -0
  284. package/dist/layouts/AppHeader.vue.js.map +1 -0
  285. package/dist/layouts/AppHeader2.vue.js +352 -0
  286. package/dist/layouts/AppHeader2.vue.js.map +1 -0
  287. package/dist/layouts/LayoutModeCards.vue.d.ts +3 -0
  288. package/dist/layouts/LayoutModeCards.vue.js +8 -0
  289. package/dist/layouts/LayoutModeCards.vue.js.map +1 -0
  290. package/dist/layouts/LayoutModeCards2.vue.js +67 -0
  291. package/dist/layouts/LayoutModeCards2.vue.js.map +1 -0
  292. package/dist/layouts/NoticeBell.vue.d.ts +3 -0
  293. package/dist/layouts/NoticeBell.vue.js +8 -0
  294. package/dist/layouts/NoticeBell.vue.js.map +1 -0
  295. package/dist/layouts/NoticeBell2.vue.js +292 -0
  296. package/dist/layouts/NoticeBell2.vue.js.map +1 -0
  297. package/dist/layouts/PersonalLayout.vue.d.ts +3 -0
  298. package/dist/layouts/PersonalLayout.vue.js +8 -0
  299. package/dist/layouts/PersonalLayout.vue.js.map +1 -0
  300. package/dist/layouts/PersonalLayout2.vue.js +65 -0
  301. package/dist/layouts/PersonalLayout2.vue.js.map +1 -0
  302. package/dist/layouts/SettingRow.vue.d.ts +16 -0
  303. package/dist/layouts/SettingRow.vue.js +8 -0
  304. package/dist/layouts/SettingRow.vue.js.map +1 -0
  305. package/dist/layouts/SettingRow2.vue.js +23 -0
  306. package/dist/layouts/SettingRow2.vue.js.map +1 -0
  307. package/dist/layouts/SettingsDrawer.vue.d.ts +10 -0
  308. package/dist/layouts/SettingsDrawer.vue.js +8 -0
  309. package/dist/layouts/SettingsDrawer.vue.js.map +1 -0
  310. package/dist/layouts/SettingsDrawer2.vue.js +380 -0
  311. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -0
  312. package/dist/layouts/TabsBar.vue.d.ts +3 -0
  313. package/dist/layouts/TabsBar.vue.js +8 -0
  314. package/dist/layouts/TabsBar.vue.js.map +1 -0
  315. package/dist/layouts/TabsBar2.vue.js +132 -0
  316. package/dist/layouts/TabsBar2.vue.js.map +1 -0
  317. package/dist/layouts/components/SideNav.vue.d.ts +15 -0
  318. package/dist/layouts/components/SideNav.vue.js +8 -0
  319. package/dist/layouts/components/SideNav.vue.js.map +1 -0
  320. package/dist/layouts/components/SideNav2.vue.js +49 -0
  321. package/dist/layouts/components/SideNav2.vue.js.map +1 -0
  322. package/dist/layouts/default.vue.d.ts +3 -0
  323. package/dist/layouts/default.vue.js +8 -0
  324. package/dist/layouts/default.vue.js.map +1 -0
  325. package/dist/layouts/default2.vue.js +213 -0
  326. package/dist/layouts/default2.vue.js.map +1 -0
  327. package/dist/lib/chunkReload.d.ts +9 -0
  328. package/dist/lib/chunkReload.js +24 -0
  329. package/dist/lib/chunkReload.js.map +1 -0
  330. package/dist/lib/icons.d.ts +2 -0
  331. package/dist/lib/icons.js +39 -0
  332. package/dist/lib/icons.js.map +1 -0
  333. package/dist/lib/loadingBar.d.ts +7 -0
  334. package/dist/lib/loadingBar.js +18 -0
  335. package/dist/lib/loadingBar.js.map +1 -0
  336. package/dist/lib/markdown.d.ts +8 -0
  337. package/dist/lib/markdown.js +16 -0
  338. package/dist/lib/markdown.js.map +1 -0
  339. package/dist/lib/markdownLinks.d.ts +26 -0
  340. package/dist/lib/markdownLinks.js +21 -0
  341. package/dist/lib/markdownLinks.js.map +1 -0
  342. package/dist/lib/noticeActions.d.ts +13 -0
  343. package/dist/lib/noticeActions.js +16 -0
  344. package/dist/lib/noticeActions.js.map +1 -0
  345. package/dist/lib/runtime.d.ts +21 -0
  346. package/dist/lib/runtime.js +13 -0
  347. package/dist/lib/runtime.js.map +1 -0
  348. package/dist/locales/en-US.d.ts +1358 -0
  349. package/dist/locales/en-US.js +1362 -0
  350. package/dist/locales/en-US.js.map +1 -0
  351. package/dist/locales/index.d.ts +30 -0
  352. package/dist/locales/index.js +46 -0
  353. package/dist/locales/index.js.map +1 -0
  354. package/dist/locales/menuTitle.d.ts +8 -0
  355. package/dist/locales/menuTitle.js +19 -0
  356. package/dist/locales/menuTitle.js.map +1 -0
  357. package/dist/locales/zh-CN.d.ts +1358 -0
  358. package/dist/locales/zh-CN.js +1368 -0
  359. package/dist/locales/zh-CN.js.map +1 -0
  360. package/dist/router/bootFailure.d.ts +8 -0
  361. package/dist/router/bootFailure.js +11 -0
  362. package/dist/router/bootFailure.js.map +1 -0
  363. package/dist/router/detailRoutes.d.ts +2 -0
  364. package/dist/router/detailRoutes.js +19 -0
  365. package/dist/router/detailRoutes.js.map +1 -0
  366. package/dist/router/index.d.ts +3 -0
  367. package/dist/router/index.js +58 -0
  368. package/dist/router/index.js.map +1 -0
  369. package/dist/router/namedPage.d.ts +13 -0
  370. package/dist/router/namedPage.js +12 -0
  371. package/dist/router/namedPage.js.map +1 -0
  372. package/dist/router/routes.d.ts +2 -0
  373. package/dist/router/routes.js +121 -0
  374. package/dist/router/routes.js.map +1 -0
  375. package/dist/router/viewRegistry.d.ts +18 -0
  376. package/dist/router/viewRegistry.js +26 -0
  377. package/dist/router/viewRegistry.js.map +1 -0
  378. package/dist/stores/app.d.ts +83 -0
  379. package/dist/stores/app.js +82 -0
  380. package/dist/stores/app.js.map +1 -0
  381. package/dist/stores/auth.d.ts +106 -0
  382. package/dist/stores/auth.js +59 -0
  383. package/dist/stores/auth.js.map +1 -0
  384. package/dist/stores/dict.d.ts +11 -0
  385. package/dist/stores/dict.js +36 -0
  386. package/dist/stores/dict.js.map +1 -0
  387. package/dist/stores/tabs.d.ts +53 -0
  388. package/dist/stores/tabs.js +88 -0
  389. package/dist/stores/tabs.js.map +1 -0
  390. package/dist/stores/user.d.ts +64 -0
  391. package/dist/stores/user.js +64 -0
  392. package/dist/stores/user.js.map +1 -0
  393. package/dist/style.css +1 -0
  394. package/dist/theme/accents.d.ts +2 -0
  395. package/dist/theme/accents.js +5 -0
  396. package/dist/theme/accents.js.map +1 -0
  397. package/dist/theme/mix.d.ts +26 -0
  398. package/dist/theme/mix.js +43 -0
  399. package/dist/theme/mix.js.map +1 -0
  400. package/dist/theme/naive-theme.d.ts +9 -0
  401. package/dist/theme/naive-theme.js +89 -0
  402. package/dist/theme/naive-theme.js.map +1 -0
  403. package/dist/types/api.d.ts +714 -0
  404. package/dist/types/api.js +15 -0
  405. package/dist/types/api.js.map +1 -0
  406. package/dist/types/menu.d.ts +67 -0
  407. package/dist/types/menu.js +26 -0
  408. package/dist/types/menu.js.map +1 -0
  409. package/dist/utils/chunkUpload.d.ts +6 -0
  410. package/dist/utils/chunkUpload.js +35 -0
  411. package/dist/utils/chunkUpload.js.map +1 -0
  412. package/dist/utils/download.d.ts +8 -0
  413. package/dist/utils/download.js +8 -0
  414. package/dist/utils/download.js.map +1 -0
  415. package/dist/utils/error.d.ts +14 -0
  416. package/dist/utils/error.js +50 -0
  417. package/dist/utils/error.js.map +1 -0
  418. package/dist/utils/format.d.ts +20 -0
  419. package/dist/utils/format.js +19 -0
  420. package/dist/utils/format.js.map +1 -0
  421. package/dist/utils/importDup.d.ts +17 -0
  422. package/dist/utils/importDup.js +18 -0
  423. package/dist/utils/importDup.js.map +1 -0
  424. package/dist/utils/oauthBrand.d.ts +100 -0
  425. package/dist/utils/oauthBrand.js +97 -0
  426. package/dist/utils/oauthBrand.js.map +1 -0
  427. package/dist/utils/tree.d.ts +33 -0
  428. package/dist/utils/tree.js +47 -0
  429. package/dist/utils/tree.js.map +1 -0
  430. package/dist/utils/ua.d.ts +7 -0
  431. package/dist/utils/ua.js +33 -0
  432. package/dist/utils/ua.js.map +1 -0
  433. package/dist/utils/url.d.ts +16 -0
  434. package/dist/utils/url.js +13 -0
  435. package/dist/utils/url.js.map +1 -0
  436. package/dist/views/dashboard/biz.vue.d.ts +3 -0
  437. package/dist/views/dashboard/biz.vue.js +8 -0
  438. package/dist/views/dashboard/biz.vue.js.map +1 -0
  439. package/dist/views/dashboard/biz2.vue.js +136 -0
  440. package/dist/views/dashboard/biz2.vue.js.map +1 -0
  441. package/dist/views/dashboard/workbench.vue.d.ts +3 -0
  442. package/dist/views/dashboard/workbench.vue.js +8 -0
  443. package/dist/views/dashboard/workbench.vue.js.map +1 -0
  444. package/dist/views/dashboard/workbench2.vue.js +195 -0
  445. package/dist/views/dashboard/workbench2.vue.js.map +1 -0
  446. package/dist/views/embed/iframe.vue.d.ts +3 -0
  447. package/dist/views/embed/iframe.vue.js +8 -0
  448. package/dist/views/embed/iframe.vue.js.map +1 -0
  449. package/dist/views/embed/iframe2.vue.js +21 -0
  450. package/dist/views/embed/iframe2.vue.js.map +1 -0
  451. package/dist/views/error/404.vue.d.ts +3 -0
  452. package/dist/views/error/404.vue.js +8 -0
  453. package/dist/views/error/404.vue.js.map +1 -0
  454. package/dist/views/error/4042.vue.js +31 -0
  455. package/dist/views/error/4042.vue.js.map +1 -0
  456. package/dist/views/error/BootError.vue.d.ts +3 -0
  457. package/dist/views/error/BootError.vue.js +8 -0
  458. package/dist/views/error/BootError.vue.js.map +1 -0
  459. package/dist/views/error/BootError2.vue.js +57 -0
  460. package/dist/views/error/BootError2.vue.js.map +1 -0
  461. package/dist/views/error/MissingRoute.vue.d.ts +3 -0
  462. package/dist/views/error/MissingRoute.vue.js +8 -0
  463. package/dist/views/error/MissingRoute.vue.js.map +1 -0
  464. package/dist/views/error/MissingRoute2.vue.js +23 -0
  465. package/dist/views/error/MissingRoute2.vue.js.map +1 -0
  466. package/dist/views/login/LoginForm.vue.d.ts +12 -0
  467. package/dist/views/login/LoginForm.vue.js +8 -0
  468. package/dist/views/login/LoginForm.vue.js.map +1 -0
  469. package/dist/views/login/LoginForm2.vue.js +642 -0
  470. package/dist/views/login/LoginForm2.vue.js.map +1 -0
  471. package/dist/views/login/index.vue.d.ts +3 -0
  472. package/dist/views/login/index.vue.js +8 -0
  473. package/dist/views/login/index.vue.js.map +1 -0
  474. package/dist/views/login/index2.vue.js +79 -0
  475. package/dist/views/login/index2.vue.js.map +1 -0
  476. package/dist/views/login/skins/AuroraGlass.vue.d.ts +3 -0
  477. package/dist/views/login/skins/AuroraGlass.vue.js +8 -0
  478. package/dist/views/login/skins/AuroraGlass.vue.js.map +1 -0
  479. package/dist/views/login/skins/AuroraGlass2.vue.js +80 -0
  480. package/dist/views/login/skins/AuroraGlass2.vue.js.map +1 -0
  481. package/dist/views/login/skins/SplitPanel.vue.d.ts +3 -0
  482. package/dist/views/login/skins/SplitPanel.vue.js +8 -0
  483. package/dist/views/login/skins/SplitPanel.vue.js.map +1 -0
  484. package/dist/views/login/skins/SplitPanel2.vue.js +85 -0
  485. package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -0
  486. package/dist/views/login/skins/Spotlight.vue.d.ts +3 -0
  487. package/dist/views/login/skins/Spotlight.vue.js +8 -0
  488. package/dist/views/login/skins/Spotlight.vue.js.map +1 -0
  489. package/dist/views/login/skins/Spotlight2.vue.js +36 -0
  490. package/dist/views/login/skins/Spotlight2.vue.js.map +1 -0
  491. package/dist/views/login/skins.d.ts +8 -0
  492. package/dist/views/login/skins.js +13 -0
  493. package/dist/views/login/skins.js.map +1 -0
  494. package/dist/views/mfa/bindComplete.d.ts +7 -0
  495. package/dist/views/mfa/bindComplete.js +8 -0
  496. package/dist/views/mfa/bindComplete.js.map +1 -0
  497. package/dist/views/mfa/index.vue.d.ts +3 -0
  498. package/dist/views/mfa/index.vue.js +8 -0
  499. package/dist/views/mfa/index.vue.js.map +1 -0
  500. package/dist/views/mfa/index2.vue.js +425 -0
  501. package/dist/views/mfa/index2.vue.js.map +1 -0
  502. package/dist/views/module/index.vue.d.ts +3 -0
  503. package/dist/views/module/index.vue.js +8 -0
  504. package/dist/views/module/index.vue.js.map +1 -0
  505. package/dist/views/module/index2.vue.js +142 -0
  506. package/dist/views/module/index2.vue.js.map +1 -0
  507. package/dist/views/oauth/callback.vue.d.ts +3 -0
  508. package/dist/views/oauth/callback.vue.js +8 -0
  509. package/dist/views/oauth/callback.vue.js.map +1 -0
  510. package/dist/views/oauth/callback2.vue.js +86 -0
  511. package/dist/views/oauth/callback2.vue.js.map +1 -0
  512. package/dist/views/personal/bindings.vue.d.ts +3 -0
  513. package/dist/views/personal/bindings.vue.js +8 -0
  514. package/dist/views/personal/bindings.vue.js.map +1 -0
  515. package/dist/views/personal/bindings2.vue.js +220 -0
  516. package/dist/views/personal/bindings2.vue.js.map +1 -0
  517. package/dist/views/personal/notice.vue.d.ts +3 -0
  518. package/dist/views/personal/notice.vue.js +5 -0
  519. package/dist/views/personal/notice.vue.js.map +1 -0
  520. package/dist/views/personal/notice2.vue.js +163 -0
  521. package/dist/views/personal/notice2.vue.js.map +1 -0
  522. package/dist/views/personal/password.vue.d.ts +3 -0
  523. package/dist/views/personal/password.vue.js +5 -0
  524. package/dist/views/personal/password.vue.js.map +1 -0
  525. package/dist/views/personal/password2.vue.js +147 -0
  526. package/dist/views/personal/password2.vue.js.map +1 -0
  527. package/dist/views/personal/profile.vue.d.ts +3 -0
  528. package/dist/views/personal/profile.vue.js +8 -0
  529. package/dist/views/personal/profile.vue.js.map +1 -0
  530. package/dist/views/personal/profile2.vue.js +264 -0
  531. package/dist/views/personal/profile2.vue.js.map +1 -0
  532. package/dist/views/personal/security.vue.d.ts +3 -0
  533. package/dist/views/personal/security.vue.js +8 -0
  534. package/dist/views/personal/security.vue.js.map +1 -0
  535. package/dist/views/personal/security2.vue.js +82 -0
  536. package/dist/views/personal/security2.vue.js.map +1 -0
  537. package/dist/views/personal/sessions.vue.d.ts +3 -0
  538. package/dist/views/personal/sessions.vue.js +8 -0
  539. package/dist/views/personal/sessions.vue.js.map +1 -0
  540. package/dist/views/personal/sessions2.vue.js +101 -0
  541. package/dist/views/personal/sessions2.vue.js.map +1 -0
  542. package/dist/views/system/cache/index.vue.d.ts +3 -0
  543. package/dist/views/system/cache/index.vue.js +8 -0
  544. package/dist/views/system/cache/index.vue.js.map +1 -0
  545. package/dist/views/system/cache/index2.vue.js +113 -0
  546. package/dist/views/system/cache/index2.vue.js.map +1 -0
  547. package/dist/views/system/config/components/ConfigFormModal.vue.d.ts +16 -0
  548. package/dist/views/system/config/components/ConfigFormModal.vue.js +5 -0
  549. package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -0
  550. package/dist/views/system/config/components/ConfigFormModal2.vue.js +177 -0
  551. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -0
  552. package/dist/views/system/config/components/ExternalAuthConfig.vue.d.ts +3 -0
  553. package/dist/views/system/config/components/ExternalAuthConfig.vue.js +8 -0
  554. package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +1 -0
  555. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +218 -0
  556. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +1 -0
  557. package/dist/views/system/config/components/GroupExtraConfig.vue.d.ts +9 -0
  558. package/dist/views/system/config/components/GroupExtraConfig.vue.js +8 -0
  559. package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +1 -0
  560. package/dist/views/system/config/components/GroupExtraConfig2.vue.js +108 -0
  561. package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +1 -0
  562. package/dist/views/system/config/components/HighSensConfig.vue.d.ts +3 -0
  563. package/dist/views/system/config/components/HighSensConfig.vue.js +5 -0
  564. package/dist/views/system/config/components/HighSensConfig.vue.js.map +1 -0
  565. package/dist/views/system/config/components/HighSensConfig2.vue.js +134 -0
  566. package/dist/views/system/config/components/HighSensConfig2.vue.js.map +1 -0
  567. package/dist/views/system/config/components/JobConfig.vue.d.ts +3 -0
  568. package/dist/views/system/config/components/JobConfig.vue.js +5 -0
  569. package/dist/views/system/config/components/JobConfig.vue.js.map +1 -0
  570. package/dist/views/system/config/components/JobConfig2.vue.js +116 -0
  571. package/dist/views/system/config/components/JobConfig2.vue.js.map +1 -0
  572. package/dist/views/system/config/components/OtherConfig.vue.d.ts +3 -0
  573. package/dist/views/system/config/components/OtherConfig.vue.js +5 -0
  574. package/dist/views/system/config/components/OtherConfig.vue.js.map +1 -0
  575. package/dist/views/system/config/components/OtherConfig2.vue.js +121 -0
  576. package/dist/views/system/config/components/OtherConfig2.vue.js.map +1 -0
  577. package/dist/views/system/config/components/SecurityConfig.vue.d.ts +3 -0
  578. package/dist/views/system/config/components/SecurityConfig.vue.js +8 -0
  579. package/dist/views/system/config/components/SecurityConfig.vue.js.map +1 -0
  580. package/dist/views/system/config/components/SecurityConfig2.vue.js +456 -0
  581. package/dist/views/system/config/components/SecurityConfig2.vue.js.map +1 -0
  582. package/dist/views/system/config/components/SysBaseConfig.vue.d.ts +3 -0
  583. package/dist/views/system/config/components/SysBaseConfig.vue.js +5 -0
  584. package/dist/views/system/config/components/SysBaseConfig.vue.js.map +1 -0
  585. package/dist/views/system/config/components/SysBaseConfig2.vue.js +107 -0
  586. package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +1 -0
  587. package/dist/views/system/config/components/UploadConfig.vue.d.ts +3 -0
  588. package/dist/views/system/config/components/UploadConfig.vue.js +5 -0
  589. package/dist/views/system/config/components/UploadConfig.vue.js.map +1 -0
  590. package/dist/views/system/config/components/UploadConfig2.vue.js +135 -0
  591. package/dist/views/system/config/components/UploadConfig2.vue.js.map +1 -0
  592. package/dist/views/system/config/groups.d.ts +9 -0
  593. package/dist/views/system/config/groups.js +18 -0
  594. package/dist/views/system/config/groups.js.map +1 -0
  595. package/dist/views/system/config/index.vue.d.ts +3 -0
  596. package/dist/views/system/config/index.vue.js +5 -0
  597. package/dist/views/system/config/index.vue.js.map +1 -0
  598. package/dist/views/system/config/index2.vue.js +127 -0
  599. package/dist/views/system/config/index2.vue.js.map +1 -0
  600. package/dist/views/system/dict/index.vue.d.ts +3 -0
  601. package/dist/views/system/dict/index.vue.js +8 -0
  602. package/dist/views/system/dict/index.vue.js.map +1 -0
  603. package/dist/views/system/dict/index2.vue.js +560 -0
  604. package/dist/views/system/dict/index2.vue.js.map +1 -0
  605. package/dist/views/system/file/index.vue.d.ts +3 -0
  606. package/dist/views/system/file/index.vue.js +5 -0
  607. package/dist/views/system/file/index.vue.js.map +1 -0
  608. package/dist/views/system/file/index2.vue.js +186 -0
  609. package/dist/views/system/file/index2.vue.js.map +1 -0
  610. package/dist/views/system/job/index.vue.d.ts +3 -0
  611. package/dist/views/system/job/index.vue.js +8 -0
  612. package/dist/views/system/job/index.vue.js.map +1 -0
  613. package/dist/views/system/job/index2.vue.js +1167 -0
  614. package/dist/views/system/job/index2.vue.js.map +1 -0
  615. package/dist/views/system/job-log/index.vue.d.ts +3 -0
  616. package/dist/views/system/job-log/index.vue.js +8 -0
  617. package/dist/views/system/job-log/index.vue.js.map +1 -0
  618. package/dist/views/system/job-log/index2.vue.js +411 -0
  619. package/dist/views/system/job-log/index2.vue.js.map +1 -0
  620. package/dist/views/system/job-monitor/index.vue.d.ts +3 -0
  621. package/dist/views/system/job-monitor/index.vue.js +8 -0
  622. package/dist/views/system/job-monitor/index.vue.js.map +1 -0
  623. package/dist/views/system/job-monitor/index2.vue.js +253 -0
  624. package/dist/views/system/job-monitor/index2.vue.js.map +1 -0
  625. package/dist/views/system/log/exception/index.vue.d.ts +3 -0
  626. package/dist/views/system/log/exception/index.vue.js +8 -0
  627. package/dist/views/system/log/exception/index.vue.js.map +1 -0
  628. package/dist/views/system/log/exception/index2.vue.js +216 -0
  629. package/dist/views/system/log/exception/index2.vue.js.map +1 -0
  630. package/dist/views/system/log/login/index.vue.d.ts +3 -0
  631. package/dist/views/system/log/login/index.vue.js +5 -0
  632. package/dist/views/system/log/login/index.vue.js.map +1 -0
  633. package/dist/views/system/log/login/index2.vue.js +113 -0
  634. package/dist/views/system/log/login/index2.vue.js.map +1 -0
  635. package/dist/views/system/log/op/index.vue.d.ts +3 -0
  636. package/dist/views/system/log/op/index.vue.js +8 -0
  637. package/dist/views/system/log/op/index.vue.js.map +1 -0
  638. package/dist/views/system/log/op/index2.vue.js +332 -0
  639. package/dist/views/system/log/op/index2.vue.js.map +1 -0
  640. package/dist/views/system/menu/components/ButtonManager.vue.d.ts +21 -0
  641. package/dist/views/system/menu/components/ButtonManager.vue.js +8 -0
  642. package/dist/views/system/menu/components/ButtonManager.vue.js.map +1 -0
  643. package/dist/views/system/menu/components/ButtonManager2.vue.js +498 -0
  644. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -0
  645. package/dist/views/system/menu/components/MenuFormModal.vue.d.ts +22 -0
  646. package/dist/views/system/menu/components/MenuFormModal.vue.js +8 -0
  647. package/dist/views/system/menu/components/MenuFormModal.vue.js.map +1 -0
  648. package/dist/views/system/menu/components/MenuFormModal2.vue.js +259 -0
  649. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -0
  650. package/dist/views/system/menu/index.vue.d.ts +3 -0
  651. package/dist/views/system/menu/index.vue.js +8 -0
  652. package/dist/views/system/menu/index.vue.js.map +1 -0
  653. package/dist/views/system/menu/index2.vue.js +391 -0
  654. package/dist/views/system/menu/index2.vue.js.map +1 -0
  655. package/dist/views/system/module/index.vue.d.ts +3 -0
  656. package/dist/views/system/module/index.vue.js +8 -0
  657. package/dist/views/system/module/index.vue.js.map +1 -0
  658. package/dist/views/system/module/index2.vue.js +344 -0
  659. package/dist/views/system/module/index2.vue.js.map +1 -0
  660. package/dist/views/system/monitor/index.vue.d.ts +3 -0
  661. package/dist/views/system/monitor/index.vue.js +8 -0
  662. package/dist/views/system/monitor/index.vue.js.map +1 -0
  663. package/dist/views/system/monitor/index2.vue.js +184 -0
  664. package/dist/views/system/monitor/index2.vue.js.map +1 -0
  665. package/dist/views/system/notice/index.vue.d.ts +3 -0
  666. package/dist/views/system/notice/index.vue.js +8 -0
  667. package/dist/views/system/notice/index.vue.js.map +1 -0
  668. package/dist/views/system/notice/index2.vue.js +401 -0
  669. package/dist/views/system/notice/index2.vue.js.map +1 -0
  670. package/dist/views/system/org/index.vue.d.ts +3 -0
  671. package/dist/views/system/org/index.vue.js +8 -0
  672. package/dist/views/system/org/index.vue.js.map +1 -0
  673. package/dist/views/system/org/index2.vue.js +397 -0
  674. package/dist/views/system/org/index2.vue.js.map +1 -0
  675. package/dist/views/system/position/index.vue.d.ts +3 -0
  676. package/dist/views/system/position/index.vue.js +5 -0
  677. package/dist/views/system/position/index.vue.js.map +1 -0
  678. package/dist/views/system/position/index2.vue.js +211 -0
  679. package/dist/views/system/position/index2.vue.js.map +1 -0
  680. package/dist/views/system/recycle/index.vue.d.ts +3 -0
  681. package/dist/views/system/recycle/index.vue.js +8 -0
  682. package/dist/views/system/recycle/index.vue.js.map +1 -0
  683. package/dist/views/system/recycle/index2.vue.js +121 -0
  684. package/dist/views/system/recycle/index2.vue.js.map +1 -0
  685. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +18 -0
  686. package/dist/views/system/role/components/GrantMenuTable.vue.js +8 -0
  687. package/dist/views/system/role/components/GrantMenuTable.vue.js.map +1 -0
  688. package/dist/views/system/role/components/GrantMenuTable2.vue.js +212 -0
  689. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -0
  690. package/dist/views/system/role/components/grantMenuGroups.d.ts +31 -0
  691. package/dist/views/system/role/components/grantMenuGroups.js +76 -0
  692. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -0
  693. package/dist/views/system/role/index.vue.d.ts +3 -0
  694. package/dist/views/system/role/index.vue.js +5 -0
  695. package/dist/views/system/role/index.vue.js.map +1 -0
  696. package/dist/views/system/role/index2.vue.js +476 -0
  697. package/dist/views/system/role/index2.vue.js.map +1 -0
  698. package/dist/views/system/session/index.vue.d.ts +3 -0
  699. package/dist/views/system/session/index.vue.js +5 -0
  700. package/dist/views/system/session/index.vue.js.map +1 -0
  701. package/dist/views/system/session/index2.vue.js +80 -0
  702. package/dist/views/system/session/index2.vue.js.map +1 -0
  703. package/dist/views/system/user/components/ResetPasswordModal.vue.d.ts +10 -0
  704. package/dist/views/system/user/components/ResetPasswordModal.vue.js +8 -0
  705. package/dist/views/system/user/components/ResetPasswordModal.vue.js.map +1 -0
  706. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +111 -0
  707. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -0
  708. package/dist/views/system/user/components/UserFormModal.vue.d.ts +30 -0
  709. package/dist/views/system/user/components/UserFormModal.vue.js +8 -0
  710. package/dist/views/system/user/components/UserFormModal.vue.js.map +1 -0
  711. package/dist/views/system/user/components/UserFormModal2.vue.js +415 -0
  712. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -0
  713. package/dist/views/system/user/index.vue.d.ts +3 -0
  714. package/dist/views/system/user/index.vue.js +8 -0
  715. package/dist/views/system/user/index.vue.js.map +1 -0
  716. package/dist/views/system/user/index2.vue.js +427 -0
  717. package/dist/views/system/user/index2.vue.js.map +1 -0
  718. package/package.json +99 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginForm2.vue.js","sources":["../../../src/views/login/LoginForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { reactive, ref, computed, onMounted, onBeforeUnmount, h } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n NAlert,\n NForm,\n NFormItem,\n NInput,\n NCheckbox,\n NModal,\n NDropdown,\n useMessage,\n type DropdownOption,\n} from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { authApi, externalAuthApi, ApiError } from '#/api'\nimport type { LoginOutput } from '#/types/api'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { useAppStore } from '#/stores/app'\nimport { useSite } from '#/composables/useSite'\nimport { resetRouter } from '#/router'\nimport { btnGrad, glowSh } from '#/theme/mix'\nimport { translateError } from '#/utils/error'\nimport {\n splitLoginProviders,\n PREVIEW_ALL_SSO_BRANDS,\n previewAllBrandProviders,\n claimWeComAutoLogin,\n} from '#/utils/oauthBrand'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { runtime } from '#/lib/runtime'\nimport BrandIcon from '#/components/oauth/BrandIcon.vue'\n\n// 皮肤外壳自带品牌栏时(如双栏),卡内不重复 logo/标题/页脚(showFooter=false 由外壳自绘版权)。\nwithDefaults(defineProps<{ showLogo?: boolean; showTitle?: boolean; showFooter?: boolean }>(), {\n showLogo: true,\n showTitle: true,\n showFooter: true,\n})\n\nconst router = useRouter()\nconst route = useRoute()\nconst message = useMessage()\nconst { t } = useI18n()\nconst user = useUserStore()\nconst auth = useAuthStore()\nconst app = useAppStore()\nconst { site, appVersion, loadSite } = useSite()\nconst year = new Date().getFullYear()\n\n/** 未绑定 SSO 后带回:登录成功后须确认再 claim(防静默抢绑) */\nconst pendingLink = computed(() =>\n typeof route.query.pendingLink === 'string' ? route.query.pendingLink : '',\n)\nconst pendingProvider = computed(() =>\n typeof route.query.provider === 'string' ? route.query.provider : '',\n)\nconst pendingDisplayName = computed(() =>\n typeof route.query.displayName === 'string' ? route.query.displayName : '',\n)\nconst pendingConfirmShow = ref(false)\nconst pendingClaimBusy = ref(false)\nconst pendingClaimToken = ref('')\n\n// 开发态(createSmartAdmin({ dev }))预填超管账号密码,免得每次手敲;生产留空。\n// SSO pending-link 场景故意不预填密码:解绑后 GitHub 会落到本页,预填+一点就 claim 看起来像「SSO 直接进了」。\nconst model = reactive(\n runtime.dev && !pendingLink.value\n ? { account: 'superAdmin', password: 'Aa123456', remember: true }\n : {\n account: runtime.dev ? 'superAdmin' : '',\n password: '',\n remember: true,\n },\n)\nconst loading = ref(false)\n\n// 登录形态:账号密码 / 短信免密 / 短信二次验证(40009) / TOTP 二次验证(40018)\n// 强制 MFA 未绑定(40020)用 Modal 引导,不切 mode,登录页默认也不常驻绑定链接\nconst mode = ref<'account' | 'sms' | 'mfa' | 'totp'>('account')\n\n// 短信免密登录\nconst smsModel = reactive({ phone: '', code: '' })\n// 二次验证挑战(40009 信令 args 下发)\nconst mfa = reactive({ challengeId: '', phoneMask: '', code: '' })\n// TOTP 挑战(40018)\nconst totp = reactive({ challengeId: '', code: '' })\n// 强制 MFA 但未绑定(40020):弹窗 + 带到 /mfa/bind 的账号\nconst bindRequiredShow = ref(false)\nconst bindAccount = ref('')\n\n// 发码/重发共用倒计时(同一时刻只有一个发码入口可见)\nconst countdown = ref(0)\nlet timer: number | undefined\nfunction startCountdown(s: number) {\n countdown.value = s\n window.clearInterval(timer)\n timer = window.setInterval(() => {\n countdown.value -= 1\n if (countdown.value <= 0) window.clearInterval(timer)\n }, 1000)\n}\nonBeforeUnmount(() => window.clearInterval(timer))\n\n// 验证码:是否启用由匿名站点信息(sys.security.captcha.enabled)运行时驱动;启用才拉取并展示。\n// 账号模式护登录,短信模式护发码(发码端点防脚本滥用)。\nconst captchaEnabled = ref(false)\nconst captchaId = ref('')\nconst captchaSvg = ref('')\nconst captchaCode = ref('')\nconst captchaType = ref('char')\n\n// math 类型需算出结果再输入,提示语不同;其余类型统一“请输入验证码”。\nconst captchaHint = computed(() =>\n captchaType.value === 'math' ? t('login.captchaMathPlaceholder') : t('login.captchaPlaceholder'),\n)\n\nasync function loadCaptcha() {\n try {\n const c = await authApi.captcha()\n captchaId.value = c.captchaId\n captchaSvg.value = c.svg\n captchaType.value = c.type || 'char'\n } catch {\n // 拉取失败不阻塞登录页渲染;点击图形可重试\n }\n}\n\n/** 验证码一次性消费:任何用掉票据的请求失败后必刷新,避免复用作废票据 */\nasync function refreshCaptchaAfterUse() {\n if (captchaEnabled.value) {\n captchaCode.value = ''\n await loadCaptcha()\n }\n}\n\nonMounted(async () => {\n // 站点信息全站共用(useSite 去重);验证码开关据此运行时驱动,启用才拉图。\n await loadSite()\n if (site.captchaEnabled) {\n captchaEnabled.value = true\n await loadCaptcha()\n }\n void loadSsoProviders()\n\n // SSO 回调带回的 TOTP 挑战:直接进入 totp 完成态\n const q = router.currentRoute.value.query\n const ch = typeof q.totpChallenge === 'string' ? q.totpChallenge : ''\n if (ch) {\n totp.challengeId = ch\n totp.code = ''\n mode.value = 'totp'\n }\n})\n\n// 英雄按钮:accent 派生渐变 + 发光(仅登录页/英雄区)。\nconst heroStyle = computed(() => ({\n background: btnGrad(app.accent),\n boxShadow: glowSh(app.accent),\n}))\n\n// 第三方登录:默认后端 providers 驱动;PREVIEW_ALL_SSO_BRANDS 时铺全品牌图(图标验收)。\nconst ssoProviders = ref<{ code: string; displayName: string; icon?: string | null }[]>([])\nconst pendingProviderLabel = computed(() => {\n const code = pendingProvider.value\n if (!code) return t('oauth.thirdParty')\n const hit = ssoProviders.value.find(p => p.code === code)\n return hit?.displayName || code\n})\nconst ssoDisplayList = computed(() =>\n PREVIEW_ALL_SSO_BRANDS ? previewAllBrandProviders() : ssoProviders.value,\n)\n// 预览全图标时不截断;正常模式 N=4 溢出\nconst ssoSplit = computed(() =>\n PREVIEW_ALL_SSO_BRANDS\n ? { visible: ssoDisplayList.value, overflow: [] as typeof ssoDisplayList.value }\n : splitLoginProviders(ssoDisplayList.value),\n)\nconst ssoOverflowOptions = computed<DropdownOption[]>(() =>\n ssoSplit.value.overflow.map(p => ({\n key: p.code,\n label: () =>\n h(\n 'span',\n {\n class: 'lf-sso-menu-item',\n style: { display: 'inline-flex', alignItems: 'center', gap: '8px' },\n },\n [h(BrandIcon, { code: p.code, icon: p.icon, size: 20 }), h('span', null, p.displayName)],\n ),\n })),\n)\nasync function loadSsoProviders() {\n try {\n ssoProviders.value = await externalAuthApi.providers()\n } catch {\n // 未配置外部登录或拉取失败:整段 SSO 区不显(预览全图标模式仍会显示)\n return\n }\n // 企业微信客户端里直接走企业微信登录;SSO 带回来的认领 / 二次验证要留在本页完成\n const q = route.query\n if (\n !q.pendingLink &&\n !q.totpChallenge &&\n claimWeComAutoLogin({\n userAgent: navigator.userAgent,\n providers: ssoProviders.value,\n storage: sessionStorage,\n })\n ) {\n window.location.href = ssoHref('wecom')\n }\n}\n/** 顶层跳 IdP(与 Gitee 一样用 <a href>)。预览假项仍给 authorize 链,未配后端会失败。 */\nfunction ssoHref(code: string) {\n return externalAuthApi.authorizeUrl(code)\n}\nfunction onSsoOverflow(key: string | number) {\n window.location.href = ssoHref(String(key))\n}\n\nasync function enterHome() {\n await router.replace('/')\n}\n\nasync function finishLogin(res: LoginOutput) {\n // 每次登录都清动态路由/授权态,否则上次会话的 routesReady=true 会跳过 enterInitial,\n // 菜单壳在、业务路由未重建 → 进系统后处处 404(绑定 MFA 后回登录再登最易踩中)。\n resetRouter()\n auth.reset()\n user.setSession(res)\n\n // 现场绑定:不静默 claim——须用户确认,并依赖服务端 binder cookie 同浏览器校验\n const link = pendingLink.value\n if (link) {\n pendingClaimToken.value = link\n pendingConfirmShow.value = true\n return\n }\n message.success(t('login.success'))\n await enterHome()\n}\n\nconst pendingConfirmIdentity = computed(() =>\n pendingDisplayName.value\n ? t('oauth.pendingLinkIdentity', { display: pendingDisplayName.value })\n : '',\n)\n\nasync function confirmPendingBind() {\n if (pendingClaimBusy.value) return\n pendingClaimBusy.value = true\n try {\n await externalAuthApi.claimPendingLink(pendingClaimToken.value)\n message.success(t('oauth.pendingLinkSuccess', { name: pendingProviderLabel.value }))\n } catch (e) {\n message.warning(translateError(e))\n } finally {\n pendingClaimBusy.value = false\n pendingConfirmShow.value = false\n pendingClaimToken.value = ''\n }\n await enterHome()\n}\n\nasync function skipPendingBind() {\n pendingConfirmShow.value = false\n pendingClaimToken.value = ''\n message.success(t('login.success'))\n await enterHome()\n}\n\nasync function onSubmit() {\n if (mode.value === 'mfa') return onMfaSubmit()\n if (mode.value === 'totp') return onTotpSubmit()\n if (mode.value === 'sms') return onSmsSubmit()\n\n if (!model.account || !model.password) {\n message.warning(t('login.required'))\n return\n }\n if (captchaEnabled.value && !captchaCode.value) {\n message.warning(t('login.captchaRequired'))\n return\n }\n loading.value = true\n try {\n const res = await authApi.login({\n account: model.account,\n password: model.password,\n ...(captchaEnabled.value\n ? { captchaId: captchaId.value, captchaCode: captchaCode.value }\n : {}),\n })\n await finishLogin(res)\n } catch (e) {\n // 40018 = 密码已过、需 TOTP 二次验证\n if (e instanceof ApiError && e.code === 40018 && e.args) {\n totp.challengeId = String(e.args.challengeId ?? '')\n totp.code = ''\n mode.value = 'totp'\n } else if (e instanceof ApiError && e.code === 40020) {\n // 40020 = 强制 MFA 未绑定 → Modal 引导自助设置(登录页默认不常驻链接)\n bindAccount.value = model.account.trim()\n bindRequiredShow.value = true\n } else if (e instanceof ApiError && e.code === 40009 && e.args) {\n // 40009 = 密码已过、需短信二次验证\n mfa.challengeId = String(e.args.challengeId ?? '')\n mfa.phoneMask = String(e.args.phoneMask ?? '')\n mfa.code = ''\n mode.value = 'mfa'\n startCountdown(Number(e.args.resendSeconds ?? 60))\n } else {\n message.error(translateError(e))\n }\n await refreshCaptchaAfterUse()\n } finally {\n loading.value = false\n }\n}\n\nfunction closeBindRequired() {\n bindRequiredShow.value = false\n}\n\nfunction goBindAuthenticator() {\n const account = bindAccount.value || model.account.trim()\n bindRequiredShow.value = false\n void router.push({ path: '/mfa/bind', query: account ? { account } : {} })\n}\n\nfunction goRecovery() {\n const account = model.account.trim() || bindAccount.value\n void router.push({\n path: '/mfa/bind',\n query: { ...(account ? { account } : {}), mode: 'recovery' },\n })\n}\n\nasync function onMfaSubmit() {\n if (!mfa.code) {\n message.warning(t('login.smsCodePlaceholder'))\n return\n }\n loading.value = true\n try {\n await finishLogin(\n await authApi.smsChallengeLogin({ challengeId: mfa.challengeId, code: mfa.code }),\n )\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function onTotpSubmit() {\n if (!totp.code) {\n message.warning(t('login.totpPlaceholder'))\n return\n }\n loading.value = true\n try {\n await finishLogin(\n await authApi.totpChallengeLogin({ challengeId: totp.challengeId, code: totp.code }),\n )\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function onMfaResend() {\n if (countdown.value > 0) return\n try {\n const r = await authApi.smsChallengeResend({ challengeId: mfa.challengeId })\n message.success(t('login.smsSent'))\n startCountdown(r.resendSeconds)\n } catch (e) {\n message.error(translateError(e))\n }\n}\n\nfunction backToAccount() {\n mode.value = 'account'\n mfa.challengeId = ''\n mfa.code = ''\n totp.challengeId = ''\n totp.code = ''\n}\n\nasync function onSendSmsCode() {\n if (countdown.value > 0) return\n if (!smsModel.phone) {\n message.warning(t('login.phonePlaceholder'))\n return\n }\n if (captchaEnabled.value && !captchaCode.value) {\n message.warning(t('login.captchaRequired'))\n return\n }\n try {\n const r = await authApi.smsLoginSend({\n phone: smsModel.phone,\n ...(captchaEnabled.value\n ? { captchaId: captchaId.value, captchaCode: captchaCode.value }\n : {}),\n })\n message.success(t('login.smsSent'))\n startCountdown(r.resendSeconds)\n } catch (e) {\n message.error(translateError(e))\n }\n await refreshCaptchaAfterUse()\n}\n\nasync function onSmsSubmit() {\n if (!smsModel.phone || !smsModel.code) {\n message.warning(t('login.smsRequired'))\n return\n }\n loading.value = true\n try {\n await finishLogin(await authApi.smsLogin({ phone: smsModel.phone, code: smsModel.code }))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n</script>\n\n<template>\n <div class=\"login-form\">\n <div v-if=\"showLogo\" class=\"lf-brand\">\n <!-- 站点 logo 的取值顺序(配置 → brand 选项 → 内置矢量标)统一在 SmartLogo 里 -->\n <SmartLogo :size=\"34\" />\n <span class=\"lf-word\">{{ site.title }}</span>\n </div>\n\n <n-alert\n v-if=\"pendingLink\"\n type=\"info\"\n :bordered=\"false\"\n class=\"lf-pending-alert\"\n :title=\"t('oauth.pendingLinkTitle', { name: pendingProviderLabel })\"\n >\n {{ t('oauth.pendingLinkHint', { name: pendingProviderLabel }) }}\n </n-alert>\n\n <!-- 短信二次验证:密码已过,凭挑战 + 短信码完成登录 -->\n <template v-if=\"mode === 'mfa'\">\n <h2 v-if=\"showTitle\" class=\"lf-title\">{{ t('login.mfaTitle', { phone: mfa.phoneMask }) }}</h2>\n <p class=\"lf-hint-line\">{{ t('login.mfaSub') }}</p>\n <n-form @keyup.enter=\"onSubmit\">\n <n-form-item :label=\"t('login.smsCode')\" path=\"code\">\n <n-input\n v-model:value=\"mfa.code\"\n :placeholder=\"t('login.smsCodePlaceholder')\"\n size=\"large\"\n :maxlength=\"6\"\n >\n <template #prefix><Icon icon=\"ph:chat-circle-text\" /></template>\n </n-input>\n </n-form-item>\n <div class=\"row lf-between\">\n <a class=\"lf-link\" @click=\"backToAccount\">{{ t('login.backToPassword') }}</a>\n <a class=\"lf-link\" :class=\"{ 'lf-link-disabled': countdown > 0 }\" @click=\"onMfaResend\">\n {{ countdown > 0 ? t('login.resendAfter', { s: countdown }) : t('login.sendCode') }}\n </a>\n </div>\n <button\n class=\"hero-btn\"\n type=\"button\"\n :style=\"heroStyle\"\n :disabled=\"loading\"\n @click.prevent=\"onSubmit\"\n >\n {{ loading ? t('common.loading') : t('login.submit') }}\n </button>\n </n-form>\n </template>\n\n <!-- TOTP 二次验证:密码已过,凭 Authenticator 动态口令完成登录 -->\n <template v-else-if=\"mode === 'totp'\">\n <h2 v-if=\"showTitle\" class=\"lf-title\">{{ t('login.totpTitle') }}</h2>\n <p class=\"lf-hint-line\">{{ t('login.totpSub') }}</p>\n <n-form @keyup.enter=\"onSubmit\">\n <n-form-item :label=\"t('login.totpCode')\" path=\"code\">\n <n-input\n v-model:value=\"totp.code\"\n :placeholder=\"t('login.totpPlaceholder')\"\n size=\"large\"\n :maxlength=\"6\"\n >\n <template #prefix><Icon icon=\"ph:shield-check\" /></template>\n </n-input>\n </n-form-item>\n <div class=\"row lf-between\">\n <a class=\"lf-link\" @click=\"backToAccount\">{{ t('login.backToPassword') }}</a>\n <a class=\"lf-link\" @click=\"goRecovery\">{{ t('login.useRecovery') }}</a>\n </div>\n <button\n class=\"hero-btn\"\n type=\"button\"\n :style=\"heroStyle\"\n :disabled=\"loading\"\n @click.prevent=\"onSubmit\"\n >\n {{ loading ? t('common.loading') : t('login.submit') }}\n </button>\n </n-form>\n </template>\n\n <template v-else>\n <h2 v-if=\"showTitle\" class=\"lf-title\">{{ t('login.title') }}</h2>\n <n-form :model=\"mode === 'account' ? model : smsModel\" @keyup.enter=\"onSubmit\">\n <template v-if=\"mode === 'account'\">\n <n-form-item :label=\"t('login.account')\" path=\"account\">\n <n-input\n v-model:value=\"model.account\"\n :placeholder=\"t('login.accountPlaceholder')\"\n size=\"large\"\n >\n <template #prefix><Icon icon=\"ph:user\" /></template>\n </n-input>\n </n-form-item>\n <n-form-item :label=\"t('login.password')\" path=\"password\">\n <n-input\n v-model:value=\"model.password\"\n type=\"password\"\n show-password-on=\"click\"\n :placeholder=\"t('login.passwordPlaceholder')\"\n size=\"large\"\n >\n <template #prefix><Icon icon=\"ph:lock\" /></template>\n </n-input>\n </n-form-item>\n </template>\n <template v-else>\n <n-form-item :label=\"t('login.phone')\" path=\"phone\">\n <n-input\n v-model:value=\"smsModel.phone\"\n :placeholder=\"t('login.phonePlaceholder')\"\n size=\"large\"\n :maxlength=\"20\"\n >\n <template #prefix><Icon icon=\"ph:device-mobile\" /></template>\n </n-input>\n </n-form-item>\n </template>\n <n-form-item v-if=\"captchaEnabled\" :label=\"t('login.captcha')\" path=\"captcha\">\n <div class=\"lf-captcha\">\n <n-input\n v-model:value=\"captchaCode\"\n :placeholder=\"captchaHint\"\n size=\"large\"\n @keyup.enter=\"onSubmit\"\n >\n <template #prefix><Icon icon=\"ph:shield-check\" /></template>\n </n-input>\n <!-- SVG 来自本站后端;点击重取一张(一次性票据) -->\n <button\n type=\"button\"\n class=\"lf-captcha-img\"\n :title=\"t('login.captchaPlaceholder')\"\n @click=\"loadCaptcha\"\n v-html=\"captchaSvg\"\n />\n </div>\n </n-form-item>\n <n-form-item v-if=\"mode === 'sms'\" :label=\"t('login.smsCode')\" path=\"code\">\n <div class=\"lf-captcha\">\n <n-input\n v-model:value=\"smsModel.code\"\n :placeholder=\"t('login.smsCodePlaceholder')\"\n size=\"large\"\n :maxlength=\"6\"\n >\n <template #prefix><Icon icon=\"ph:chat-circle-text\" /></template>\n </n-input>\n <button\n type=\"button\"\n class=\"lf-send-btn\"\n :disabled=\"countdown > 0\"\n @click=\"onSendSmsCode\"\n >\n {{ countdown > 0 ? t('login.resendAfter', { s: countdown }) : t('login.sendCode') }}\n </button>\n </div>\n </n-form-item>\n <div class=\"row lf-between\">\n <n-checkbox v-if=\"mode === 'account'\" v-model:checked=\"model.remember\">\n {{ t('login.remember') }}\n </n-checkbox>\n <span v-else />\n <a\n v-if=\"site.smsLoginEnabled\"\n class=\"lf-link\"\n @click=\"mode = mode === 'account' ? 'sms' : 'account'\"\n >\n {{ mode === 'account' ? t('login.smsLogin') : t('login.accountLogin') }}\n </a>\n </div>\n <button\n class=\"hero-btn\"\n type=\"button\"\n :style=\"heroStyle\"\n :disabled=\"loading\"\n @click.prevent=\"onSubmit\"\n >\n {{ loading ? t('common.loading') : t('login.submit') }}\n </button>\n </n-form>\n\n <!-- 第三方登录:Gitee 风圆标;<a href>。PREVIEW_ALL_SSO_BRANDS 时展示全部品牌图。 -->\n <template v-if=\"ssoDisplayList.length\">\n <div class=\"lf-divider\">\n <span>{{ t('login.otherMethods') }}</span>\n </div>\n <div class=\"lf-sso\">\n <a\n v-for=\"p in ssoSplit.visible\"\n :key=\"p.code\"\n class=\"lf-sso-btn\"\n :href=\"ssoHref(p.code)\"\n :title=\"p.displayName\"\n :aria-label=\"p.displayName\"\n >\n <BrandIcon :code=\"p.code\" :icon=\"p.icon\" :size=\"32\" />\n </a>\n <n-dropdown\n v-if=\"ssoSplit.overflow.length\"\n trigger=\"click\"\n :options=\"ssoOverflowOptions\"\n @select=\"onSsoOverflow\"\n >\n <a\n class=\"lf-sso-btn lf-sso-more\"\n href=\"javascript:void(0)\"\n role=\"button\"\n :title=\"t('login.moreMethods')\"\n :aria-label=\"t('login.moreMethods')\"\n @click.prevent\n >\n <Icon icon=\"ph:dots-three-bold\" :width=\"18\" />\n </a>\n </n-dropdown>\n </div>\n </template>\n </template>\n\n <!-- 页脚:版权(可选链接)+ 构建期版本号。皮肤自绘页脚时(如双栏)传 :show-footer=\"false\" 关掉。 -->\n <footer v-if=\"showFooter\" class=\"lf-foot\">\n <span>\n © {{ year }}\n <a v-if=\"site.copyrightUrl\" :href=\"site.copyrightUrl\" target=\"_blank\" rel=\"noopener\">\n {{ site.copyright || site.title }}\n </a>\n <template v-else>{{ site.copyright || site.title }}</template>\n </span>\n <span v-if=\"appVersion\" class=\"lf-ver\">v{{ appVersion }}</span>\n </footer>\n\n <!-- 强制 MFA 未绑定(40020):遮罩 Modal,账密表单仍在底下;默认登录页不常驻绑定链接 -->\n <n-modal\n v-model:show=\"bindRequiredShow\"\n preset=\"dialog\"\n type=\"warning\"\n :title=\"t('login.totpBindTitle')\"\n :content=\"t('login.totpBindSub')\"\n :positive-text=\"t('login.setupAuthenticator')\"\n :negative-text=\"t('common.cancel')\"\n @positive-click=\"goBindAuthenticator\"\n @negative-click=\"closeBindRequired\"\n />\n <!-- pending-link:登录后显式确认绑定,防静默抢绑 -->\n <n-modal\n v-model:show=\"pendingConfirmShow\"\n preset=\"dialog\"\n type=\"info\"\n :title=\"t('oauth.pendingLinkConfirmTitle')\"\n :content=\"\n t('oauth.pendingLinkConfirmContent', {\n name: pendingProviderLabel,\n identity: pendingConfirmIdentity,\n account: user.userInfo?.account ?? '',\n })\n \"\n :positive-text=\"t('oauth.pendingLinkConfirmOk')\"\n :negative-text=\"t('oauth.pendingLinkConfirmSkip')\"\n :loading=\"pendingClaimBusy\"\n :closable=\"false\"\n :mask-closable=\"false\"\n @positive-click=\"confirmPendingBind\"\n @negative-click=\"skipPendingBind\"\n />\n </div>\n</template>\n\n<style scoped>\n/* 文字色默认跟随应用令牌;皮肤可通过 --lf-title / --lf-hint 覆盖(如极光深色皮肤强制浅色)。 */\n.login-form {\n width: 100%;\n}\n.lf-pending-alert {\n margin-bottom: 16px;\n border-radius: 10px;\n text-align: left;\n}\n.lf-brand {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 18px;\n}\n/* 后台配置的品牌 logo:限高与内置矢量 logo 齐平,宽度自适应不变形 */\n.lf-word {\n font-size: 22px;\n font-weight: 700;\n letter-spacing: 0.2px;\n color: var(--lf-title, var(--color-text-primary));\n}\n.lf-title {\n font-size: var(--font-size-lg);\n font-weight: 600;\n margin: 0 0 22px;\n color: var(--lf-title, var(--color-text-primary));\n}\n/* 二次验证副标题:标题下的弱化说明行 */\n.lf-hint-line {\n margin: -14px 0 18px;\n font-size: 13px;\n color: var(--lf-hint, var(--color-text-tertiary));\n}\n.row {\n margin: 4px 0 20px;\n}\n.lf-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n/* 模式切换/重发:文字链接,复用主题色 */\n.lf-link {\n font-size: 13px;\n color: var(--color-primary);\n cursor: pointer;\n user-select: none;\n}\n.lf-link:hover {\n opacity: 0.85;\n}\n.lf-link-disabled {\n color: var(--lf-hint, var(--color-text-tertiary));\n cursor: default;\n pointer-events: none;\n}\n/* 验证码:输入框 + 可点击刷新的 SVG 图形(等高对齐) */\n.lf-captcha {\n display: flex;\n gap: 10px;\n width: 100%;\n align-items: stretch;\n}\n.lf-captcha-img {\n flex: 0 0 auto;\n height: 40px;\n min-width: 96px;\n padding: 0;\n border: 1px solid var(--lf-border, var(--color-border));\n border-radius: var(--radius-md);\n background: #fff;\n cursor: pointer;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.lf-captcha-img :deep(svg) {\n height: 100%;\n width: auto;\n}\n/* 发码按钮:与验证码图形同尺寸位,文字化 */\n.lf-send-btn {\n flex: 0 0 auto;\n height: 40px;\n min-width: 96px;\n padding: 0 12px;\n border: 1px solid var(--lf-border, var(--color-border));\n border-radius: var(--radius-md);\n background: var(--color-fill);\n font-size: 13px;\n color: var(--lf-title, var(--color-text-secondary));\n cursor: pointer;\n transition:\n border-color var(--transition-fast),\n color var(--transition-fast);\n}\n.lf-send-btn:hover:not(:disabled) {\n border-color: var(--color-primary);\n color: var(--color-primary);\n}\n.lf-send-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.hero-btn {\n width: 100%;\n height: 48px;\n border: none;\n border-radius: var(--radius-md);\n color: #fff;\n font-size: var(--font-size-md);\n font-weight: 600;\n cursor: pointer;\n transition:\n transform var(--transition-fast),\n box-shadow var(--transition-fast);\n}\n.hero-btn:hover {\n transform: translateY(-2px);\n}\n.hero-btn:active {\n transform: translateY(0);\n}\n.hero-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n/* 第三方登录:分隔线 + 等宽按钮(设计稿 §Variant A) */\n.lf-divider {\n display: flex;\n align-items: center;\n gap: 14px;\n margin: 24px 0 16px;\n}\n.lf-divider::before,\n.lf-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--lf-border, var(--color-border));\n}\n.lf-divider span {\n font-size: 12px;\n color: var(--lf-hint, var(--color-text-tertiary));\n}\n.lf-sso {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 12px; /* 贴近 Gitee 一排小圆间距 */\n}\n/* Gitee 风:约 32px 圆标,比默认尺寸更紧凑 */\n.lf-sso-btn {\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n overflow: hidden;\n box-sizing: border-box;\n flex-shrink: 0;\n}\n/* 不 hover 放大(Gitee 同款静态圆标) */\n.lf-sso-btn:hover {\n text-decoration: none;\n color: inherit;\n}\n.lf-sso-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.lf-sso-more {\n width: 32px;\n height: 32px;\n border: 1px solid var(--lf-border, var(--color-border));\n background: var(--color-fill, #f5f5f5);\n color: var(--color-text-tertiary, #999);\n}\n/* 页脚:版权 + 版本号,弱化色,与 SSO 区留白 */\n.lf-foot {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n margin-top: 24px;\n font-size: 12px;\n color: var(--lf-hint, var(--color-text-tertiary));\n}\n.lf-foot a {\n color: inherit;\n text-decoration: none;\n}\n.lf-foot a:hover {\n color: var(--color-primary);\n}\n.lf-ver {\n opacity: 0.75;\n}\n</style>\n"],"names":["router","useRouter","route","useRoute","message","useMessage","useI18n","user","useUserStore","auth","useAuthStore","app","useAppStore","site","appVersion","loadSite","useSite","year","pendingLink","computed","pendingProvider","pendingDisplayName","pendingConfirmShow","ref","pendingClaimBusy","pendingClaimToken","model","reactive","runtime","loading","mode","smsModel","mfa","totp","bindRequiredShow","bindAccount","countdown","timer","startCountdown","s","onBeforeUnmount","captchaEnabled","captchaId","captchaSvg","captchaCode","captchaType","captchaHint","loadCaptcha","c","authApi","refreshCaptchaAfterUse","onMounted","loadSsoProviders","q","ch","heroStyle","btnGrad","glowSh","ssoProviders","pendingProviderLabel","code","hit","p","ssoDisplayList","ssoSplit","splitLoginProviders","ssoOverflowOptions","h","BrandIcon","externalAuthApi","claimWeComAutoLogin","ssoHref","onSsoOverflow","key","enterHome","finishLogin","res","resetRouter","link","pendingConfirmIdentity","confirmPendingBind","e","translateError","skipPendingBind","onSubmit","onMfaSubmit","onTotpSubmit","onSmsSubmit","ApiError","closeBindRequired","goBindAuthenticator","account","goRecovery","onMfaResend","r","backToAccount","onSendSmsCode","_openBlock","_createElementBlock","_hoisted_1","__props","_hoisted_2","_createVNode","SmartLogo","_createElementVNode","_hoisted_3","_toDisplayString","_unref","_createBlock","NAlert","_createTextVNode","_Fragment","_hoisted_4","_hoisted_5","NForm","NFormItem","NInput","_cache","$event","Icon","_hoisted_6","_normalizeClass","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_15","_hoisted_16","_hoisted_17","NCheckbox","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_renderList","NDropdown","_hoisted_24","_hoisted_25","_hoisted_26","NModal"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./index2.vue.js";
2
+ /* empty css */
3
+ import t from "../../_virtual/_plugin-vue_export-helper.js";
4
+ const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-846afb99"]]);
5
+ export {
6
+ m as default
7
+ };
8
+ //# sourceMappingURL=index.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,79 @@
1
+ import { defineComponent as f, ref as v, watch as C, computed as N, openBlock as c, createElementBlock as u, createBlock as S, resolveDynamicComponent as w, createElementVNode as r, unref as t, Fragment as y, renderList as D, normalizeClass as I, toDisplayString as p, createVNode as m, withCtx as d, createTextVNode as g } from "vue";
2
+ import { NTooltip as _ } from "naive-ui";
3
+ import { Icon as x } from "@iconify/vue";
4
+ import { useI18n as E } from "vue-i18n";
5
+ import { useAppStore as L } from "../../stores/app.js";
6
+ import { LOGIN_SKINS as s, DEFAULT_SKIN as z } from "./skins.js";
7
+ const B = { class: "login-shell" }, K = { class: "login-topbar" }, T = ["aria-label"], U = ["aria-selected", "onClick"], V = { class: "login-tools" }, $ = ["aria-label"], A = ["aria-label"], k = "login-skin", H = /* @__PURE__ */ f({
8
+ __name: "index",
9
+ setup(F) {
10
+ const l = L(), { t: o } = E();
11
+ function b() {
12
+ const a = new URLSearchParams(window.location.search).get("skin");
13
+ if (a && s.some((e) => e.id === a)) return a;
14
+ const n = localStorage.getItem(k);
15
+ return n && s.some((e) => e.id === n) ? n : z;
16
+ }
17
+ const i = v(b());
18
+ C(i, (a) => localStorage.setItem(k, a));
19
+ const h = N(() => s.find((a) => a.id === i.value) ?? s[0]);
20
+ return (a, n) => (c(), u("div", B, [
21
+ (c(), S(w(h.value.component))),
22
+ r("div", K, [
23
+ r("div", {
24
+ class: "skin-switch",
25
+ role: "tablist",
26
+ "aria-label": t(o)("app.loginStyle")
27
+ }, [
28
+ (c(!0), u(y, null, D(t(s), (e) => (c(), u("button", {
29
+ key: e.id,
30
+ class: I(["skin-seg", { active: e.id === i.value }]),
31
+ type: "button",
32
+ role: "tab",
33
+ "aria-selected": e.id === i.value,
34
+ onClick: (q) => i.value = e.id
35
+ }, p(t(o)(e.label)), 11, U))), 128))
36
+ ], 8, T),
37
+ r("div", V, [
38
+ m(t(_), null, {
39
+ trigger: d(() => [
40
+ r("button", {
41
+ class: "tool-btn",
42
+ type: "button",
43
+ "aria-label": t(l).isDark ? t(o)("app.light") : t(o)("app.dark"),
44
+ onClick: n[0] || (n[0] = (e) => t(l).toggleDark())
45
+ }, [
46
+ m(t(x), {
47
+ icon: t(l).isDark ? "ph:moon-stars" : "ph:sun",
48
+ width: 18
49
+ }, null, 8, ["icon"])
50
+ ], 8, $)
51
+ ]),
52
+ default: d(() => [
53
+ g(" " + p(t(l).isDark ? t(o)("app.light") : t(o)("app.dark")), 1)
54
+ ]),
55
+ _: 1
56
+ }),
57
+ m(t(_), null, {
58
+ trigger: d(() => [
59
+ r("button", {
60
+ class: "tool-btn tool-lang",
61
+ type: "button",
62
+ "aria-label": t(o)("app.language"),
63
+ onClick: n[1] || (n[1] = (e) => t(l).setLocale(t(l).locale === "zh-CN" ? "en-US" : "zh-CN"))
64
+ }, p(t(l).locale === "zh-CN" ? "中" : "EN"), 9, A)
65
+ ]),
66
+ default: d(() => [
67
+ g(" " + p(t(o)("app.language")), 1)
68
+ ]),
69
+ _: 1
70
+ })
71
+ ])
72
+ ])
73
+ ]));
74
+ }
75
+ });
76
+ export {
77
+ H as default
78
+ };
79
+ //# sourceMappingURL=index2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../src/views/login/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport { NTooltip } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore } from '#/stores/app'\nimport { LOGIN_SKINS, DEFAULT_SKIN } from './skins'\n\nconst KEY = 'login-skin'\nconst app = useAppStore()\nconst { t } = useI18n()\n\nfunction initSkin(): string {\n // ?skin= 一次性覆盖(便于对比预览),否则读记忆,再回退默认。\n const q = new URLSearchParams(window.location.search).get('skin')\n if (q && LOGIN_SKINS.some(s => s.id === q)) return q\n const saved = localStorage.getItem(KEY)\n if (saved && LOGIN_SKINS.some(s => s.id === saved)) return saved\n return DEFAULT_SKIN\n}\n\nconst skin = ref(initSkin())\nwatch(skin, v => localStorage.setItem(KEY, v))\n\nconst active = computed(() => LOGIN_SKINS.find(s => s.id === skin.value) ?? LOGIN_SKINS[0])\n</script>\n\n<template>\n <div class=\"login-shell\">\n <component :is=\"active.component\" />\n\n <!-- 右上角工具栏:皮肤切换 + 主题/语言,三枚磨砂药丸并排(主题/语言贴最右角)。 -->\n <div class=\"login-topbar\">\n <!-- 皮肤切换器:深色磨砂药丸,在明/暗/极光三种底色上都可读 -->\n <div class=\"skin-switch\" role=\"tablist\" :aria-label=\"t('app.loginStyle')\">\n <button\n v-for=\"s in LOGIN_SKINS\"\n :key=\"s.id\"\n class=\"skin-seg\"\n :class=\"{ active: s.id === skin }\"\n type=\"button\"\n role=\"tab\"\n :aria-selected=\"s.id === skin\"\n @click=\"skin = s.id\"\n >\n {{ t(s.label) }}\n </button>\n </div>\n\n <!-- 全局工具:主题 + 语言。深色磨砂药丸,在明/暗/极光三种底色上都可读,三种皮肤通用。 -->\n <div class=\"login-tools\">\n <n-tooltip>\n <template #trigger>\n <button\n class=\"tool-btn\"\n type=\"button\"\n :aria-label=\"app.isDark ? t('app.light') : t('app.dark')\"\n @click=\"app.toggleDark()\"\n >\n <Icon :icon=\"app.isDark ? 'ph:moon-stars' : 'ph:sun'\" :width=\"18\" />\n </button>\n </template>\n {{ app.isDark ? t('app.light') : t('app.dark') }}\n </n-tooltip>\n <n-tooltip>\n <template #trigger>\n <button\n class=\"tool-btn tool-lang\"\n type=\"button\"\n :aria-label=\"t('app.language')\"\n @click=\"app.setLocale(app.locale === 'zh-CN' ? 'en-US' : 'zh-CN')\"\n >\n {{ app.locale === 'zh-CN' ? '中' : 'EN' }}\n </button>\n </template>\n {{ t('app.language') }}\n </n-tooltip>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.login-shell {\n position: relative;\n height: 100dvh;\n overflow: hidden;\n}\n/* 右上角工具栏:皮肤切换 + 主题/语言并排靠右;窄屏放不下时换行仍右对齐,不横向溢出。 */\n.login-topbar {\n position: fixed;\n top: 20px;\n right: 24px;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-wrap: wrap;\n gap: 10px;\n}\n/* 全局工具药丸,与皮肤切换器同款磨砂,自带对比,三底色皆可读 */\n.login-tools {\n display: flex;\n gap: 2px;\n padding: 4px;\n border-radius: 999px;\n background: rgba(18, 20, 28, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.14);\n backdrop-filter: blur(14px);\n -webkit-backdrop-filter: blur(14px);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.28);\n}\n.tool-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 34px;\n height: 30px;\n padding: 0 10px;\n border: none;\n cursor: pointer;\n border-radius: 999px;\n background: transparent;\n font-size: 13px;\n font-weight: 600;\n color: rgba(255, 255, 255, 0.62);\n transition:\n color 0.2s,\n background 0.2s;\n}\n.tool-btn:hover {\n color: #fff;\n}\n.tool-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n/* ponytail: 固定深色药丸自带对比,纯白 spotlight 右上角也够读;若极端不够再补浅色 scrim */\n.skin-switch {\n display: flex;\n gap: 2px;\n padding: 4px;\n border-radius: 999px;\n background: rgba(18, 20, 28, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.14);\n backdrop-filter: blur(14px);\n -webkit-backdrop-filter: blur(14px);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.28);\n}\n.skin-seg {\n border: none;\n cursor: pointer;\n padding: 6px 16px;\n border-radius: 999px;\n background: transparent;\n font-size: 13px;\n font-weight: 600;\n color: rgba(255, 255, 255, 0.62);\n transition:\n color 0.2s,\n background 0.2s;\n}\n.skin-seg:hover {\n color: #fff;\n}\n.skin-seg.active {\n background: var(--color-primary);\n color: #fff;\n}\n</style>\n"],"names":["KEY","app","useAppStore","t","useI18n","initSkin","q","LOGIN_SKINS","s","saved","DEFAULT_SKIN","skin","ref","watch","v","active","computed","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_resolveDynamicComponent","_createElementVNode","_hoisted_2","_unref","_Fragment","_renderList","$event","_hoisted_4","_hoisted_5","_createVNode","NTooltip","_cache","Icon","_createTextVNode","_toDisplayString","_hoisted_7"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./AuroraGlass2.vue.js";
2
+ /* empty css */
3
+ import r from "../../../_virtual/_plugin-vue_export-helper.js";
4
+ const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-e994c489"]]);
5
+ export {
6
+ m as default
7
+ };
8
+ //# sourceMappingURL=AuroraGlass.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuroraGlass.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,80 @@
1
+ import { defineComponent as v, computed as t, openBlock as b, createElementBlock as p, normalizeStyle as u, normalizeClass as C, unref as s, createStaticVNode as x, createElementVNode as c, createVNode as i, withCtx as g } from "vue";
2
+ import { darkTheme as f, NConfigProvider as h } from "naive-ui";
3
+ import { useAppStore as F } from "../../../stores/app.js";
4
+ import { rgba as r, mix as a } from "../../../theme/mix.js";
5
+ import k from "../LoginForm.vue.js";
6
+ const E = { class: "aurora-content" }, _ = { class: "glass-card" }, B = /* @__PURE__ */ v({
7
+ __name: "AuroraGlass",
8
+ setup($) {
9
+ const o = F(), n = t(() => ({
10
+ "--a1": r(o.accent, 0.55),
11
+ "--a2": r(a(o.accent, "#8B5CF6", 0.65), 0.5),
12
+ "--a3": r(a(o.accent, "#22D3EE", 0.55), 0.45),
13
+ "--a4": r(a(o.accent, "#EC4899", 0.6), 0.4)
14
+ })), d = t(() => o.isDark ? f : null), l = t(() => ({
15
+ primaryColor: o.accent,
16
+ primaryColorHover: a(o.accent, "#ffffff", 0.16),
17
+ primaryColorPressed: a(o.accent, "#000000", 0.18)
18
+ })), m = t(
19
+ () => o.isDark ? {
20
+ common: l.value,
21
+ Input: {
22
+ color: "rgba(255, 255, 255, 0.06)",
23
+ colorFocus: "rgba(255, 255, 255, 0.1)",
24
+ textColor: "rgba(255, 255, 255, 0.92)",
25
+ placeholderColor: "rgba(255, 255, 255, 0.4)",
26
+ iconColor: "rgba(255, 255, 255, 0.5)",
27
+ border: "1px solid rgba(255, 255, 255, 0.14)",
28
+ borderHover: `1px solid ${r(o.accent, 0.6)}`,
29
+ borderFocus: `1px solid ${o.accent}`,
30
+ boxShadowFocus: `0 0 0 2px ${r(o.accent, 0.25)}`,
31
+ caretColor: o.accent
32
+ },
33
+ Form: { labelTextColor: "rgba(255, 255, 255, 0.78)" },
34
+ Checkbox: { textColor: "rgba(255, 255, 255, 0.7)" }
35
+ } : {
36
+ common: l.value,
37
+ Input: {
38
+ color: "rgba(255, 255, 255, 0.5)",
39
+ colorFocus: "rgba(255, 255, 255, 0.8)",
40
+ textColor: "#1D2129",
41
+ placeholderColor: "rgba(0, 0, 0, 0.4)",
42
+ iconColor: "rgba(0, 0, 0, 0.4)",
43
+ border: "1px solid rgba(0, 0, 0, 0.1)",
44
+ borderHover: `1px solid ${r(o.accent, 0.5)}`,
45
+ borderFocus: `1px solid ${o.accent}`,
46
+ boxShadowFocus: `0 0 0 2px ${r(o.accent, 0.2)}`,
47
+ caretColor: o.accent
48
+ },
49
+ Form: { labelTextColor: "#4E5969" },
50
+ Checkbox: { textColor: "#4E5969" }
51
+ }
52
+ );
53
+ return (y, e) => (b(), p("div", {
54
+ class: C(["aurora", { light: !s(o).isDark }]),
55
+ style: u(n.value)
56
+ }, [
57
+ e[1] || (e[1] = x('<div class="aurora-bg" data-v-e994c489></div><div class="stars" data-v-e994c489></div><div class="orb orb-1" data-v-e994c489></div><div class="orb orb-2" data-v-e994c489></div><div class="orb orb-3" data-v-e994c489></div>', 5)),
58
+ c("div", E, [
59
+ e[0] || (e[0] = c("div", { class: "halo" }, null, -1)),
60
+ i(s(h), {
61
+ theme: d.value,
62
+ "theme-overrides": m.value,
63
+ "inherit-theme-overrides": !1
64
+ }, {
65
+ default: g(() => [
66
+ c("div", _, [
67
+ i(k)
68
+ ])
69
+ ]),
70
+ _: 1
71
+ }, 8, ["theme", "theme-overrides"])
72
+ ]),
73
+ e[2] || (e[2] = c("div", { class: "grain" }, null, -1))
74
+ ], 6));
75
+ }
76
+ });
77
+ export {
78
+ B as default
79
+ };
80
+ //# sourceMappingURL=AuroraGlass2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuroraGlass2.vue.js","sources":["../../../../src/views/login/skins/AuroraGlass.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { NConfigProvider, darkTheme } from 'naive-ui'\nimport type { GlobalThemeOverrides } from 'naive-ui'\nimport { useAppStore } from '#/stores/app'\nimport { mix, rgba } from '#/theme/mix'\nimport LoginForm from '../LoginForm.vue'\n\nconst app = useAppStore()\n\n// 极光四色:accent + 派生紫/青/品红,随主题色联动。\nconst vars = computed(() => ({\n '--a1': rgba(app.accent, 0.55),\n '--a2': rgba(mix(app.accent, '#8B5CF6', 0.65), 0.5),\n '--a3': rgba(mix(app.accent, '#22D3EE', 0.55), 0.45),\n '--a4': rgba(mix(app.accent, '#EC4899', 0.6), 0.4),\n}))\n\n// 跟随应用明暗:深色用 darkTheme,浅色用 Naive 默认(null)。inherit=false 隔离应用根 overrides。\nconst naiveTheme = computed(() => (app.isDark ? darkTheme : null))\n\n// accent 派生主色两套共用。\nconst common = computed(() => ({\n primaryColor: app.accent,\n primaryColorHover: mix(app.accent, '#ffffff', 0.16),\n primaryColorPressed: mix(app.accent, '#000000', 0.18),\n}))\n\n// 输入框做成玻璃上的半透明观感 + accent 聚焦,深/浅两套。\n// ponytail: 浅色分支硬编码了 text-primary(#1D2129)/secondary(#4E5969) 令牌值,tokens 若改需同步\nconst glassTheme = computed<GlobalThemeOverrides>(() =>\n app.isDark\n ? {\n common: common.value,\n Input: {\n color: 'rgba(255, 255, 255, 0.06)',\n colorFocus: 'rgba(255, 255, 255, 0.1)',\n textColor: 'rgba(255, 255, 255, 0.92)',\n placeholderColor: 'rgba(255, 255, 255, 0.4)',\n iconColor: 'rgba(255, 255, 255, 0.5)',\n border: '1px solid rgba(255, 255, 255, 0.14)',\n borderHover: `1px solid ${rgba(app.accent, 0.6)}`,\n borderFocus: `1px solid ${app.accent}`,\n boxShadowFocus: `0 0 0 2px ${rgba(app.accent, 0.25)}`,\n caretColor: app.accent,\n },\n Form: { labelTextColor: 'rgba(255, 255, 255, 0.78)' },\n Checkbox: { textColor: 'rgba(255, 255, 255, 0.7)' },\n }\n : {\n common: common.value,\n Input: {\n color: 'rgba(255, 255, 255, 0.5)',\n colorFocus: 'rgba(255, 255, 255, 0.8)',\n textColor: '#1D2129',\n placeholderColor: 'rgba(0, 0, 0, 0.4)',\n iconColor: 'rgba(0, 0, 0, 0.4)',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n borderHover: `1px solid ${rgba(app.accent, 0.5)}`,\n borderFocus: `1px solid ${app.accent}`,\n boxShadowFocus: `0 0 0 2px ${rgba(app.accent, 0.2)}`,\n caretColor: app.accent,\n },\n Form: { labelTextColor: '#4E5969' },\n Checkbox: { textColor: '#4E5969' },\n },\n)\n</script>\n\n<template>\n <div class=\"aurora\" :class=\"{ light: !app.isDark }\" :style=\"vars\">\n <div class=\"aurora-bg\" />\n <div class=\"stars\" />\n <div class=\"orb orb-1\" />\n <div class=\"orb orb-2\" />\n <div class=\"orb orb-3\" />\n <div class=\"aurora-content\">\n <div class=\"halo\" />\n <n-config-provider\n :theme=\"naiveTheme\"\n :theme-overrides=\"glassTheme\"\n :inherit-theme-overrides=\"false\"\n >\n <div class=\"glass-card\">\n <LoginForm />\n </div>\n </n-config-provider>\n </div>\n <div class=\"grain\" />\n </div>\n</template>\n\n<style scoped>\n.aurora {\n position: relative;\n height: 100dvh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background: radial-gradient(140% 120% at 50% 0%, #12162b 0%, #0a0b12 55%, #06060c 100%);\n}\n/* 细网格,中心遮罩淡出 */\n.aurora::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background-image:\n linear-gradient(rgba(255, 255, 255, 0.045) 1px, transparent 1px),\n linear-gradient(90deg, rgba(255, 255, 255, 0.045) 1px, transparent 1px);\n background-size: 46px 46px;\n -webkit-mask-image: radial-gradient(circle at 50% 45%, #000 0%, transparent 72%);\n mask-image: radial-gradient(circle at 50% 45%, #000 0%, transparent 72%);\n}\n/* 暗角,聚焦中心 */\n.aurora::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n background: radial-gradient(120% 120% at 50% 42%, transparent 52%, rgba(0, 0, 0, 0.6) 100%);\n}\n.aurora-bg {\n position: absolute;\n inset: -20%;\n z-index: 0;\n background:\n radial-gradient(38% 38% at 18% 22%, var(--a1), transparent 68%),\n radial-gradient(42% 42% at 82% 18%, var(--a2), transparent 70%),\n radial-gradient(48% 48% at 60% 88%, var(--a3), transparent 72%),\n radial-gradient(34% 34% at 88% 68%, var(--a4), transparent 66%);\n filter: blur(28px);\n animation: aurora-move 18s ease-in-out infinite alternate;\n}\n@keyframes aurora-move {\n 0% {\n transform: translate3d(-3%, -2%, 0) rotate(0deg) scale(1.05);\n }\n 50% {\n transform: translate3d(3%, 2%, 0) rotate(4deg) scale(1.16);\n }\n 100% {\n transform: translate3d(-2%, 3%, 0) rotate(-3deg) scale(1.08);\n }\n}\n/* 星点微闪 */\n.stars {\n position: absolute;\n inset: 0;\n z-index: 0;\n background-image:\n radial-gradient(1.5px 1.5px at 20% 30%, rgba(255, 255, 255, 0.7), transparent 60%),\n radial-gradient(1px 1px at 70% 62%, rgba(255, 255, 255, 0.5), transparent 60%),\n radial-gradient(1.5px 1.5px at 42% 82%, rgba(255, 255, 255, 0.6), transparent 60%),\n radial-gradient(1px 1px at 85% 22%, rgba(255, 255, 255, 0.5), transparent 60%),\n radial-gradient(1px 1px at 55% 14%, rgba(255, 255, 255, 0.55), transparent 60%),\n radial-gradient(1.5px 1.5px at 12% 66%, rgba(255, 255, 255, 0.5), transparent 60%),\n radial-gradient(1px 1px at 92% 48%, rgba(255, 255, 255, 0.45), transparent 60%);\n animation: twinkle 5s ease-in-out infinite;\n}\n@keyframes twinkle {\n 0%,\n 100% {\n opacity: 0.45;\n }\n 50% {\n opacity: 0.9;\n }\n}\n.orb {\n position: absolute;\n z-index: 0;\n border-radius: 50%;\n filter: blur(55px);\n opacity: 0.55;\n}\n.orb-1 {\n width: 340px;\n height: 340px;\n background: var(--a1);\n top: -60px;\n left: -40px;\n animation: float-y 14s ease-in-out infinite;\n}\n.orb-2 {\n width: 280px;\n height: 280px;\n background: var(--a4);\n bottom: -80px;\n right: -40px;\n animation: float-y 16s ease-in-out infinite reverse;\n}\n.orb-3 {\n width: 200px;\n height: 200px;\n background: var(--a3);\n top: 38%;\n right: 18%;\n animation: float-y 20s ease-in-out infinite;\n}\n@keyframes float-y {\n 0%,\n 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-30px);\n }\n}\n.aurora-content {\n position: relative;\n z-index: 3;\n width: 100%;\n max-width: 520px;\n padding: 24px;\n}\n/* 卡后旋转极光光环(略大于卡片,溢出成辉光环) */\n.halo {\n position: absolute;\n z-index: 0;\n inset: 8px;\n border-radius: 36px;\n background: conic-gradient(from 0deg, var(--a1), var(--a2), var(--a3), var(--a4), var(--a1));\n filter: blur(48px);\n opacity: 0.6;\n animation: spin 16s linear infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.glass-card {\n /* 覆盖共享表单文字色为浅色(玻璃是深的) */\n --lf-title: #fff;\n --lf-hint: rgba(255, 255, 255, 0.5);\n position: relative;\n z-index: 1;\n width: 100%;\n padding: 46px 46px;\n border-radius: 20px;\n background: rgba(255, 255, 255, 0.07);\n border: 1px solid rgba(255, 255, 255, 0.14);\n backdrop-filter: blur(26px) saturate(150%);\n -webkit-backdrop-filter: blur(26px) saturate(150%);\n box-shadow:\n 0 30px 80px rgba(0, 0, 0, 0.55),\n 0 0 60px -12px var(--a2),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n overflow: hidden;\n}\n/* accent 渐变发光边框 */\n.glass-card::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: 20px;\n padding: 1px;\n background: linear-gradient(135deg, var(--a1), transparent 45%, var(--a2));\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n pointer-events: none;\n opacity: 0.9;\n}\n/* 玻璃表面缓慢流光 */\n.glass-card::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 2;\n pointer-events: none;\n background: linear-gradient(\n 120deg,\n transparent 36%,\n rgba(255, 255, 255, 0.1) 48%,\n transparent 60%\n );\n background-size: 220% 100%;\n background-repeat: no-repeat;\n animation: sheen 8s ease-in-out infinite;\n}\n@keyframes sheen {\n 0% {\n background-position: 180% 0;\n }\n 55%,\n 100% {\n background-position: -60% 0;\n }\n}\n/* 胶片颗粒,消除色带 + 质感 */\n.grain {\n position: absolute;\n inset: 0;\n z-index: 5;\n pointer-events: none;\n opacity: 0.05;\n mix-blend-mode: overlay;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\");\n}\n/* ── 浅色变体(应用浅色主题时)──────────────────────── */\n.aurora.light {\n background: radial-gradient(140% 120% at 50% 0%, #eef1fb 0%, #f6f7fc 55%, #ffffff 100%);\n}\n/* 网格线改深(浅底上可见) */\n.aurora.light::before {\n background-image:\n linear-gradient(rgba(0, 0, 0, 0.05) 1px, transparent 1px),\n linear-gradient(90deg, rgba(0, 0, 0, 0.05) 1px, transparent 1px);\n}\n/* 暗角柔化为冷色微晕(黑暗角在浅底像脏) */\n.aurora.light::after {\n background: radial-gradient(\n 120% 120% at 50% 42%,\n transparent 55%,\n rgba(120, 130, 180, 0.12) 100%\n );\n}\n/* 白星点在浅底不可见,隐藏 */\n.aurora.light .stars {\n display: none;\n}\n/* 光环稍收敛 */\n.aurora.light .halo {\n opacity: 0.5;\n}\n/* 玻璃卡:浅色玻璃 + 深色文字 */\n.aurora.light .glass-card {\n --lf-title: var(--color-text-primary);\n --lf-hint: var(--color-text-tertiary);\n background: rgba(255, 255, 255, 0.62);\n border: 1px solid rgba(214, 218, 235, 0.9);\n box-shadow:\n 0 30px 80px rgba(80, 90, 160, 0.18),\n 0 0 60px -12px var(--a2),\n inset 0 1px 0 rgba(255, 255, 255, 0.9);\n}\n/* 浅色下关掉 accent 遮罩渐变环:mask-composite 在圆角处有细毛边,深色靠辉光盖住、浅色会暴露成\"一层毛边\" */\n.aurora.light .glass-card::before {\n display: none;\n}\n/* 白色流光在浅玻璃上几乎不可见,浅色下关掉 */\n.aurora.light .glass-card::after {\n display: none;\n}\n\n/* 窄屏收紧内边距:默认 46px 卡内边距在 ~360px 手机上会挤压表单 */\n@media (max-width: 480px) {\n .aurora-content {\n padding: 16px;\n }\n .glass-card {\n padding: 32px 24px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .aurora-bg,\n .orb,\n .stars,\n .halo,\n .glass-card::after {\n animation: none;\n }\n .glass-card::after {\n display: none;\n }\n}\n</style>\n"],"names":["app","useAppStore","vars","computed","rgba","mix","naiveTheme","darkTheme","common","glassTheme","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_createVNode","NConfigProvider","_hoisted_2","LoginForm"],"mappings":";;;;;;;;AAQA,UAAMA,IAAMC,EAAA,GAGNC,IAAOC,EAAS,OAAO;AAAA,MAC3B,QAAQC,EAAKJ,EAAI,QAAQ,IAAI;AAAA,MAC7B,QAAQI,EAAKC,EAAIL,EAAI,QAAQ,WAAW,IAAI,GAAG,GAAG;AAAA,MAClD,QAAQI,EAAKC,EAAIL,EAAI,QAAQ,WAAW,IAAI,GAAG,IAAI;AAAA,MACnD,QAAQI,EAAKC,EAAIL,EAAI,QAAQ,WAAW,GAAG,GAAG,GAAG;AAAA,IAAA,EACjD,GAGIM,IAAaH,EAAS,MAAOH,EAAI,SAASO,IAAY,IAAK,GAG3DC,IAASL,EAAS,OAAO;AAAA,MAC7B,cAAcH,EAAI;AAAA,MAClB,mBAAmBK,EAAIL,EAAI,QAAQ,WAAW,IAAI;AAAA,MAClD,qBAAqBK,EAAIL,EAAI,QAAQ,WAAW,IAAI;AAAA,IAAA,EACpD,GAIIS,IAAaN;AAAA,MAA+B,MAChDH,EAAI,SACA;AAAA,QACE,QAAQQ,EAAO;AAAA,QACf,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,aAAa,aAAaJ,EAAKJ,EAAI,QAAQ,GAAG,CAAC;AAAA,UAC/C,aAAa,aAAaA,EAAI,MAAM;AAAA,UACpC,gBAAgB,aAAaI,EAAKJ,EAAI,QAAQ,IAAI,CAAC;AAAA,UACnD,YAAYA,EAAI;AAAA,QAAA;AAAA,QAElB,MAAM,EAAE,gBAAgB,4BAAA;AAAA,QACxB,UAAU,EAAE,WAAW,2BAAA;AAAA,MAA2B,IAEpD;AAAA,QACE,QAAQQ,EAAO;AAAA,QACf,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,aAAa,aAAaJ,EAAKJ,EAAI,QAAQ,GAAG,CAAC;AAAA,UAC/C,aAAa,aAAaA,EAAI,MAAM;AAAA,UACpC,gBAAgB,aAAaI,EAAKJ,EAAI,QAAQ,GAAG,CAAC;AAAA,UAClD,YAAYA,EAAI;AAAA,QAAA;AAAA,QAElB,MAAM,EAAE,gBAAgB,UAAA;AAAA,QACxB,UAAU,EAAE,WAAW,UAAA;AAAA,MAAU;AAAA,IACnC;2BAKJU,EAmBM,OAAA;AAAA,MAnBD,OAAKC,EAAA,CAAC,UAAQ,EAAA,OAAA,CAAmBC,EAAAZ,CAAA,EAAI,OAAA,CAAM,CAAA;AAAA,MAAK,SAAOE,EAAA,KAAI;AAAA,IAAA;;MAM9DW,EAWM,OAXNC,GAWM;AAAA,wBAVJD,EAAoB,OAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,QACjBE,EAQoBH,EAAAI,CAAA,GAAA;AAAA,UAPjB,OAAOV,EAAA;AAAA,UACP,mBAAiBG,EAAA;AAAA,UACjB,2BAAyB;AAAA,QAAA;qBAE1B,MAEM;AAAA,YAFNI,EAEM,OAFNI,GAEM;AAAA,cADJF,EAAaG,CAAA;AAAA,YAAA;;;;;sBAInBL,EAAqB,OAAA,EAAhB,OAAM,WAAO,MAAA,EAAA;AAAA,IAAA;;;"}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./SplitPanel2.vue.js";
2
+ /* empty css */
3
+ import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
+ const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-9b2b9733"]]);
5
+ export {
6
+ m as default
7
+ };
8
+ //# sourceMappingURL=SplitPanel.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitPanel.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,85 @@
1
+ import { defineComponent as b, computed as h, openBlock as l, createElementBlock as i, normalizeStyle as a, createElementVNode as t, createVNode as p, toDisplayString as o, unref as e, createTextVNode as r, Fragment as u, renderList as k, createCommentVNode as w } from "vue";
2
+ import { Icon as S } from "@iconify/vue";
3
+ import { useI18n as V } from "vue-i18n";
4
+ import { useAppStore as x } from "../../../stores/app.js";
5
+ import { useSite as F } from "../../../composables/useSite.js";
6
+ import { rgba as f, mix as N } from "../../../theme/mix.js";
7
+ import P from "../../../components/SmartLogo.vue.js";
8
+ import B from "../LoginForm.vue.js";
9
+ const C = { class: "panel" }, L = { class: "panel-inner" }, z = { class: "logo" }, A = { class: "headline" }, D = { class: "sub" }, E = { class: "points" }, I = { class: "form-wrap" }, U = { class: "mid" }, R = { class: "form-inner" }, T = { class: "greet" }, Y = { class: "greet-sub" }, j = { class: "foot" }, q = ["href"], G = {
10
+ key: 2,
11
+ class: "foot-ver"
12
+ }, ee = /* @__PURE__ */ b({
13
+ __name: "SplitPanel",
14
+ setup(H) {
15
+ const { t: s } = V(), c = x(), { site: n, appVersion: d } = F(), g = (/* @__PURE__ */ new Date()).getFullYear(), y = h(() => [s("login.featRbac"), s("login.featScope"), s("login.featPortal")]), v = h(() => ({
16
+ "--a1": f(c.accent, 0.5),
17
+ "--a2": f(N(c.accent, "#8B5CF6", 0.6), 0.4)
18
+ }));
19
+ return (J, _) => (l(), i("div", {
20
+ class: "split",
21
+ style: a(v.value)
22
+ }, [
23
+ t("div", C, [
24
+ _[0] || (_[0] = t("div", { class: "panel-aurora" }, null, -1)),
25
+ t("div", L, [
26
+ t("div", z, [
27
+ p(P, { size: 34 }),
28
+ t("span", null, o(e(n).title), 1)
29
+ ]),
30
+ t("div", {
31
+ class: "bar",
32
+ style: a({ background: e(c).accent })
33
+ }, null, 4),
34
+ t("h1", A, [
35
+ r(o(e(s)("login.headlinePre")) + " ", 1),
36
+ t("span", {
37
+ style: a({ color: e(c).accent })
38
+ }, o(e(s)("login.headlineAccent")), 5),
39
+ r(" " + o(e(s)("login.headlinePost")), 1)
40
+ ]),
41
+ t("p", D, o(e(n).subtitle || e(s)("login.subtitle")), 1),
42
+ t("ul", E, [
43
+ (l(!0), i(u, null, k(y.value, (m) => (l(), i("li", { key: m }, [
44
+ p(e(S), {
45
+ icon: "ph:check-circle-duotone",
46
+ width: 18,
47
+ style: a({ color: e(c).accent })
48
+ }, null, 8, ["style"]),
49
+ r(" " + o(m), 1)
50
+ ]))), 128))
51
+ ])
52
+ ])
53
+ ]),
54
+ t("div", I, [
55
+ t("div", U, [
56
+ t("div", R, [
57
+ t("p", T, o(e(s)("login.welcome")), 1),
58
+ t("p", Y, o(e(s)("login.welcomeSub")), 1),
59
+ p(B, {
60
+ "show-logo": !1,
61
+ "show-title": !1,
62
+ "show-footer": !1
63
+ })
64
+ ])
65
+ ]),
66
+ t("p", j, [
67
+ r(" © " + o(e(g)) + " ", 1),
68
+ e(n).copyrightUrl ? (l(), i("a", {
69
+ key: 0,
70
+ href: e(n).copyrightUrl,
71
+ target: "_blank",
72
+ rel: "noopener"
73
+ }, o(e(n).copyright || e(n).title), 9, q)) : (l(), i(u, { key: 1 }, [
74
+ r(o(e(n).copyright || e(n).title), 1)
75
+ ], 64)),
76
+ e(d) ? (l(), i("span", G, "v" + o(e(d)), 1)) : w("", !0)
77
+ ])
78
+ ])
79
+ ], 4));
80
+ }
81
+ });
82
+ export {
83
+ ee as default
84
+ };
85
+ //# sourceMappingURL=SplitPanel2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitPanel2.vue.js","sources":["../../../../src/views/login/skins/SplitPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore } from '#/stores/app'\nimport { useSite } from '#/composables/useSite'\nimport { mix, rgba } from '#/theme/mix'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport LoginForm from '../LoginForm.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst { site, appVersion } = useSite()\nconst year = new Date().getFullYear()\n\n// 卖点随语言切换(t 在 computed 内对 locale 响应)。\nconst points = computed(() => [t('login.featRbac'), t('login.featScope'), t('login.featPortal')])\n\nconst vars = computed(() => ({\n '--a1': rgba(app.accent, 0.5),\n '--a2': rgba(mix(app.accent, '#8B5CF6', 0.6), 0.4),\n}))\n</script>\n\n<template>\n <div class=\"split\" :style=\"vars\">\n <!-- 左:品牌面板(窄屏隐藏)-->\n <div class=\"panel\">\n <div class=\"panel-aurora\" />\n <div class=\"panel-inner\">\n <div class=\"logo\">\n <!-- 站点 logo 的取值顺序(配置 → brand 选项 → 内置矢量标)统一在 SmartLogo 里 -->\n <SmartLogo :size=\"34\" />\n <span>{{ site.title }}</span>\n </div>\n <div class=\"bar\" :style=\"{ background: app.accent }\" />\n <!-- 标题拆 pre/accent/post 三段以支持 i18n,中间词染 accent 色(整句硬编码中文切不了英文) -->\n <h1 class=\"headline\">\n {{ t('login.headlinePre') }}\n <span :style=\"{ color: app.accent }\">{{ t('login.headlineAccent') }}</span>\n {{ t('login.headlinePost') }}\n </h1>\n <p class=\"sub\">{{ site.subtitle || t('login.subtitle') }}</p>\n <ul class=\"points\">\n <li v-for=\"p in points\" :key=\"p\">\n <Icon icon=\"ph:check-circle-duotone\" :width=\"18\" :style=\"{ color: app.accent }\" />\n {{ p }}\n </li>\n </ul>\n </div>\n </div>\n\n <!-- 右:全高工作区(居中表单 + 版权页脚);主题/语言切换在外壳全局工具药丸 -->\n <div class=\"form-wrap\">\n <div class=\"mid\">\n <div class=\"form-inner\">\n <p class=\"greet\">{{ t('login.welcome') }}</p>\n <p class=\"greet-sub\">{{ t('login.welcomeSub') }}</p>\n <LoginForm :show-logo=\"false\" :show-title=\"false\" :show-footer=\"false\" />\n </div>\n </div>\n\n <p class=\"foot\">\n © {{ year }}\n <a v-if=\"site.copyrightUrl\" :href=\"site.copyrightUrl\" target=\"_blank\" rel=\"noopener\">\n {{ site.copyright || site.title }}\n </a>\n <template v-else>{{ site.copyright || site.title }}</template>\n <span v-if=\"appVersion\" class=\"foot-ver\">v{{ appVersion }}</span>\n </p>\n </div>\n </div>\n</template>\n\n<style scoped>\n.split {\n height: 100dvh;\n display: grid;\n grid-template-columns: 1.15fr 0.85fr;\n background: var(--color-bg-body);\n}\n/* 左栏 = recessed 品牌面(body 底 + 极光),与右栏 clean container 拉开图/底关系 */\n.panel {\n position: relative;\n overflow: hidden;\n background: var(--color-bg-body);\n border-right: 1px solid var(--color-border);\n}\n/* 细网格纹理,左上淡出 */\n.panel::before {\n content: '';\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(rgba(127, 127, 127, 0.08) 1px, transparent 1px),\n linear-gradient(90deg, rgba(127, 127, 127, 0.08) 1px, transparent 1px);\n background-size: 40px 40px;\n -webkit-mask-image: radial-gradient(circle at 30% 40%, #000, transparent 72%);\n mask-image: radial-gradient(circle at 30% 40%, #000, transparent 72%);\n}\n.panel-aurora {\n position: absolute;\n inset: -20%;\n background:\n radial-gradient(40% 40% at 25% 20%, var(--a1), transparent 68%),\n radial-gradient(45% 45% at 80% 78%, var(--a2), transparent 70%);\n filter: blur(45px);\n opacity: 0.9;\n animation: panel-move 22s ease-in-out infinite alternate;\n}\n@keyframes panel-move {\n 0% {\n transform: translate3d(-3%, -2%, 0) scale(1.05);\n }\n 100% {\n transform: translate3d(3%, 3%, 0) scale(1.12);\n }\n}\n.panel-inner {\n position: relative;\n z-index: 1;\n padding: 64px 56px;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n}\n.logo {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 22px;\n font-weight: 700;\n color: #2a3c82;\n}\n/* 后台配置的品牌 logo:限高与内置矢量 logo(size=40)齐平,宽度自适应不变形 */\n.bar {\n width: 40px;\n height: 3px;\n border-radius: 2px;\n margin: 28px 0 20px;\n}\n.headline {\n font-size: 42px;\n line-height: 1.2;\n font-weight: 800;\n color: var(--color-text-primary);\n margin: 0;\n}\n.sub {\n color: var(--color-text-secondary);\n margin: 16px 0 28px;\n}\n.points {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.points li {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--color-text-secondary);\n}\n\n/* 右栏 = 全高工作区:居中表单 + 页脚(顶栏切换已上移到外壳全局工具) */\n.form-wrap {\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--color-bg-container);\n}\n.mid {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n}\n.form-inner {\n width: 100%;\n max-width: 340px;\n animation: fade-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.greet {\n font-size: 26px;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--color-text-primary);\n margin: 0 0 6px;\n}\n.greet-sub {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n margin: 0 0 26px;\n}\n.foot {\n margin: 0;\n padding: 18px 24px 22px;\n text-align: center;\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.foot a {\n color: inherit;\n text-decoration: none;\n}\n.foot a:hover {\n color: var(--color-primary);\n}\n.foot-ver {\n margin-left: 8px;\n opacity: 0.75;\n}\n@keyframes fade-up {\n from {\n opacity: 0;\n transform: translateY(16px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n@media (max-width: 900px) {\n .split {\n grid-template-columns: 1fr;\n }\n .panel {\n display: none;\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .panel-aurora,\n .form-inner {\n animation: none;\n }\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","site","appVersion","useSite","year","points","computed","vars","rgba","mix","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_createVNode","SmartLogo","_toDisplayString","_unref","_normalizeStyle","_hoisted_4","_createTextVNode","_hoisted_5","_hoisted_6","_Fragment","_renderList","p","Icon","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","LoginForm","_hoisted_12","_hoisted_13","_openBlock","_hoisted_14"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./Spotlight2.vue.js";
2
+ /* empty css */
3
+ import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
+ const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-2d0bde1c"]]);
5
+ export {
6
+ _ as default
7
+ };
8
+ //# sourceMappingURL=Spotlight.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spotlight.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,36 @@
1
+ import { defineComponent as c, ref as l, onMounted as p, onBeforeUnmount as d, computed as u, openBlock as v, createElementBlock as f, normalizeStyle as w, createElementVNode as n, createVNode as _ } from "vue";
2
+ import { useAppStore as g } from "../../../stores/app.js";
3
+ import { rgba as s, mix as x } from "../../../theme/mix.js";
4
+ import y from "../LoginForm.vue.js";
5
+ const B = { class: "card" }, C = /* @__PURE__ */ c({
6
+ __name: "Spotlight",
7
+ setup(E) {
8
+ const e = g(), r = l(50), i = l(38);
9
+ function m(t) {
10
+ r.value = t.clientX / window.innerWidth * 100, i.value = t.clientY / window.innerHeight * 100;
11
+ }
12
+ p(() => window.addEventListener("mousemove", m, { passive: !0 })), d(() => window.removeEventListener("mousemove", m));
13
+ const a = u(() => ({
14
+ "--mx": r.value + "%",
15
+ "--my": i.value + "%",
16
+ "--s1": s(e.accent, 0.28),
17
+ "--s2": s(x(e.accent, "#8B5CF6", 0.6), 0.22),
18
+ // 跟随光晕独立取色:亮色近白底下 0.28 几乎不可见,提到 0.5 才读得出;暗底 0.28 已够。
19
+ "--spot": s(e.accent, e.isDark ? 0.3 : 0.5)
20
+ }));
21
+ return (t, o) => (v(), f("div", {
22
+ class: "spotlight",
23
+ style: w(a.value)
24
+ }, [
25
+ o[0] || (o[0] = n("div", { class: "mesh" }, null, -1)),
26
+ o[1] || (o[1] = n("div", { class: "spot" }, null, -1)),
27
+ n("div", B, [
28
+ _(y)
29
+ ])
30
+ ], 4));
31
+ }
32
+ });
33
+ export {
34
+ C as default
35
+ };
36
+ //# sourceMappingURL=Spotlight2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spotlight2.vue.js","sources":["../../../../src/views/login/skins/Spotlight.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue'\nimport { useAppStore } from '#/stores/app'\nimport { mix, rgba } from '#/theme/mix'\nimport LoginForm from '../LoginForm.vue'\n\nconst app = useAppStore()\n\n// 聚光位置(百分比),默认略偏上居中;鼠标移动时跟随。\nconst mx = ref(50)\nconst my = ref(38)\nfunction onMove(e: MouseEvent) {\n mx.value = (e.clientX / window.innerWidth) * 100\n my.value = (e.clientY / window.innerHeight) * 100\n}\nonMounted(() => window.addEventListener('mousemove', onMove, { passive: true }))\nonBeforeUnmount(() => window.removeEventListener('mousemove', onMove))\n\nconst vars = computed(() => ({\n '--mx': mx.value + '%',\n '--my': my.value + '%',\n '--s1': rgba(app.accent, 0.28),\n '--s2': rgba(mix(app.accent, '#8B5CF6', 0.6), 0.22),\n // 跟随光晕独立取色:亮色近白底下 0.28 几乎不可见,提到 0.5 才读得出;暗底 0.28 已够。\n '--spot': rgba(app.accent, app.isDark ? 0.3 : 0.5),\n}))\n</script>\n\n<template>\n <div class=\"spotlight\" :style=\"vars\">\n <div class=\"mesh\" />\n <div class=\"spot\" />\n <div class=\"card\">\n <LoginForm />\n </div>\n </div>\n</template>\n\n<style scoped>\n.spotlight {\n position: relative;\n height: 100dvh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-bg-body);\n}\n.mesh {\n position: absolute;\n inset: 0;\n background:\n radial-gradient(30% 40% at 15% 20%, var(--s1), transparent 60%),\n radial-gradient(30% 40% at 85% 80%, var(--s2), transparent 60%);\n opacity: 0.9;\n}\n.spot {\n position: absolute;\n inset: 0;\n pointer-events: none;\n background: radial-gradient(340px 340px at var(--mx) var(--my), var(--spot), transparent 60%);\n transition: background 0.12s ease-out;\n}\n.card {\n position: relative;\n z-index: 2;\n width: 100%;\n max-width: 460px;\n padding: 46px 46px;\n background: var(--color-bg-container);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-3);\n animation: fade-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n@keyframes fade-up {\n from {\n opacity: 0;\n transform: translateY(16px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n/* 窄屏:给卡片侧边留白 + 收紧内边距(默认 46px 在 ~360px 手机上挤压表单、卡片贴边) */\n@media (max-width: 480px) {\n .spotlight {\n padding: 0 16px;\n }\n .card {\n padding: 32px 24px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spot {\n /* 光晕仍跟随指针(指针驱动的位移,非自发动画);仅去掉缓动过渡。\n Windows Server 等默认关动画的环境会命中此分支;若连指针跟随一并禁掉,会退化为静态居中,\n 表现为\"光晕不跟鼠标\",故此处只去缓动、保留跟随。 */\n transition: none;\n }\n .card {\n animation: none;\n }\n}\n</style>\n"],"names":["app","useAppStore","mx","ref","my","onMove","e","onMounted","onBeforeUnmount","vars","computed","rgba","mix","_createElementBlock","_createElementVNode","_hoisted_1","_createVNode","LoginForm"],"mappings":";;;;;;;AAMA,UAAMA,IAAMC,EAAA,GAGNC,IAAKC,EAAI,EAAE,GACXC,IAAKD,EAAI,EAAE;AACjB,aAASE,EAAOC,GAAe;AAC7B,MAAAJ,EAAG,QAASI,EAAE,UAAU,OAAO,aAAc,KAC7CF,EAAG,QAASE,EAAE,UAAU,OAAO,cAAe;AAAA,IAChD;AACA,IAAAC,EAAU,MAAM,OAAO,iBAAiB,aAAaF,GAAQ,EAAE,SAAS,GAAA,CAAM,CAAC,GAC/EG,EAAgB,MAAM,OAAO,oBAAoB,aAAaH,CAAM,CAAC;AAErE,UAAMI,IAAOC,EAAS,OAAO;AAAA,MAC3B,QAAQR,EAAG,QAAQ;AAAA,MACnB,QAAQE,EAAG,QAAQ;AAAA,MACnB,QAAQO,EAAKX,EAAI,QAAQ,IAAI;AAAA,MAC7B,QAAQW,EAAKC,EAAIZ,EAAI,QAAQ,WAAW,GAAG,GAAG,IAAI;AAAA;AAAA,MAElD,UAAUW,EAAKX,EAAI,QAAQA,EAAI,SAAS,MAAM,GAAG;AAAA,IAAA,EACjD;2BAIAa,EAMM,OAAA;AAAA,MAND,OAAM;AAAA,MAAa,SAAOJ,EAAA,KAAI;AAAA,IAAA;sBACjCK,EAAoB,OAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,sBACjBA,EAAoB,OAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,MACjBA,EAEM,OAFNC,GAEM;AAAA,QADJC,EAAaC,CAAA;AAAA,MAAA;;;;"}
@@ -0,0 +1,8 @@
1
+ import { Component } from 'vue';
2
+ export interface LoginSkin {
3
+ id: string;
4
+ label: string;
5
+ component: Component;
6
+ }
7
+ export declare const LOGIN_SKINS: LoginSkin[];
8
+ export declare const DEFAULT_SKIN = "aurora";
@@ -0,0 +1,13 @@
1
+ import o from "./skins/AuroraGlass.vue.js";
2
+ import i from "./skins/SplitPanel.vue.js";
3
+ import t from "./skins/Spotlight.vue.js";
4
+ const p = [
5
+ { id: "aurora", label: "login.skinAurora", component: o },
6
+ { id: "split", label: "login.skinSplit", component: i },
7
+ { id: "spotlight", label: "login.skinSpotlight", component: t }
8
+ ], a = "aurora";
9
+ export {
10
+ a as DEFAULT_SKIN,
11
+ p as LOGIN_SKINS
12
+ };
13
+ //# sourceMappingURL=skins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skins.js","sources":["../../../src/views/login/skins.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport AuroraGlass from './skins/AuroraGlass.vue'\nimport SplitPanel from './skins/SplitPanel.vue'\nimport Spotlight from './skins/Spotlight.vue'\n\nexport interface LoginSkin {\n id: string\n label: string\n component: Component\n}\n\nexport const LOGIN_SKINS: LoginSkin[] = [\n { id: 'aurora', label: 'login.skinAurora', component: AuroraGlass },\n { id: 'split', label: 'login.skinSplit', component: SplitPanel },\n { id: 'spotlight', label: 'login.skinSpotlight', component: Spotlight },\n]\n\nexport const DEFAULT_SKIN = 'aurora'\n"],"names":["LOGIN_SKINS","AuroraGlass","SplitPanel","Spotlight","DEFAULT_SKIN"],"mappings":";;;AAWO,MAAMA,IAA2B;AAAA,EACtC,EAAE,IAAI,UAAU,OAAO,oBAAoB,WAAWC,EAAA;AAAA,EACtD,EAAE,IAAI,SAAS,OAAO,mBAAmB,WAAWC,EAAA;AAAA,EACpD,EAAE,IAAI,aAAa,OAAO,uBAAuB,WAAWC,EAAA;AAC9D,GAEaC,IAAe;"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * bindComplete 已在服务端完成绑定;前端只能在拿到非空恢复码后进入展示步。
3
+ * 缺字段 / null / 空数组 / 仅空白串 一律视为响应不完整,避免空白成功屏。
4
+ */
5
+ export declare function takeRecoveryCodes(out: {
6
+ recoveryCodes?: string[] | null;
7
+ }): string[] | null;