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.
- package/LICENSE +201 -0
- package/README.md +78 -0
- package/dist/App.vue.d.ts +3 -0
- package/dist/App.vue.js +54 -0
- package/dist/App.vue.js.map +1 -0
- package/dist/App2.vue.js +5 -0
- package/dist/App2.vue.js.map +1 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
- package/dist/_virtual/_plugin-vue_export-helper.js.map +1 -0
- package/dist/api/client.d.ts +29 -0
- package/dist/api/client.js +139 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +672 -0
- package/dist/api/index.js +638 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/reauthGate.d.ts +16 -0
- package/dist/api/reauthGate.js +21 -0
- package/dist/api/reauthGate.js.map +1 -0
- package/dist/api/schema.d.ts +10230 -0
- package/dist/assets/icons/ph-subset.json.js +16 -0
- package/dist/assets/icons/ph-subset.json.js.map +1 -0
- package/dist/assets/oauth/dingtalk.svg.js +5 -0
- package/dist/assets/oauth/dingtalk.svg.js.map +1 -0
- package/dist/assets/oauth/gitee.svg.js +5 -0
- package/dist/assets/oauth/gitee.svg.js.map +1 -0
- package/dist/assets/oauth/github.svg.js +5 -0
- package/dist/assets/oauth/github.svg.js.map +1 -0
- package/dist/assets/oauth/qq.svg.js +5 -0
- package/dist/assets/oauth/qq.svg.js.map +1 -0
- package/dist/assets/oauth/wechat.svg.js +5 -0
- package/dist/assets/oauth/wechat.svg.js.map +1 -0
- package/dist/assets/oauth/wecom.svg.js +5 -0
- package/dist/assets/oauth/wecom.svg.js.map +1 -0
- package/dist/assets/svg/star.svg.js +6 -0
- package/dist/assets/svg/star.svg.js.map +1 -0
- package/dist/components/ApiSelect/index.vue.d.ts +22 -0
- package/dist/components/ApiSelect/index.vue.js +50 -0
- package/dist/components/ApiSelect/index.vue.js.map +1 -0
- package/dist/components/ApiSelect/index2.vue.js +5 -0
- package/dist/components/ApiSelect/index2.vue.js.map +1 -0
- package/dist/components/AppIcon.vue.d.ts +7 -0
- package/dist/components/AppIcon.vue.js +33 -0
- package/dist/components/AppIcon.vue.js.map +1 -0
- package/dist/components/AppIcon2.vue.js +5 -0
- package/dist/components/AppIcon2.vue.js.map +1 -0
- package/dist/components/Chart/BarChart.vue.d.ts +13 -0
- package/dist/components/Chart/BarChart.vue.js +27 -0
- package/dist/components/Chart/BarChart.vue.js.map +1 -0
- package/dist/components/Chart/BarChart2.vue.js +5 -0
- package/dist/components/Chart/BarChart2.vue.js.map +1 -0
- package/dist/components/Chart/LineChart.vue.d.ts +15 -0
- package/dist/components/Chart/LineChart.vue.js +33 -0
- package/dist/components/Chart/LineChart.vue.js.map +1 -0
- package/dist/components/Chart/LineChart2.vue.js +5 -0
- package/dist/components/Chart/LineChart2.vue.js.map +1 -0
- package/dist/components/Chart/PieChart.vue.d.ts +14 -0
- package/dist/components/Chart/PieChart.vue.js +31 -0
- package/dist/components/Chart/PieChart.vue.js.map +1 -0
- package/dist/components/Chart/PieChart2.vue.js +5 -0
- package/dist/components/Chart/PieChart2.vue.js.map +1 -0
- package/dist/components/Chart/echarts.d.ts +57 -0
- package/dist/components/Chart/echarts.js +47 -0
- package/dist/components/Chart/echarts.js.map +1 -0
- package/dist/components/Chart/index.vue.d.ts +12 -0
- package/dist/components/Chart/index.vue.js +8 -0
- package/dist/components/Chart/index.vue.js.map +1 -0
- package/dist/components/Chart/index2.vue.js +27 -0
- package/dist/components/Chart/index2.vue.js.map +1 -0
- package/dist/components/CodeBlock/index.vue.d.ts +17 -0
- package/dist/components/CodeBlock/index.vue.js +8 -0
- package/dist/components/CodeBlock/index.vue.js.map +1 -0
- package/dist/components/CodeBlock/index2.vue.js +48 -0
- package/dist/components/CodeBlock/index2.vue.js.map +1 -0
- package/dist/components/CronEditor/index.vue.d.ts +15 -0
- package/dist/components/CronEditor/index.vue.js +8 -0
- package/dist/components/CronEditor/index.vue.js.map +1 -0
- package/dist/components/CronEditor/index2.vue.js +528 -0
- package/dist/components/CronEditor/index2.vue.js.map +1 -0
- package/dist/components/DetailPage/index.vue.d.ts +26 -0
- package/dist/components/DetailPage/index.vue.js +8 -0
- package/dist/components/DetailPage/index.vue.js.map +1 -0
- package/dist/components/DetailPage/index2.vue.js +51 -0
- package/dist/components/DetailPage/index2.vue.js.map +1 -0
- package/dist/components/DictCheckbox/index.vue.d.ts +6 -0
- package/dist/components/DictCheckbox/index.vue.js +43 -0
- package/dist/components/DictCheckbox/index.vue.js.map +1 -0
- package/dist/components/DictCheckbox/index2.vue.js +5 -0
- package/dist/components/DictCheckbox/index2.vue.js.map +1 -0
- package/dist/components/DictRadio/index.vue.d.ts +6 -0
- package/dist/components/DictRadio/index.vue.js +38 -0
- package/dist/components/DictRadio/index.vue.js.map +1 -0
- package/dist/components/DictRadio/index2.vue.js +5 -0
- package/dist/components/DictRadio/index2.vue.js.map +1 -0
- package/dist/components/DictSelect/index.vue.d.ts +6 -0
- package/dist/components/DictSelect/index.vue.js +37 -0
- package/dist/components/DictSelect/index.vue.js.map +1 -0
- package/dist/components/DictSelect/index2.vue.js +5 -0
- package/dist/components/DictSelect/index2.vue.js.map +1 -0
- package/dist/components/DictTag/index.vue.d.ts +10 -0
- package/dist/components/DictTag/index.vue.js +48 -0
- package/dist/components/DictTag/index.vue.js.map +1 -0
- package/dist/components/DictTag/index2.vue.js +5 -0
- package/dist/components/DictTag/index2.vue.js.map +1 -0
- package/dist/components/ErrorBoundary/index.vue.d.ts +13 -0
- package/dist/components/ErrorBoundary/index.vue.js +8 -0
- package/dist/components/ErrorBoundary/index.vue.js.map +1 -0
- package/dist/components/ErrorBoundary/index2.vue.js +61 -0
- package/dist/components/ErrorBoundary/index2.vue.js.map +1 -0
- package/dist/components/ExportColumnsModal/index.vue.d.ts +19 -0
- package/dist/components/ExportColumnsModal/index.vue.js +8 -0
- package/dist/components/ExportColumnsModal/index.vue.js.map +1 -0
- package/dist/components/ExportColumnsModal/index2.vue.js +121 -0
- package/dist/components/ExportColumnsModal/index2.vue.js.map +1 -0
- package/dist/components/FileUpload/index.vue.d.ts +24 -0
- package/dist/components/FileUpload/index.vue.js +42 -0
- package/dist/components/FileUpload/index.vue.js.map +1 -0
- package/dist/components/FileUpload/index2.vue.js +5 -0
- package/dist/components/FileUpload/index2.vue.js.map +1 -0
- package/dist/components/FormContainer/index.vue.d.ts +51 -0
- package/dist/components/FormContainer/index.vue.js +160 -0
- package/dist/components/FormContainer/index.vue.js.map +1 -0
- package/dist/components/FormContainer/index3.vue.js +6 -0
- package/dist/components/FormContainer/index3.vue.js.map +1 -0
- package/dist/components/IconPicker/index.vue.d.ts +18 -0
- package/dist/components/IconPicker/index.vue.js +43 -0
- package/dist/components/IconPicker/index.vue.js.map +1 -0
- package/dist/components/IconPicker/index2.vue.js +5 -0
- package/dist/components/IconPicker/index2.vue.js.map +1 -0
- package/dist/components/ImportWizard/index.vue.d.ts +39 -0
- package/dist/components/ImportWizard/index.vue.js +8 -0
- package/dist/components/ImportWizard/index.vue.js.map +1 -0
- package/dist/components/ImportWizard/index2.vue.js +634 -0
- package/dist/components/ImportWizard/index2.vue.js.map +1 -0
- package/dist/components/JsonEditor/index.vue.d.ts +12 -0
- package/dist/components/JsonEditor/index.vue.js +87 -0
- package/dist/components/JsonEditor/index.vue.js.map +1 -0
- package/dist/components/JsonEditor/index2.vue.js +5 -0
- package/dist/components/JsonEditor/index2.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/MarkdownView.vue.d.ts +6 -0
- package/dist/components/MarkdownEditor/MarkdownView.vue.js +33 -0
- package/dist/components/MarkdownEditor/MarkdownView.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/MarkdownView2.vue.js +5 -0
- package/dist/components/MarkdownEditor/MarkdownView2.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/index.vue.d.ts +10 -0
- package/dist/components/MarkdownEditor/index.vue.js +35 -0
- package/dist/components/MarkdownEditor/index.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/index2.vue.js +5 -0
- package/dist/components/MarkdownEditor/index2.vue.js.map +1 -0
- package/dist/components/MenuSearch.vue.d.ts +10 -0
- package/dist/components/MenuSearch.vue.js +8 -0
- package/dist/components/MenuSearch.vue.js.map +1 -0
- package/dist/components/MenuSearch2.vue.js +121 -0
- package/dist/components/MenuSearch2.vue.js.map +1 -0
- package/dist/components/OrgTreeSelect/index.vue.d.ts +6 -0
- package/dist/components/OrgTreeSelect/index.vue.js +42 -0
- package/dist/components/OrgTreeSelect/index.vue.js.map +1 -0
- package/dist/components/OrgTreeSelect/index2.vue.js +5 -0
- package/dist/components/OrgTreeSelect/index2.vue.js.map +1 -0
- package/dist/components/PasswordStrength/index.vue.d.ts +6 -0
- package/dist/components/PasswordStrength/index.vue.js +8 -0
- package/dist/components/PasswordStrength/index.vue.js.map +1 -0
- package/dist/components/PasswordStrength/index2.vue.js +91 -0
- package/dist/components/PasswordStrength/index2.vue.js.map +1 -0
- package/dist/components/ReauthModal.vue.d.ts +3 -0
- package/dist/components/ReauthModal.vue.js +8 -0
- package/dist/components/ReauthModal.vue.js.map +1 -0
- package/dist/components/ReauthModal2.vue.js +139 -0
- package/dist/components/ReauthModal2.vue.js.map +1 -0
- package/dist/components/RoleSelect/index.vue.d.ts +8 -0
- package/dist/components/RoleSelect/index.vue.js +26 -0
- package/dist/components/RoleSelect/index.vue.js.map +1 -0
- package/dist/components/RoleSelect/index2.vue.js +5 -0
- package/dist/components/RoleSelect/index2.vue.js.map +1 -0
- package/dist/components/SelectTable/index.vue.d.ts +76 -0
- package/dist/components/SelectTable/index.vue.js +8 -0
- package/dist/components/SelectTable/index.vue.js.map +1 -0
- package/dist/components/SelectTable/index2.vue.js +256 -0
- package/dist/components/SelectTable/index2.vue.js.map +1 -0
- package/dist/components/SmartLogo.vue.d.ts +8 -0
- package/dist/components/SmartLogo.vue.js +8 -0
- package/dist/components/SmartLogo.vue.js.map +1 -0
- package/dist/components/SmartLogo2.vue.js +74 -0
- package/dist/components/SmartLogo2.vue.js.map +1 -0
- package/dist/components/StatusSwitch/index.vue.d.ts +21 -0
- package/dist/components/StatusSwitch/index.vue.js +45 -0
- package/dist/components/StatusSwitch/index.vue.js.map +1 -0
- package/dist/components/StatusSwitch/index2.vue.js +5 -0
- package/dist/components/StatusSwitch/index2.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index.vue.d.ts +13 -0
- package/dist/components/TableZoomButton/index.vue.js +42 -0
- package/dist/components/TableZoomButton/index.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index2.vue.js +5 -0
- package/dist/components/TableZoomButton/index2.vue.js.map +1 -0
- package/dist/components/UserPicker/index.vue.d.ts +13 -0
- package/dist/components/UserPicker/index.vue.js +8 -0
- package/dist/components/UserPicker/index.vue.js.map +1 -0
- package/dist/components/UserPicker/index2.vue.js +214 -0
- package/dist/components/UserPicker/index2.vue.js.map +1 -0
- package/dist/components/UserSelect/index.vue.d.ts +9 -0
- package/dist/components/UserSelect/index.vue.js +32 -0
- package/dist/components/UserSelect/index.vue.js.map +1 -0
- package/dist/components/UserSelect/index2.vue.js +5 -0
- package/dist/components/UserSelect/index2.vue.js.map +1 -0
- package/dist/components/oauth/BrandIcon.vue.d.ts +12 -0
- package/dist/components/oauth/BrandIcon.vue.js +8 -0
- package/dist/components/oauth/BrandIcon.vue.js.map +1 -0
- package/dist/components/oauth/BrandIcon2.vue.js +95 -0
- package/dist/components/oauth/BrandIcon2.vue.js.map +1 -0
- package/dist/composables/authMenuRoute.d.ts +32 -0
- package/dist/composables/authMenuRoute.js +37 -0
- package/dist/composables/authMenuRoute.js.map +1 -0
- package/dist/composables/clearClientCache.d.ts +10 -0
- package/dist/composables/clearClientCache.js +17 -0
- package/dist/composables/clearClientCache.js.map +1 -0
- package/dist/composables/useAuthMenu.d.ts +3 -0
- package/dist/composables/useAuthMenu.js +61 -0
- package/dist/composables/useAuthMenu.js.map +1 -0
- package/dist/composables/useBatchDelete.d.ts +18 -0
- package/dist/composables/useBatchDelete.js +21 -0
- package/dist/composables/useBatchDelete.js.map +1 -0
- package/dist/composables/useCompactScreen.d.ts +12 -0
- package/dist/composables/useCompactScreen.js +17 -0
- package/dist/composables/useCompactScreen.js.map +1 -0
- package/dist/composables/useConfirm.d.ts +18 -0
- package/dist/composables/useConfirm.js +61 -0
- package/dist/composables/useConfirm.js.map +1 -0
- package/dist/composables/useFullscreenToggle.d.ts +11 -0
- package/dist/composables/useFullscreenToggle.js +64 -0
- package/dist/composables/useFullscreenToggle.js.map +1 -0
- package/dist/composables/useHeaderTools.d.ts +31 -0
- package/dist/composables/useHeaderTools.js +15 -0
- package/dist/composables/useHeaderTools.js.map +1 -0
- package/dist/composables/useLayoutMenu.d.ts +17 -0
- package/dist/composables/useLayoutMenu.js +93 -0
- package/dist/composables/useLayoutMenu.js.map +1 -0
- package/dist/composables/useMenuBadge.d.ts +11 -0
- package/dist/composables/useMenuBadge.js +17 -0
- package/dist/composables/useMenuBadge.js.map +1 -0
- package/dist/composables/useMenuFlat.d.ts +8 -0
- package/dist/composables/useMenuFlat.js +29 -0
- package/dist/composables/useMenuFlat.js.map +1 -0
- package/dist/composables/useModule.d.ts +16 -0
- package/dist/composables/useModule.js +44 -0
- package/dist/composables/useModule.js.map +1 -0
- package/dist/composables/useNoticeAction.d.ts +8 -0
- package/dist/composables/useNoticeAction.js +79 -0
- package/dist/composables/useNoticeAction.js.map +1 -0
- package/dist/composables/usePageTitle.d.ts +1 -0
- package/dist/composables/usePageTitle.js +20 -0
- package/dist/composables/usePageTitle.js.map +1 -0
- package/dist/composables/useRealtime.d.ts +31 -0
- package/dist/composables/useRealtime.js +59 -0
- package/dist/composables/useRealtime.js.map +1 -0
- package/dist/composables/useSite.d.ts +24 -0
- package/dist/composables/useSite.js +27 -0
- package/dist/composables/useSite.js.map +1 -0
- package/dist/composables/useTabTitle.d.ts +1 -0
- package/dist/composables/useTabTitle.js +10 -0
- package/dist/composables/useTabTitle.js.map +1 -0
- package/dist/composables/useTableRowSort.d.ts +20 -0
- package/dist/composables/useTableRowSort.js +59 -0
- package/dist/composables/useTableRowSort.js.map +1 -0
- package/dist/composables/useTableZoom.d.ts +5 -0
- package/dist/composables/useTableZoom.js +30 -0
- package/dist/composables/useTableZoom.js.map +1 -0
- package/dist/composables/useTheme.d.ts +13 -0
- package/dist/composables/useTheme.js +30 -0
- package/dist/composables/useTheme.js.map +1 -0
- package/dist/composables/useVisualViewportHeight.d.ts +3 -0
- package/dist/composables/useVisualViewportHeight.js +16 -0
- package/dist/composables/useVisualViewportHeight.js.map +1 -0
- package/dist/createSmartAdmin.d.ts +56 -0
- package/dist/createSmartAdmin.js +76 -0
- package/dist/createSmartAdmin.js.map +1 -0
- package/dist/directives/auth.d.ts +16 -0
- package/dist/directives/auth.js +19 -0
- package/dist/directives/auth.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +273 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/AppHeader.vue.d.ts +12 -0
- package/dist/layouts/AppHeader.vue.js +8 -0
- package/dist/layouts/AppHeader.vue.js.map +1 -0
- package/dist/layouts/AppHeader2.vue.js +352 -0
- package/dist/layouts/AppHeader2.vue.js.map +1 -0
- package/dist/layouts/LayoutModeCards.vue.d.ts +3 -0
- package/dist/layouts/LayoutModeCards.vue.js +8 -0
- package/dist/layouts/LayoutModeCards.vue.js.map +1 -0
- package/dist/layouts/LayoutModeCards2.vue.js +67 -0
- package/dist/layouts/LayoutModeCards2.vue.js.map +1 -0
- package/dist/layouts/NoticeBell.vue.d.ts +3 -0
- package/dist/layouts/NoticeBell.vue.js +8 -0
- package/dist/layouts/NoticeBell.vue.js.map +1 -0
- package/dist/layouts/NoticeBell2.vue.js +292 -0
- package/dist/layouts/NoticeBell2.vue.js.map +1 -0
- package/dist/layouts/PersonalLayout.vue.d.ts +3 -0
- package/dist/layouts/PersonalLayout.vue.js +8 -0
- package/dist/layouts/PersonalLayout.vue.js.map +1 -0
- package/dist/layouts/PersonalLayout2.vue.js +65 -0
- package/dist/layouts/PersonalLayout2.vue.js.map +1 -0
- package/dist/layouts/SettingRow.vue.d.ts +16 -0
- package/dist/layouts/SettingRow.vue.js +8 -0
- package/dist/layouts/SettingRow.vue.js.map +1 -0
- package/dist/layouts/SettingRow2.vue.js +23 -0
- package/dist/layouts/SettingRow2.vue.js.map +1 -0
- package/dist/layouts/SettingsDrawer.vue.d.ts +10 -0
- package/dist/layouts/SettingsDrawer.vue.js +8 -0
- package/dist/layouts/SettingsDrawer.vue.js.map +1 -0
- package/dist/layouts/SettingsDrawer2.vue.js +380 -0
- package/dist/layouts/SettingsDrawer2.vue.js.map +1 -0
- package/dist/layouts/TabsBar.vue.d.ts +3 -0
- package/dist/layouts/TabsBar.vue.js +8 -0
- package/dist/layouts/TabsBar.vue.js.map +1 -0
- package/dist/layouts/TabsBar2.vue.js +132 -0
- package/dist/layouts/TabsBar2.vue.js.map +1 -0
- package/dist/layouts/components/SideNav.vue.d.ts +15 -0
- package/dist/layouts/components/SideNav.vue.js +8 -0
- package/dist/layouts/components/SideNav.vue.js.map +1 -0
- package/dist/layouts/components/SideNav2.vue.js +49 -0
- package/dist/layouts/components/SideNav2.vue.js.map +1 -0
- package/dist/layouts/default.vue.d.ts +3 -0
- package/dist/layouts/default.vue.js +8 -0
- package/dist/layouts/default.vue.js.map +1 -0
- package/dist/layouts/default2.vue.js +213 -0
- package/dist/layouts/default2.vue.js.map +1 -0
- package/dist/lib/chunkReload.d.ts +9 -0
- package/dist/lib/chunkReload.js +24 -0
- package/dist/lib/chunkReload.js.map +1 -0
- package/dist/lib/icons.d.ts +2 -0
- package/dist/lib/icons.js +39 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/loadingBar.d.ts +7 -0
- package/dist/lib/loadingBar.js +18 -0
- package/dist/lib/loadingBar.js.map +1 -0
- package/dist/lib/markdown.d.ts +8 -0
- package/dist/lib/markdown.js +16 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/markdownLinks.d.ts +26 -0
- package/dist/lib/markdownLinks.js +21 -0
- package/dist/lib/markdownLinks.js.map +1 -0
- package/dist/lib/noticeActions.d.ts +13 -0
- package/dist/lib/noticeActions.js +16 -0
- package/dist/lib/noticeActions.js.map +1 -0
- package/dist/lib/runtime.d.ts +21 -0
- package/dist/lib/runtime.js +13 -0
- package/dist/lib/runtime.js.map +1 -0
- package/dist/locales/en-US.d.ts +1358 -0
- package/dist/locales/en-US.js +1362 -0
- package/dist/locales/en-US.js.map +1 -0
- package/dist/locales/index.d.ts +30 -0
- package/dist/locales/index.js +46 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/menuTitle.d.ts +8 -0
- package/dist/locales/menuTitle.js +19 -0
- package/dist/locales/menuTitle.js.map +1 -0
- package/dist/locales/zh-CN.d.ts +1358 -0
- package/dist/locales/zh-CN.js +1368 -0
- package/dist/locales/zh-CN.js.map +1 -0
- package/dist/router/bootFailure.d.ts +8 -0
- package/dist/router/bootFailure.js +11 -0
- package/dist/router/bootFailure.js.map +1 -0
- package/dist/router/detailRoutes.d.ts +2 -0
- package/dist/router/detailRoutes.js +19 -0
- package/dist/router/detailRoutes.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.js +58 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/namedPage.d.ts +13 -0
- package/dist/router/namedPage.js +12 -0
- package/dist/router/namedPage.js.map +1 -0
- package/dist/router/routes.d.ts +2 -0
- package/dist/router/routes.js +121 -0
- package/dist/router/routes.js.map +1 -0
- package/dist/router/viewRegistry.d.ts +18 -0
- package/dist/router/viewRegistry.js +26 -0
- package/dist/router/viewRegistry.js.map +1 -0
- package/dist/stores/app.d.ts +83 -0
- package/dist/stores/app.js +82 -0
- package/dist/stores/app.js.map +1 -0
- package/dist/stores/auth.d.ts +106 -0
- package/dist/stores/auth.js +59 -0
- package/dist/stores/auth.js.map +1 -0
- package/dist/stores/dict.d.ts +11 -0
- package/dist/stores/dict.js +36 -0
- package/dist/stores/dict.js.map +1 -0
- package/dist/stores/tabs.d.ts +53 -0
- package/dist/stores/tabs.js +88 -0
- package/dist/stores/tabs.js.map +1 -0
- package/dist/stores/user.d.ts +64 -0
- package/dist/stores/user.js +64 -0
- package/dist/stores/user.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/theme/accents.d.ts +2 -0
- package/dist/theme/accents.js +5 -0
- package/dist/theme/accents.js.map +1 -0
- package/dist/theme/mix.d.ts +26 -0
- package/dist/theme/mix.js +43 -0
- package/dist/theme/mix.js.map +1 -0
- package/dist/theme/naive-theme.d.ts +9 -0
- package/dist/theme/naive-theme.js +89 -0
- package/dist/theme/naive-theme.js.map +1 -0
- package/dist/types/api.d.ts +714 -0
- package/dist/types/api.js +15 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/menu.d.ts +67 -0
- package/dist/types/menu.js +26 -0
- package/dist/types/menu.js.map +1 -0
- package/dist/utils/chunkUpload.d.ts +6 -0
- package/dist/utils/chunkUpload.js +35 -0
- package/dist/utils/chunkUpload.js.map +1 -0
- package/dist/utils/download.d.ts +8 -0
- package/dist/utils/download.js +8 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/error.d.ts +14 -0
- package/dist/utils/error.js +50 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/format.d.ts +20 -0
- package/dist/utils/format.js +19 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/importDup.d.ts +17 -0
- package/dist/utils/importDup.js +18 -0
- package/dist/utils/importDup.js.map +1 -0
- package/dist/utils/oauthBrand.d.ts +100 -0
- package/dist/utils/oauthBrand.js +97 -0
- package/dist/utils/oauthBrand.js.map +1 -0
- package/dist/utils/tree.d.ts +33 -0
- package/dist/utils/tree.js +47 -0
- package/dist/utils/tree.js.map +1 -0
- package/dist/utils/ua.d.ts +7 -0
- package/dist/utils/ua.js +33 -0
- package/dist/utils/ua.js.map +1 -0
- package/dist/utils/url.d.ts +16 -0
- package/dist/utils/url.js +13 -0
- package/dist/utils/url.js.map +1 -0
- package/dist/views/dashboard/biz.vue.d.ts +3 -0
- package/dist/views/dashboard/biz.vue.js +8 -0
- package/dist/views/dashboard/biz.vue.js.map +1 -0
- package/dist/views/dashboard/biz2.vue.js +136 -0
- package/dist/views/dashboard/biz2.vue.js.map +1 -0
- package/dist/views/dashboard/workbench.vue.d.ts +3 -0
- package/dist/views/dashboard/workbench.vue.js +8 -0
- package/dist/views/dashboard/workbench.vue.js.map +1 -0
- package/dist/views/dashboard/workbench2.vue.js +195 -0
- package/dist/views/dashboard/workbench2.vue.js.map +1 -0
- package/dist/views/embed/iframe.vue.d.ts +3 -0
- package/dist/views/embed/iframe.vue.js +8 -0
- package/dist/views/embed/iframe.vue.js.map +1 -0
- package/dist/views/embed/iframe2.vue.js +21 -0
- package/dist/views/embed/iframe2.vue.js.map +1 -0
- package/dist/views/error/404.vue.d.ts +3 -0
- package/dist/views/error/404.vue.js +8 -0
- package/dist/views/error/404.vue.js.map +1 -0
- package/dist/views/error/4042.vue.js +31 -0
- package/dist/views/error/4042.vue.js.map +1 -0
- package/dist/views/error/BootError.vue.d.ts +3 -0
- package/dist/views/error/BootError.vue.js +8 -0
- package/dist/views/error/BootError.vue.js.map +1 -0
- package/dist/views/error/BootError2.vue.js +57 -0
- package/dist/views/error/BootError2.vue.js.map +1 -0
- package/dist/views/error/MissingRoute.vue.d.ts +3 -0
- package/dist/views/error/MissingRoute.vue.js +8 -0
- package/dist/views/error/MissingRoute.vue.js.map +1 -0
- package/dist/views/error/MissingRoute2.vue.js +23 -0
- package/dist/views/error/MissingRoute2.vue.js.map +1 -0
- package/dist/views/login/LoginForm.vue.d.ts +12 -0
- package/dist/views/login/LoginForm.vue.js +8 -0
- package/dist/views/login/LoginForm.vue.js.map +1 -0
- package/dist/views/login/LoginForm2.vue.js +642 -0
- package/dist/views/login/LoginForm2.vue.js.map +1 -0
- package/dist/views/login/index.vue.d.ts +3 -0
- package/dist/views/login/index.vue.js +8 -0
- package/dist/views/login/index.vue.js.map +1 -0
- package/dist/views/login/index2.vue.js +79 -0
- package/dist/views/login/index2.vue.js.map +1 -0
- package/dist/views/login/skins/AuroraGlass.vue.d.ts +3 -0
- package/dist/views/login/skins/AuroraGlass.vue.js +8 -0
- package/dist/views/login/skins/AuroraGlass.vue.js.map +1 -0
- package/dist/views/login/skins/AuroraGlass2.vue.js +80 -0
- package/dist/views/login/skins/AuroraGlass2.vue.js.map +1 -0
- package/dist/views/login/skins/SplitPanel.vue.d.ts +3 -0
- package/dist/views/login/skins/SplitPanel.vue.js +8 -0
- package/dist/views/login/skins/SplitPanel.vue.js.map +1 -0
- package/dist/views/login/skins/SplitPanel2.vue.js +85 -0
- package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -0
- package/dist/views/login/skins/Spotlight.vue.d.ts +3 -0
- package/dist/views/login/skins/Spotlight.vue.js +8 -0
- package/dist/views/login/skins/Spotlight.vue.js.map +1 -0
- package/dist/views/login/skins/Spotlight2.vue.js +36 -0
- package/dist/views/login/skins/Spotlight2.vue.js.map +1 -0
- package/dist/views/login/skins.d.ts +8 -0
- package/dist/views/login/skins.js +13 -0
- package/dist/views/login/skins.js.map +1 -0
- package/dist/views/mfa/bindComplete.d.ts +7 -0
- package/dist/views/mfa/bindComplete.js +8 -0
- package/dist/views/mfa/bindComplete.js.map +1 -0
- package/dist/views/mfa/index.vue.d.ts +3 -0
- package/dist/views/mfa/index.vue.js +8 -0
- package/dist/views/mfa/index.vue.js.map +1 -0
- package/dist/views/mfa/index2.vue.js +425 -0
- package/dist/views/mfa/index2.vue.js.map +1 -0
- package/dist/views/module/index.vue.d.ts +3 -0
- package/dist/views/module/index.vue.js +8 -0
- package/dist/views/module/index.vue.js.map +1 -0
- package/dist/views/module/index2.vue.js +142 -0
- package/dist/views/module/index2.vue.js.map +1 -0
- package/dist/views/oauth/callback.vue.d.ts +3 -0
- package/dist/views/oauth/callback.vue.js +8 -0
- package/dist/views/oauth/callback.vue.js.map +1 -0
- package/dist/views/oauth/callback2.vue.js +86 -0
- package/dist/views/oauth/callback2.vue.js.map +1 -0
- package/dist/views/personal/bindings.vue.d.ts +3 -0
- package/dist/views/personal/bindings.vue.js +8 -0
- package/dist/views/personal/bindings.vue.js.map +1 -0
- package/dist/views/personal/bindings2.vue.js +220 -0
- package/dist/views/personal/bindings2.vue.js.map +1 -0
- package/dist/views/personal/notice.vue.d.ts +3 -0
- package/dist/views/personal/notice.vue.js +5 -0
- package/dist/views/personal/notice.vue.js.map +1 -0
- package/dist/views/personal/notice2.vue.js +163 -0
- package/dist/views/personal/notice2.vue.js.map +1 -0
- package/dist/views/personal/password.vue.d.ts +3 -0
- package/dist/views/personal/password.vue.js +5 -0
- package/dist/views/personal/password.vue.js.map +1 -0
- package/dist/views/personal/password2.vue.js +147 -0
- package/dist/views/personal/password2.vue.js.map +1 -0
- package/dist/views/personal/profile.vue.d.ts +3 -0
- package/dist/views/personal/profile.vue.js +8 -0
- package/dist/views/personal/profile.vue.js.map +1 -0
- package/dist/views/personal/profile2.vue.js +264 -0
- package/dist/views/personal/profile2.vue.js.map +1 -0
- package/dist/views/personal/security.vue.d.ts +3 -0
- package/dist/views/personal/security.vue.js +8 -0
- package/dist/views/personal/security.vue.js.map +1 -0
- package/dist/views/personal/security2.vue.js +82 -0
- package/dist/views/personal/security2.vue.js.map +1 -0
- package/dist/views/personal/sessions.vue.d.ts +3 -0
- package/dist/views/personal/sessions.vue.js +8 -0
- package/dist/views/personal/sessions.vue.js.map +1 -0
- package/dist/views/personal/sessions2.vue.js +101 -0
- package/dist/views/personal/sessions2.vue.js.map +1 -0
- package/dist/views/system/cache/index.vue.d.ts +3 -0
- package/dist/views/system/cache/index.vue.js +8 -0
- package/dist/views/system/cache/index.vue.js.map +1 -0
- package/dist/views/system/cache/index2.vue.js +113 -0
- package/dist/views/system/cache/index2.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.d.ts +16 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js +5 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +177 -0
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -0
- package/dist/views/system/config/components/ExternalAuthConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js +8 -0
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +218 -0
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/GroupExtraConfig.vue.d.ts +9 -0
- package/dist/views/system/config/components/GroupExtraConfig.vue.js +8 -0
- package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js +108 -0
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/HighSensConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/HighSensConfig.vue.js +5 -0
- package/dist/views/system/config/components/HighSensConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/HighSensConfig2.vue.js +134 -0
- package/dist/views/system/config/components/HighSensConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/JobConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/JobConfig.vue.js +5 -0
- package/dist/views/system/config/components/JobConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/JobConfig2.vue.js +116 -0
- package/dist/views/system/config/components/JobConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/OtherConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/OtherConfig.vue.js +5 -0
- package/dist/views/system/config/components/OtherConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/OtherConfig2.vue.js +121 -0
- package/dist/views/system/config/components/OtherConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/SecurityConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/SecurityConfig.vue.js +8 -0
- package/dist/views/system/config/components/SecurityConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/SecurityConfig2.vue.js +456 -0
- package/dist/views/system/config/components/SecurityConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/SysBaseConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/SysBaseConfig.vue.js +5 -0
- package/dist/views/system/config/components/SysBaseConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/SysBaseConfig2.vue.js +107 -0
- package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/UploadConfig.vue.js +5 -0
- package/dist/views/system/config/components/UploadConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadConfig2.vue.js +135 -0
- package/dist/views/system/config/components/UploadConfig2.vue.js.map +1 -0
- package/dist/views/system/config/groups.d.ts +9 -0
- package/dist/views/system/config/groups.js +18 -0
- package/dist/views/system/config/groups.js.map +1 -0
- package/dist/views/system/config/index.vue.d.ts +3 -0
- package/dist/views/system/config/index.vue.js +5 -0
- package/dist/views/system/config/index.vue.js.map +1 -0
- package/dist/views/system/config/index2.vue.js +127 -0
- package/dist/views/system/config/index2.vue.js.map +1 -0
- package/dist/views/system/dict/index.vue.d.ts +3 -0
- package/dist/views/system/dict/index.vue.js +8 -0
- package/dist/views/system/dict/index.vue.js.map +1 -0
- package/dist/views/system/dict/index2.vue.js +560 -0
- package/dist/views/system/dict/index2.vue.js.map +1 -0
- package/dist/views/system/file/index.vue.d.ts +3 -0
- package/dist/views/system/file/index.vue.js +5 -0
- package/dist/views/system/file/index.vue.js.map +1 -0
- package/dist/views/system/file/index2.vue.js +186 -0
- package/dist/views/system/file/index2.vue.js.map +1 -0
- package/dist/views/system/job/index.vue.d.ts +3 -0
- package/dist/views/system/job/index.vue.js +8 -0
- package/dist/views/system/job/index.vue.js.map +1 -0
- package/dist/views/system/job/index2.vue.js +1167 -0
- package/dist/views/system/job/index2.vue.js.map +1 -0
- package/dist/views/system/job-log/index.vue.d.ts +3 -0
- package/dist/views/system/job-log/index.vue.js +8 -0
- package/dist/views/system/job-log/index.vue.js.map +1 -0
- package/dist/views/system/job-log/index2.vue.js +411 -0
- package/dist/views/system/job-log/index2.vue.js.map +1 -0
- package/dist/views/system/job-monitor/index.vue.d.ts +3 -0
- package/dist/views/system/job-monitor/index.vue.js +8 -0
- package/dist/views/system/job-monitor/index.vue.js.map +1 -0
- package/dist/views/system/job-monitor/index2.vue.js +253 -0
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -0
- package/dist/views/system/log/exception/index.vue.d.ts +3 -0
- package/dist/views/system/log/exception/index.vue.js +8 -0
- package/dist/views/system/log/exception/index.vue.js.map +1 -0
- package/dist/views/system/log/exception/index2.vue.js +216 -0
- package/dist/views/system/log/exception/index2.vue.js.map +1 -0
- package/dist/views/system/log/login/index.vue.d.ts +3 -0
- package/dist/views/system/log/login/index.vue.js +5 -0
- package/dist/views/system/log/login/index.vue.js.map +1 -0
- package/dist/views/system/log/login/index2.vue.js +113 -0
- package/dist/views/system/log/login/index2.vue.js.map +1 -0
- package/dist/views/system/log/op/index.vue.d.ts +3 -0
- package/dist/views/system/log/op/index.vue.js +8 -0
- package/dist/views/system/log/op/index.vue.js.map +1 -0
- package/dist/views/system/log/op/index2.vue.js +332 -0
- package/dist/views/system/log/op/index2.vue.js.map +1 -0
- package/dist/views/system/menu/components/ButtonManager.vue.d.ts +21 -0
- package/dist/views/system/menu/components/ButtonManager.vue.js +8 -0
- package/dist/views/system/menu/components/ButtonManager.vue.js.map +1 -0
- package/dist/views/system/menu/components/ButtonManager2.vue.js +498 -0
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -0
- package/dist/views/system/menu/components/MenuFormModal.vue.d.ts +22 -0
- package/dist/views/system/menu/components/MenuFormModal.vue.js +8 -0
- package/dist/views/system/menu/components/MenuFormModal.vue.js.map +1 -0
- package/dist/views/system/menu/components/MenuFormModal2.vue.js +259 -0
- package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -0
- package/dist/views/system/menu/index.vue.d.ts +3 -0
- package/dist/views/system/menu/index.vue.js +8 -0
- package/dist/views/system/menu/index.vue.js.map +1 -0
- package/dist/views/system/menu/index2.vue.js +391 -0
- package/dist/views/system/menu/index2.vue.js.map +1 -0
- package/dist/views/system/module/index.vue.d.ts +3 -0
- package/dist/views/system/module/index.vue.js +8 -0
- package/dist/views/system/module/index.vue.js.map +1 -0
- package/dist/views/system/module/index2.vue.js +344 -0
- package/dist/views/system/module/index2.vue.js.map +1 -0
- package/dist/views/system/monitor/index.vue.d.ts +3 -0
- package/dist/views/system/monitor/index.vue.js +8 -0
- package/dist/views/system/monitor/index.vue.js.map +1 -0
- package/dist/views/system/monitor/index2.vue.js +184 -0
- package/dist/views/system/monitor/index2.vue.js.map +1 -0
- package/dist/views/system/notice/index.vue.d.ts +3 -0
- package/dist/views/system/notice/index.vue.js +8 -0
- package/dist/views/system/notice/index.vue.js.map +1 -0
- package/dist/views/system/notice/index2.vue.js +401 -0
- package/dist/views/system/notice/index2.vue.js.map +1 -0
- package/dist/views/system/org/index.vue.d.ts +3 -0
- package/dist/views/system/org/index.vue.js +8 -0
- package/dist/views/system/org/index.vue.js.map +1 -0
- package/dist/views/system/org/index2.vue.js +397 -0
- package/dist/views/system/org/index2.vue.js.map +1 -0
- package/dist/views/system/position/index.vue.d.ts +3 -0
- package/dist/views/system/position/index.vue.js +5 -0
- package/dist/views/system/position/index.vue.js.map +1 -0
- package/dist/views/system/position/index2.vue.js +211 -0
- package/dist/views/system/position/index2.vue.js.map +1 -0
- package/dist/views/system/recycle/index.vue.d.ts +3 -0
- package/dist/views/system/recycle/index.vue.js +8 -0
- package/dist/views/system/recycle/index.vue.js.map +1 -0
- package/dist/views/system/recycle/index2.vue.js +121 -0
- package/dist/views/system/recycle/index2.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +18 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.js +8 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +212 -0
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -0
- package/dist/views/system/role/components/grantMenuGroups.d.ts +31 -0
- package/dist/views/system/role/components/grantMenuGroups.js +76 -0
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -0
- package/dist/views/system/role/index.vue.d.ts +3 -0
- package/dist/views/system/role/index.vue.js +5 -0
- package/dist/views/system/role/index.vue.js.map +1 -0
- package/dist/views/system/role/index2.vue.js +476 -0
- package/dist/views/system/role/index2.vue.js.map +1 -0
- package/dist/views/system/session/index.vue.d.ts +3 -0
- package/dist/views/system/session/index.vue.js +5 -0
- package/dist/views/system/session/index.vue.js.map +1 -0
- package/dist/views/system/session/index2.vue.js +80 -0
- package/dist/views/system/session/index2.vue.js.map +1 -0
- package/dist/views/system/user/components/ResetPasswordModal.vue.d.ts +10 -0
- package/dist/views/system/user/components/ResetPasswordModal.vue.js +8 -0
- package/dist/views/system/user/components/ResetPasswordModal.vue.js.map +1 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js +111 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserFormModal.vue.d.ts +30 -0
- package/dist/views/system/user/components/UserFormModal.vue.js +8 -0
- package/dist/views/system/user/components/UserFormModal.vue.js.map +1 -0
- package/dist/views/system/user/components/UserFormModal2.vue.js +415 -0
- package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -0
- package/dist/views/system/user/index.vue.d.ts +3 -0
- package/dist/views/system/user/index.vue.js +8 -0
- package/dist/views/system/user/index.vue.js.map +1 -0
- package/dist/views/system/user/index2.vue.js +427 -0
- package/dist/views/system/user/index2.vue.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zh-CN.js","sources":["../../src/locales/zh-CN.ts"],"sourcesContent":["// 中文文案。error.* 键 = 后端 msgKey(点分路径,来自 ErrorCode.cs 的 [MsgKey]),供请求层翻译。\nexport default {\n common: {\n rowNo: '序号',\n copySuffix: '-副本',\n zoomIn: '放大',\n zoomOut: '还原',\n success: '操作成功',\n confirm: '确定',\n confirmTitle: '操作确认',\n cancel: '取消',\n close: '关闭',\n more: '更多',\n search: '查询',\n reset: '重置',\n expandAll: '展开全部',\n collapseAll: '折叠全部',\n add: '新增',\n edit: '编辑',\n delete: '删除',\n save: '保存',\n submit: '提交',\n format: '格式化',\n copy: '复制',\n copied: '已复制',\n loading: '加载中…',\n yes: '是',\n no: '否',\n status: '状态',\n enabled: '启用',\n disabled: '停用',\n visible: '显示',\n hidden: '隐藏',\n operation: '操作',\n createTime: '创建时间',\n batchDelete: '批量删除',\n batchDeleteConfirm: '确认删除选中的 {count} 项?此操作不可恢复。',\n all: '全部',\n noData: '暂无数据',\n back: '返回',\n detail: '详情',\n },\n userPicker: {\n title: '选择用户',\n available: '可选用户',\n selected: '已选',\n add: '添加',\n added: '已选',\n addChecked: '添加选中',\n clear: '清空',\n },\n notFound: {\n desc: '页面不存在',\n back: '返回工作台',\n },\n // 内容区渲染异常兜底(components/ErrorBoundary)\n errorBoundary: {\n title: '这个页面出错了',\n desc: '页面渲染时抛出了未处理的异常。可以重试,或先回首页继续用别的功能。',\n retry: '重试',\n home: '回首页',\n },\n // 门户重建失败(网络/5xx/限流):会话没坏,不清会话\n bootError: {\n title: '加载工作台失败',\n desc: '没能取到你的应用与菜单。多半是网络不通或服务端暂时不可用,你的登录状态仍然有效。',\n retry: '重试',\n relogin: '重新登录',\n },\n missingRoute: {\n title: '菜单页面无法加载',\n message: '菜单“{title}”配置的组件路径不存在,请检查组件路径:{component}',\n },\n app: {\n theme: '主题',\n dark: '暗色',\n light: '亮色',\n accent: '主色',\n density: '密度',\n comfortable: '舒适',\n compact: '紧凑',\n language: '语言',\n loginStyle: '登录页样式',\n collapse: '折叠菜单',\n openMenu: '打开菜单',\n switchModule: '切换应用',\n logout: '退出登录',\n personalCenter: '个人中心',\n clearCache: '清除缓存',\n cacheCleared: '缓存已清除',\n profile: '个人资料',\n password: '修改密码',\n security: '账号安全',\n sessions: '我的会话',\n bindings: '账号绑定',\n search: '搜索菜单',\n fullscreen: '全屏',\n exitFullscreen: '退出全屏',\n settings: '系统设置',\n notice: {\n title: '消息通知',\n empty: '暂无通知',\n markAllRead: '全部已读',\n viewAll: '查看全部',\n },\n },\n settings: {\n title: '系统设置',\n tabAppearance: '外观',\n tabLayout: '布局',\n tabGeneral: '通用',\n themeMode: '主题模式',\n auto: '跟随系统',\n themeColor: '主题色',\n custom: '自定义',\n layout: '布局模式',\n layoutVertical: '左侧菜单模式',\n layoutVerticalMix: '左侧菜单混合模式',\n layoutVerticalHybridHeaderFirst: '左侧混合-顶部优先',\n layoutHorizontal: '顶部菜单模式',\n layoutTopHybridSidebarFirst: '顶部混合-侧边优先',\n layoutTopHybridHeaderFirst: '顶部混合-顶部优先',\n interface: '界面功能',\n showBreadcrumb: '显示面包屑',\n showTabs: '显示多标签',\n fixedHeader: '固定头部',\n pageTransition: '切换动画',\n transitionNone: '无',\n transitionFade: '淡入淡出',\n transitionFadeSlide: '滑动淡入',\n grayscale: '灰色模式',\n watermark: '水印',\n watermarkText: '水印文案',\n watermarkPlaceholder: '请输入水印文案',\n formStyle: '表单形态',\n formStyleModal: '弹窗',\n formStyleDrawer: '抽屉',\n resetConfirm: '确定恢复默认设置?',\n copyConfig: '复制配置',\n configCopied: '已复制当前配置(粘回 stores/app.ts 的 DEFAULTS 即为新默认)',\n searchPlaceholder: '搜索菜单…',\n searchEmpty: '无匹配菜单',\n searchHint: '↑↓ 导航 · ↵ 进入 · Esc 关闭',\n },\n tabs: {\n refresh: '刷新',\n pin: '固定',\n unpin: '取消固定',\n close: '关闭',\n closeOthers: '关闭其他',\n closeLeft: '关闭左侧',\n closeRight: '关闭右侧',\n closeAll: '关闭全部',\n },\n login: {\n title: '登录',\n subtitle: '面向多机构、多应用的统一权限底座',\n headlinePre: '企业级',\n headlineAccent: '权限',\n headlinePost: '管理后台',\n welcome: '欢迎回来',\n welcomeSub: '请登录以继续管理后台',\n featRbac: 'RBAC 角色授权',\n featScope: '多机构数据范围',\n featPortal: '多应用门户',\n account: '账号',\n accountPlaceholder: '请输入账号',\n password: '密码',\n passwordPlaceholder: '请输入密码',\n required: '请输入账号和密码',\n captcha: '验证码',\n captchaPlaceholder: '请输入验证码',\n captchaMathPlaceholder: '请输入计算结果',\n captchaRequired: '请输入验证码',\n remember: '记住我',\n submit: '登 录',\n success: '登录成功',\n smsLogin: '短信登录',\n accountLogin: '账号登录',\n phone: '手机号',\n phonePlaceholder: '请输入手机号',\n smsCode: '短信验证码',\n smsCodePlaceholder: '请输入短信验证码',\n smsRequired: '请输入手机号和短信验证码',\n sendCode: '获取验证码',\n resendAfter: '{s}s 后重发',\n smsSent: '验证码已发送',\n mfaTitle: '验证码已发送至 {phone}',\n mfaSub: '请输入短信验证码完成登录',\n setupAuthenticator: '设置身份验证器',\n totpTitle: '二次验证',\n totpSub: '请输入身份验证器中的 6 位动态口令',\n totpCode: '动态口令',\n totpPlaceholder: '请输入 6 位动态口令',\n totpBindTitle: '需要设置身份验证器',\n totpBindSub: '管理员已要求此账号启用二次验证。请先完成绑定,再重新登录。',\n useRecovery: '使用恢复码',\n backToPassword: '返回密码登录',\n otherMethods: '其他登录方式',\n moreMethods: '更多登录方式',\n ssoWecom: '企业微信',\n ssoDingtalk: '钉钉',\n sso: 'SSO',\n ssoComingSoon: '第三方登录即将开放',\n skinAurora: '极光',\n skinSplit: '双栏',\n skinSpotlight: '聚光',\n },\n module: {\n choose: '选择应用',\n empty: '暂无可访问的应用,请联系管理员分配',\n setDefault: '设为默认',\n isDefault: '默认',\n back: '返回',\n enter: '进入',\n manage: '模块管理',\n code: '编码',\n name: '名称',\n icon: '图标',\n defaultRoute: '默认路由',\n apiPrefix: '路由前缀',\n apiPrefixHint: '用于权限路由下拉按应用过滤,填后端路由段(如 sys、biz);留空=不过滤',\n sort: '排序',\n remark: '备注',\n builtin: '内置',\n codeRequired: '请输入编码',\n nameRequired: '请输入名称',\n addTitle: '新增应用',\n editTitle: '编辑应用',\n deleteConfirm: '确定删除应用「{title}」?',\n disableConfirm: '确定停用应用「{title}」?门户将不再显示该应用',\n saved: '保存成功',\n deleted: '已删除',\n },\n menu: {\n searchPlaceholder: '搜索名称/路由/权限码',\n workbench: '工作台',\n profile: '个人资料',\n password: '修改密码',\n security: '账号安全',\n notice: '我的通知',\n sessions: '我的会话',\n bindings: '账号绑定',\n manage: '菜单管理',\n parent: '上级菜单',\n parentRoot: '顶级(根目录)',\n type: '类型',\n typeCatalog: '目录',\n typeMenu: '页面',\n typeButton: '按钮',\n title: '标题',\n permission: '权限码',\n permissionPlaceholder: '选择路由,可多选',\n permissionHint: '一颗按钮可挂多条路由,角色勾上它即一起授出;「查询」按钮挂列表与详情两条路由。',\n configPerms: '配置权限 ({n})',\n showAllRoutes: '显示全部应用路由',\n routesInApp: '本应用路由',\n routesOther: '其他应用路由',\n module: '所属应用',\n moduleHint: '仅顶级目录可设',\n linkHint: '外链/内嵌:路径填 http(s) URL = 外链(新窗口打开);组件填 http(s) URL = 内嵌 iframe。',\n moduleAll: '全部',\n moduleUnassigned: '未分配',\n path: '路由路径',\n component: '组件路径',\n icon: '图标',\n sort: '排序',\n visible: '侧栏可见',\n titleRequired: '请输入标题',\n addTitle: '新增菜单',\n editTitle: '编辑菜单',\n addChild: '新增子节点',\n buttons: '权限按钮',\n buttonManagerTitle: '「{title}」· 权限按钮',\n buttonParent: '所属页面',\n addButton: '新增按钮',\n batchFromRoutes: '从路由批量添加',\n batchTitle: '从路由批量添加按钮',\n batchSearchPlaceholder: '搜索方法/路径/标题',\n noRoutesLeft: '没有可添加的路由(该菜单已覆盖全部,或路由清单为空)',\n btnQuery: '查询',\n btnCreate: '新增',\n btnUpdate: '编辑',\n btnDelete: '删除',\n deleteConfirm: '确定删除菜单「{title}」?',\n disableConfirm: '确定停用菜单「{title}」?其子节点将一并隐藏',\n saved: '保存成功',\n deleted: '已删除',\n },\n iconPicker: {\n placeholder: '选择图标',\n title: '选择图标',\n search: '搜索图标名…',\n local: '本地 SVG',\n online: '在线',\n onlinePlaceholder: '输入任意 iconify 名,如 mdi:home',\n use: '使用',\n offlineHint: '当前离线,未内置的在线图标无法预览',\n empty: '无匹配图标',\n more: '还有 {n} 个,继续输入以缩小范围',\n },\n // SmartTable(smart-naive-table)组件文案;查询/重置/密度复用 common/app 键,全局注入见 createSmartAdmin.ts\n table: {\n refresh: '刷新',\n columnSettings: '列设置',\n columnSettingsReset: '恢复默认',\n fixedLeft: '固定到左侧',\n fixedRight: '固定到右侧',\n fixedNone: '取消固定',\n expand: '展开',\n collapse: '收起',\n // TableZoomButton(表格铺满视口看宽表)\n zoom: '放大',\n zoomExit: '还原',\n },\n workbench: {\n welcome: '你好,{name}',\n subtitle: 'SmartAdmin · 企业级权限管理后台',\n roles: '角色总数',\n users: '授权用户',\n perms: '权限点',\n online: '在线会话',\n trendTitle: '近 7 日活跃趋势',\n distributionTitle: '资源分布',\n trendLogins: '登录数',\n trendActive: '活跃用户',\n },\n // 业务系统工作台(dashboard/biz.vue;真数据拼装,应用可用同 key 页面覆盖成自己的业务统计)\n biz: {\n welcome: '{name},欢迎回来',\n subtitle: '应用工作台',\n quick: '快捷入口',\n notices: '我的通知',\n viewAll: '查看全部',\n noMenus: '当前应用暂无菜单',\n },\n user: {\n title: '用户管理',\n account: '账号',\n name: '姓名',\n status: '状态',\n enabled: '启用',\n disabled: '停用',\n superAdmin: '超管',\n createTime: '创建时间',\n // 写侧字段(创建/编辑专用)\n password: '初始密码',\n // 未配 Security:DefaultInitialPassword 时(默认就没配),后端生成随机强口令 —— 别再说\"系统默认初始密码\",\n // 那个东西默认不存在,照着这句话去告诉新人\"用默认密码登\"必然登不上。\n passwordHint: '留空则自动生成随机密码(创建后显示一次)',\n org: '归属机构',\n allOrgs: '全部',\n orgPlaceholder: '选择机构(可空)',\n position: '职位',\n positionPlaceholder: '选择职位(可空)',\n director: '直属主管',\n directorPlaceholder: '选择主管(可空)',\n nickname: '昵称',\n nicknamePlaceholder: '昵称(可空)',\n phone: '手机号',\n phonePlaceholder: '手机号(可空)',\n phoneInvalid: '手机号格式不正确',\n email: '邮箱',\n emailPlaceholder: '邮箱(可空)',\n emailInvalid: '邮箱格式不正确',\n gender: '性别',\n genderPlaceholder: '选择性别(可空)',\n avatar: '头像',\n avatarUploading: '上传中…',\n roles: '角色',\n rolesPlaceholder: '分配角色(可空)',\n accountRequired: '请输入账号',\n nameRequired: '请输入姓名',\n addTitle: '新增用户',\n editTitle: '编辑用户',\n deleteConfirm: '确定删除用户「{name}」?',\n disableConfirm: '确定停用用户「{name}」?',\n saved: '保存成功',\n deleted: '已删除',\n resetPassword: '重置密码',\n newPassword: '新密码',\n newPasswordHint: '留空则自动生成随机密码',\n resetDone: '密码已重置',\n createDone: '用户已创建',\n resetDoneHint: '请将下方初始密码转达给用户,关闭后不再显示:',\n copy: '复制',\n copied: '已复制到剪贴板',\n copyFailed: '复制失败,请手动选取',\n forceTotp: '强制动态口令',\n totpBound: '已绑动态口令',\n issueTotpInvite: '发放动态口令邀请',\n clearMfa: '解绑身份验证器',\n clearMfaConfirm: '确定解绑用户「{name}」的身份验证器?解绑后需重新绑定才能使用二次验证。',\n mfaCleared: '已解绑该用户的身份验证器',\n totpInviteTitle: '{name} 的动态口令邀请',\n totpInviteOnce: '邀请仅在当前显示一次,请通过受控渠道将链接或令牌发送给用户。',\n totpInviteUrl: '绑定链接',\n totpInviteToken: '邀请令牌',\n totpInviteExpires: '过期时间',\n },\n mfa: {\n bindTitle: '设置身份验证器',\n recoveryTitle: '使用恢复码',\n useRecovery: '使用恢复码',\n backToBind: '设置身份验证器',\n stepVerify: '验证身份',\n stepAuthenticator: '身份验证器',\n stepRecovery: '恢复码',\n bindHint: '输入账号和当前密码开始自助绑定(需管理员已开启 TOTP)。',\n account: '账号',\n currentPassword: '当前密码',\n startBind: '开始设置',\n bindRequired: '请输入账号和当前密码',\n scanSetupHint: '用 Google Authenticator、Microsoft Authenticator 等应用扫描下方二维码。',\n manualSetupHint: '无法扫码时,可手动输入密钥添加到身份验证器,再填写当前 6 位动态口令。',\n manualKey: '手动设置密钥',\n otpauthUri: '身份验证器 URI',\n authenticatorCode: '动态口令',\n completeBind: '完成设置',\n codeRequired: '请输入动态口令',\n recoveryOnce:\n '请立即保存这些恢复码。每个只能使用一次,关闭页面后将不再显示。建议下载到本地妥善保管。',\n copy: '复制',\n copied: '已复制到剪贴板',\n copyFailed: '复制失败,请手动选取',\n copyAll: '复制全部恢复码',\n downloadCodes: '下载到本地',\n recoveryDownloaded: '恢复码文件已开始下载',\n recoveryDownloadHeader: 'SmartAdmin 恢复码(账号:{account})',\n recoveryDownloadFooter: '每个恢复码仅可使用一次。请离线妥善保管,勿转发他人。',\n backToLogin: '返回登录',\n recoveryHint: '恢复码会移除身份验证器并注销所有现有会话。之后请重新自助绑定。',\n recoveryCode: '恢复码',\n submitRecovery: '使用恢复码',\n recoveryRequired: '请输入账号、当前密码和恢复码',\n recoveryDone: '身份验证器已移除。请重新登录;如仍被要求,请再次自助绑定。',\n bindStartResponseIncomplete: '设置响应不完整,请重新开始设置。',\n bindCompleteResponseIncomplete: '设置响应不完整,请重新开始设置。',\n },\n reauth: {\n title: '再次验证身份',\n hint: '此操作涉及高风险变更,请输入动态口令或当前密码以继续(约 5 分钟内有效)。',\n method: '验证方式',\n methodTotp: '动态口令',\n methodPassword: '当前密码',\n totpCode: '动态口令',\n totpPlaceholder: '6 位动态口令',\n totpRequired: '请输入动态口令',\n password: '当前密码',\n passwordPlaceholder: '当前登录密码',\n passwordRequired: '请输入当前密码',\n confirm: '验证并继续',\n },\n // 导入向导 / 导出选列(两模板各自维护)\n import: {\n button: '导入',\n wizardTitle: '导入用户',\n stepUpload: '上传文件',\n stepMapping: '列映射',\n stepPreview: '预览改错',\n stepResult: '完成',\n downloadTemplate: '下载模板',\n dropHint: '点击或拖拽 xlsx 到此处',\n dropSub: '仅支持 .xlsx;字典列请用模板下拉值',\n needFile: '请先选择导入文件',\n mappingHint: '将文件表头映射到目标字段;自动匹配的已预选,可按需调整。',\n fileHeader: '文件表头',\n targetColumn: '目标列',\n unmap: '(不映射)',\n summary: '共 {total} 行,其中 {errors} 行有错误',\n summaryDup: '另有 {n} 行已存在',\n onlyErrors: '只看错误行',\n revalidate: '重新校验',\n revalidated: '已重验:{errors}/{total} 行有错',\n errors: '错误',\n ok: '通过',\n errorCount: '{n} 项',\n dupTag: '已存在',\n // 键名后缀 = DuplicateStrategy 的数值(0 跳过 / 1 覆盖 / 2 记为错误)\n dupHint: {\n 0: '该行已存在,提交时按「跳过已存在」略过,不必修改',\n 1: '该行已存在,提交时按「覆盖已存在」更新,不必修改',\n 2: '该行已存在,当前策略「已存在记为错误」下会被判失败',\n },\n strategy: '重复策略',\n strategySkip: '跳过已存在',\n strategyOverwrite: '覆盖已存在',\n strategyError: '已存在记为错误',\n commit: '提交导入',\n prev: '上一步',\n next: '下一步',\n resultTitle: '导入完成',\n resultTotal: '合计 {n} 行',\n resultInserted: '新增 {n}',\n resultUpdated: '更新 {n}',\n resultSkipped: '跳过 {n}',\n resultFailed: '失败 {n}',\n editFailures: '继续修改失败行',\n downloadErrorReport: '下载错误报告',\n noErrorRows: '当前没有错误行',\n },\n export: {\n button: '导出',\n pickColumns: '选择导出列',\n selectAll: '全选',\n confirm: '导出',\n done: '导出成功',\n },\n config: {\n title: '配置管理',\n key: '配置键',\n name: '配置名称',\n value: '配置值',\n group: '分组编码',\n sort: '排序',\n remark: '备注',\n keyRequired: '请输入配置键',\n nameRequired: '请输入配置名称',\n addTitle: '新增配置',\n editTitle: '编辑配置',\n deleteConfirm: '确定删除配置「{name}」?',\n saved: '保存成功',\n deleted: '已删除',\n groupManagedBy: '该分组归「{tab}」管理,保存后在那里显示',\n groupExtra: {\n title: '本组其它配置',\n hint: '同一分组里上面的表单没有列出的配置项,在这里查看、修改或删除。',\n },\n tab: {\n base: '系统基础',\n security: '安全策略',\n externalAuth: '第三方登录',\n upload: '上传策略',\n job: '定时任务',\n other: '其他配置',\n },\n job: {\n logRetentionDays: '日志保留天数',\n alertEmails: '告警邮箱',\n alertEmailsHint: '多个邮箱用逗号分隔',\n },\n externalAuth: {\n hint: '控制登录页显示哪些已部署的第三方登录方式。关闭后按钮隐藏,授权入口同步拒绝。连接密钥仍在服务器配置文件中。',\n empty: '当前未注册任何第三方登录(需在部署中装包或配置 OIDC)',\n showOnLogin: '登录页显示',\n hidden: '已隐藏',\n loginVisible: '登录页显示',\n summary: '共 {total} 种方式 · {on} 个在登录页显示',\n summaryFull: '共 {total} 种 · 已配置 {registered} · 登录页显示 {on}',\n reset: '还原',\n notConfigured: '未配置',\n notConfiguredTip: '部署侧未注册该方式(未装包或未填密钥),无法在登录页开启。',\n linkByAccount: '按账号自动关联',\n linkByAccountConfirmTitle: '打开按账号自动关联?',\n linkByAccountConfirm:\n '{name}账号与本地账号完全相同的人,首次从{name}登录时会自动绑定到该本地账号并直接登录;超级管理员、已停用账号、已绑过{name}的账号除外。请先确认两边账号是同一批人,比如本地账号就是从{name}同步来的。',\n },\n base: {\n siteTitle: '站点标题',\n logo: 'Logo 地址',\n siteSubtitle: '登录副标题',\n copyright: '版权信息',\n copyrightUrl: '版权链接',\n },\n security: {\n loginLock: {\n title: '登录失败锁定',\n maxFailCount: '锁定阈值(次)',\n lockMinutes: '锁定时长(分钟)',\n },\n password: {\n title: '密码复杂度',\n minLength: '最小长度',\n requireUpper: '须含大写字母',\n requireLower: '须含小写字母',\n requireDigit: '须含数字',\n requireSpecial: '须含特殊字符',\n expireDays: '密码有效天数(0=永不过期)',\n historyCount: '密码历史防重用条数(0=关闭)',\n },\n session: {\n title: '会话时长',\n accessMinutes: '访问令牌(分钟)',\n refreshMinutes: '刷新令牌(分钟)',\n },\n captcha: {\n title: '登录验证码',\n enabled: '启用登录验证码',\n type: '验证码类型',\n types: { char: '字符', path: '描边(更抗爬)', math: '算术' },\n },\n totp: {\n title: '动态口令(TOTP)',\n enabled: '启用动态口令',\n requireForSuperAdmin: '超管必须动态口令',\n hint: '与登录验证码一样可即时开关。开启后,用户管理里的「强制动态口令」才会在登录时生效;用户可在账号安全中自助绑定。',\n },\n sms: {\n title: '短信验证',\n hint: '二次验证仅对绑定了手机号的用户生效;开发环境验证码打印在后端日志,生产需注册真实短信通道(ISmsSender)。',\n },\n mfa: { enabled: '启用短信二次验证' },\n smsLogin: { enabled: '启用短信验证码登录' },\n rateLimit: {\n title: '请求限流',\n enabled: '启用请求限流',\n windowSeconds: '限流窗口(秒)',\n permitPerWindow: '全局每窗口请求数',\n authPermitPerWindow: '认证端点每窗口请求数',\n },\n highSens: {\n title: '高敏感权限(自定义追加)',\n hint: '内核默认高敏权限不可删除;下方仅可追加/删除消费者自定义权限码。写操作需近期再认证。',\n code: '权限码',\n remark: '备注',\n codePh: '如 POST:/api/v1/biz/order',\n remarkPh: '可选备注',\n codeRequired: '请填写权限码',\n },\n },\n upload: {\n title: '上传约束',\n maxSizeMb: '单文件上限(MB)',\n allowedExtensions: '允许的后缀',\n extPlaceholder: '输入后缀回车,如 .jpg',\n extTip: '含点、小写;留空则回退到服务端默认',\n },\n },\n // 字典管理(主从:左类型 / 右字典项)\n dict: {\n title: '字典管理',\n code: '类型编码',\n name: '类型名称',\n searchName: '搜索名称',\n sort: '排序',\n remark: '备注',\n codeRequired: '请输入类型编码',\n nameRequired: '请输入类型名称',\n addTypeTitle: '新增字典类型',\n editTypeTitle: '编辑字典类型',\n typeDeleteConfirm: '确定删除字典类型「{name}」?其下字典项将一并删除。',\n typeSaved: '保存成功',\n typeDeleted: '已删除',\n itemsOf: '「{name}」的字典项',\n selectTypeHint: '请选择左侧字典类型以管理其字典项',\n itemLabel: '显示文本',\n itemValue: '值',\n itemLabelRequired: '请输入显示文本',\n itemValueRequired: '请输入值',\n addItem: '新增字典项',\n addItemTitle: '新增字典项',\n editItemTitle: '编辑字典项',\n itemDeleteConfirm: '确定删除字典项「{label}」?',\n itemSaved: '保存成功',\n itemDeleted: '已删除',\n },\n // 机构管理(树表 + 上级机构树选)\n org: {\n title: '机构管理',\n searchPlaceholder: '搜索机构名称/编码',\n name: '机构名称',\n code: '机构编码',\n category: '分类',\n categoryPlaceholder: '选择机构分类',\n sort: '排序',\n parent: '上级机构',\n parentPlaceholder: '选择上级机构(留空=顶级)',\n nameRequired: '请输入机构名称',\n codePlaceholder: '不填则自动生成',\n addChild: '新增下级',\n addTitle: '新增机构',\n editTitle: '编辑机构',\n deleteConfirm: '确定删除机构「{name}」?',\n copy: '复制',\n copyTitle: '复制机构',\n copyConfirm: '将复制「{name}」及其全部下级,克隆编码自动追加 -copy 后缀。',\n copyNameLabel: '新机构名称',\n copied: '已复制',\n saved: '保存成功',\n deleted: '已删除',\n },\n // 文件管理(列表 + 上传/下载/删除)\n file: {\n title: '文件管理',\n name: '文件名',\n extension: '后缀',\n size: '大小',\n contentType: '类型',\n uploadTime: '上传时间',\n upload: '上传文件',\n uploadChunked: '分片上传',\n uploaded: '上传成功',\n download: '下载',\n deleteConfirm: '确定删除文件「{name}」?',\n deleted: '已删除',\n },\n // 消息通知(管理端发布/列表/删除 + 用户侧「我的通知」共用此命名空间)\n notice: {\n title: '消息通知',\n mine: '我的通知',\n status: '状态',\n read: '已读',\n unread: '未读',\n allRead: '已全部标记为已读',\n noticeTitle: '标题',\n content: '内容',\n type: '类型',\n typeNotice: '通知',\n typeAnnouncement: '公告',\n typeMessage: '消息',\n receiver: '接收范围',\n receiverAll: '全体用户',\n receiverRole: '指定角色',\n receiverUser: '指定用户',\n receiverPlaceholder: '请选择接收对象',\n receiverRequired: '请选择接收对象',\n publishTime: '发布时间',\n publish: '发布通知',\n publishTitle: '发布通知',\n titleRequired: '请输入标题',\n deleteConfirm: '确定删除通知「{title}」?',\n published: '已发布',\n deleted: '已删除',\n view: '查看',\n detailTitle: '通知详情',\n // 动作按钮(发布时可选带上,渲染在正文下)\n actions: '动作按钮',\n actionsHint:\n '最多 5 条;url 以 /api/ 开头是接口调用,其它站内路径是页面跳转;文案含「.」按 i18n key 翻译',\n actionCount: '{count} 个动作',\n actionLabel: '文案',\n actionMethod: '方法',\n actionUrl: '站内路径',\n actionStyle: '样式',\n actionStyleDefault: '默认',\n actionStylePrimary: '主色',\n actionStyleError: '危险',\n actionNeedConfirm: '先确认',\n actionNeedComment: '填意见',\n actionAdd: '添加动作',\n actionConfirm: '确定执行「{label}」?',\n actionCommentPlaceholder: '请输入意见(可留空)',\n actionDone: '已执行',\n actionInvalidUrl: '动作地址不合法',\n },\n // 实时通知(SignalR;后端 SmartAdmin:Realtime:Enabled 开启后即时推送,否则退回轮询/惰性 401)\n realtime: {\n forcedLogout: '您已被强制下线',\n },\n // 在线会话(只读 + 踢人)\n session: {\n title: '在线会话',\n account: '账号',\n ip: 'IP 地址',\n device: '设备',\n loginTime: '登录时间',\n expiresAt: '过期时间',\n kick: '强制下线',\n self: '当前会话',\n kickConfirm: '确定强制下线账号「{account}」的会话?该会话将立即失效。',\n kicked: '已强制下线',\n mineTitle: '我的会话',\n current: '当前设备',\n kickMineConfirm: '确定下线该设备上的会话?其登录状态将立即失效。',\n },\n // 外部登录 / SSO:回调结果页 + 个人中心账号绑定\n oauth: {\n processing: '正在处理登录…',\n backToLogin: '即将返回登录页',\n failed: '第三方登录失败,请重试',\n bindingsTitle: '账号绑定',\n bindingsHint: '把第三方账号绑定到本账号后,即可用它一键登录。绑定需跳转到对应平台完成一次授权。',\n bindingsTip: '绑定会跳转到对应平台授权;解绑后将无法再用该方式登录本账号。',\n boundCountLabel: '已绑定',\n bindTip: '点击下方按钮前往授权绑定',\n disabledTip: '运营已关闭该登录方式,已绑定的仍可解绑',\n cannotBind: '暂不可绑定',\n noProviders: '当前未启用任何第三方登录方式',\n thirdParty: '第三方账号',\n pendingLinkTitle: '待绑定 {name}',\n pendingLinkHint:\n '该 {name} 尚未绑定系统账号。请用你自己的系统账号登录;登录后将请你确认是否绑定。请勿打开来源不明的绑定链接。',\n pendingLinkSuccess: '已绑定 {name},下次可直接用它登录',\n pendingLinkConfirmTitle: '确认绑定第三方账号?',\n pendingLinkConfirmContent:\n '将把 {name}{identity} 绑定到当前账号「{account}」。若这不是你本人刚授权的第三方账号,请选择「仅登录」。',\n pendingLinkConfirmOk: '确认绑定',\n pendingLinkConfirmSkip: '仅登录,不绑定',\n pendingLinkIdentity: '({display})',\n bind: '绑定',\n unbind: '解绑',\n bound: '已绑定',\n notBound: '未绑定',\n boundAt: '绑定于 {time}',\n unbound: '已解绑',\n unbindConfirm: '确定解绑「{name}」?解绑后将不能再用它登录本账号。',\n disabled: '已停用',\n // 内置品牌显示名(后端未下发 displayName 时用)\n brand: {\n github: 'GitHub',\n wechat: '微信',\n wecom: '企业微信',\n dingtalk: '钉钉',\n gitee: 'Gitee',\n qq: 'QQ',\n },\n },\n // 岗位管理(普通 CRUD;岗位与机构无关联)\n position: {\n title: '岗位管理',\n code: '岗位编码',\n name: '岗位名称',\n sort: '排序',\n codePlaceholder: '不填则自动生成',\n nameRequired: '请输入岗位名称',\n addTitle: '新增岗位',\n editTitle: '编辑岗位',\n deleteConfirm: '确定删除岗位「{name}」?',\n saved: '保存成功',\n deleted: '已删除',\n },\n // 角色管理(CRUD + 授权菜单 + 数据范围)\n role: {\n title: '角色管理',\n code: '角色编码',\n name: '角色名称',\n sort: '排序',\n remark: '备注',\n codeRequired: '请输入角色编码',\n nameRequired: '请输入角色名称',\n addTitle: '新增角色',\n editTitle: '编辑角色',\n // 删角色会物理删掉用户↔角色关联(不可恢复),故删前先查人数当面告知;查不到人数(无用户查询权限)才退回这条通用文案\n deleteConfirm: '确定删除角色「{name}」?其授权、数据范围及用户关联将一并清除。',\n deleteConfirmNoUsers: '确定删除角色「{name}」?当前没有用户使用该角色。',\n deleteConfirmWithUsers:\n '角色「{name}」当前有 {count} 个用户在用。删除后这些用户将立即失去该角色的全部权限,且关联无法恢复。确定删除?',\n batchDeleteWithUsers:\n '确定删除所选 {count} 个角色?其中 {users} 个用户将立即失去相应权限,且关联无法恢复。',\n isDelegatable: '可转授',\n isDelegatableHint: '开启后,非超管用户可把该角色指派给其数据范围内的用户',\n grantUsers: '授权用户',\n grantUsersSaved: '用户授权已保存',\n saved: '保存成功',\n deleted: '已删除',\n grantMenus: '授权菜单',\n grantSaved: '授权已保存',\n catalog: '一级目录',\n menuCol: '菜单',\n buttonsCol: '按钮授权',\n apiOnlyRow: '接口权限(无页面)',\n dataScope: '数据范围',\n scopeType: '范围类型',\n customOrgs: '自定义机构',\n customOrgsHint: '选择该角色可见的机构',\n scopeSaved: '数据范围已保存',\n scope: {\n all: '全部数据',\n org: '本机构',\n orgAndChildren: '本机构及以下',\n self: '仅本人',\n custom: '自定义机构',\n },\n },\n // 日志(登录 / 操作共用一个命名空间;共享 result/success/failed/ip/userAgent/clear/cleared)\n log: {\n loginTitle: '登录日志',\n account: '账号',\n result: '结果',\n success: '成功',\n failed: '失败',\n resultCode: '结果码',\n name: '姓名',\n ip: 'IP 地址',\n userAgent: '客户端',\n device: '设备',\n clear: '清空日志',\n clearLoginConfirm: '确定清空全部登录日志?此为硬删除,不可恢复。',\n cleared: '已清空',\n // 操作日志\n opTitle: '操作日志',\n opName: '操作名',\n method: '方法',\n path: '路径',\n elapsed: '耗时',\n operator: '操作人',\n operatorPlaceholder: '选择操作人',\n param: '入参',\n exception: '异常信息',\n detail: '详情',\n clearOpConfirm: '确定清空全部操作日志?此为硬删除,不可恢复。',\n // 异常日志\n exceptionTitle: '异常日志',\n exceptionType: '异常类型',\n exceptionMessage: '异常消息',\n stackTrace: '异常堆栈',\n traceId: '追踪号',\n clearExceptionConfirm: '确定清空全部异常日志?此为硬删除,不可恢复。',\n },\n monitor: {\n title: '服务器监控',\n refresh: '刷新',\n cpu: 'CPU 占用',\n memory: '内存占用',\n runtime: '运行时',\n disk: '磁盘',\n processorCount: '处理器',\n threadCount: '线程',\n gcHeap: '托管堆',\n totalMemory: '可用上界',\n machineName: '主机名',\n framework: '框架',\n os: '操作系统',\n arch: '架构',\n uptime: '运行时长',\n free: '可用',\n days: '天',\n hours: '时',\n minutes: '分',\n },\n // 定时任务(任务列表 / 执行记录 / 任务监控 / CronEditor;错误码文案在 error.job.*,别重复)\n job: {\n title: '定时任务',\n name: '任务名称',\n code: '任务编码',\n codePlaceholder: '唯一编码,创建后不可变',\n remark: '备注',\n nameRequired: '请输入任务名称',\n codeRequired: '请输入任务编码',\n addTitle: '新增任务',\n editTitle: '编辑任务',\n deleteConfirm: '确定删除任务「{name}」?',\n saved: '保存成功,集群下最长 30 秒后生效',\n deleted: '已删除',\n runOnce: '执行',\n runConfirm: '确定立即执行一次任务「{name}」?本次执行不影响原调度节奏。',\n runStarted: '已触发执行',\n viewLogs: '记录',\n protectedTip: '内置任务受保护,禁止删除',\n pauseConfirm: '确定暂停任务「{name}」?暂停后不再调度。',\n panicTooltip: '连续失败 {n} 次已熔断;重新启用将清零连败并恢复调度',\n nextRunTime: '下次执行',\n lastRunTime: '上次执行',\n runCount: '执行/失败',\n status: { ready: '就绪', paused: '已暂停', completed: '已完成', panic: '已熔断' },\n form: {\n sectionBasic: '基本',\n sectionTrigger: '触发',\n sectionHandler: '载荷',\n sectionAdvanced: '高级选项',\n sectionAdvancedHint: '生效窗口、错过策略、并发、重试与告警;不展开也能保存',\n startTime: '生效开始',\n endTime: '生效结束',\n windowPlaceholder: '留空=不限',\n misfireStrategy: '错过策略',\n misfireSkip: '跳过',\n misfireFireOnceNow: '立即补跑一次',\n concurrencyMode: '并发模式',\n concurrencySerial: '串行跳过',\n concurrencyParallel: '并行',\n timeoutSeconds: '执行超时(秒)',\n timeoutHint: '0 = 不限制',\n retryCount: '失败重试次数',\n retryIntervalSeconds: '重试间隔(秒)',\n failAlertThreshold: '连败告警阈值',\n failAlertHint: '0 = 不告警不熔断',\n alertByNotice: '站内信告警',\n alertEmails: '告警邮箱',\n alertEmailsPlaceholder: '逗号分隔;留空回退全局配置',\n },\n trigger: {\n kind: '触发方式',\n cron: 'Cron',\n interval: '固定间隔',\n oneShot: '一次性',\n cronExpression: 'Cron 表达式',\n cronRequired: '请输入 cron 表达式',\n intervalSeconds: '间隔秒数',\n intervalRequired: '请输入间隔秒数(≥5)',\n oneShotTime: '执行时刻',\n oneShotRequired: '请选择执行时刻',\n seconds: '秒',\n everySeconds: '每 {n} 秒',\n },\n handler: {\n kind: '载荷类型',\n compiled: '编译类',\n http: 'HTTP',\n sql: 'SQL',\n sqlDisabledHint: 'SQL 载荷未启用:需后端开启 SmartAdmin:Jobs:Sql:Enabled',\n name: '处理器',\n namePlaceholder: '选择已注册的处理器',\n nameRequired: '请选择处理器',\n props: '属性包',\n propKey: '键',\n propValue: '值',\n addProp: '添加一项',\n httpUrl: '请求地址',\n httpUrlRequired: '请输入请求地址',\n httpMethod: '请求方法',\n httpHeaders: '请求头',\n headersMaskHint: '出于安全,已存请求头的值以 ******** 显示;不修改则原样保存生效',\n httpBody: '请求体',\n successStatuses: '成功状态码',\n successStatusesPlaceholder: '如 200,201;留空 = 2xx 即成功',\n sqlText: 'SQL 语句',\n sqlRequired: '请输入 SQL 语句',\n },\n log: {\n title: '执行记录',\n job: '任务',\n jobPlaceholder: '选择任务',\n fireMode: '触发来源',\n fireModeSchedule: '调度',\n fireModeManual: '手动',\n fireModeBackfill: '补跑',\n fireModeMisfireSkip: '错过跳过',\n scheduledTime: '计划时刻',\n startTime: '开始时间',\n elapsed: '耗时',\n runStatus: '状态',\n running: '运行中',\n success: '成功',\n failed: '失败',\n timeout: '超时',\n cancelled: '已取消',\n skipped: '已跳过',\n retryIndex: '重试次',\n node: '节点',\n kill: '终止',\n killConfirm: '确定终止任务「{name}」的这次执行?终止旗标写入后,目标节点最迟数秒内停止。',\n killed: '已请求终止',\n clear: '清空记录',\n clearTitle: '清空执行记录',\n clearAll: '全部记录',\n beforeDays: '{n} 天以前的记录',\n clearHint: '运行中的记录一律保留;此为硬删除,不可恢复。',\n cleared: '已清理 {n} 条记录',\n message: '处理器输出',\n error: '异常信息',\n attempts: '同一次触发的各次尝试',\n firstTry: '首次',\n retryN: '第 {n} 次重试',\n },\n monitor: {\n title: '任务监控',\n todaySuccess: '今日成功',\n todayFailed: '今日失败',\n running: '运行中',\n totalJobs: '任务总数',\n trendTitle: '近 14 日成败趋势',\n trendSuccess: '成功',\n trendFailed: '失败',\n upcomingTitle: '即将执行',\n upcomingJob: '任务',\n upcomingTime: '时刻',\n nodesTitle: '集群节点',\n nodeName: '节点',\n role: '角色',\n leader: 'leader',\n standby: 'standby',\n lastHeartbeat: '最后心跳',\n workerId: 'WorkerId',\n pid: 'PID',\n justNow: '刚刚',\n secondsAgo: '{n} 秒前',\n minutesAgo: '{n} 分钟前',\n hoursAgo: '{n} 小时前',\n },\n cron: {\n tabSecond: '秒',\n tabMinute: '分',\n tabHour: '时',\n tabDay: '日',\n tabMonth: '月',\n tabWeek: '周',\n tabExpression: '表达式',\n every: '每',\n any: '不指定(?)',\n range: '区间',\n to: '到',\n step: '步长',\n stepFrom: '从',\n stepEvery: '起,每',\n list: '指定值',\n lastDay: '月末(L)',\n lastDayHint: '0 = 月末当天,n = 月末前 n 天(L-n)',\n nearestWeekday: '最近工作日(nW)',\n nearestWeekdayHint: '距该日最近的工作日,不跨月',\n lastWeekday: '月末工作日(LW)',\n lastOfWeek: '最后一个周几(nL)',\n nth: '第 m 个周几(n#m)',\n nthPrefix: '第',\n nthInfix: '个',\n sun: '周日',\n mon: '周一',\n tue: '周二',\n wed: '周三',\n thu: '周四',\n fri: '周五',\n sat: '周六',\n expressionPlaceholder: '如 0 0 2 * * ?(秒 分 时 日 月 周)',\n expressionHint: '支持 5 段(自动补秒位)或 6 段;日与周不能同时受限,其一须为 * 或 ?',\n normalized: '归一化',\n nextRuns: '未来 {n} 次',\n noUpcoming: '已无未来执行时刻',\n everySecondWarning: '该表达式等效每秒执行,请确认这是有意为之',\n },\n },\n cache: {\n authTitle: '权限缓存',\n authDesc: '清除全部用户的权限码与数据范围缓存。直接改库或排障后,强制下次请求按最新授权重算。',\n authConfirm: '确定清除全部用户的权限/数据范围缓存?下次请求将重新计算授权。',\n dictTitle: '字典缓存',\n dictDesc: '清除全部字典类型的字典项缓存。直接改库后,强制下拉数据源按最新字典重建。',\n dictConfirm: '确定清除全部字典项缓存?',\n configTitle: '配置缓存',\n configDesc: '清除全部系统配置项的读穿透缓存。直接改库后,强制配置值按最新库表重读。',\n configConfirm: '确定清除全部系统配置缓存?',\n portalTitle: '门户菜单缓存',\n portalDesc: '递增门户代际,令所有用户的模块/菜单树缓存整体失效,下次进入重建。',\n portalConfirm: '确定重建门户菜单缓存?所有用户的菜单将在下次请求时重算。',\n execute: '执行',\n flushed: '已清除 {n} 项缓存',\n portalDone: '已重建门户菜单缓存',\n note: '仅提供定向失效,不浏览键、不读取值——缓存中含明文验证码/一次性令牌、键中内嵌手机号/IP。正常的授权变更已自动失效,此页用于直接改库等旁路场景的手动刷新。',\n },\n profile: {\n title: '个人资料',\n account: '账号',\n name: '姓名',\n org: '机构',\n position: '职位',\n nickname: '昵称',\n gender: '性别',\n phone: '手机号',\n email: '邮箱',\n avatar: '头像',\n avatarUploading: '上传中…',\n phoneInvalid: '手机号格式不正确',\n emailInvalid: '邮箱格式不正确',\n saved: '资料已更新',\n },\n personalSecurity: {\n title: '账号安全',\n // 全员可见:只说用户能做什么,不指向后台配置路径。\n hint: '在此绑定或管理身份验证器(TOTP),用于登录二次验证。',\n // 仅管理员可见(超管 / 能进系统配置):指向「安全策略」开关,普通用户无需也不应看到。\n adminHint:\n '若绑定失败或登录不要求二次验证,请到「系统配置 → 安全策略」确认已开启「启用动态口令」。',\n bindDesc: '使用账号与当前密码完成自助绑定;也可使用恢复码解除绑定后重新绑定。',\n setupAuthenticator: '设置身份验证器',\n useRecovery: '使用恢复码',\n note: '自愿绑定请从本页进入。若账号被要求启用二次验证且尚未绑定,登录账密通过后会弹出引导。',\n },\n changePassword: {\n title: '修改密码',\n oldPassword: '原密码',\n newPassword: '新密码',\n confirmPassword: '确认新密码',\n oldRequired: '请输入原密码',\n newRequired: '请输入新密码',\n confirmRequired: '请再次输入新密码',\n mismatch: '两次输入的新密码不一致',\n changed: '密码已修改,请重新登录',\n forcedHint: '首次登录或密码被重置,请先修改密码后再使用系统。',\n strength: { label: '密码强度', weak: '弱', fair: '中', strong: '强' },\n rules: {\n minLength: '至少 {n} 位',\n upper: '包含大写字母',\n lower: '包含小写字母',\n digit: '包含数字',\n special: '包含特殊字符',\n specialOptional: '包含特殊字符(可选,更安全)',\n },\n },\n // ── 后端错误码 msgKey → 文案 ──────────────────────────────\n error: {\n _fallback: '操作失败,请稍后重试',\n // 前端侧错误(不来自后端错误码):请求被超时闸掐断或主动取消\n network: {\n timeout: '请求超时,请检查网络后重试',\n aborted: '请求已取消',\n },\n auth: {\n passwordWrong: '账号或密码错误',\n captchaExpired: '验证码已过期',\n captchaWrong: '验证码错误',\n accountLocked: '账号已锁定,请稍后再试',\n accountDisabled: '账号已停用',\n tokenInvalid: '登录状态无效,请重新登录',\n refreshTokenInvalid: '登录已过期,请重新登录',\n tooManyRequests: '操作过于频繁,请稍后再试',\n smsCodeRequired: '请输入短信验证码',\n smsCodeWrong: '短信验证码错误',\n smsCodeExpired: '短信验证码错误或已失效,请重新获取',\n smsLoginDisabled: '短信验证码登录未启用',\n oauthProviderDisabled: '该第三方登录方式未启用或不存在',\n oauthStateInvalid: '登录会话已失效,请重新发起第三方登录',\n oauthExchangeFailed: '第三方登录换取身份失败,请重试',\n oauthAccountNotBound: '该第三方账号尚未绑定系统账号,请先登录本系统账号以完成绑定',\n oauthAlreadyBound: '该第三方账号已被绑定,或当前账号已绑定同一登录方式',\n totpRequired: '请输入动态口令完成二次验证',\n totpWrong: '动态口令错误',\n totpNotBound: '尚未绑定动态口令,请先完成绑定',\n bindInviteInvalid: '绑定无效或已过期,请重新开始设置',\n mfaBindInvalid: '绑定无效或已过期,请重新开始设置',\n recoveryCodeInvalid: '恢复码无效或已使用',\n csrfInvalid: '请求校验失败,请刷新页面后重试',\n reauthRequired: '此操作需要再次验证身份',\n mfaBindPasswordRequired: '绑定动态口令前请先验证当前密码',\n apiKeyInvalid: 'API Key 缺失或无效',\n },\n perm: {\n denied: '无权限访问',\n demoReadOnly: '当前为演示环境,禁止修改操作',\n superAdminRequired: '该操作仅限超级管理员执行',\n },\n user: {\n notFound: '用户不存在',\n accountExists: '账号已存在',\n superAdminProtected: '超级管理员受保护,禁止此操作',\n passwordTooWeak: '新密码不满足密码复杂度要求',\n passwordReused: '新密码不能与当前或最近使用过的密码相同',\n outOfDataScope: '目标用户超出当前数据范围',\n avatarUrlInvalid: '头像地址不合法',\n cannotOperateSelf: '不能对自己执行此操作',\n },\n role: {\n notFound: '角色不存在',\n codeExists: '角色编码已存在',\n notDelegatable: '目标角色不可转授',\n },\n org: {\n notFound: '机构不存在',\n hasChildren: '存在子机构,不可删除',\n invalidParent: '上级机构无效',\n codeExists: '机构编码已存在',\n hasUsers: '机构下仍有用户,不可删除',\n outOfScope: '目标机构超出当前数据范围',\n },\n position: {\n notFound: '职位不存在',\n codeExists: '职位编码已存在',\n hasUsers: '该职位下仍有用户,不可删除',\n },\n module: {\n notFound: '应用不存在',\n codeExists: '应用编码已存在',\n protected: '内置应用受保护,禁止此操作',\n accessDenied: '无该应用访问权限',\n hasMenus: '应用下仍有挂靠菜单,请先迁移或删除后再删应用',\n },\n menu: {\n notFound: '菜单不存在',\n hasChildren: '存在子节点,不可删除',\n invalidParent: '上级菜单无效(不能指向自身或其子节点)',\n },\n session: { notFound: '会话不存在或已下线' },\n dict: {\n typeNotFound: '字典类型不存在',\n typeCodeExists: '字典类型编码已存在',\n itemNotFound: '字典项不存在',\n seedProtected: '种子数据受保护,不可删除',\n itemValueExists: '字典项值在该类型下已存在',\n },\n config: { notFound: '配置不存在', keyExists: '配置键已存在' },\n notice: {\n notFound: '通知不存在',\n receiverRequired: '定向发布必须指定至少一个接收对象',\n receiverNotFound: '接收对象不存在或已停用',\n actionInvalid:\n '动作列表不合法:文案不能为空,方法只能是 GET/POST,地址须是单个 / 开头的站内路径,最多 5 条',\n },\n file: {\n empty: '文件为空',\n tooLarge: '文件超出大小限制',\n extNotAllowed: '不支持的文件类型',\n notFound: '文件不存在',\n chunkMissing: '分片缺失,请重试上传',\n chunkHashMismatch: '文件校验失败,请重新上传',\n },\n excel: {\n providerMissing: '未安装 Excel 支持包,请安装 SmartAdmin.Excel 并调用 AddSmartAdminExcel()',\n },\n import: {\n fileEmpty: '导入文件为空',\n rowLimitExceeded: '导入行数超过上限',\n columnMissing: '必填列未映射',\n cellRequired: '该单元格为必填项',\n cellDictInvalid: '字典值无效',\n cellRefNotFound: '引用的数据不存在',\n cellFormatInvalid: '单元格格式不正确',\n duplicateInFile: '业务键在本文件内重复',\n duplicateInDb: '业务键在库中已存在',\n orgOutOfScope: '机构不在当前数据范围内',\n },\n export: {\n tooManyRows: '导出结果超过行数上限,请先收窄筛选条件',\n columnInvalid: '请求导出的列无效',\n },\n job: {\n notFound: '任务不存在',\n codeExists: '任务编码已存在',\n cronInvalid: 'cron 表达式不合法',\n triggerInvalid: '触发配置不合法',\n handlerNotFound: '处理器未注册',\n alreadyRunning: '上次执行尚未结束',\n runNotAlive: '该执行记录不在运行中',\n sqlDisabled: 'SQL 任务未启用',\n httpUrlBlocked: '目标地址被安全策略拒绝',\n statusConflict: '任务状态不允许该操作',\n propsInvalid: '任务参数缺失或不合法',\n logNotFound: '执行记录不存在',\n runLimitReached: '运行中任务数已达上限,请稍后再试',\n protected: '内置任务受保护,禁止删除',\n },\n recycle: {\n notFound: '回收站中未找到该记录',\n uniqueConflict: '恢复失败:编码/账号已被新记录占用',\n invalidType: '不支持的回收站类型',\n },\n request: {\n pageSizeExceeded: '每页条数超过上限 {max},请调小分页或使用导出',\n },\n system: { internal: '服务器内部错误' },\n },\n\n // 回收站\n recycle: {\n title: '回收站',\n name: '名称',\n code: '编码',\n deletedAt: '删除时间',\n restore: '恢复',\n purge: '彻底删除',\n restoreConfirm: '确定恢复「{name}」?',\n purgeConfirm: '确定彻底删除「{name}」?数据将无法恢复。',\n restored: '已恢复',\n purged: '已彻底删除',\n empty: '回收站为空',\n tabs: {\n user: '用户',\n role: '角色',\n org: '机构',\n position: '岗位',\n module: '模块',\n config: '配置',\n dict: '字典',\n menu: '菜单',\n job: '定时任务',\n },\n },\n // 用户导入导出:列标题 + 文件名(与 UserImportProfile / UserExportProfile 的列一一对应)\n userExport: {\n account: '登录账号',\n name: '姓名',\n nickname: '昵称',\n phone: '手机号',\n email: '邮箱',\n gender: '性别',\n orgName: '所属机构',\n positionName: '职位',\n directorName: '直属主管',\n enabled: '启用状态',\n superAdmin: '超级管理员',\n createTime: '创建时间',\n fileName: '用户导出.xlsx',\n importTemplateName: '用户导入模板.xlsx',\n errorReportName: '用户导入错误报告.xlsx',\n },\n logOp: {\n fileName: '操作日志导出.xlsx',\n },\n}\n"],"names":["zhCN"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** 令牌/刷新令牌失效(ErrorCode.TokenInvalid / RefreshTokenInvalid)。 */
|
|
2
|
+
export declare const TOKEN_INVALID_CODE = 40006;
|
|
3
|
+
export declare const REFRESH_TOKEN_INVALID_CODE = 40007;
|
|
4
|
+
/**
|
|
5
|
+
* 该错误是否意味着会话已失效(可以清会话回登录页)。
|
|
6
|
+
* 非 ApiError(网络中断、超时)与 5xx / 429 一律返回 false —— 留在原地重试。
|
|
7
|
+
*/
|
|
8
|
+
export declare function isSessionDead(err: unknown): boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ApiError as n } from "../api/index.js";
|
|
2
|
+
const E = 40006, t = 40007, s = /* @__PURE__ */ new Set([401, E, t]);
|
|
3
|
+
function e(o) {
|
|
4
|
+
return o instanceof n && s.has(o.code);
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
t as REFRESH_TOKEN_INVALID_CODE,
|
|
8
|
+
E as TOKEN_INVALID_CODE,
|
|
9
|
+
e as isSessionDead
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=bootFailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootFailure.js","sources":["../../src/router/bootFailure.ts"],"sourcesContent":["// 门户重建(enterInitial)失败的分诊。\n//\n// 只有会话真的没了才清会话回登录页:HTTP 401,或后端明说令牌失效的两个业务码。\n// 网络抖一下、后端 502、被限流都不是会话问题 —— 清会话赶回登录页,重登时还会撞上同一个网络问题,\n// 白丢当前页面又解决不了任何事,所以这类失败走可重试的错误页。\nimport { ApiError } from '#/api'\n\n/** 令牌/刷新令牌失效(ErrorCode.TokenInvalid / RefreshTokenInvalid)。 */\nexport const TOKEN_INVALID_CODE = 40006\nexport const REFRESH_TOKEN_INVALID_CODE = 40007\n\nconst SESSION_DEAD_CODES = new Set([401, TOKEN_INVALID_CODE, REFRESH_TOKEN_INVALID_CODE])\n\n/**\n * 该错误是否意味着会话已失效(可以清会话回登录页)。\n * 非 ApiError(网络中断、超时)与 5xx / 429 一律返回 false —— 留在原地重试。\n */\nexport function isSessionDead(err: unknown): boolean {\n return err instanceof ApiError && SESSION_DEAD_CODES.has(err.code)\n}\n"],"names":["TOKEN_INVALID_CODE","REFRESH_TOKEN_INVALID_CODE","SESSION_DEAD_CODES","isSessionDead","err","ApiError"],"mappings":";AAQO,MAAMA,IAAqB,OACrBC,IAA6B,OAEpCC,IAAqB,oBAAI,IAAI,CAAC,KAAKF,GAAoBC,CAA0B,CAAC;AAMjF,SAASE,EAAcC,GAAuB;AACnD,SAAOA,aAAeC,KAAYH,EAAmB,IAAIE,EAAI,IAAI;AACnE;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { router as t, registerDynamic as r } from "./index.js";
|
|
2
|
+
import { namedPage as m } from "./namedPage.js";
|
|
3
|
+
import { detailViews as n } from "./viewRegistry.js";
|
|
4
|
+
function s() {
|
|
5
|
+
for (const [a, i] of n()) {
|
|
6
|
+
const o = `/${a.slice(0, -7)}`, e = "detail" + o.replace(/\//g, "-");
|
|
7
|
+
t.hasRoute(e) && t.removeRoute(e), t.addRoute("layout", {
|
|
8
|
+
path: `${o}/:id/detail`,
|
|
9
|
+
name: e,
|
|
10
|
+
component: m(e, i),
|
|
11
|
+
// title 用通用「详情」兜底;页面加载后由 useTabTitle 覆盖成记录名。noCache:详情只读,不进 keep-alive。
|
|
12
|
+
meta: { title: "common.detail", noCache: !0 }
|
|
13
|
+
}), r(e);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
s as registerDetailRoutes
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=detailRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detailRoutes.js","sources":["../../src/router/detailRoutes.ts"],"sourcesContent":["import { router, registerDynamic } from '#/router'\nimport { namedPage } from '#/router/namedPage'\nimport { detailViews } from '#/router/viewRegistry'\n\n// 约定式详情路由:约定「views 下任意 `detail.vue` = 一个按记录 id 的详情页」。\n// views/system/user/detail.vue(页面表 key system/user/detail)→ 路由 /system/user/:id/detail,名 detail-system-user\n// 走动态注册(而非写死进 routes.ts):由 buildRoutesForModule 在菜单路由重建处一并调用,\n// 故每次登录/切应用/F5 重建时详情路由随菜单路由一起复活 —— 动态且刷新/深链安全。\n// 消费方加详情页:自己 views 下丢一个 `<模块路径>/detail.vue`,随 createSmartAdmin({ views }) 进页面表即可。\n// 局限(需自定义参数名 / 一页多详情)时再退回显式静态路由。见 skills/create-page-variant.md 变体四。\n\n/** 扫描 detail.vue 约定,把详情路由挂到 layout 壳下。幂等:重复调用先删同名再加。 */\nexport function registerDetailRoutes(): void {\n for (const [key, loader] of detailViews()) {\n const base = `/${key.slice(0, -'/detail'.length)}` // → /system/user\n const name = 'detail' + base.replace(/\\//g, '-') // → detail-system-user\n if (router.hasRoute(name)) router.removeRoute(name)\n router.addRoute('layout', {\n path: `${base}/:id/detail`,\n name,\n component: namedPage(name, loader),\n // title 用通用「详情」兜底;页面加载后由 useTabTitle 覆盖成记录名。noCache:详情只读,不进 keep-alive。\n meta: { title: 'common.detail', noCache: true },\n })\n registerDynamic(name)\n }\n}\n"],"names":["registerDetailRoutes","key","loader","detailViews","base","name","router","namedPage","registerDynamic"],"mappings":";;;AAYO,SAASA,IAA6B;AAC3C,aAAW,CAACC,GAAKC,CAAM,KAAKC,KAAe;AACzC,UAAMC,IAAO,IAAIH,EAAI,MAAM,GAAG,EAAiB,CAAC,IAC1CI,IAAO,WAAWD,EAAK,QAAQ,OAAO,GAAG;AAC/C,IAAIE,EAAO,SAASD,CAAI,KAAGC,EAAO,YAAYD,CAAI,GAClDC,EAAO,SAAS,UAAU;AAAA,MACxB,MAAM,GAAGF,CAAI;AAAA,MACb,MAAAC;AAAA,MACA,WAAWE,EAAUF,GAAMH,CAAM;AAAA;AAAA,MAEjC,MAAM,EAAE,OAAO,iBAAiB,SAAS,GAAA;AAAA,IAAK,CAC/C,GACDM,EAAgBH,CAAI;AAAA,EACtB;AACF;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createRouter as c, createWebHistory as f } from "vue-router";
|
|
2
|
+
import { staticRoutes as m } from "./routes.js";
|
|
3
|
+
import { useUserStore as p } from "../stores/user.js";
|
|
4
|
+
import { useAuthStore as h } from "../stores/auth.js";
|
|
5
|
+
import { useTabsStore as l } from "../stores/tabs.js";
|
|
6
|
+
import { loadingBar as u } from "../lib/loadingBar.js";
|
|
7
|
+
import { reloadOnChunkError as d } from "../lib/chunkReload.js";
|
|
8
|
+
import { ensureAccessToken as g } from "../api/client.js";
|
|
9
|
+
import { isSessionDead as k } from "./bootFailure.js";
|
|
10
|
+
const t = c({
|
|
11
|
+
history: f(),
|
|
12
|
+
routes: m
|
|
13
|
+
});
|
|
14
|
+
t.beforeEach(() => {
|
|
15
|
+
u.start();
|
|
16
|
+
});
|
|
17
|
+
t.afterEach(() => {
|
|
18
|
+
u.finish();
|
|
19
|
+
});
|
|
20
|
+
t.onError((e) => {
|
|
21
|
+
u.error(), d(e);
|
|
22
|
+
});
|
|
23
|
+
let n = [];
|
|
24
|
+
function C(e) {
|
|
25
|
+
n.push(e);
|
|
26
|
+
}
|
|
27
|
+
function i() {
|
|
28
|
+
for (const e of n) t.hasRoute(e) && t.removeRoute(e);
|
|
29
|
+
n = [];
|
|
30
|
+
}
|
|
31
|
+
t.beforeEach(async (e) => {
|
|
32
|
+
var s;
|
|
33
|
+
const r = p(), o = h();
|
|
34
|
+
if (!r.accessToken && (r.cookieSession || r.refreshToken) && (await g() || r.clear()), e.name === "login")
|
|
35
|
+
return e.query.pendingLink || e.query.totpChallenge ? ((r.accessToken || r.refreshToken || r.cookieSession) && (i(), o.reset(), r.clear()), !0) : r.isLoggedIn ? { path: "/", replace: !0 } : !0;
|
|
36
|
+
if (e.meta.public) return !0;
|
|
37
|
+
if (!r.isLoggedIn) return { path: "/login", replace: !0 };
|
|
38
|
+
if ((s = r.userInfo) != null && s.mustChangePassword)
|
|
39
|
+
return e.path === "/personal/password" ? !0 : { path: "/personal/password", replace: !0 };
|
|
40
|
+
if (e.name === "boot-error") return !0;
|
|
41
|
+
if (!o.routesReady)
|
|
42
|
+
try {
|
|
43
|
+
const { useModule: a } = await import("../composables/useModule.js");
|
|
44
|
+
return (await a().enterInitial()).chooser ? e.name === "module" ? !0 : { path: "/module", replace: !0 } : e.name === "module" ? !0 : e.path === "/" ? { path: o.homePath, replace: !0 } : e.fullPath;
|
|
45
|
+
} catch (a) {
|
|
46
|
+
return k(a) ? (i(), o.reset(), r.clear(), { path: "/login", replace: !0 }) : { path: "/boot-error", query: { redirect: e.fullPath }, replace: !0 };
|
|
47
|
+
}
|
|
48
|
+
return e.path === "/" ? { path: o.homePath, replace: !0 } : !0;
|
|
49
|
+
});
|
|
50
|
+
t.afterEach((e) => {
|
|
51
|
+
e.meta.public || ["login", "module", "not-found", "personal"].includes(e.name) || e.matched.some((r) => r.name === "layout") && l().addTab(e);
|
|
52
|
+
});
|
|
53
|
+
export {
|
|
54
|
+
C as registerDynamic,
|
|
55
|
+
i as resetRouter,
|
|
56
|
+
t as router
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/router/index.ts"],"sourcesContent":["import { createRouter, createWebHistory } from 'vue-router'\nimport { staticRoutes } from './routes'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { useTabsStore } from '#/stores/tabs'\nimport { loadingBar } from '#/lib/loadingBar'\nimport { reloadOnChunkError } from '#/lib/chunkReload'\nimport { ensureAccessToken } from '#/api/client'\nimport { isSessionDead } from './bootFailure'\n\nexport const router = createRouter({\n history: createWebHistory(),\n routes: staticRoutes,\n})\n\n// 路由加载进度条:懒加载 chunk 与 F5 重建菜单(enterInitial)期间给出反馈。\nrouter.beforeEach(() => {\n loadingBar.start()\n})\nrouter.afterEach(() => {\n loadingBar.finish()\n})\n// 路由懒加载失败大多是发版后旧 chunk 404 —— 自动重载一次拿新 index.html(每标签页仅一次)。\nrouter.onError(err => {\n loadingBar.error()\n reloadOnChunkError(err)\n})\n\n// 动态路由名登记,用于登出/切应用时精确移除。\nlet dynamicNames: Array<string | symbol> = []\nexport function registerDynamic(name: string | symbol) {\n dynamicNames.push(name)\n}\nexport function resetRouter() {\n for (const n of dynamicNames) if (router.hasRoute(n)) router.removeRoute(n)\n dynamicNames = []\n}\n\nrouter.beforeEach(async to => {\n const user = useUserStore()\n const auth = useAuthStore()\n\n // Cookie 会话:access 只在内存,F5 后靠 cookieSession 标记 + HttpOnly refresh 静默换发。\n // 默认模式令牌已 localStorage 水合,ensureAccessToken 立即 true。\n if (!user.accessToken && (user.cookieSession || user.refreshToken)) {\n const ok = await ensureAccessToken()\n if (!ok) user.clear()\n }\n\n // 登录页是唯一免认证页;已登录再访问则回首页。\n // 例外:SSO 未绑定 pendingLink / SSO 后 TOTP 挑战——必须停在登录页完成账密或二次验证。\n // 若仍带着残留会话进 /login,会误弹回首页,看起来像「解绑后 GitHub 仍直接登录」。\n if (to.name === 'login') {\n const needReauth = !!(to.query.pendingLink || to.query.totpChallenge)\n if (needReauth) {\n if (user.accessToken || user.refreshToken || user.cookieSession) {\n resetRouter()\n auth.reset()\n user.clear()\n }\n return true\n }\n return user.isLoggedIn ? { path: '/', replace: true } : true\n }\n\n // 公开的 OAuth 回调和 MFA 绑定/恢复页不能被登录守卫送回登录页。\n if (to.meta.public) return true\n\n if (!user.isLoggedIn) return { path: '/login', replace: true }\n\n // 强制改密守卫:管理员建号/重置后首登,未改密前只允许停留在改密页,阻断其它一切导航\n // (含应用选择/门户重建)。改密页是静态路由,无需动态路由就绪即可渲染,故放在 routesReady 重建之前,\n // 直接放行改密页避免\"重建→选应用→又被弹回\"的循环。改密成功后现有流程强制登出重登,标志由后端清零。\n if (user.userInfo?.mustChangePassword) {\n return to.path === '/personal/password' ? true : { path: '/personal/password', replace: true }\n }\n\n // 重建失败页本身就是重建失败的落点,放行,否则下面的重建守卫会在它身上再试一次,变成死循环。\n if (to.name === 'boot-error') return true\n\n // 刷新白屏守卫:动态路由只活在内存,F5/深链时 routesReady=false → 重建后重解析。\n // 注意:不能用 to.meta.public 短路——未注册的动态路由会先命中 catch-all(404),\n // 若按 public 放行就会错显 404 而非重建。\n if (!auth.routesReady) {\n try {\n const { useModule } = await import('#/composables/useModule')\n const res = await useModule().enterInitial()\n if (res.chooser) return to.name === 'module' ? true : { path: '/module', replace: true }\n // 选应用页放行:enterInitial 已填好 auth.modules,渲染所需数据齐备。\n // 不能弹回 '/' —— 那样默认应用一旦设定就再无入口改它(右上角九宫格正是导航到这里)。\n if (to.name === 'module') return true\n // 目标是 '/' 时不能 return to.fullPath——那是重定向到自身,'/' 已无静态 redirect,会被判成无限重定向。\n // 此刻菜单树已就绪,直接给出首页。\n if (to.path === '/') return { path: auth.homePath, replace: true }\n return to.fullPath // 重解析当前 URL(此时动态路由已就绪)\n } catch (e) {\n // 只有会话确实失效才清会话;网络抖动/5xx/限流留在原地给可重试的错误页(见 bootFailure.ts)。\n if (isSessionDead(e)) {\n resetRouter()\n auth.reset()\n user.clear()\n return { path: '/login', replace: true }\n }\n return { path: '/boot-error', query: { redirect: to.fullPath }, replace: true }\n }\n }\n\n // '/' 落到当前应用自己的首页。放在守卫里(而非 layout 的 redirect)——redirect 在 resolve 阶段求值,\n // 早于本守卫,那时 menuTree 还空、动态路由未建,算出的首页必然是错的。\n if (to.path === '/') return { path: auth.homePath, replace: true }\n\n return true\n})\n\n// 记录已访问页为标签(动态路由就绪后触发,F5 重解析也会命中)。\nrouter.afterEach(to => {\n if (to.meta.public) return\n if (['login', 'module', 'not-found', 'personal'].includes(to.name as string)) return\n if (!to.matched.some(r => r.name === 'layout')) return\n useTabsStore().addTab(to)\n})\n"],"names":["router","createRouter","createWebHistory","staticRoutes","loadingBar","err","reloadOnChunkError","dynamicNames","registerDynamic","name","resetRouter","n","to","user","useUserStore","auth","useAuthStore","ensureAccessToken","_a","useModule","e","isSessionDead","useTabsStore"],"mappings":";;;;;;;;;AAUO,MAAMA,IAASC,EAAa;AAAA,EACjC,SAASC,EAAA;AAAA,EACT,QAAQC;AACV,CAAC;AAGDH,EAAO,WAAW,MAAM;AACtB,EAAAI,EAAW,MAAA;AACb,CAAC;AACDJ,EAAO,UAAU,MAAM;AACrB,EAAAI,EAAW,OAAA;AACb,CAAC;AAEDJ,EAAO,QAAQ,CAAAK,MAAO;AACpB,EAAAD,EAAW,MAAA,GACXE,EAAmBD,CAAG;AACxB,CAAC;AAGD,IAAIE,IAAuC,CAAA;AACpC,SAASC,EAAgBC,GAAuB;AACrD,EAAAF,EAAa,KAAKE,CAAI;AACxB;AACO,SAASC,IAAc;AAC5B,aAAWC,KAAKJ,EAAc,CAAIP,EAAO,SAASW,CAAC,KAAGX,EAAO,YAAYW,CAAC;AAC1E,EAAAJ,IAAe,CAAA;AACjB;AAEAP,EAAO,WAAW,OAAMY,MAAM;;AAC5B,QAAMC,IAAOC,EAAA,GACPC,IAAOC,EAAA;AAYb,MARI,CAACH,EAAK,gBAAgBA,EAAK,iBAAiBA,EAAK,kBACxC,MAAMI,EAAA,KACRJ,EAAK,MAAA,IAMZD,EAAG,SAAS;AAEd,WADsBA,EAAG,MAAM,eAAeA,EAAG,MAAM,kBAEjDC,EAAK,eAAeA,EAAK,gBAAgBA,EAAK,mBAChDH,EAAA,GACAK,EAAK,MAAA,GACLF,EAAK,MAAA,IAEA,MAEFA,EAAK,aAAa,EAAE,MAAM,KAAK,SAAS,OAAS;AAI1D,MAAID,EAAG,KAAK,OAAQ,QAAO;AAE3B,MAAI,CAACC,EAAK,WAAY,QAAO,EAAE,MAAM,UAAU,SAAS,GAAA;AAKxD,OAAIK,IAAAL,EAAK,aAAL,QAAAK,EAAe;AACjB,WAAON,EAAG,SAAS,uBAAuB,KAAO,EAAE,MAAM,sBAAsB,SAAS,GAAA;AAI1F,MAAIA,EAAG,SAAS,aAAc,QAAO;AAKrC,MAAI,CAACG,EAAK;AACR,QAAI;AACF,YAAM,EAAE,WAAAI,EAAA,IAAc,MAAM,OAAO,6BAAyB;AAE5D,cADY,MAAMA,EAAA,EAAY,aAAA,GACtB,UAAgBP,EAAG,SAAS,WAAW,KAAO,EAAE,MAAM,WAAW,SAAS,GAAA,IAG9EA,EAAG,SAAS,WAAiB,KAG7BA,EAAG,SAAS,MAAY,EAAE,MAAMG,EAAK,UAAU,SAAS,GAAA,IACrDH,EAAG;AAAA,IACZ,SAASQ,GAAG;AAEV,aAAIC,EAAcD,CAAC,KACjBV,EAAA,GACAK,EAAK,MAAA,GACLF,EAAK,MAAA,GACE,EAAE,MAAM,UAAU,SAAS,GAAA,KAE7B,EAAE,MAAM,eAAe,OAAO,EAAE,UAAUD,EAAG,SAAA,GAAY,SAAS,GAAA;AAAA,IAC3E;AAKF,SAAIA,EAAG,SAAS,MAAY,EAAE,MAAMG,EAAK,UAAU,SAAS,GAAA,IAErD;AACT,CAAC;AAGDf,EAAO,UAAU,CAAAY,MAAM;AACrB,EAAIA,EAAG,KAAK,UACR,CAAC,SAAS,UAAU,aAAa,UAAU,EAAE,SAASA,EAAG,IAAc,KACtEA,EAAG,QAAQ,KAAK,OAAK,EAAE,SAAS,QAAQ,KAC7CU,EAAA,EAAe,OAAOV,CAAE;AAC1B,CAAC;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Component, AsyncComponentLoader } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* 包装懒加载页面,使「组件名 === 路由名」。
|
|
4
|
+
* keep-alive 的 :include 按组件 name 匹配,而 <script setup> 的 __name 取自文件名
|
|
5
|
+
* (众多 index.vue 会跨页冲突、且与路由名 menu-${id} 不符)。
|
|
6
|
+
* inner 只建一次 → 身份稳定,keep-alive 缓存其子树;onActivated/onDeactivated 照常透传。
|
|
7
|
+
*
|
|
8
|
+
* 外面再套一层原生 <div.page-view>:default.vue 的 <transition mode="out-in"> 硬性要求子节点是
|
|
9
|
+
* 单个根元素,而不少页面模板是「主体 + 并排若干弹窗组件」的多根 Fragment(关着时渲染成注释节点)。
|
|
10
|
+
* out-in 遇到非元素/多根会走进"non-element root node"分支瞬时卡死。统一套一层 div,交给 transition
|
|
11
|
+
* 的永远是单元素根,任何页面(单根/多根/异步加载中)都能瞬时过渡。
|
|
12
|
+
*/
|
|
13
|
+
export declare function namedPage(name: string, loader: AsyncComponentLoader): Component;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineAsyncComponent as s, defineComponent as i, h as t } from "vue";
|
|
2
|
+
const d = i({ render: () => t("div") }), r = /* @__PURE__ */ new Map();
|
|
3
|
+
function a(e, o) {
|
|
4
|
+
const n = r.get(e);
|
|
5
|
+
if ((n == null ? void 0 : n.loader) === o) return n.comp;
|
|
6
|
+
const p = s({ loader: o, loadingComponent: d, delay: 0 }), c = i({ name: e, render: () => t("div", { class: "page-view" }, t(p)) });
|
|
7
|
+
return r.set(e, { loader: o, comp: c }), c;
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
a as namedPage
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=namedPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedPage.js","sources":["../../src/router/namedPage.ts"],"sourcesContent":["import {\n defineAsyncComponent,\n defineComponent,\n h,\n type Component,\n type AsyncComponentLoader,\n} from 'vue'\n\n// 加载占位:必须是真实元素——defineAsyncComponent 默认 pending 态渲染 null(注释节点),\n// out-in Transition 遇到会判成\"非元素根节点\",连续快切页面时可能卡死整条过渡序列、之后每页永久空白。\n// delay:0 让占位立即生效,不留 pending-无占位的窗口期。\nconst LOADING = defineComponent({ render: () => h('div') })\n\n// 按路由名记忆化:改一次菜单就会重建全部动态路由(见 useAuthMenu.buildRoutesForModule),\n// 若每次都新建组件对象,已开标签页的路由记录会换上新身份 → keep-alive 缓存全部 miss、切回时重挂、状态清空。\n// 失效条件用 loader 引用:import.meta.glob 的 loader 每个文件一个稳定函数,\n// 组件路径没改 → 同一引用 → 复用(缓存保住);管理员改了组件路径 → 引用变 → 重建(正确失效)。\nconst cache = new Map<string, { loader: AsyncComponentLoader; comp: Component }>()\n\n/**\n * 包装懒加载页面,使「组件名 === 路由名」。\n * keep-alive 的 :include 按组件 name 匹配,而 <script setup> 的 __name 取自文件名\n * (众多 index.vue 会跨页冲突、且与路由名 menu-${id} 不符)。\n * inner 只建一次 → 身份稳定,keep-alive 缓存其子树;onActivated/onDeactivated 照常透传。\n *\n * 外面再套一层原生 <div.page-view>:default.vue 的 <transition mode=\"out-in\"> 硬性要求子节点是\n * 单个根元素,而不少页面模板是「主体 + 并排若干弹窗组件」的多根 Fragment(关着时渲染成注释节点)。\n * out-in 遇到非元素/多根会走进\"non-element root node\"分支瞬时卡死。统一套一层 div,交给 transition\n * 的永远是单元素根,任何页面(单根/多根/异步加载中)都能瞬时过渡。\n */\nexport function namedPage(name: string, loader: AsyncComponentLoader) {\n const hit = cache.get(name)\n if (hit?.loader === loader) return hit.comp\n\n const inner = defineAsyncComponent({ loader, loadingComponent: LOADING, delay: 0 })\n const comp = defineComponent({ name, render: () => h('div', { class: 'page-view' }, h(inner)) })\n cache.set(name, { loader, comp })\n return comp\n}\n"],"names":["LOADING","defineComponent","h","cache","namedPage","name","loader","hit","inner","defineAsyncComponent","comp"],"mappings":";AAWA,MAAMA,IAAUC,EAAgB,EAAE,QAAQ,MAAMC,EAAE,KAAK,GAAG,GAMpDC,wBAAY,IAAA;AAaX,SAASC,EAAUC,GAAcC,GAA8B;AACpE,QAAMC,IAAMJ,EAAM,IAAIE,CAAI;AAC1B,OAAIE,KAAA,gBAAAA,EAAK,YAAWD,EAAQ,QAAOC,EAAI;AAEvC,QAAMC,IAAQC,EAAqB,EAAE,QAAAH,GAAQ,kBAAkBN,GAAS,OAAO,GAAG,GAC5EU,IAAOT,EAAgB,EAAE,MAAAI,GAAM,QAAQ,MAAMH,EAAE,OAAO,EAAE,OAAO,eAAeA,EAAEM,CAAK,CAAC,GAAG;AAC/F,SAAAL,EAAM,IAAIE,GAAM,EAAE,QAAAC,GAAQ,MAAAI,GAAM,GACzBA;AACT;"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { namedPage as e } from "./namedPage.js";
|
|
2
|
+
const t = [
|
|
3
|
+
{
|
|
4
|
+
path: "/login",
|
|
5
|
+
name: "login",
|
|
6
|
+
component: () => import("../views/login/index.vue.js"),
|
|
7
|
+
meta: { public: !0 }
|
|
8
|
+
},
|
|
9
|
+
// 外部登录 / SSO 回调结果页:IdP → 后端回调 → 302 到此,凭票据换令牌或提示错误。
|
|
10
|
+
// 公开路由(登录前也要能到);不进壳,独立整屏处理。
|
|
11
|
+
{
|
|
12
|
+
path: "/oauth/callback",
|
|
13
|
+
name: "oauth-callback",
|
|
14
|
+
component: () => import("../views/oauth/callback.vue.js"),
|
|
15
|
+
meta: { public: !0 }
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
path: "/mfa/bind",
|
|
19
|
+
name: "mfa-bind",
|
|
20
|
+
component: () => import("../views/mfa/index.vue.js"),
|
|
21
|
+
meta: { public: !0 }
|
|
22
|
+
},
|
|
23
|
+
// 门户重建失败(网络/5xx/限流)的落点。必须在布局壳之外:到这里时动态路由恰恰没建起来。
|
|
24
|
+
{
|
|
25
|
+
path: "/boot-error",
|
|
26
|
+
name: "boot-error",
|
|
27
|
+
component: () => import("../views/error/BootError.vue.js")
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
path: "/module",
|
|
31
|
+
name: "module",
|
|
32
|
+
component: () => import("../views/module/index.vue.js"),
|
|
33
|
+
meta: { title: "module.choose" }
|
|
34
|
+
// i18n 键(与兄弟静态路由 menu.* 同法),不硬编码中文
|
|
35
|
+
},
|
|
36
|
+
// 站内整屏页(/fullscreen/*):脱离布局壳占满窗口,给挂墙大屏 / 看板用。消费方的整屏路由经
|
|
37
|
+
// createSmartAdmin({ routes }) 注册为顶级路由(与这里同级);菜单节点 path 填该路径、component 留空 →
|
|
38
|
+
// 点击走 window.open 新标签(见 utils/url.isFullscreenPath)。非 public:仍走登录守卫。
|
|
39
|
+
{
|
|
40
|
+
path: "/",
|
|
41
|
+
name: "layout",
|
|
42
|
+
component: () => import("../layouts/default.vue.js"),
|
|
43
|
+
// 不设 redirect:它在 resolve 阶段求值,早于全局守卫——那时动态路由还没重建、menuTree 还空,
|
|
44
|
+
// 算出的首页必然是错的。'/' 的落点改由守卫在路由就绪后决定(见 router/index.ts)。
|
|
45
|
+
children: [
|
|
46
|
+
// 工作台不在此:它是每个应用自己的一条菜单(后端播种),由 useAuthMenu 动态注册。
|
|
47
|
+
// 个人中心:二级壳(左导航)+ 子页;URL 仍为 /personal/*。通知铃铛入口独立,不进中心导航。
|
|
48
|
+
{
|
|
49
|
+
path: "/personal",
|
|
50
|
+
name: "personal",
|
|
51
|
+
component: () => import("../layouts/PersonalLayout.vue.js"),
|
|
52
|
+
redirect: "/personal/profile",
|
|
53
|
+
children: [
|
|
54
|
+
{
|
|
55
|
+
path: "profile",
|
|
56
|
+
name: "personal-profile",
|
|
57
|
+
component: e("personal-profile", () => import("../views/personal/profile.vue.js")),
|
|
58
|
+
meta: { title: "menu.profile" }
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
path: "password",
|
|
62
|
+
name: "personal-password",
|
|
63
|
+
component: e(
|
|
64
|
+
"personal-password",
|
|
65
|
+
() => import("../views/personal/password.vue.js")
|
|
66
|
+
),
|
|
67
|
+
meta: { title: "menu.password" }
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
path: "security",
|
|
71
|
+
name: "personal-security",
|
|
72
|
+
component: e(
|
|
73
|
+
"personal-security",
|
|
74
|
+
() => import("../views/personal/security.vue.js")
|
|
75
|
+
),
|
|
76
|
+
meta: { title: "menu.security" }
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
path: "sessions",
|
|
80
|
+
name: "personal-sessions",
|
|
81
|
+
component: e(
|
|
82
|
+
"personal-sessions",
|
|
83
|
+
() => import("../views/personal/sessions.vue.js")
|
|
84
|
+
),
|
|
85
|
+
meta: { title: "menu.sessions" }
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
path: "bindings",
|
|
89
|
+
name: "personal-bindings",
|
|
90
|
+
component: e(
|
|
91
|
+
"personal-bindings",
|
|
92
|
+
() => import("../views/personal/bindings.vue.js")
|
|
93
|
+
),
|
|
94
|
+
meta: { title: "menu.bindings" }
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
// 我的通知:走 [ActiveSession] 的 notice/mine,人人可读 —— 故是静态路由而非菜单
|
|
99
|
+
// (进菜单就得播种 + 给每个角色授权,那才是真正的多余功课)。入口在顶栏铃铛的「查看全部」。
|
|
100
|
+
{
|
|
101
|
+
path: "/personal/notice",
|
|
102
|
+
name: "personal-notice",
|
|
103
|
+
component: e("personal-notice", () => import("../views/personal/notice.vue.js")),
|
|
104
|
+
meta: { title: "menu.notice" }
|
|
105
|
+
},
|
|
106
|
+
// 404 挂在壳内(而非顶级):打错一个 URL 不该把人甩出侧边栏、标签栏和退出按钮之外。
|
|
107
|
+
// 未登录者到不了这里——守卫先于 public 判定就把他弹去登录页;深链刷新也不会闪 404,
|
|
108
|
+
// 守卫在导航确认前先重建动态路由再重解析(见 router/index.ts)。
|
|
109
|
+
// afterEach 按 name 'not-found' 拦了 addTab,所以它不会在标签栏留下一条。
|
|
110
|
+
{
|
|
111
|
+
path: "/:pathMatch(.*)*",
|
|
112
|
+
name: "not-found",
|
|
113
|
+
component: e("not-found", () => import("../views/error/404.vue.js"))
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
];
|
|
118
|
+
export {
|
|
119
|
+
t as staticRoutes
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sources":["../../src/router/routes.ts"],"sourcesContent":["import type { RouteRecordRaw } from 'vue-router'\nimport { namedPage } from './namedPage'\n\n// 静态路由(白名单 + 布局壳 + 固定页)。业务页由菜单树动态注册到 'layout' 下。\nexport const staticRoutes: RouteRecordRaw[] = [\n {\n path: '/login',\n name: 'login',\n component: () => import('#/views/login/index.vue'),\n meta: { public: true },\n },\n // 外部登录 / SSO 回调结果页:IdP → 后端回调 → 302 到此,凭票据换令牌或提示错误。\n // 公开路由(登录前也要能到);不进壳,独立整屏处理。\n {\n path: '/oauth/callback',\n name: 'oauth-callback',\n component: () => import('#/views/oauth/callback.vue'),\n meta: { public: true },\n },\n {\n path: '/mfa/bind',\n name: 'mfa-bind',\n component: () => import('#/views/mfa/index.vue'),\n meta: { public: true },\n },\n // 门户重建失败(网络/5xx/限流)的落点。必须在布局壳之外:到这里时动态路由恰恰没建起来。\n {\n path: '/boot-error',\n name: 'boot-error',\n component: () => import('#/views/error/BootError.vue'),\n },\n {\n path: '/module',\n name: 'module',\n component: () => import('#/views/module/index.vue'),\n meta: { title: 'module.choose' }, // i18n 键(与兄弟静态路由 menu.* 同法),不硬编码中文\n },\n // 站内整屏页(/fullscreen/*):脱离布局壳占满窗口,给挂墙大屏 / 看板用。消费方的整屏路由经\n // createSmartAdmin({ routes }) 注册为顶级路由(与这里同级);菜单节点 path 填该路径、component 留空 →\n // 点击走 window.open 新标签(见 utils/url.isFullscreenPath)。非 public:仍走登录守卫。\n {\n path: '/',\n name: 'layout',\n component: () => import('#/layouts/default.vue'),\n // 不设 redirect:它在 resolve 阶段求值,早于全局守卫——那时动态路由还没重建、menuTree 还空,\n // 算出的首页必然是错的。'/' 的落点改由守卫在路由就绪后决定(见 router/index.ts)。\n children: [\n // 工作台不在此:它是每个应用自己的一条菜单(后端播种),由 useAuthMenu 动态注册。\n // 个人中心:二级壳(左导航)+ 子页;URL 仍为 /personal/*。通知铃铛入口独立,不进中心导航。\n {\n path: '/personal',\n name: 'personal',\n component: () => import('#/layouts/PersonalLayout.vue'),\n redirect: '/personal/profile',\n children: [\n {\n path: 'profile',\n name: 'personal-profile',\n component: namedPage('personal-profile', () => import('#/views/personal/profile.vue')),\n meta: { title: 'menu.profile' },\n },\n {\n path: 'password',\n name: 'personal-password',\n component: namedPage(\n 'personal-password',\n () => import('#/views/personal/password.vue'),\n ),\n meta: { title: 'menu.password' },\n },\n {\n path: 'security',\n name: 'personal-security',\n component: namedPage(\n 'personal-security',\n () => import('#/views/personal/security.vue'),\n ),\n meta: { title: 'menu.security' },\n },\n {\n path: 'sessions',\n name: 'personal-sessions',\n component: namedPage(\n 'personal-sessions',\n () => import('#/views/personal/sessions.vue'),\n ),\n meta: { title: 'menu.sessions' },\n },\n {\n path: 'bindings',\n name: 'personal-bindings',\n component: namedPage(\n 'personal-bindings',\n () => import('#/views/personal/bindings.vue'),\n ),\n meta: { title: 'menu.bindings' },\n },\n ],\n },\n // 我的通知:走 [ActiveSession] 的 notice/mine,人人可读 —— 故是静态路由而非菜单\n // (进菜单就得播种 + 给每个角色授权,那才是真正的多余功课)。入口在顶栏铃铛的「查看全部」。\n {\n path: '/personal/notice',\n name: 'personal-notice',\n component: namedPage('personal-notice', () => import('#/views/personal/notice.vue')),\n meta: { title: 'menu.notice' },\n },\n // 404 挂在壳内(而非顶级):打错一个 URL 不该把人甩出侧边栏、标签栏和退出按钮之外。\n // 未登录者到不了这里——守卫先于 public 判定就把他弹去登录页;深链刷新也不会闪 404,\n // 守卫在导航确认前先重建动态路由再重解析(见 router/index.ts)。\n // afterEach 按 name 'not-found' 拦了 addTab,所以它不会在标签栏留下一条。\n {\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n component: namedPage('not-found', () => import('#/views/error/404.vue')),\n },\n ],\n },\n]\n"],"names":["staticRoutes","namedPage"],"mappings":";AAIO,MAAMA,IAAiC;AAAA,EAC5C;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,MAAM,OAAO,6BAAyB;AAAA,IACjD,MAAM,EAAE,QAAQ,GAAA;AAAA,EAAK;AAAA;AAAA;AAAA,EAIvB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,MAAM,OAAO,gCAA4B;AAAA,IACpD,MAAM,EAAE,QAAQ,GAAA;AAAA,EAAK;AAAA,EAEvB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,MAAM,OAAO,2BAAuB;AAAA,IAC/C,MAAM,EAAE,QAAQ,GAAA;AAAA,EAAK;AAAA;AAAA,EAGvB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,MAAM,OAAO,iCAA6B;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,MAAM,OAAO,8BAA0B;AAAA,IAClD,MAAM,EAAE,OAAO,gBAAA;AAAA;AAAA,EAAgB;AAAA;AAAA;AAAA;AAAA,EAKjC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,MAAM,OAAO,2BAAuB;AAAA;AAAA;AAAA,IAG/C,UAAU;AAAA;AAAA;AAAA,MAGR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,MAAM,OAAO,kCAA8B;AAAA,QACtD,UAAU;AAAA,QACV,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAWC,EAAU,oBAAoB,MAAM,OAAO,kCAA8B,CAAC;AAAA,YACrF,MAAM,EAAE,OAAO,eAAA;AAAA,UAAe;AAAA,UAEhC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAWA;AAAA,cACT;AAAA,cACA,MAAM,OAAO,mCAA+B;AAAA,YAAA;AAAA,YAE9C,MAAM,EAAE,OAAO,gBAAA;AAAA,UAAgB;AAAA,UAEjC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAWA;AAAA,cACT;AAAA,cACA,MAAM,OAAO,mCAA+B;AAAA,YAAA;AAAA,YAE9C,MAAM,EAAE,OAAO,gBAAA;AAAA,UAAgB;AAAA,UAEjC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAWA;AAAA,cACT;AAAA,cACA,MAAM,OAAO,mCAA+B;AAAA,YAAA;AAAA,YAE9C,MAAM,EAAE,OAAO,gBAAA;AAAA,UAAgB;AAAA,UAEjC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAWA;AAAA,cACT;AAAA,cACA,MAAM,OAAO,mCAA+B;AAAA,YAAA;AAAA,YAE9C,MAAM,EAAE,OAAO,gBAAA;AAAA,UAAgB;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA,MAIF;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAWA,EAAU,mBAAmB,MAAM,OAAO,iCAA6B,CAAC;AAAA,QACnF,MAAM,EAAE,OAAO,cAAA;AAAA,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA,MAM/B;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAWA,EAAU,aAAa,MAAM,OAAO,2BAAuB,CAAC;AAAA,MAAA;AAAA,IACzE;AAAA,EACF;AAEJ;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
/** 页面懒加载器:import.meta.glob 的每个值就是一个。 */
|
|
3
|
+
export type ViewLoader = () => Promise<Component | {
|
|
4
|
+
default: Component;
|
|
5
|
+
}>;
|
|
6
|
+
/** glob 键 → 页面 key:取最后一个 `/views/` 之后、去掉 .vue(`./views/system/user/index.vue` → `system/user/index`)。 */
|
|
7
|
+
export declare function normalizeViewKey(path: string): string;
|
|
8
|
+
/** 并入一批页面(键可以是 glob 原始路径,也可以是已规范化的 key)。 */
|
|
9
|
+
export declare function registerViews(map: Record<string, ViewLoader>): void;
|
|
10
|
+
export declare function getView(key: string): ViewLoader | undefined;
|
|
11
|
+
export declare function hasView(key: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* 菜单 component 字段的全部合法取值,供菜单管理表单的「组件路径」下拉:
|
|
14
|
+
* 手敲错一个字符时 buildRoutesForModule 会保留路径并落到 MissingRoute 诊断页;下拉仍是第一道防线。
|
|
15
|
+
*/
|
|
16
|
+
export declare function viewComponentPaths(): string[];
|
|
17
|
+
/** 约定式详情页:key 以 `/detail` 结尾的页面(views/<模块>/detail.vue)。 */
|
|
18
|
+
export declare function detailViews(): Array<[key: string, loader: ViewLoader]>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const s = {};
|
|
2
|
+
function t(e) {
|
|
3
|
+
const i = e.lastIndexOf("/views/");
|
|
4
|
+
return (i >= 0 ? e.slice(i + 7) : e.replace(/^\.?\/+/, "")).replace(/\.vue$/, "");
|
|
5
|
+
}
|
|
6
|
+
function n(e) {
|
|
7
|
+
for (const [i, o] of Object.entries(e)) s[t(i)] = o;
|
|
8
|
+
}
|
|
9
|
+
function r(e) {
|
|
10
|
+
return s[e];
|
|
11
|
+
}
|
|
12
|
+
function m() {
|
|
13
|
+
return Object.keys(s).toSorted();
|
|
14
|
+
}
|
|
15
|
+
function v() {
|
|
16
|
+
return Object.entries(s).filter(([e]) => e.endsWith("/detail"));
|
|
17
|
+
}
|
|
18
|
+
n(/* @__PURE__ */ Object.assign({ "../views/dashboard/biz.vue": () => import("../views/dashboard/biz.vue.js"), "../views/dashboard/workbench.vue": () => import("../views/dashboard/workbench.vue.js"), "../views/embed/iframe.vue": () => import("../views/embed/iframe.vue.js"), "../views/error/404.vue": () => import("../views/error/404.vue.js"), "../views/error/BootError.vue": () => import("../views/error/BootError.vue.js"), "../views/error/MissingRoute.vue": () => import("../views/error/MissingRoute.vue.js"), "../views/login/LoginForm.vue": () => import("../views/login/LoginForm.vue.js"), "../views/login/index.vue": () => import("../views/login/index.vue.js"), "../views/login/skins/AuroraGlass.vue": () => import("../views/login/skins/AuroraGlass.vue.js"), "../views/login/skins/SplitPanel.vue": () => import("../views/login/skins/SplitPanel.vue.js"), "../views/login/skins/Spotlight.vue": () => import("../views/login/skins/Spotlight.vue.js"), "../views/mfa/index.vue": () => import("../views/mfa/index.vue.js"), "../views/module/index.vue": () => import("../views/module/index.vue.js"), "../views/oauth/callback.vue": () => import("../views/oauth/callback.vue.js"), "../views/personal/bindings.vue": () => import("../views/personal/bindings.vue.js"), "../views/personal/notice.vue": () => import("../views/personal/notice.vue.js"), "../views/personal/password.vue": () => import("../views/personal/password.vue.js"), "../views/personal/profile.vue": () => import("../views/personal/profile.vue.js"), "../views/personal/security.vue": () => import("../views/personal/security.vue.js"), "../views/personal/sessions.vue": () => import("../views/personal/sessions.vue.js"), "../views/system/cache/index.vue": () => import("../views/system/cache/index.vue.js"), "../views/system/config/components/ConfigFormModal.vue": () => import("../views/system/config/components/ConfigFormModal.vue.js"), "../views/system/config/components/ExternalAuthConfig.vue": () => import("../views/system/config/components/ExternalAuthConfig.vue.js"), "../views/system/config/components/GroupExtraConfig.vue": () => import("../views/system/config/components/GroupExtraConfig.vue.js"), "../views/system/config/components/HighSensConfig.vue": () => import("../views/system/config/components/HighSensConfig.vue.js"), "../views/system/config/components/JobConfig.vue": () => import("../views/system/config/components/JobConfig.vue.js"), "../views/system/config/components/OtherConfig.vue": () => import("../views/system/config/components/OtherConfig.vue.js"), "../views/system/config/components/SecurityConfig.vue": () => import("../views/system/config/components/SecurityConfig.vue.js"), "../views/system/config/components/SysBaseConfig.vue": () => import("../views/system/config/components/SysBaseConfig.vue.js"), "../views/system/config/components/UploadConfig.vue": () => import("../views/system/config/components/UploadConfig.vue.js"), "../views/system/config/index.vue": () => import("../views/system/config/index.vue.js"), "../views/system/dict/index.vue": () => import("../views/system/dict/index.vue.js"), "../views/system/file/index.vue": () => import("../views/system/file/index.vue.js"), "../views/system/job-log/index.vue": () => import("../views/system/job-log/index.vue.js"), "../views/system/job-monitor/index.vue": () => import("../views/system/job-monitor/index.vue.js"), "../views/system/job/index.vue": () => import("../views/system/job/index.vue.js"), "../views/system/log/exception/index.vue": () => import("../views/system/log/exception/index.vue.js"), "../views/system/log/login/index.vue": () => import("../views/system/log/login/index.vue.js"), "../views/system/log/op/index.vue": () => import("../views/system/log/op/index.vue.js"), "../views/system/menu/components/ButtonManager.vue": () => import("../views/system/menu/components/ButtonManager.vue.js"), "../views/system/menu/components/MenuFormModal.vue": () => import("../views/system/menu/components/MenuFormModal.vue.js"), "../views/system/menu/index.vue": () => import("../views/system/menu/index.vue.js"), "../views/system/module/index.vue": () => import("../views/system/module/index.vue.js"), "../views/system/monitor/index.vue": () => import("../views/system/monitor/index.vue.js"), "../views/system/notice/index.vue": () => import("../views/system/notice/index.vue.js"), "../views/system/org/index.vue": () => import("../views/system/org/index.vue.js"), "../views/system/position/index.vue": () => import("../views/system/position/index.vue.js"), "../views/system/recycle/index.vue": () => import("../views/system/recycle/index.vue.js"), "../views/system/role/components/GrantMenuTable.vue": () => import("../views/system/role/components/GrantMenuTable.vue.js"), "../views/system/role/index.vue": () => import("../views/system/role/index.vue.js"), "../views/system/session/index.vue": () => import("../views/system/session/index.vue.js"), "../views/system/user/components/ResetPasswordModal.vue": () => import("../views/system/user/components/ResetPasswordModal.vue.js"), "../views/system/user/components/UserFormModal.vue": () => import("../views/system/user/components/UserFormModal.vue.js"), "../views/system/user/index.vue": () => import("../views/system/user/index.vue.js") }));
|
|
19
|
+
export {
|
|
20
|
+
v as detailViews,
|
|
21
|
+
r as getView,
|
|
22
|
+
t as normalizeViewKey,
|
|
23
|
+
n as registerViews,
|
|
24
|
+
m as viewComponentPaths
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=viewRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewRegistry.js","sources":["../../src/router/viewRegistry.ts"],"sourcesContent":["import type { Component } from 'vue'\n\n/** 页面懒加载器:import.meta.glob 的每个值就是一个。 */\nexport type ViewLoader = () => Promise<Component | { default: Component }>\n\n// 页面表:key 即菜单 component 字段的取值(如 system/user/index)。内核内置页在本模块加载时登记,\n// 消费方与插件经 registerViews 并入;同名覆盖,谁后注册谁生效(createSmartAdmin 里插件在前、应用最后)。\n// 每个 loader 引用稳定(glob 每文件一个函数),namedPage 靠它判断 keep-alive 缓存要不要失效。\nconst views: Record<string, ViewLoader> = {}\n\n/** glob 键 → 页面 key:取最后一个 `/views/` 之后、去掉 .vue(`./views/system/user/index.vue` → `system/user/index`)。 */\nexport function normalizeViewKey(path: string): string {\n const i = path.lastIndexOf('/views/')\n const rel = i >= 0 ? path.slice(i + '/views/'.length) : path.replace(/^\\.?\\/+/, '')\n return rel.replace(/\\.vue$/, '')\n}\n\n/** 并入一批页面(键可以是 glob 原始路径,也可以是已规范化的 key)。 */\nexport function registerViews(map: Record<string, ViewLoader>): void {\n for (const [key, loader] of Object.entries(map)) views[normalizeViewKey(key)] = loader\n}\n\nexport function getView(key: string): ViewLoader | undefined {\n return views[key]\n}\n\nexport function hasView(key: string): boolean {\n return key in views\n}\n\n/**\n * 菜单 component 字段的全部合法取值,供菜单管理表单的「组件路径」下拉:\n * 手敲错一个字符时 buildRoutesForModule 会保留路径并落到 MissingRoute 诊断页;下拉仍是第一道防线。\n */\nexport function viewComponentPaths(): string[] {\n return Object.keys(views).toSorted()\n}\n\n/** 约定式详情页:key 以 `/detail` 结尾的页面(views/<模块>/detail.vue)。 */\nexport function detailViews(): Array<[key: string, loader: ViewLoader]> {\n return Object.entries(views).filter(([k]) => k.endsWith('/detail'))\n}\n\n// 内核内置页\nregisterViews(import.meta.glob('../views/**/*.vue') as Record<string, ViewLoader>)\n"],"names":["views","normalizeViewKey","path","registerViews","map","key","loader","getView","viewComponentPaths","detailViews","k"],"mappings":"AAQA,MAAMA,IAAoC,CAAA;AAGnC,SAASC,EAAiBC,GAAsB;AACrD,QAAM,IAAIA,EAAK,YAAY,SAAS;AAEpC,UADY,KAAK,IAAIA,EAAK,MAAM,IAAI,CAAgB,IAAIA,EAAK,QAAQ,WAAW,EAAE,GACvE,QAAQ,UAAU,EAAE;AACjC;AAGO,SAASC,EAAcC,GAAuC;AACnE,aAAW,CAACC,GAAKC,CAAM,KAAK,OAAO,QAAQF,CAAG,EAAG,CAAAJ,EAAMC,EAAiBI,CAAG,CAAC,IAAIC;AAClF;AAEO,SAASC,EAAQF,GAAqC;AAC3D,SAAOL,EAAMK,CAAG;AAClB;AAUO,SAASG,IAA+B;AAC7C,SAAO,OAAO,KAAKR,CAAK,EAAE,SAAA;AAC5B;AAGO,SAASS,IAAwD;AACtE,SAAO,OAAO,QAAQT,CAAK,EAAE,OAAO,CAAC,CAACU,CAAC,MAAMA,EAAE,SAAS,SAAS,CAAC;AACpE;AAGAP,+nKAAiF;"}
|