smart-admin-web 10.14.0 → 10.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/README.md +6 -6
  2. package/dist/api/index.d.ts +41 -2
  3. package/dist/api/index.js +36 -15
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +418 -6
  6. package/dist/assets/icons/ph-subset.json.js +7 -7
  7. package/dist/assets/smart-logo.svg.js +5 -0
  8. package/dist/assets/smart-logo.svg.js.map +1 -0
  9. package/dist/components/AppIcon.vue.js +9 -9
  10. package/dist/components/AppIcon.vue.js.map +1 -1
  11. package/dist/components/AppWatermark.vue.d.ts +14 -0
  12. package/dist/components/AppWatermark.vue.js +38 -0
  13. package/dist/components/AppWatermark.vue.js.map +1 -0
  14. package/dist/components/AppWatermark2.vue.js +5 -0
  15. package/dist/components/AppWatermark2.vue.js.map +1 -0
  16. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  17. package/dist/components/Chart/echarts.js +15 -20
  18. package/dist/components/Chart/echarts.js.map +1 -1
  19. package/dist/components/CronEditor/index.vue.js +1 -1
  20. package/dist/components/CronEditor/index2.vue.js +2 -1
  21. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  22. package/dist/components/DetailPage/index.vue.js +2 -2
  23. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  24. package/dist/components/DictTag/index.vue.js.map +1 -1
  25. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  26. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  27. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  28. package/dist/components/FormContainer/index.vue.js +91 -56
  29. package/dist/components/FormContainer/index.vue.js.map +1 -1
  30. package/dist/components/ImportWizard/index.vue.js +1 -1
  31. package/dist/components/ImportWizard/index2.vue.js +44 -41
  32. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  33. package/dist/components/MenuSearch.vue.js +2 -2
  34. package/dist/components/MenuSearch2.vue.js +19 -18
  35. package/dist/components/MenuSearch2.vue.js.map +1 -1
  36. package/dist/components/PasswordStrength/index.vue.js +2 -2
  37. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  38. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  39. package/dist/components/SmartLogo.vue.d.ts +3 -0
  40. package/dist/components/SmartLogo.vue.js +1 -1
  41. package/dist/components/SmartLogo2.vue.js +22 -64
  42. package/dist/components/SmartLogo2.vue.js.map +1 -1
  43. package/dist/{views/system/config/components/GroupExtraConfig.vue.d.ts → components/TableTotal/index.vue.d.ts} +1 -4
  44. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  45. package/dist/components/TableTotal/index2.vue.js +16 -0
  46. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  47. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  48. package/dist/components/UserPicker/index.vue.js +2 -2
  49. package/dist/components/UserPicker/index2.vue.js +176 -117
  50. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  51. package/dist/composables/useBatchDelete.js.map +1 -1
  52. package/dist/composables/useLayoutMenu.js +17 -16
  53. package/dist/composables/useLayoutMenu.js.map +1 -1
  54. package/dist/composables/useLoginHero.d.ts +2 -0
  55. package/dist/composables/useLoginHero.js +22 -0
  56. package/dist/composables/useLoginHero.js.map +1 -0
  57. package/dist/composables/useModule.js +39 -29
  58. package/dist/composables/useModule.js.map +1 -1
  59. package/dist/composables/usePageTitle.js +16 -14
  60. package/dist/composables/usePageTitle.js.map +1 -1
  61. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  62. package/dist/composables/useShellBreakpoint.js +37 -0
  63. package/dist/composables/useShellBreakpoint.js.map +1 -0
  64. package/dist/composables/useSite.d.ts +20 -0
  65. package/dist/composables/useSite.js +18 -13
  66. package/dist/composables/useSite.js.map +1 -1
  67. package/dist/composables/useTabTitle.js.map +1 -1
  68. package/dist/composables/useTableTitle.d.ts +6 -0
  69. package/dist/composables/useTableTitle.js +11 -0
  70. package/dist/composables/useTableTitle.js.map +1 -0
  71. package/dist/composables/useTableZoom.d.ts +5 -0
  72. package/dist/composables/useTableZoom.js.map +1 -1
  73. package/dist/composables/useTheme.d.ts +2 -2
  74. package/dist/composables/useTheme.js +23 -20
  75. package/dist/composables/useTheme.js.map +1 -1
  76. package/dist/createSmartAdmin.d.ts +12 -2
  77. package/dist/createSmartAdmin.js +72 -60
  78. package/dist/createSmartAdmin.js.map +1 -1
  79. package/dist/index.d.ts +5 -2
  80. package/dist/index.js +223 -208
  81. package/dist/index.js.map +1 -1
  82. package/dist/layouts/AccentPicker.vue.js +8 -0
  83. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  84. package/dist/layouts/AccentPicker2.vue.js +131 -0
  85. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  86. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  87. package/dist/layouts/AppHeader.vue.js +2 -2
  88. package/dist/layouts/AppHeader2.vue.js +317 -235
  89. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  90. package/dist/layouts/NoticeBell.vue.js +2 -2
  91. package/dist/layouts/NoticeBell2.vue.js +1 -1
  92. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  93. package/dist/layouts/PersonalLayout.vue.js +2 -2
  94. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  95. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  96. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  97. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  98. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  99. package/dist/layouts/TabsBar.vue.js +2 -2
  100. package/dist/layouts/TabsBar2.vue.js +97 -69
  101. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  102. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  103. package/dist/layouts/components/SideNav.vue.js +1 -1
  104. package/dist/layouts/components/SideNav2.vue.js +54 -26
  105. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  106. package/dist/layouts/default.vue.js +1 -1
  107. package/dist/layouts/default2.vue.js +170 -140
  108. package/dist/layouts/default2.vue.js.map +1 -1
  109. package/dist/lib/favicon.d.ts +1 -0
  110. package/dist/lib/favicon.js +12 -0
  111. package/dist/lib/favicon.js.map +1 -0
  112. package/dist/lib/loginHero.d.ts +16 -0
  113. package/dist/lib/loginHero.js +33 -0
  114. package/dist/lib/loginHero.js.map +1 -0
  115. package/dist/lib/logoCrop.d.ts +25 -0
  116. package/dist/lib/logoCrop.js +22 -0
  117. package/dist/lib/logoCrop.js.map +1 -0
  118. package/dist/lib/runtime.d.ts +2 -0
  119. package/dist/lib/runtime.js +1 -1
  120. package/dist/lib/runtime.js.map +1 -1
  121. package/dist/lib/securityRules.d.ts +26 -0
  122. package/dist/lib/securityRules.js +86 -0
  123. package/dist/lib/securityRules.js.map +1 -0
  124. package/dist/lib/watermark.d.ts +110 -0
  125. package/dist/lib/watermark.js +151 -0
  126. package/dist/lib/watermark.js.map +1 -0
  127. package/dist/locales/en-US.d.ts +462 -42
  128. package/dist/locales/en-US.js +491 -78
  129. package/dist/locales/en-US.js.map +1 -1
  130. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  131. package/dist/locales/kernelMenuTitles.js +128 -0
  132. package/dist/locales/kernelMenuTitles.js.map +1 -0
  133. package/dist/locales/menuTitle.d.ts +3 -0
  134. package/dist/locales/menuTitle.js +14 -12
  135. package/dist/locales/menuTitle.js.map +1 -1
  136. package/dist/locales/zh-CN.d.ts +462 -42
  137. package/dist/locales/zh-CN.js +490 -81
  138. package/dist/locales/zh-CN.js.map +1 -1
  139. package/dist/router/index.js +41 -32
  140. package/dist/router/index.js.map +1 -1
  141. package/dist/router/namedPage.d.ts +4 -0
  142. package/dist/router/namedPage.js +7 -7
  143. package/dist/router/namedPage.js.map +1 -1
  144. package/dist/router/viewRegistry.js +12 -12
  145. package/dist/router/viewRegistry.js.map +1 -1
  146. package/dist/stores/app.d.ts +0 -12
  147. package/dist/stores/app.js +11 -12
  148. package/dist/stores/app.js.map +1 -1
  149. package/dist/stores/tabs.js.map +1 -1
  150. package/dist/stores/user.d.ts +10 -0
  151. package/dist/stores/user.js.map +1 -1
  152. package/dist/style.css +1 -1
  153. package/dist/theme/accentTokens.d.ts +27 -0
  154. package/dist/theme/accentTokens.js +54 -0
  155. package/dist/theme/accentTokens.js.map +1 -0
  156. package/dist/theme/accents.d.ts +21 -1
  157. package/dist/theme/accents.js +11 -2
  158. package/dist/theme/accents.js.map +1 -1
  159. package/dist/theme/mix.d.ts +58 -7
  160. package/dist/theme/mix.js +115 -30
  161. package/dist/theme/mix.js.map +1 -1
  162. package/dist/theme/naive-theme.d.ts +5 -2
  163. package/dist/theme/naive-theme.js +405 -75
  164. package/dist/theme/naive-theme.js.map +1 -1
  165. package/dist/utils/jwt.d.ts +8 -0
  166. package/dist/utils/jwt.js +14 -0
  167. package/dist/utils/jwt.js.map +1 -0
  168. package/dist/utils/menuIcon.d.ts +2 -0
  169. package/dist/utils/menuIcon.js +8 -0
  170. package/dist/utils/menuIcon.js.map +1 -0
  171. package/dist/utils/oauthBrand.d.ts +34 -9
  172. package/dist/utils/oauthBrand.js +70 -74
  173. package/dist/utils/oauthBrand.js.map +1 -1
  174. package/dist/utils/tableFilter.d.ts +88 -0
  175. package/dist/utils/tableFilter.js +116 -0
  176. package/dist/utils/tableFilter.js.map +1 -0
  177. package/dist/utils/tableToolbar.d.ts +18 -0
  178. package/dist/utils/tableToolbar.js +11 -0
  179. package/dist/utils/tableToolbar.js.map +1 -0
  180. package/dist/utils/treeFilter.d.ts +20 -0
  181. package/dist/utils/treeFilter.js +24 -0
  182. package/dist/utils/treeFilter.js.map +1 -0
  183. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  184. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  185. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  186. package/dist/views/dashboard/biz.vue.js +1 -1
  187. package/dist/views/dashboard/biz2.vue.js +310 -257
  188. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  189. package/dist/views/dashboard/workbench.vue.js +2 -2
  190. package/dist/views/dashboard/workbench2.vue.js +141 -155
  191. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  192. package/dist/views/embed/iframe.vue.js +2 -2
  193. package/dist/views/embed/iframe2.vue.js +22 -15
  194. package/dist/views/embed/iframe2.vue.js.map +1 -1
  195. package/dist/views/error/404.vue.js +2 -2
  196. package/dist/views/error/4042.vue.js +33 -24
  197. package/dist/views/error/4042.vue.js.map +1 -1
  198. package/dist/views/error/BootError.vue.js +1 -1
  199. package/dist/views/error/BootError2.vue.js +59 -48
  200. package/dist/views/error/BootError2.vue.js.map +1 -1
  201. package/dist/views/error/MissingRoute.vue.js +2 -2
  202. package/dist/views/error/MissingRoute2.vue.js +34 -15
  203. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  204. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  205. package/dist/views/login/LoginForm.vue.js +2 -2
  206. package/dist/views/login/LoginForm2.vue.js +580 -488
  207. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  208. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  209. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  210. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  211. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  212. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  213. package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
  214. package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
  215. package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
  216. package/dist/views/login/components/LoginHeroPanel2.vue.js +61 -0
  217. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
  218. package/dist/views/login/index.vue.js +1 -1
  219. package/dist/views/login/index2.vue.js +141 -71
  220. package/dist/views/login/index2.vue.js.map +1 -1
  221. package/dist/views/login/layout.d.ts +11 -0
  222. package/dist/views/login/layout.js +27 -0
  223. package/dist/views/login/layout.js.map +1 -0
  224. package/dist/views/mfa/index.vue.js +2 -2
  225. package/dist/views/mfa/index2.vue.js +367 -321
  226. package/dist/views/mfa/index2.vue.js.map +1 -1
  227. package/dist/views/module/index.vue.js +2 -2
  228. package/dist/views/module/index2.vue.js +132 -99
  229. package/dist/views/module/index2.vue.js.map +1 -1
  230. package/dist/views/oauth/callback.vue.js +2 -2
  231. package/dist/views/oauth/callback2.vue.js +65 -51
  232. package/dist/views/oauth/callback2.vue.js.map +1 -1
  233. package/dist/views/personal/bindings.vue.js +2 -2
  234. package/dist/views/personal/bindings2.vue.js +98 -94
  235. package/dist/views/personal/bindings2.vue.js.map +1 -1
  236. package/dist/views/personal/notice2.vue.js +103 -76
  237. package/dist/views/personal/notice2.vue.js.map +1 -1
  238. package/dist/views/personal/password2.vue.js +47 -40
  239. package/dist/views/personal/password2.vue.js.map +1 -1
  240. package/dist/views/personal/profile.vue.js +3 -3
  241. package/dist/views/personal/profile2.vue.js +24 -18
  242. package/dist/views/personal/profile2.vue.js.map +1 -1
  243. package/dist/views/personal/security.vue.js +2 -2
  244. package/dist/views/personal/security2.vue.js +65 -53
  245. package/dist/views/personal/security2.vue.js.map +1 -1
  246. package/dist/views/personal/sessions.vue.js +2 -2
  247. package/dist/views/personal/sessions2.vue.js +67 -62
  248. package/dist/views/personal/sessions2.vue.js.map +1 -1
  249. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  250. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  251. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  252. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  253. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  254. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  255. package/dist/views/system/ai-model/index.vue.js +2 -2
  256. package/dist/views/system/ai-model/index2.vue.js +99 -99
  257. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  258. package/dist/views/system/ai-model/presets.d.ts +1 -1
  259. package/dist/views/system/ai-model/presets.js +18 -18
  260. package/dist/views/system/ai-model/presets.js.map +1 -1
  261. package/dist/views/system/ai-usage/index.vue.js +2 -2
  262. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  263. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  264. package/dist/views/system/api-docs/index.vue.js +5 -2
  265. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  266. package/dist/views/system/api-docs/index2.vue.js +92 -42
  267. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  268. package/dist/views/system/cache/index.vue.js +2 -2
  269. package/dist/views/system/cache/index2.vue.js +74 -80
  270. package/dist/views/system/cache/index2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/AdminMock.vue.js +8 -0
  272. package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
  273. package/dist/views/system/config/components/AdminMock2.vue.js +93 -0
  274. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
  275. package/dist/views/system/config/components/AdvancedSection.vue.js +8 -0
  276. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
  277. package/dist/views/system/config/components/AdvancedSection2.vue.js +163 -0
  278. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
  279. package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
  280. package/dist/views/system/config/components/BrandSection.vue.js +8 -0
  281. package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
  282. package/dist/views/system/config/components/BrandSection2.vue.js +266 -0
  283. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
  284. package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
  285. package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
  286. package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
  287. package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
  288. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
  289. package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
  290. package/dist/views/system/config/components/CfgRow.vue.js +9 -0
  291. package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
  292. package/dist/views/system/config/components/CfgRow2.vue.js +54 -0
  293. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
  294. package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
  295. package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
  296. package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
  297. package/dist/views/system/config/components/CfgSegment2.vue.js +45 -0
  298. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
  299. package/dist/views/system/config/components/ConfigFormModal.vue.js +4 -1
  300. package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
  301. package/dist/views/system/config/components/ConfigFormModal2.vue.js +72 -60
  302. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  303. package/dist/views/system/config/components/JobSection.vue.js +8 -0
  304. package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
  305. package/dist/views/system/config/components/JobSection2.vue.js +140 -0
  306. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
  307. package/dist/views/system/config/components/LoginMock.vue.d.ts +8 -0
  308. package/dist/views/system/config/components/LoginMock.vue.js +8 -0
  309. package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
  310. package/dist/views/system/config/components/LoginMock2.vue.js +132 -0
  311. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
  312. package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
  313. package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
  314. package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
  315. package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
  316. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
  317. package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
  318. package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
  319. package/dist/views/system/config/components/LogoEditor2.vue.js +161 -0
  320. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
  321. package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
  322. package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
  323. package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
  324. package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
  325. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
  326. package/dist/{layouts/SettingRow.vue.d.ts → views/system/config/components/ScaleToFit.vue.d.ts} +2 -1
  327. package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
  328. package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
  329. package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
  330. package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
  331. package/dist/views/system/config/components/SectionLayout.vue.d.ts +30 -0
  332. package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
  333. package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
  334. package/dist/views/system/config/components/SectionLayout2.vue.js +69 -0
  335. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
  336. package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
  337. package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
  338. package/dist/views/system/config/components/SecuritySection2.vue.js +417 -0
  339. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
  340. package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
  341. package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
  342. package/dist/views/system/config/components/SensitiveSection2.vue.js +214 -0
  343. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
  344. package/dist/views/system/config/components/SigninSection.vue.js +8 -0
  345. package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
  346. package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
  347. package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
  348. package/dist/views/system/config/components/UploadSection.vue.js +8 -0
  349. package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
  350. package/dist/views/system/config/components/UploadSection2.vue.js +176 -0
  351. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
  352. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  353. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  354. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  355. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  356. package/dist/views/system/config/draft.d.ts +148 -0
  357. package/dist/views/system/config/draft.js +170 -0
  358. package/dist/views/system/config/draft.js.map +1 -0
  359. package/dist/views/system/config/flash.d.ts +2 -0
  360. package/dist/views/system/config/flash.js +9 -0
  361. package/dist/views/system/config/flash.js.map +1 -0
  362. package/dist/views/system/config/groups.d.ts +38 -7
  363. package/dist/views/system/config/groups.js +104 -14
  364. package/dist/views/system/config/groups.js.map +1 -1
  365. package/dist/views/system/config/index.vue.js +6 -2
  366. package/dist/views/system/config/index.vue.js.map +1 -1
  367. package/dist/views/system/config/index2.vue.js +201 -111
  368. package/dist/views/system/config/index2.vue.js.map +1 -1
  369. package/dist/views/system/config/layoutMode.d.ts +23 -0
  370. package/dist/views/system/config/layoutMode.js +28 -0
  371. package/dist/views/system/config/layoutMode.js.map +1 -0
  372. package/dist/views/system/config/providerForm.d.ts +33 -0
  373. package/dist/views/system/config/providerForm.js +63 -0
  374. package/dist/views/system/config/providerForm.js.map +1 -0
  375. package/dist/views/system/dict/index.vue.js +2 -2
  376. package/dist/views/system/dict/index2.vue.js +471 -366
  377. package/dist/views/system/dict/index2.vue.js.map +1 -1
  378. package/dist/views/system/file/index2.vue.js +91 -76
  379. package/dist/views/system/file/index2.vue.js.map +1 -1
  380. package/dist/views/system/job/index.vue.js +3 -3
  381. package/dist/views/system/job/index2.vue.js +897 -828
  382. package/dist/views/system/job/index2.vue.js.map +1 -1
  383. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  384. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  385. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  386. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  387. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  388. package/dist/views/system/job-log/index.vue.js +2 -2
  389. package/dist/views/system/job-log/index2.vue.js +193 -207
  390. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  391. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  392. package/dist/views/system/job-log/runStatus.js +26 -0
  393. package/dist/views/system/job-log/runStatus.js.map +1 -0
  394. package/dist/views/system/job-monitor/index.vue.js +2 -2
  395. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  396. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  397. package/dist/views/system/log/exception/index.vue.js +2 -2
  398. package/dist/views/system/log/exception/index2.vue.js +135 -96
  399. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  400. package/dist/views/system/log/login/index2.vue.js +62 -41
  401. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  402. package/dist/views/system/log/op/index.vue.js +2 -2
  403. package/dist/views/system/log/op/index2.vue.js +200 -162
  404. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  405. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  406. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  407. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  408. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  409. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  410. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  411. package/dist/views/system/menu/index.vue.js +1 -1
  412. package/dist/views/system/menu/index2.vue.js +216 -183
  413. package/dist/views/system/menu/index2.vue.js.map +1 -1
  414. package/dist/views/system/module/index.vue.js +1 -1
  415. package/dist/views/system/module/index2.vue.js +177 -144
  416. package/dist/views/system/module/index2.vue.js.map +1 -1
  417. package/dist/views/system/monitor/index.vue.js +2 -2
  418. package/dist/views/system/monitor/index2.vue.js +134 -149
  419. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  420. package/dist/views/system/notice/index.vue.js +1 -1
  421. package/dist/views/system/notice/index2.vue.js +209 -181
  422. package/dist/views/system/notice/index2.vue.js.map +1 -1
  423. package/dist/views/system/org/index.vue.js +1 -1
  424. package/dist/views/system/org/index2.vue.js +278 -248
  425. package/dist/views/system/org/index2.vue.js.map +1 -1
  426. package/dist/views/system/position/index.vue.js +5 -2
  427. package/dist/views/system/position/index.vue.js.map +1 -1
  428. package/dist/views/system/position/index2.vue.js +128 -92
  429. package/dist/views/system/position/index2.vue.js.map +1 -1
  430. package/dist/views/system/recycle/index.vue.js +2 -2
  431. package/dist/views/system/recycle/index2.vue.js +90 -67
  432. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  433. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  434. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  435. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  436. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  437. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  438. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  439. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  440. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  441. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  442. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  443. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  444. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  445. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  446. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  447. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  448. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  449. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  450. package/dist/views/system/role/index.vue.js +5 -2
  451. package/dist/views/system/role/index.vue.js.map +1 -1
  452. package/dist/views/system/role/index2.vue.js +181 -165
  453. package/dist/views/system/role/index2.vue.js.map +1 -1
  454. package/dist/views/system/session/index2.vue.js +75 -49
  455. package/dist/views/system/session/index2.vue.js.map +1 -1
  456. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  457. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  458. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  459. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  460. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  461. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  462. package/dist/views/system/user/index.vue.js +2 -2
  463. package/dist/views/system/user/index2.vue.js +362 -275
  464. package/dist/views/system/user/index2.vue.js.map +1 -1
  465. package/package.json +6 -8
  466. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  467. package/dist/components/SelectTable/index2.vue.js +0 -256
  468. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  469. package/dist/composables/useTableRowSort.d.ts +0 -20
  470. package/dist/composables/useTableRowSort.js +0 -59
  471. package/dist/composables/useTableRowSort.js.map +0 -1
  472. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  473. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  474. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  475. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  476. package/dist/layouts/SettingRow.vue.js +0 -8
  477. package/dist/layouts/SettingRow.vue.js.map +0 -1
  478. package/dist/layouts/SettingRow2.vue.js +0 -23
  479. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  480. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  481. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  482. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  483. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  484. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  485. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  486. package/dist/views/login/skins/SplitPanel2.vue.js +0 -85
  487. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  488. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  489. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  490. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  491. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  492. package/dist/views/login/skins.d.ts +0 -8
  493. package/dist/views/login/skins.js +0 -13
  494. package/dist/views/login/skins.js.map +0 -1
  495. package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
  496. package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
  497. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
  498. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
  499. package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
  500. package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
  501. package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
  502. package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
  503. package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
  504. package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
  505. package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
  506. package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
  507. package/dist/views/system/config/components/JobConfig.vue.js +0 -5
  508. package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
  509. package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
  510. package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
  511. package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
  512. package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
  513. package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
  514. package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
  515. package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
  516. package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
  517. package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
  518. package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
  519. package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
  520. package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
  521. package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
  522. package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
  523. package/dist/views/system/config/components/UploadConfig.vue.d.ts +0 -3
  524. package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
  525. package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
  526. package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
  527. package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
  528. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  529. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  530. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/AdminMock.vue.d.ts} +0 -0
  531. /package/dist/views/{login/skins/SplitPanel.vue.d.ts → system/config/components/AdvancedSection.vue.d.ts} +0 -0
  532. /package/dist/views/{login/skins/Spotlight.vue.d.ts → system/config/components/JobSection.vue.d.ts} +0 -0
  533. /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
  534. /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
  535. /package/dist/views/system/config/components/{JobConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
  536. /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
  537. /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → UploadSection.vue.d.ts} +0 -0
  538. /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → WatermarkSection.vue.d.ts} +0 -0
@@ -1,86 +1,100 @@
1
- import { defineComponent as w, ref as b, onMounted as A, openBlock as c, createElementBlock as u, createVNode as v, unref as s, createElementVNode as p, toDisplayString as l } from "vue";
2
- import { useRoute as E, useRouter as T } from "vue-router";
1
+ import { defineComponent as A, ref as _, onMounted as E, openBlock as u, createBlock as T, withCtx as B, createElementVNode as t, createElementBlock as v, Fragment as b, createVNode as x, unref as s, toDisplayString as p } from "vue";
2
+ import { useRoute as C, useRouter as L } from "vue-router";
3
3
  import { useI18n as q } from "vue-i18n";
4
- import { NSpin as B } from "naive-ui";
5
- import { Icon as C } from "@iconify/vue";
6
- import { externalAuthApi as L } from "../../api/index.js";
7
- import { useUserStore as I } from "../../stores/user.js";
8
- import { useAuthStore as D } from "../../stores/auth.js";
9
- import { resetRouter as O } from "../../router/index.js";
10
- import { translateError as U } from "../../utils/error.js";
11
- const V = { class: "oauth-cb" }, z = {
12
- key: 0,
13
- class: "oauth-box"
14
- }, F = { class: "oauth-msg" }, H = {
15
- key: 1,
16
- class: "oauth-box"
17
- }, K = { class: "oauth-msg" }, M = { class: "oauth-sub" }, te = /* @__PURE__ */ w({
4
+ import { NSpin as D } from "naive-ui";
5
+ import { Icon as I } from "@iconify/vue";
6
+ import { externalAuthApi as F } from "../../api/index.js";
7
+ import { useUserStore as O } from "../../stores/user.js";
8
+ import { useAuthStore as U } from "../../stores/auth.js";
9
+ import { resetRouter as V } from "../../router/index.js";
10
+ import { translateError as z } from "../../utils/error.js";
11
+ import H from "../login/components/LoginDesk.vue.js";
12
+ const K = {
13
+ class: "oauth-box",
14
+ role: "status",
15
+ "aria-live": "polite"
16
+ }, M = { class: "oauth-msg" }, P = { class: "oauth-msg oauth-msg-fail" }, Y = { class: "oauth-sub" }, ne = /* @__PURE__ */ A({
18
17
  __name: "callback",
19
- setup(P) {
20
- const S = E(), t = T(), { t: o } = q(), r = I(), x = D(), h = b("processing"), d = b(""), N = {
18
+ setup(j) {
19
+ const w = C(), o = L(), { t: r } = q(), n = O(), S = U(), l = _("processing"), d = _(""), N = {
21
20
  40013: "error.auth.oauthProviderDisabled",
22
21
  40014: "error.auth.oauthStateInvalid",
23
22
  40015: "error.auth.oauthExchangeFailed",
24
23
  40016: "error.auth.oauthAccountNotBound",
25
24
  40017: "error.auth.oauthAlreadyBound"
26
25
  };
27
- function a(e) {
28
- h.value = "error", d.value = e, window.setTimeout(() => t.replace("/login"), 2600);
26
+ function c(e) {
27
+ l.value = "error", d.value = e, window.setTimeout(() => o.replace("/login"), 2600);
29
28
  }
30
- function f() {
31
- !r.accessToken && !r.refreshToken && !r.cookieSession || (O(), x.reset(), r.clear());
29
+ function h() {
30
+ !n.accessToken && !n.refreshToken && !n.cookieSession || (V(), S.reset(), n.clear());
32
31
  }
33
- return A(async () => {
34
- const e = S.query, i = typeof e.ticket == "string" ? e.ticket : "", R = typeof e.bind == "string" ? e.bind : "", m = typeof e.pendingLink == "string" ? e.pendingLink : "", g = typeof e.provider == "string" ? e.provider : "", _ = typeof e.displayName == "string" ? e.displayName : "", y = typeof e.error == "string" ? e.error : "", k = typeof e.totpChallenge == "string" ? e.totpChallenge : "";
32
+ return E(async () => {
33
+ const e = w.query, i = typeof e.ticket == "string" ? e.ticket : "", R = typeof e.bind == "string" ? e.bind : "", f = typeof e.pendingLink == "string" ? e.pendingLink : "", m = typeof e.provider == "string" ? e.provider : "", g = typeof e.displayName == "string" ? e.displayName : "", y = typeof e.error == "string" ? e.error : "", k = typeof e.totpChallenge == "string" ? e.totpChallenge : "";
35
34
  if (k) {
36
- f(), await t.replace({ path: "/login", query: { totpChallenge: k } });
35
+ h(), await o.replace({ path: "/login", query: { totpChallenge: k } });
37
36
  return;
38
37
  }
39
- if (m) {
40
- f(), await t.replace({
38
+ if (f) {
39
+ h(), await o.replace({
41
40
  path: "/login",
42
41
  query: {
43
- pendingLink: m,
44
- ...g ? { provider: g } : {},
45
- ..._ ? { displayName: _ } : {}
42
+ pendingLink: f,
43
+ ...m ? { provider: m } : {},
44
+ ...g ? { displayName: g } : {}
46
45
  }
47
46
  });
48
47
  return;
49
48
  }
50
49
  if (y) {
51
- const n = N[Number(y)];
52
- a(o(n || "oauth.failed"));
50
+ const a = N[Number(y)];
51
+ c(r(a || "oauth.failed"));
53
52
  return;
54
53
  }
55
54
  if (R) {
56
- t.replace("/personal/bindings");
55
+ o.replace("/personal/bindings");
57
56
  return;
58
57
  }
59
58
  if (i) {
60
59
  try {
61
- r.setSession(await L.exchange(i)), t.replace("/");
62
- } catch (n) {
63
- a(U(n));
60
+ n.setSession(await F.exchange(i)), o.replace("/");
61
+ } catch (a) {
62
+ c(z(a));
64
63
  }
65
64
  return;
66
65
  }
67
- a(o("oauth.failed"));
68
- }), (e, i) => (c(), u("div", V, [
69
- h.value === "processing" ? (c(), u("div", z, [
70
- v(s(B), { size: "large" }),
71
- p("p", F, l(s(o)("oauth.processing")), 1)
72
- ])) : (c(), u("div", H, [
73
- v(s(C), {
74
- icon: "ph:warning-circle-duotone",
75
- class: "oauth-err-icon"
76
- }),
77
- p("p", K, l(d.value), 1),
78
- p("p", M, l(s(o)("oauth.backToLogin")), 1)
79
- ]))
80
- ]));
66
+ c(r("oauth.failed"));
67
+ }), (e, i) => (u(), T(H, {
68
+ width: 400,
69
+ "content-style": "padding: 34px 28px 28px"
70
+ }, {
71
+ default: B(() => [
72
+ t("div", K, [
73
+ l.value === "processing" ? (u(), v(b, { key: 0 }, [
74
+ x(s(D), { size: "large" }),
75
+ t("p", M, p(s(r)("oauth.processing")), 1)
76
+ ], 64)) : (u(), v(b, { key: 1 }, [
77
+ x(s(I), {
78
+ icon: "ph:warning-circle",
79
+ width: 44,
80
+ class: "oauth-err-icon"
81
+ }),
82
+ t("p", P, p(d.value), 1),
83
+ t("p", Y, p(s(r)("oauth.backToLogin")), 1),
84
+ i[0] || (i[0] = t("div", {
85
+ class: "oauth-bar",
86
+ "aria-hidden": "true"
87
+ }, [
88
+ t("i")
89
+ ], -1))
90
+ ], 64))
91
+ ])
92
+ ]),
93
+ _: 1
94
+ }));
81
95
  }
82
96
  });
83
97
  export {
84
- te as default
98
+ ne as default
85
99
  };
86
100
  //# sourceMappingURL=callback2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"callback2.vue.js","sources":["../../../src/views/oauth/callback.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 外部登录 / SSO 回调结果页。IdP → 后端回调换会话后,后端 302 到本页并带:\n// ?ticket=xxx 登录成功:凭一次性票据换令牌 → 存会话 → 进首页\n// ?bind=code 绑定成功:回个人中心绑定页\n// ?pendingLink=…&provider=… 未绑定:转登录页,账密成功后认领自动绑定\n// ?totpChallenge=id (+ error=40018) SSO 后需 TOTP:带回登录页完成二次验证\n// ?error=NNNNN 失败:按错误码提示,稍候回登录页\n// 公开路由(未登录也能到);令牌不进 URL,只带票据(见后端 ExternalAuthController)。\nimport { onMounted, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { NSpin } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { externalAuthApi } from '#/api'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { resetRouter } from '#/router'\nimport { translateError } from '#/utils/error'\n\nconst route = useRoute()\nconst router = useRouter()\nconst { t } = useI18n()\nconst user = useUserStore()\nconst auth = useAuthStore()\n\nconst state = ref<'processing' | 'error'>('processing')\nconst errorText = ref('')\n\n// 后端按 ErrorCode 数字码重定向;这里映射已知 oauth 码到 i18n(与后端 40013–40017 对齐)\nconst OAUTH_ERROR_KEYS: Record<number, string> = {\n 40013: 'error.auth.oauthProviderDisabled',\n 40014: 'error.auth.oauthStateInvalid',\n 40015: 'error.auth.oauthExchangeFailed',\n 40016: 'error.auth.oauthAccountNotBound',\n 40017: 'error.auth.oauthAlreadyBound',\n}\n\nfunction fail(text: string) {\n state.value = 'error'\n errorText.value = text\n window.setTimeout(() => router.replace('/login'), 2600)\n}\n\n/**\n * 丢掉残留 SPA 会话。解绑后 SSO 会回 pendingLink/totpChallenge → /login;\n * 若 localStorage 仍有 token,路由守卫会把「已登录访问 /login」弹回首页,看起来像「GitHub 直接登录进去了」。\n * 多个前端实例不同源存储时尤其易踩:在一端登出,回调却落到另一端仍带旧会话。\n */\nfunction dropResidualSession() {\n if (!user.accessToken && !user.refreshToken && !user.cookieSession) return\n resetRouter()\n auth.reset()\n user.clear()\n}\n\nonMounted(async () => {\n const q = route.query\n const ticket = typeof q.ticket === 'string' ? q.ticket : ''\n const bind = typeof q.bind === 'string' ? q.bind : ''\n const pendingLink = typeof q.pendingLink === 'string' ? q.pendingLink : ''\n const provider = typeof q.provider === 'string' ? q.provider : ''\n const displayName = typeof q.displayName === 'string' ? q.displayName : ''\n const error = typeof q.error === 'string' ? q.error : ''\n const totpChallenge = typeof q.totpChallenge === 'string' ? q.totpChallenge : ''\n\n // SSO 已通过 IdP,但需 TOTP:把挑战 Id 交给登录页完成 40018 流\n if (totpChallenge) {\n dropResidualSession()\n await router.replace({ path: '/login', query: { totpChallenge } })\n return\n }\n\n // 未绑定:转登录页现场绑定(账密成功后须确认再 claim);必须先清残留会话,否则守卫直接送首页\n if (pendingLink) {\n dropResidualSession()\n await router.replace({\n path: '/login',\n query: {\n pendingLink,\n ...(provider ? { provider } : {}),\n ...(displayName ? { displayName } : {}),\n },\n })\n return\n }\n\n if (error) {\n const key = OAUTH_ERROR_KEYS[Number(error)]\n fail(key ? t(key) : t('oauth.failed'))\n return\n }\n\n if (bind) {\n router.replace('/personal/bindings') // 绑定成功回个人中心\n return\n }\n\n if (ticket) {\n try {\n user.setSession(await externalAuthApi.exchange(ticket))\n router.replace('/')\n } catch (e) {\n fail(translateError(e))\n }\n return\n }\n\n fail(t('oauth.failed')) // 既无票据也无错误码:异常回退\n})\n</script>\n\n<template>\n <div class=\"oauth-cb\">\n <div v-if=\"state === 'processing'\" class=\"oauth-box\">\n <n-spin size=\"large\" />\n <p class=\"oauth-msg\">{{ t('oauth.processing') }}</p>\n </div>\n <div v-else class=\"oauth-box\">\n <Icon icon=\"ph:warning-circle-duotone\" class=\"oauth-err-icon\" />\n <p class=\"oauth-msg\">{{ errorText }}</p>\n <p class=\"oauth-sub\">{{ t('oauth.backToLogin') }}</p>\n </div>\n </div>\n</template>\n\n<style scoped>\n.oauth-cb {\n min-height: 100dvh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-bg-layout, #f5f6f8);\n}\n.oauth-box {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n}\n.oauth-msg {\n font-size: 15px;\n color: var(--color-text-primary);\n}\n.oauth-sub {\n font-size: 13px;\n color: var(--color-text-tertiary);\n}\n.oauth-err-icon {\n font-size: 44px;\n color: var(--color-error, #e88080);\n}\n</style>\n"],"names":["route","useRoute","router","useRouter","t","useI18n","user","useUserStore","auth","useAuthStore","state","ref","errorText","OAUTH_ERROR_KEYS","fail","text","dropResidualSession","resetRouter","onMounted","q","ticket","bind","pendingLink","provider","displayName","error","totpChallenge","key","externalAuthApi","e","translateError","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createVNode","_unref","NSpin","_createElementVNode","_hoisted_3","_toDisplayString","_hoisted_4","Icon","_hoisted_5","_hoisted_6"],"mappings":"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"}
1
+ {"version":3,"file":"callback2.vue.js","sources":["../../../src/views/oauth/callback.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 外部登录 / SSO 回调结果页。IdP → 后端回调换会话后,后端 302 到本页并带:\n// ?ticket=xxx 登录成功:凭一次性票据换令牌 → 存会话 → 进首页\n// ?bind=code 绑定成功:回个人中心绑定页\n// ?pendingLink=…&provider=… 未绑定:转登录页,账密成功后认领自动绑定\n// ?totpChallenge=id (+ error=40018) SSO 后需 TOTP:带回登录页完成二次验证\n// ?error=NNNNN 失败:按错误码提示,稍候回登录页\n// 公开路由(未登录也能到);令牌不进 URL,只带票据(见后端 ExternalAuthController)。\nimport { onMounted, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { NSpin } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { externalAuthApi } from '#/api'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { resetRouter } from '#/router'\nimport { translateError } from '#/utils/error'\nimport LoginDesk from '#/views/login/components/LoginDesk.vue'\n\nconst route = useRoute()\nconst router = useRouter()\nconst { t } = useI18n()\nconst user = useUserStore()\nconst auth = useAuthStore()\n\nconst state = ref<'processing' | 'error'>('processing')\nconst errorText = ref('')\n\n// 后端按 ErrorCode 数字码重定向;这里映射已知 oauth 码到 i18n(与后端 40013–40017 对齐)\nconst OAUTH_ERROR_KEYS: Record<number, string> = {\n 40013: 'error.auth.oauthProviderDisabled',\n 40014: 'error.auth.oauthStateInvalid',\n 40015: 'error.auth.oauthExchangeFailed',\n 40016: 'error.auth.oauthAccountNotBound',\n 40017: 'error.auth.oauthAlreadyBound',\n}\n\nfunction fail(text: string) {\n state.value = 'error'\n errorText.value = text\n window.setTimeout(() => router.replace('/login'), 2600)\n}\n\n/**\n * 丢掉残留 SPA 会话。解绑后 SSO 会回 pendingLink/totpChallenge → /login;\n * 若 localStorage 仍有 token,路由守卫会把「已登录访问 /login」弹回首页,看起来像「GitHub 直接登录进去了」。\n * 多个前端实例不同源存储时尤其易踩:在一端登出,回调却落到另一端仍带旧会话。\n */\nfunction dropResidualSession() {\n if (!user.accessToken && !user.refreshToken && !user.cookieSession) return\n resetRouter()\n auth.reset()\n user.clear()\n}\n\nonMounted(async () => {\n const q = route.query\n const ticket = typeof q.ticket === 'string' ? q.ticket : ''\n const bind = typeof q.bind === 'string' ? q.bind : ''\n const pendingLink = typeof q.pendingLink === 'string' ? q.pendingLink : ''\n const provider = typeof q.provider === 'string' ? q.provider : ''\n const displayName = typeof q.displayName === 'string' ? q.displayName : ''\n const error = typeof q.error === 'string' ? q.error : ''\n const totpChallenge = typeof q.totpChallenge === 'string' ? q.totpChallenge : ''\n\n // SSO 已通过 IdP,但需 TOTP:把挑战 Id 交给登录页完成 40018 流\n if (totpChallenge) {\n dropResidualSession()\n await router.replace({ path: '/login', query: { totpChallenge } })\n return\n }\n\n // 未绑定:转登录页现场绑定(账密成功后须确认再 claim);必须先清残留会话,否则守卫直接送首页\n if (pendingLink) {\n dropResidualSession()\n await router.replace({\n path: '/login',\n query: {\n pendingLink,\n ...(provider ? { provider } : {}),\n ...(displayName ? { displayName } : {}),\n },\n })\n return\n }\n\n if (error) {\n const key = OAUTH_ERROR_KEYS[Number(error)]\n fail(key ? t(key) : t('oauth.failed'))\n return\n }\n\n if (bind) {\n router.replace('/personal/bindings') // 绑定成功回个人中心\n return\n }\n\n if (ticket) {\n try {\n user.setSession(await externalAuthApi.exchange(ticket))\n router.replace('/')\n } catch (e) {\n fail(translateError(e))\n }\n return\n }\n\n fail(t('oauth.failed')) // 既无票据也无错误码:异常回退\n})\n</script>\n\n<template>\n <LoginDesk :width=\"400\" content-style=\"padding: 34px 28px 28px\">\n <div class=\"oauth-box\" role=\"status\" aria-live=\"polite\">\n <template v-if=\"state === 'processing'\">\n <n-spin size=\"large\" />\n <p class=\"oauth-msg\">{{ t('oauth.processing') }}</p>\n </template>\n <template v-else>\n <Icon icon=\"ph:warning-circle\" :width=\"44\" class=\"oauth-err-icon\" />\n <p class=\"oauth-msg oauth-msg-fail\">{{ errorText }}</p>\n <p class=\"oauth-sub\">{{ t('oauth.backToLogin') }}</p>\n <!-- 与 fail() 里 2.6 秒后回登录页的定时器同长的进度条(纯展示,跳转仍由定时器负责) -->\n <div class=\"oauth-bar\" aria-hidden=\"true\"><i /></div>\n </template>\n </div>\n </LoginDesk>\n</template>\n\n<style scoped>\n.oauth-box {\n min-height: 150px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 14px;\n text-align: center;\n}\n.oauth-msg {\n margin: 0;\n font-size: 15px;\n color: var(--text-1);\n}\n.oauth-msg-fail {\n max-width: 320px;\n line-height: 1.5;\n}\n.oauth-sub {\n margin: 0;\n font-size: 13.5px;\n color: var(--text-3);\n}\n.oauth-err-icon {\n color: var(--err);\n}\n.oauth-bar {\n width: 160px;\n height: 3px;\n overflow: hidden;\n border-radius: 2px;\n background: var(--fill);\n}\n.oauth-bar i {\n display: block;\n height: 100%;\n width: 100%;\n border-radius: inherit;\n background: var(--signal);\n transform-origin: left;\n animation: oauth-fill 2.6s linear both;\n}\n@keyframes oauth-fill {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .oauth-bar i {\n animation: none;\n }\n}\n</style>\n"],"names":["route","useRoute","router","useRouter","t","useI18n","user","useUserStore","auth","useAuthStore","state","ref","errorText","OAUTH_ERROR_KEYS","fail","text","dropResidualSession","resetRouter","onMounted","q","ticket","bind","pendingLink","provider","displayName","error","totpChallenge","key","externalAuthApi","e","translateError","_createBlock","LoginDesk","_createElementVNode","_hoisted_1","_createElementBlock","_Fragment","_createVNode","_unref","NSpin","_hoisted_2","_toDisplayString","Icon","_hoisted_3","_hoisted_4"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import o from "./bindings2.vue.js";
2
2
  /* empty css */
3
- import t from "../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-3ab6b190"]]);
3
+ import f from "../../_virtual/_plugin-vue_export-helper.js";
4
+ const m = /* @__PURE__ */ f(o, [["__scopeId", "data-v-6fc65f6f"]]);
5
5
  export {
6
6
  m as default
7
7
  };
@@ -1,213 +1,217 @@
1
- import { defineComponent as I, ref as _, computed as B, onMounted as L, openBlock as a, createElementBlock as c, createElementVNode as d, toDisplayString as i, unref as e, createCommentVNode as v, createVNode as m, withCtx as l, createTextVNode as h, createBlock as u, Fragment as P, renderList as q, normalizeClass as T } from "vue";
2
- import { useMessage as F, NAlert as H, NSpin as R, NEmpty as U, NCard as j, NTag as y, NButton as x } from "naive-ui";
1
+ import { defineComponent as I, ref as p, computed as B, onMounted as L, openBlock as s, createElementBlock as r, createElementVNode as d, toDisplayString as i, unref as e, createBlock as u, withCtx as o, createTextVNode as b, createCommentVNode as y, createVNode as h, Fragment as P, renderList as q, normalizeClass as T } from "vue";
2
+ import { useMessage as F, NTag as f, NAlert as H, NSpin as R, NEmpty as U, NCard as j, NButton as x } from "naive-ui";
3
3
  import { useI18n as G } from "vue-i18n";
4
- import { externalAuthApi as f } from "../../api/index.js";
4
+ import { externalAuthApi as v } from "../../api/index.js";
5
5
  import { useConfirm as J } from "../../composables/useConfirm.js";
6
6
  import { translateError as A } from "../../utils/error.js";
7
7
  import { fmtDateTime as K } from "../../utils/format.js";
8
8
  import { mergeBindingRows as O } from "../../utils/oauthBrand.js";
9
9
  import Q from "../../components/oauth/BrandIcon.vue.js";
10
10
  import g from "../../components/AppIcon.vue.js";
11
- const W = { class: "bind-page" }, X = { class: "bind-header" }, Y = { class: "bind-header-text" }, Z = { class: "bind-title" }, w = { class: "bind-hint" }, ee = {
12
- key: 0,
13
- class: "bind-summary"
14
- }, ne = { class: "bind-summary-num" }, ie = { class: "bind-summary-label" }, se = {
11
+ const W = { class: "bind-page" }, X = { class: "bind-header" }, Y = { class: "bind-header-text" }, Z = { class: "bind-title" }, w = { class: "bind-hint" }, ee = { class: "bind-summary-num" }, ne = {
15
12
  key: 1,
16
13
  class: "bind-grid"
17
- }, te = { class: "bind-card-main" }, ae = {
14
+ }, ie = { class: "bind-card-main" }, te = {
18
15
  key: 0,
19
16
  class: "bind-check",
20
17
  "aria-hidden": "true"
21
- }, de = { class: "bind-meta" }, oe = { class: "bind-title-row" }, le = { class: "bind-name" }, ce = { class: "bind-code" }, re = {
18
+ }, ae = { class: "bind-meta" }, se = { class: "bind-title-row" }, de = { class: "bind-name" }, oe = { class: "bind-code" }, le = {
22
19
  key: 0,
23
20
  class: "bind-time"
24
- }, ue = {
21
+ }, ce = {
25
22
  key: 1,
26
23
  class: "bind-disabled-tip"
27
- }, be = {
24
+ }, re = {
28
25
  key: 2,
29
26
  class: "bind-free-tip"
30
- }, me = { class: "bind-actions" }, he = {
27
+ }, ue = { class: "bind-actions" }, be = {
31
28
  key: 2,
32
29
  class: "bind-na"
33
- }, Te = /* @__PURE__ */ I({
30
+ }, Ne = /* @__PURE__ */ I({
34
31
  __name: "bindings",
35
- setup(pe) {
36
- const { t: s } = G(), k = F(), { confirm: E } = J(), p = _(!0), C = _([]), z = _([]), r = _(null), b = B(() => O(C.value, z.value)), V = B(() => b.value.filter((t) => !!t.binding).length);
32
+ setup(me) {
33
+ const { t } = G(), k = F(), { confirm: E } = J(), _ = p(!0), C = p([]), z = p([]), l = p(null), m = B(() => O(C.value, z.value)), V = B(() => m.value.filter((a) => !!a.binding).length);
37
34
  async function N() {
38
- p.value = !0;
35
+ _.value = !0;
39
36
  try {
40
- const [t, o] = await Promise.all([f.providers(), f.bindings()]);
41
- C.value = t, z.value = o;
42
- } catch (t) {
43
- k.error(A(t));
37
+ const [a, c] = await Promise.all([v.providers(), v.bindings()]);
38
+ C.value = a, z.value = c;
39
+ } catch (a) {
40
+ k.error(A(a));
44
41
  } finally {
45
- p.value = !1;
42
+ _.value = !1;
46
43
  }
47
44
  }
48
45
  L(N);
49
- async function M(t) {
50
- if (!(!t.enabled || r.value)) {
51
- r.value = t.code;
46
+ async function M(a) {
47
+ if (!(!a.enabled || l.value)) {
48
+ l.value = a.code;
52
49
  try {
53
- const { authorizeUrl: o } = await f.bindStart(t.code);
54
- window.location.href = o;
55
- } catch (o) {
56
- k.error(A(o)), r.value = null;
50
+ const { authorizeUrl: c } = await v.bindStart(a.code);
51
+ window.location.href = c;
52
+ } catch (c) {
53
+ k.error(A(c)), l.value = null;
57
54
  }
58
55
  }
59
56
  }
60
- function S(t) {
61
- r.value || E({
57
+ function S(a) {
58
+ l.value || E({
62
59
  type: "warning",
63
- content: s("oauth.unbindConfirm", { name: t.displayName }),
64
- action: () => f.unbind(t.code),
65
- successMsg: s("oauth.unbound")
66
- }).then((o) => {
67
- o && N();
60
+ content: t("oauth.unbindConfirm", { name: a.displayName }),
61
+ action: () => v.unbind(a.code),
62
+ successMsg: t("oauth.unbound")
63
+ }).then((c) => {
64
+ c && N();
68
65
  });
69
66
  }
70
- function $(t) {
71
- return t.enabled ? t.binding ? "bind-card--bound" : "bind-card--free" : "bind-card--disabled";
67
+ function $(a) {
68
+ return a.enabled ? a.binding ? "bind-card--bound" : "bind-card--free" : "bind-card--disabled";
72
69
  }
73
- return (t, o) => (a(), c("div", W, [
70
+ return (a, c) => (s(), r("div", W, [
74
71
  d("header", X, [
75
72
  d("div", Y, [
76
- d("h2", Z, i(e(s)("oauth.bindingsTitle")), 1),
77
- d("p", w, i(e(s)("oauth.bindingsHint")), 1)
73
+ d("h2", Z, i(e(t)("oauth.bindingsTitle")), 1),
74
+ d("p", w, i(e(t)("oauth.bindingsHint")), 1)
78
75
  ]),
79
- !p.value && b.value.length ? (a(), c("div", ee, [
80
- d("span", ne, i(V.value), 1),
81
- o[0] || (o[0] = d("span", { class: "bind-summary-sep" }, "/", -1)),
82
- d("span", null, i(b.value.length), 1),
83
- d("span", ie, i(e(s)("oauth.boundCountLabel")), 1)
84
- ])) : v("", !0)
76
+ !_.value && m.value.length ? (s(), u(e(f), {
77
+ key: 0,
78
+ round: "",
79
+ bordered: !1,
80
+ size: "medium",
81
+ class: "bind-summary"
82
+ }, {
83
+ default: o(() => [
84
+ d("span", ee, i(V.value), 1),
85
+ b(" / " + i(m.value.length) + " " + i(e(t)("oauth.boundCountLabel")), 1)
86
+ ]),
87
+ _: 1
88
+ })) : y("", !0)
85
89
  ]),
86
- m(e(H), {
90
+ h(e(H), {
87
91
  type: "info",
88
92
  bordered: !1,
89
93
  class: "bind-alert"
90
94
  }, {
91
- default: l(() => [
92
- h(i(e(s)("oauth.bindingsTip")), 1)
95
+ default: o(() => [
96
+ b(i(e(t)("oauth.bindingsTip")), 1)
93
97
  ]),
94
98
  _: 1
95
99
  }),
96
- m(e(R), { show: p.value }, {
97
- default: l(() => [
98
- !p.value && !b.value.length ? (a(), u(e(U), {
100
+ h(e(R), { show: _.value }, {
101
+ default: o(() => [
102
+ !_.value && !m.value.length ? (s(), u(e(U), {
99
103
  key: 0,
100
- description: e(s)("oauth.noProviders"),
104
+ description: e(t)("oauth.noProviders"),
101
105
  class: "bind-empty"
102
- }, null, 8, ["description"])) : b.value.length ? (a(), c("div", se, [
103
- (a(!0), c(P, null, q(b.value, (n) => (a(), u(e(j), {
106
+ }, null, 8, ["description"])) : m.value.length ? (s(), r("div", ne, [
107
+ (s(!0), r(P, null, q(m.value, (n) => (s(), u(e(j), {
104
108
  key: n.code,
105
109
  size: "small",
106
110
  bordered: !0,
107
- class: T(["bind-card", $(n)])
111
+ class: T(["a-card bind-card", $(n)])
108
112
  }, {
109
- default: l(() => [
110
- d("div", te, [
113
+ default: o(() => [
114
+ d("div", ie, [
111
115
  d("span", {
112
116
  class: T(["bind-avatar", { "bind-avatar--bound": !!n.binding }])
113
117
  }, [
114
- m(Q, {
118
+ h(Q, {
115
119
  code: n.code,
116
120
  icon: n.icon,
117
121
  size: 44
118
122
  }, null, 8, ["code", "icon"]),
119
- n.binding ? (a(), c("span", ae, [
120
- m(g, {
121
- icon: "ph:check-bold",
123
+ n.binding ? (s(), r("span", te, [
124
+ h(g, {
125
+ icon: "ph:check",
122
126
  size: 12
123
127
  })
124
- ])) : v("", !0)
128
+ ])) : y("", !0)
125
129
  ], 2),
126
- d("div", de, [
127
- d("div", oe, [
128
- d("span", le, i(n.displayName), 1),
129
- n.enabled ? n.binding ? (a(), u(e(y), {
130
+ d("div", ae, [
131
+ d("div", se, [
132
+ d("span", de, i(n.displayName), 1),
133
+ n.enabled ? n.binding ? (s(), u(e(f), {
130
134
  key: 1,
131
135
  size: "small",
132
136
  type: "success",
133
137
  bordered: !1,
134
138
  round: ""
135
139
  }, {
136
- default: l(() => [
137
- h(i(e(s)("oauth.bound")), 1)
140
+ default: o(() => [
141
+ b(i(e(t)("oauth.bound")), 1)
138
142
  ]),
139
143
  _: 1
140
- })) : (a(), u(e(y), {
144
+ })) : (s(), u(e(f), {
141
145
  key: 2,
142
146
  size: "small",
143
147
  bordered: !1,
144
148
  round: ""
145
149
  }, {
146
- default: l(() => [
147
- h(i(e(s)("oauth.notBound")), 1)
150
+ default: o(() => [
151
+ b(i(e(t)("oauth.notBound")), 1)
148
152
  ]),
149
153
  _: 1
150
- })) : (a(), u(e(y), {
154
+ })) : (s(), u(e(f), {
151
155
  key: 0,
152
156
  size: "small",
153
157
  type: "warning",
154
158
  bordered: !1,
155
159
  round: ""
156
160
  }, {
157
- default: l(() => [
158
- h(i(e(s)("oauth.disabled")), 1)
161
+ default: o(() => [
162
+ b(i(e(t)("oauth.disabled")), 1)
159
163
  ]),
160
164
  _: 1
161
165
  }))
162
166
  ]),
163
- d("code", ce, i(n.code), 1),
164
- n.binding ? (a(), c("p", re, i(e(s)("oauth.boundAt", { time: e(K)(n.binding.boundAt) })), 1)) : n.enabled ? (a(), c("p", be, i(e(s)("oauth.bindTip")), 1)) : (a(), c("p", ue, i(e(s)("oauth.disabledTip")), 1))
167
+ d("code", oe, i(n.code), 1)
165
168
  ])
166
169
  ]),
167
- d("div", me, [
168
- n.binding ? (a(), u(e(x), {
170
+ n.binding ? (s(), r("p", le, i(e(t)("oauth.boundAt", { time: e(K)(n.binding.boundAt) })), 1)) : n.enabled ? (s(), r("p", re, i(e(t)("oauth.bindTip")), 1)) : (s(), r("p", ce, i(e(t)("oauth.disabledTip")), 1)),
171
+ d("div", ue, [
172
+ n.binding ? (s(), u(e(x), {
169
173
  key: 0,
170
174
  size: "small",
171
175
  quaternary: "",
172
176
  type: "error",
173
- disabled: !!r.value,
177
+ disabled: !!l.value,
174
178
  onClick: (D) => S(n)
175
179
  }, {
176
- icon: l(() => [
177
- m(g, {
180
+ icon: o(() => [
181
+ h(g, {
178
182
  icon: "ph:link-break",
179
183
  size: 15
180
184
  })
181
185
  ]),
182
- default: l(() => [
183
- h(" " + i(e(s)("oauth.unbind")), 1)
186
+ default: o(() => [
187
+ b(" " + i(e(t)("oauth.unbind")), 1)
184
188
  ]),
185
189
  _: 1
186
- }, 8, ["disabled", "onClick"])) : n.enabled ? (a(), u(e(x), {
190
+ }, 8, ["disabled", "onClick"])) : n.enabled ? (s(), u(e(x), {
187
191
  key: 1,
188
192
  size: "small",
189
193
  type: "primary",
190
194
  secondary: "",
191
- loading: r.value === n.code,
192
- disabled: !!r.value && r.value !== n.code,
195
+ loading: l.value === n.code,
196
+ disabled: !!l.value && l.value !== n.code,
193
197
  onClick: (D) => M(n)
194
198
  }, {
195
- icon: l(() => [
196
- m(g, {
199
+ icon: o(() => [
200
+ h(g, {
197
201
  icon: "ph:link",
198
202
  size: 15
199
203
  })
200
204
  ]),
201
- default: l(() => [
202
- h(" " + i(e(s)("oauth.bind")), 1)
205
+ default: o(() => [
206
+ b(" " + i(e(t)("oauth.bind")), 1)
203
207
  ]),
204
208
  _: 1
205
- }, 8, ["loading", "disabled", "onClick"])) : (a(), c("span", he, i(e(s)("oauth.cannotBind")), 1))
209
+ }, 8, ["loading", "disabled", "onClick"])) : (s(), r("span", be, i(e(t)("oauth.cannotBind")), 1))
206
210
  ])
207
211
  ]),
208
212
  _: 2
209
213
  }, 1032, ["class"]))), 128))
210
- ])) : v("", !0)
214
+ ])) : y("", !0)
211
215
  ]),
212
216
  _: 1
213
217
  }, 8, ["show"])
@@ -215,6 +219,6 @@ const W = { class: "bind-page" }, X = { class: "bind-header" }, Y = { class: "bi
215
219
  }
216
220
  });
217
221
  export {
218
- Te as default
222
+ Ne as default
219
223
  };
220
224
  //# sourceMappingURL=bindings2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bindings2.vue.js","sources":["../../../src/views/personal/bindings.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 账号绑定(个人中心 + 品牌化):启用 providers ∪ 已绑定停用项;卡片网格与配置 Tab 同风。\nimport { computed, onMounted, ref } from 'vue'\nimport { NAlert, NButton, NCard, NEmpty, NSpin, NTag, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { externalAuthApi, type ExternalProvider, type ExternalBinding } from '#/api'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateError } from '#/utils/error'\nimport { fmtDateTime } from '#/utils/format'\nimport { mergeBindingRows, type BindingRow } from '#/utils/oauthBrand'\nimport BrandIcon from '#/components/oauth/BrandIcon.vue'\nimport AppIcon from '#/components/AppIcon.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\n\nconst loading = ref(true)\nconst providers = ref<ExternalProvider[]>([])\nconst bindings = ref<ExternalBinding[]>([])\nconst busyCode = ref<string | null>(null)\n\nconst rows = computed(() => mergeBindingRows(providers.value, bindings.value))\nconst boundCount = computed(() => rows.value.filter(r => !!r.binding).length)\n\nasync function load() {\n loading.value = true\n try {\n const [ps, bs] = await Promise.all([externalAuthApi.providers(), externalAuthApi.bindings()])\n providers.value = ps\n bindings.value = bs\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\nasync function bind(row: BindingRow) {\n if (!row.enabled || busyCode.value) return\n busyCode.value = row.code\n try {\n const { authorizeUrl } = await externalAuthApi.bindStart(row.code)\n window.location.href = authorizeUrl\n } catch (e) {\n message.error(translateError(e))\n busyCode.value = null\n }\n}\n\nfunction unbind(row: BindingRow) {\n if (busyCode.value) return\n confirm({\n type: 'warning',\n content: t('oauth.unbindConfirm', { name: row.displayName }),\n action: () => externalAuthApi.unbind(row.code),\n successMsg: t('oauth.unbound'),\n }).then(ok => {\n if (ok) load()\n })\n}\n\n/** 三种绑定状态各一个修饰类,着色写在样式里(free = naive 默认卡片)。 */\nfunction cardClass(row: BindingRow) {\n if (!row.enabled) return 'bind-card--disabled'\n if (row.binding) return 'bind-card--bound'\n return 'bind-card--free'\n}\n</script>\n\n<template>\n <div class=\"bind-page\">\n <header class=\"bind-header\">\n <div class=\"bind-header-text\">\n <h2 class=\"bind-title\">{{ t('oauth.bindingsTitle') }}</h2>\n <p class=\"bind-hint\">{{ t('oauth.bindingsHint') }}</p>\n </div>\n <div v-if=\"!loading && rows.length\" class=\"bind-summary\">\n <span class=\"bind-summary-num\">{{ boundCount }}</span>\n <span class=\"bind-summary-sep\">/</span>\n <span>{{ rows.length }}</span>\n <span class=\"bind-summary-label\">{{ t('oauth.boundCountLabel') }}</span>\n </div>\n </header>\n\n <n-alert type=\"info\" :bordered=\"false\" class=\"bind-alert\">\n {{ t('oauth.bindingsTip') }}\n </n-alert>\n\n <n-spin :show=\"loading\">\n <n-empty\n v-if=\"!loading && !rows.length\"\n :description=\"t('oauth.noProviders')\"\n class=\"bind-empty\"\n />\n\n <div v-else-if=\"rows.length\" class=\"bind-grid\">\n <n-card\n v-for=\"row in rows\"\n :key=\"row.code\"\n size=\"small\"\n :bordered=\"true\"\n class=\"bind-card\"\n :class=\"cardClass(row)\"\n >\n <div class=\"bind-card-main\">\n <span class=\"bind-avatar\" :class=\"{ 'bind-avatar--bound': !!row.binding }\">\n <BrandIcon :code=\"row.code\" :icon=\"row.icon\" :size=\"44\" />\n <span v-if=\"row.binding\" class=\"bind-check\" aria-hidden=\"true\">\n <AppIcon icon=\"ph:check-bold\" :size=\"12\" />\n </span>\n </span>\n <div class=\"bind-meta\">\n <div class=\"bind-title-row\">\n <span class=\"bind-name\">{{ row.displayName }}</span>\n <n-tag v-if=\"!row.enabled\" size=\"small\" type=\"warning\" :bordered=\"false\" round>\n {{ t('oauth.disabled') }}\n </n-tag>\n <n-tag v-else-if=\"row.binding\" size=\"small\" type=\"success\" :bordered=\"false\" round>\n {{ t('oauth.bound') }}\n </n-tag>\n <n-tag v-else size=\"small\" :bordered=\"false\" round>\n {{ t('oauth.notBound') }}\n </n-tag>\n </div>\n <code class=\"bind-code\">{{ row.code }}</code>\n <p v-if=\"row.binding\" class=\"bind-time\">\n {{ t('oauth.boundAt', { time: fmtDateTime(row.binding.boundAt) }) }}\n </p>\n <p v-else-if=\"!row.enabled\" class=\"bind-disabled-tip\">\n {{ t('oauth.disabledTip') }}\n </p>\n <p v-else class=\"bind-free-tip\">{{ t('oauth.bindTip') }}</p>\n </div>\n </div>\n\n <div class=\"bind-actions\">\n <n-button\n v-if=\"row.binding\"\n size=\"small\"\n quaternary\n type=\"error\"\n :disabled=\"!!busyCode\"\n @click=\"unbind(row)\"\n >\n <template #icon><AppIcon icon=\"ph:link-break\" :size=\"15\" /></template>\n {{ t('oauth.unbind') }}\n </n-button>\n <n-button\n v-else-if=\"row.enabled\"\n size=\"small\"\n type=\"primary\"\n secondary\n :loading=\"busyCode === row.code\"\n :disabled=\"!!busyCode && busyCode !== row.code\"\n @click=\"bind(row)\"\n >\n <template #icon><AppIcon icon=\"ph:link\" :size=\"15\" /></template>\n {{ t('oauth.bind') }}\n </n-button>\n <span v-else class=\"bind-na\">{{ t('oauth.cannotBind') }}</span>\n </div>\n </n-card>\n </div>\n </n-spin>\n </div>\n</template>\n\n<style scoped>\n.bind-page {\n max-width: 920px;\n}\n.bind-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 14px;\n flex-wrap: wrap;\n}\n.bind-title {\n margin: 0 0 6px;\n font-size: 18px;\n font-weight: 600;\n line-height: 1.3;\n color: var(--color-text-primary, #1f1f1f);\n}\n.bind-hint {\n margin: 0;\n max-width: 520px;\n font-size: 13px;\n line-height: 1.55;\n color: var(--color-text-secondary, #666);\n}\n.bind-summary {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n padding: 8px 12px;\n border-radius: 10px;\n background: var(--color-fill, #f5f5f5);\n font-size: 13px;\n color: var(--color-text-secondary, #666);\n flex-shrink: 0;\n}\n.bind-summary-num {\n font-size: 18px;\n font-weight: 700;\n color: var(--color-primary, #646cff);\n font-variant-numeric: tabular-nums;\n}\n.bind-summary-sep {\n opacity: 0.5;\n}\n.bind-summary-label {\n margin-left: 4px;\n}\n.bind-alert {\n margin-bottom: 16px;\n border-radius: 10px;\n}\n.bind-empty {\n padding: 48px 0;\n}\n.bind-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n/* n-card 默认边框/底色就是 --color-border / --color-bg-container(见 theme/naive-theme.ts),\n 所以「未绑定」态什么都不用写;圆角同样由 Card.borderRadius = --radius-lg 给。 */\n.bind-card :deep(.n-card-content) {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.bind-card:hover {\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.06);\n}\n/* 状态着色必须压过 naive 的 `.n-card.n-card--bordered`(两个类=同权重,加载顺序不确定),\n 故修饰类与 .bind-card 复合写,靠权重取胜,而不是靠先后。 */\n.bind-card.bind-card--bound {\n border-color: color-mix(in srgb, var(--color-success, #18a058) 40%, var(--color-border, #e8e8e8));\n background: color-mix(in srgb, var(--color-success, #18a058) 4%, var(--color-bg-container, #fff));\n}\n.bind-card.bind-card--disabled {\n opacity: 0.78;\n background: var(--color-fill-quaternary, #f7f7f7);\n border-style: dashed;\n}\n.bind-card-main {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n min-width: 0;\n}\n.bind-avatar {\n position: relative;\n display: inline-flex;\n width: 48px;\n height: 48px;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n overflow: visible;\n background: var(--color-fill, #f5f5f5);\n}\n.bind-avatar :deep(.oauth-brand-badge),\n.bind-avatar :deep(img) {\n border-radius: 50%;\n overflow: hidden;\n}\n.bind-avatar--bound {\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-success, #18a058) 35%, transparent);\n}\n.bind-check {\n position: absolute;\n right: -2px;\n bottom: -2px;\n display: inline-flex;\n width: 18px;\n height: 18px;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n background: var(--color-success, #18a058);\n color: #fff;\n border: 2px solid var(--color-bg-container, #fff);\n line-height: 0;\n}\n.bind-meta {\n min-width: 0;\n flex: 1;\n}\n.bind-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n margin-bottom: 4px;\n}\n.bind-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--color-text-primary, #1f1f1f);\n line-height: 1.3;\n}\n.bind-code {\n display: inline-block;\n font-size: 12px;\n color: var(--color-text-tertiary, #999);\n background: var(--color-fill, #f5f5f5);\n padding: 1px 6px;\n border-radius: 4px;\n}\n.bind-time,\n.bind-free-tip,\n.bind-disabled-tip {\n margin: 8px 0 0;\n font-size: 12px;\n line-height: 1.45;\n color: var(--color-text-tertiary, #999);\n}\n.bind-time {\n color: var(--color-text-secondary, #666);\n}\n.bind-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 12px;\n border-top: 1px dashed var(--color-border, #e8e8e8);\n min-height: 36px;\n}\n.bind-na {\n font-size: 12px;\n color: var(--color-text-tertiary, #999);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","loading","ref","providers","bindings","busyCode","rows","computed","mergeBindingRows","boundCount","r","load","ps","bs","externalAuthApi","e","translateError","onMounted","bind","row","authorizeUrl","unbind","ok","cardClass","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_cache","_hoisted_8","_createVNode","NAlert","NSpin","_createBlock","NEmpty","_hoisted_9","_Fragment","_renderList","NCard","_normalizeClass","_hoisted_10","BrandIcon","_hoisted_11","AppIcon","_hoisted_12","_hoisted_13","_hoisted_14","NTag","_hoisted_15","_hoisted_16","fmtDateTime","_hoisted_18","_hoisted_17","_hoisted_19","NButton","$event","_createTextVNode","_hoisted_20"],"mappings":"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"}
1
+ {"version":3,"file":"bindings2.vue.js","sources":["../../../src/views/personal/bindings.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 账号绑定(个人中心 + 品牌化):启用 providers ∪ 已绑定停用项;卡片网格与配置 Tab 同风。\nimport { computed, onMounted, ref } from 'vue'\nimport { NAlert, NButton, NCard, NEmpty, NSpin, NTag, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { externalAuthApi, type ExternalProvider, type ExternalBinding } from '#/api'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateError } from '#/utils/error'\nimport { fmtDateTime } from '#/utils/format'\nimport { mergeBindingRows, type BindingRow } from '#/utils/oauthBrand'\nimport BrandIcon from '#/components/oauth/BrandIcon.vue'\nimport AppIcon from '#/components/AppIcon.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\n\nconst loading = ref(true)\nconst providers = ref<ExternalProvider[]>([])\nconst bindings = ref<ExternalBinding[]>([])\nconst busyCode = ref<string | null>(null)\n\nconst rows = computed(() => mergeBindingRows(providers.value, bindings.value))\nconst boundCount = computed(() => rows.value.filter(r => !!r.binding).length)\n\nasync function load() {\n loading.value = true\n try {\n const [ps, bs] = await Promise.all([externalAuthApi.providers(), externalAuthApi.bindings()])\n providers.value = ps\n bindings.value = bs\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\nasync function bind(row: BindingRow) {\n if (!row.enabled || busyCode.value) return\n busyCode.value = row.code\n try {\n const { authorizeUrl } = await externalAuthApi.bindStart(row.code)\n window.location.href = authorizeUrl\n } catch (e) {\n message.error(translateError(e))\n busyCode.value = null\n }\n}\n\nfunction unbind(row: BindingRow) {\n if (busyCode.value) return\n confirm({\n type: 'warning',\n content: t('oauth.unbindConfirm', { name: row.displayName }),\n action: () => externalAuthApi.unbind(row.code),\n successMsg: t('oauth.unbound'),\n }).then(ok => {\n if (ok) load()\n })\n}\n\n/** 三种绑定状态各一个修饰类,着色写在样式里(free = naive 默认卡片)。 */\nfunction cardClass(row: BindingRow) {\n if (!row.enabled) return 'bind-card--disabled'\n if (row.binding) return 'bind-card--bound'\n return 'bind-card--free'\n}\n</script>\n\n<template>\n <div class=\"bind-page\">\n <header class=\"bind-header\">\n <div class=\"bind-header-text\">\n <!-- 页头只放说明 + 计数胶囊(左侧子导航已标明当前页),标题保留给读屏用 -->\n <h2 class=\"bind-title\">{{ t('oauth.bindingsTitle') }}</h2>\n <p class=\"bind-hint\">{{ t('oauth.bindingsHint') }}</p>\n </div>\n <n-tag\n v-if=\"!loading && rows.length\"\n round\n :bordered=\"false\"\n size=\"medium\"\n class=\"bind-summary\"\n >\n <span class=\"bind-summary-num\">{{ boundCount }}</span>\n / {{ rows.length }} {{ t('oauth.boundCountLabel') }}\n </n-tag>\n </header>\n\n <n-alert type=\"info\" :bordered=\"false\" class=\"bind-alert\">\n {{ t('oauth.bindingsTip') }}\n </n-alert>\n\n <n-spin :show=\"loading\">\n <n-empty\n v-if=\"!loading && !rows.length\"\n :description=\"t('oauth.noProviders')\"\n class=\"bind-empty\"\n />\n\n <div v-else-if=\"rows.length\" class=\"bind-grid\">\n <n-card\n v-for=\"row in rows\"\n :key=\"row.code\"\n size=\"small\"\n :bordered=\"true\"\n class=\"a-card bind-card\"\n :class=\"cardClass(row)\"\n >\n <div class=\"bind-card-main\">\n <span class=\"bind-avatar\" :class=\"{ 'bind-avatar--bound': !!row.binding }\">\n <BrandIcon :code=\"row.code\" :icon=\"row.icon\" :size=\"44\" />\n <span v-if=\"row.binding\" class=\"bind-check\" aria-hidden=\"true\">\n <AppIcon icon=\"ph:check\" :size=\"12\" />\n </span>\n </span>\n <div class=\"bind-meta\">\n <div class=\"bind-title-row\">\n <span class=\"bind-name\">{{ row.displayName }}</span>\n <n-tag v-if=\"!row.enabled\" size=\"small\" type=\"warning\" :bordered=\"false\" round>\n {{ t('oauth.disabled') }}\n </n-tag>\n <n-tag v-else-if=\"row.binding\" size=\"small\" type=\"success\" :bordered=\"false\" round>\n {{ t('oauth.bound') }}\n </n-tag>\n <n-tag v-else size=\"small\" :bordered=\"false\" round>\n {{ t('oauth.notBound') }}\n </n-tag>\n </div>\n <code class=\"bind-code\">{{ row.code }}</code>\n </div>\n </div>\n <p v-if=\"row.binding\" class=\"bind-time\">\n {{ t('oauth.boundAt', { time: fmtDateTime(row.binding.boundAt) }) }}\n </p>\n <p v-else-if=\"!row.enabled\" class=\"bind-disabled-tip\">\n {{ t('oauth.disabledTip') }}\n </p>\n <p v-else class=\"bind-free-tip\">{{ t('oauth.bindTip') }}</p>\n\n <div class=\"bind-actions\">\n <n-button\n v-if=\"row.binding\"\n size=\"small\"\n quaternary\n type=\"error\"\n :disabled=\"!!busyCode\"\n @click=\"unbind(row)\"\n >\n <template #icon><AppIcon icon=\"ph:link-break\" :size=\"15\" /></template>\n {{ t('oauth.unbind') }}\n </n-button>\n <n-button\n v-else-if=\"row.enabled\"\n size=\"small\"\n type=\"primary\"\n secondary\n :loading=\"busyCode === row.code\"\n :disabled=\"!!busyCode && busyCode !== row.code\"\n @click=\"bind(row)\"\n >\n <template #icon><AppIcon icon=\"ph:link\" :size=\"15\" /></template>\n {{ t('oauth.bind') }}\n </n-button>\n <span v-else class=\"bind-na\">{{ t('oauth.cannotBind') }}</span>\n </div>\n </n-card>\n </div>\n </n-spin>\n </div>\n</template>\n\n<style scoped>\n.bind-page {\n max-width: 920px;\n width: 100%;\n}\n.bind-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 12px;\n flex-wrap: wrap;\n}\n/* 标题仅供读屏 */\n.bind-title {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n.bind-hint {\n margin: 0;\n max-width: 520px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-2);\n}\n.bind-summary {\n flex-shrink: 0;\n font-variant-numeric: tabular-nums;\n}\n.bind-summary-num {\n font-size: 18px;\n font-weight: 600;\n color: var(--signal);\n}\n.bind-alert {\n margin-bottom: 12px;\n}\n.bind-empty {\n padding: 48px 0;\n}\n.bind-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(min(280px, 100%), 1fr));\n gap: 12px;\n min-height: 120px;\n}\n.bind-card :deep(.n-card__content) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 14px 16px;\n}\n/* 状态着色必须压过 naive 的 `.n-card.n-card--bordered`(两个类=同权重,加载顺序不确定),\n 故修饰类与 .bind-card 复合写,靠权重取胜,而不是靠先后。 */\n.bind-card.bind-card--bound {\n border-color: color-mix(in srgb, var(--ok) 40%, transparent);\n background: color-mix(in srgb, var(--ok) 4%, var(--bg-card));\n}\n.bind-card.bind-card--disabled {\n opacity: 0.78;\n background: var(--fill);\n border: 1px dashed var(--hairline);\n}\n.bind-card-main {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.bind-avatar {\n position: relative;\n display: inline-flex;\n width: 48px;\n height: 48px;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n overflow: visible;\n background: var(--fill);\n color: var(--text-1);\n}\n.bind-avatar :deep(.oauth-brand-badge),\n.bind-avatar :deep(img) {\n border-radius: 50%;\n overflow: hidden;\n}\n.bind-avatar--bound {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 35%, transparent);\n}\n.bind-check {\n position: absolute;\n right: -2px;\n bottom: -2px;\n display: inline-flex;\n width: 18px;\n height: 18px;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n background: var(--ok);\n color: var(--bg-card);\n box-shadow: 0 0 0 2px var(--bg-card);\n line-height: 0;\n}\n.bind-meta {\n min-width: 0;\n flex: 1;\n}\n.bind-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n.bind-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--text-1);\n}\n.bind-code {\n display: inline-block;\n margin-top: 4px;\n padding: 0 6px;\n border-radius: 6px;\n background: var(--fill);\n color: var(--text-2);\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n/* 说明行放到头像行下面,整卡一条通栏 */\n.bind-time,\n.bind-free-tip,\n.bind-disabled-tip {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-3);\n}\n.bind-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 10px;\n border-top: 1px dashed var(--hairline);\n min-height: 36px;\n}\n.bind-na {\n font-size: 13px;\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","message","useMessage","confirm","useConfirm","loading","ref","providers","bindings","busyCode","rows","computed","mergeBindingRows","boundCount","r","load","ps","bs","externalAuthApi","e","translateError","onMounted","bind","row","authorizeUrl","unbind","ok","cardClass","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_createBlock","NTag","_hoisted_6","_createTextVNode","_createVNode","NAlert","NSpin","NEmpty","_hoisted_7","_Fragment","_renderList","NCard","_normalizeClass","_hoisted_8","BrandIcon","_hoisted_9","AppIcon","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","fmtDateTime","_hoisted_16","_hoisted_15","_hoisted_17","NButton","$event","_hoisted_18"],"mappings":"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"}