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,83 @@
|
|
|
1
|
+
export type Density = 'comfortable' | 'compact';
|
|
2
|
+
export type FormStyle = 'modal' | 'drawer';
|
|
3
|
+
export type Locale = 'zh-CN' | 'en-US';
|
|
4
|
+
export type ThemeScheme = 'light' | 'dark' | 'auto';
|
|
5
|
+
export type PageTransition = 'fade' | 'fade-slide' | 'none';
|
|
6
|
+
export type LayoutMode = 'vertical' | 'vertical-mix' | 'vertical-hybrid-header-first' | 'horizontal' | 'top-hybrid-sidebar-first' | 'top-hybrid-header-first';
|
|
7
|
+
/** 布局模式全集(单一来源:抽屉卡片、布局 shell、持久化值校验共用)。 */
|
|
8
|
+
export declare const LAYOUT_MODES: LayoutMode[];
|
|
9
|
+
/** 可被"恢复默认"重置的外观项(不含 locale / collapsed,那两项按会话保留)。 */
|
|
10
|
+
declare const DEFAULTS: {
|
|
11
|
+
themeScheme: ThemeScheme;
|
|
12
|
+
accent: string;
|
|
13
|
+
density: Density;
|
|
14
|
+
layoutMode: LayoutMode;
|
|
15
|
+
showBreadcrumb: boolean;
|
|
16
|
+
showTabs: boolean;
|
|
17
|
+
fixedHeader: boolean;
|
|
18
|
+
pageTransition: PageTransition;
|
|
19
|
+
grayscale: boolean;
|
|
20
|
+
watermark: boolean;
|
|
21
|
+
watermarkText: string;
|
|
22
|
+
formStyle: FormStyle;
|
|
23
|
+
};
|
|
24
|
+
/** UI 偏好:主题模式 / 主色 / 密度 / 布局 / 界面开关 / 折叠 / 语言。持久化(localStorage key "app")。 */
|
|
25
|
+
export declare const useAppStore: import('pinia').StoreDefinition<"app", {
|
|
26
|
+
collapsed: boolean;
|
|
27
|
+
locale: Locale;
|
|
28
|
+
themeScheme: ThemeScheme;
|
|
29
|
+
accent: string;
|
|
30
|
+
density: Density;
|
|
31
|
+
layoutMode: LayoutMode;
|
|
32
|
+
showBreadcrumb: boolean;
|
|
33
|
+
showTabs: boolean;
|
|
34
|
+
fixedHeader: boolean;
|
|
35
|
+
pageTransition: PageTransition;
|
|
36
|
+
grayscale: boolean;
|
|
37
|
+
watermark: boolean;
|
|
38
|
+
watermarkText: string;
|
|
39
|
+
formStyle: FormStyle;
|
|
40
|
+
}, {
|
|
41
|
+
isDark(state: {
|
|
42
|
+
collapsed: boolean;
|
|
43
|
+
locale: Locale;
|
|
44
|
+
themeScheme: ThemeScheme;
|
|
45
|
+
accent: string;
|
|
46
|
+
density: Density;
|
|
47
|
+
layoutMode: LayoutMode;
|
|
48
|
+
showBreadcrumb: boolean;
|
|
49
|
+
showTabs: boolean;
|
|
50
|
+
fixedHeader: boolean;
|
|
51
|
+
pageTransition: PageTransition;
|
|
52
|
+
grayscale: boolean;
|
|
53
|
+
watermark: boolean;
|
|
54
|
+
watermarkText: string;
|
|
55
|
+
formStyle: FormStyle;
|
|
56
|
+
} & import('pinia').PiniaCustomStateProperties<{
|
|
57
|
+
collapsed: boolean;
|
|
58
|
+
locale: Locale;
|
|
59
|
+
themeScheme: ThemeScheme;
|
|
60
|
+
accent: string;
|
|
61
|
+
density: Density;
|
|
62
|
+
layoutMode: LayoutMode;
|
|
63
|
+
showBreadcrumb: boolean;
|
|
64
|
+
showTabs: boolean;
|
|
65
|
+
fixedHeader: boolean;
|
|
66
|
+
pageTransition: PageTransition;
|
|
67
|
+
grayscale: boolean;
|
|
68
|
+
watermark: boolean;
|
|
69
|
+
watermarkText: string;
|
|
70
|
+
formStyle: FormStyle;
|
|
71
|
+
}>): boolean;
|
|
72
|
+
}, {
|
|
73
|
+
setThemeScheme(s: ThemeScheme): void;
|
|
74
|
+
toggleDark(): void;
|
|
75
|
+
setAccent(hex: string): void;
|
|
76
|
+
setDensity(d: Density): void;
|
|
77
|
+
setLocale(l: Locale): void;
|
|
78
|
+
toggleCollapsed(): void;
|
|
79
|
+
setLayoutMode(m: LayoutMode): void;
|
|
80
|
+
resetSettings(): void;
|
|
81
|
+
exportSettings(): Record<keyof typeof DEFAULTS, unknown>;
|
|
82
|
+
}>;
|
|
83
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { defineStore as s } from "pinia";
|
|
2
|
+
import { usePreferredDark as i } from "@vueuse/core";
|
|
3
|
+
import { ACCENTS as a } from "../theme/accents.js";
|
|
4
|
+
const o = i(), c = [
|
|
5
|
+
"vertical",
|
|
6
|
+
"vertical-mix",
|
|
7
|
+
"vertical-hybrid-header-first",
|
|
8
|
+
"horizontal",
|
|
9
|
+
"top-hybrid-sidebar-first",
|
|
10
|
+
"top-hybrid-header-first"
|
|
11
|
+
], t = {
|
|
12
|
+
themeScheme: "auto",
|
|
13
|
+
accent: a[0],
|
|
14
|
+
density: "compact",
|
|
15
|
+
// 系统设置密度默认使用紧凑档,提升后台列表与表单的信息密度。
|
|
16
|
+
layoutMode: "vertical",
|
|
17
|
+
showBreadcrumb: !0,
|
|
18
|
+
showTabs: !0,
|
|
19
|
+
fixedHeader: !0,
|
|
20
|
+
pageTransition: "fade",
|
|
21
|
+
grayscale: !1,
|
|
22
|
+
watermark: !1,
|
|
23
|
+
watermarkText: "",
|
|
24
|
+
// FormContainer 的全局形态偏好(弹窗/抽屉);组件可 per-instance 覆盖。
|
|
25
|
+
formStyle: "modal"
|
|
26
|
+
}, m = s("app", {
|
|
27
|
+
state: () => ({
|
|
28
|
+
...t,
|
|
29
|
+
collapsed: !1,
|
|
30
|
+
locale: "zh-CN"
|
|
31
|
+
}),
|
|
32
|
+
getters: {
|
|
33
|
+
// auto 时按系统深浅色实时解析(prefersDark 是响应式 ref,getter 是 computed → 随之更新)。
|
|
34
|
+
isDark(e) {
|
|
35
|
+
return e.themeScheme === "auto" ? o.value : e.themeScheme === "dark";
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
actions: {
|
|
39
|
+
setThemeScheme(e) {
|
|
40
|
+
this.themeScheme = e;
|
|
41
|
+
},
|
|
42
|
+
// 顶栏快捷切换:在当前生效的深浅色基础上翻到明确的一侧。
|
|
43
|
+
toggleDark() {
|
|
44
|
+
this.themeScheme = this.isDark ? "light" : "dark";
|
|
45
|
+
},
|
|
46
|
+
setAccent(e) {
|
|
47
|
+
this.accent = e;
|
|
48
|
+
},
|
|
49
|
+
setDensity(e) {
|
|
50
|
+
this.density = e;
|
|
51
|
+
},
|
|
52
|
+
setLocale(e) {
|
|
53
|
+
this.locale = e;
|
|
54
|
+
},
|
|
55
|
+
toggleCollapsed() {
|
|
56
|
+
this.collapsed = !this.collapsed;
|
|
57
|
+
},
|
|
58
|
+
setLayoutMode(e) {
|
|
59
|
+
this.layoutMode = e;
|
|
60
|
+
},
|
|
61
|
+
// 抽屉"恢复默认":还原外观项,保留 locale / collapsed。其余布尔项由抽屉 v-model 直接改。
|
|
62
|
+
resetSettings() {
|
|
63
|
+
Object.assign(this, t);
|
|
64
|
+
},
|
|
65
|
+
// 导出当前外观配置(DEFAULTS 同名键的现值);抽屉「复制配置」用,粘回 app.ts DEFAULTS 即为新默认。
|
|
66
|
+
exportSettings() {
|
|
67
|
+
const e = Object.keys(t);
|
|
68
|
+
return Object.fromEntries(e.map((r) => [r, this[r]]));
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
persist: {
|
|
72
|
+
// localStorage 里的值不受代码约束:布局模式不在 LAYOUT_MODES、主色不在 ACCENTS 的,回落默认。
|
|
73
|
+
afterHydrate: ({ store: e }) => {
|
|
74
|
+
c.includes(e.layoutMode) || (e.layoutMode = "vertical"), a.includes(e.accent) || (e.accent = a[0]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
export {
|
|
79
|
+
c as LAYOUT_MODES,
|
|
80
|
+
m as useAppStore
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sources":["../../src/stores/app.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport { usePreferredDark } from '@vueuse/core'\nimport { ACCENTS } from '#/theme/accents'\n\n// 模块级:建一次 matchMedia 监听;isDark getter 内响应式读取 → auto 下随系统实时翻。\nconst prefersDark = usePreferredDark()\n\nexport type Density = 'comfortable' | 'compact'\nexport type FormStyle = 'modal' | 'drawer'\nexport type Locale = 'zh-CN' | 'en-US'\nexport type ThemeScheme = 'light' | 'dark' | 'auto'\nexport type PageTransition = 'fade' | 'fade-slide' | 'none'\nexport type LayoutMode =\n | 'vertical'\n | 'vertical-mix'\n | 'vertical-hybrid-header-first'\n | 'horizontal'\n | 'top-hybrid-sidebar-first'\n | 'top-hybrid-header-first'\n\n/** 布局模式全集(单一来源:抽屉卡片、布局 shell、持久化值校验共用)。 */\nexport const LAYOUT_MODES: LayoutMode[] = [\n 'vertical',\n 'vertical-mix',\n 'vertical-hybrid-header-first',\n 'horizontal',\n 'top-hybrid-sidebar-first',\n 'top-hybrid-header-first',\n]\n\n/** 可被\"恢复默认\"重置的外观项(不含 locale / collapsed,那两项按会话保留)。 */\nconst DEFAULTS = {\n themeScheme: 'auto' as ThemeScheme,\n accent: ACCENTS[0] as string,\n density: 'compact' as Density, // 系统设置密度默认使用紧凑档,提升后台列表与表单的信息密度。\n layoutMode: 'vertical' as LayoutMode,\n showBreadcrumb: true,\n showTabs: true,\n fixedHeader: true,\n pageTransition: 'fade' as PageTransition,\n grayscale: false,\n watermark: false,\n watermarkText: '',\n // FormContainer 的全局形态偏好(弹窗/抽屉);组件可 per-instance 覆盖。\n formStyle: 'modal' as FormStyle,\n}\n\n/** UI 偏好:主题模式 / 主色 / 密度 / 布局 / 界面开关 / 折叠 / 语言。持久化(localStorage key \"app\")。 */\nexport const useAppStore = defineStore('app', {\n state: () => ({\n ...DEFAULTS,\n collapsed: false,\n locale: 'zh-CN' as Locale,\n }),\n getters: {\n // auto 时按系统深浅色实时解析(prefersDark 是响应式 ref,getter 是 computed → 随之更新)。\n isDark(state): boolean {\n return state.themeScheme === 'auto' ? prefersDark.value : state.themeScheme === 'dark'\n },\n },\n actions: {\n setThemeScheme(s: ThemeScheme) {\n this.themeScheme = s\n },\n // 顶栏快捷切换:在当前生效的深浅色基础上翻到明确的一侧。\n toggleDark() {\n this.themeScheme = this.isDark ? 'light' : 'dark'\n },\n setAccent(hex: string) {\n this.accent = hex\n },\n setDensity(d: Density) {\n this.density = d\n },\n setLocale(l: Locale) {\n this.locale = l\n },\n toggleCollapsed() {\n this.collapsed = !this.collapsed\n },\n setLayoutMode(m: LayoutMode) {\n this.layoutMode = m\n },\n // 抽屉\"恢复默认\":还原外观项,保留 locale / collapsed。其余布尔项由抽屉 v-model 直接改。\n resetSettings() {\n Object.assign(this, DEFAULTS)\n },\n // 导出当前外观配置(DEFAULTS 同名键的现值);抽屉「复制配置」用,粘回 app.ts DEFAULTS 即为新默认。\n exportSettings(): Record<keyof typeof DEFAULTS, unknown> {\n const keys = Object.keys(DEFAULTS) as (keyof typeof DEFAULTS)[]\n return Object.fromEntries(keys.map(k => [k, this[k]])) as Record<\n keyof typeof DEFAULTS,\n unknown\n >\n },\n },\n persist: {\n // localStorage 里的值不受代码约束:布局模式不在 LAYOUT_MODES、主色不在 ACCENTS 的,回落默认。\n afterHydrate: ({ store }) => {\n if (!LAYOUT_MODES.includes(store.layoutMode)) store.layoutMode = 'vertical'\n if (!(ACCENTS as readonly string[]).includes(store.accent)) store.accent = ACCENTS[0]\n },\n },\n})\n"],"names":["prefersDark","usePreferredDark","LAYOUT_MODES","DEFAULTS","ACCENTS","useAppStore","defineStore","state","s","hex","d","l","m","keys","k","store"],"mappings":";;;AAKA,MAAMA,IAAcC,EAAA,GAgBPC,IAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGMC,IAAW;AAAA,EACf,aAAa;AAAA,EACb,QAAQC,EAAQ,CAAC;AAAA,EACjB,SAAS;AAAA;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA;AAAA,EAEf,WAAW;AACb,GAGaC,IAAcC,EAAY,OAAO;AAAA,EAC5C,OAAO,OAAO;AAAA,IACZ,GAAGH;AAAA,IACH,WAAW;AAAA,IACX,QAAQ;AAAA,EAAA;AAAA,EAEV,SAAS;AAAA;AAAA,IAEP,OAAOI,GAAgB;AACrB,aAAOA,EAAM,gBAAgB,SAASP,EAAY,QAAQO,EAAM,gBAAgB;AAAA,IAClF;AAAA,EAAA;AAAA,EAEF,SAAS;AAAA,IACP,eAAeC,GAAgB;AAC7B,WAAK,cAAcA;AAAA,IACrB;AAAA;AAAA,IAEA,aAAa;AACX,WAAK,cAAc,KAAK,SAAS,UAAU;AAAA,IAC7C;AAAA,IACA,UAAUC,GAAa;AACrB,WAAK,SAASA;AAAA,IAChB;AAAA,IACA,WAAWC,GAAY;AACrB,WAAK,UAAUA;AAAA,IACjB;AAAA,IACA,UAAUC,GAAW;AACnB,WAAK,SAASA;AAAA,IAChB;AAAA,IACA,kBAAkB;AAChB,WAAK,YAAY,CAAC,KAAK;AAAA,IACzB;AAAA,IACA,cAAcC,GAAe;AAC3B,WAAK,aAAaA;AAAA,IACpB;AAAA;AAAA,IAEA,gBAAgB;AACd,aAAO,OAAO,MAAMT,CAAQ;AAAA,IAC9B;AAAA;AAAA,IAEA,iBAAyD;AACvD,YAAMU,IAAO,OAAO,KAAKV,CAAQ;AACjC,aAAO,OAAO,YAAYU,EAAK,IAAI,CAAAC,MAAK,CAACA,GAAG,KAAKA,CAAC,CAAC,CAAC,CAAC;AAAA,IAIvD;AAAA,EAAA;AAAA,EAEF,SAAS;AAAA;AAAA,IAEP,cAAc,CAAC,EAAE,OAAAC,QAAY;AAC3B,MAAKb,EAAa,SAASa,EAAM,UAAU,QAAS,aAAa,aAC3DX,EAA8B,SAASW,EAAM,MAAM,MAAGA,EAAM,SAASX,EAAQ,CAAC;AAAA,IACtF;AAAA,EAAA;AAEJ,CAAC;"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AppModule, MenuNode } from '../types/menu';
|
|
2
|
+
/**
|
|
3
|
+
* 授权态:模块 / 菜单树 / 权限码 / 路由是否已建。
|
|
4
|
+
* **只持久化 currentModuleId 一项**——F5/深链时守卫据它重建"上次所在应用"的动态路由,
|
|
5
|
+
* 跨应用深链(默认应用 ≠ 当前应用)才不会落 404。
|
|
6
|
+
* menuTree/modules/routesReady 一律不持久化:动态路由只活在 router 内存里,刷新后由守卫重建;
|
|
7
|
+
* 尤其 routesReady 若被持久化成 true,F5 会跳过重建导致每条动态路由 404。
|
|
8
|
+
*/
|
|
9
|
+
export declare const useAuthStore: import('pinia').StoreDefinition<"auth", {
|
|
10
|
+
modules: AppModule[];
|
|
11
|
+
currentModuleId: number | null;
|
|
12
|
+
defaultModuleId: number | null;
|
|
13
|
+
menuTree: MenuNode[];
|
|
14
|
+
permissionCodes: string[];
|
|
15
|
+
permissionsLoaded: boolean;
|
|
16
|
+
isSuperAdmin: boolean;
|
|
17
|
+
routesReady: boolean;
|
|
18
|
+
}, {
|
|
19
|
+
/**
|
|
20
|
+
* 当前应用的首页:模块自己的 DefaultRoute → 菜单树第一个叶子 → 应用选择器兜底。
|
|
21
|
+
* 每个应用一个首页,所以 '/' 的落点不能写死(由守卫在路由就绪后取用,见 router/index.ts)。
|
|
22
|
+
* 兜底是 /module 而非某个固定页:一个菜单都没配的应用没有首页可言,把人送回选择器,
|
|
23
|
+
* 好过让他撞上一个"不属于本应用"的路径吃 404。
|
|
24
|
+
*/
|
|
25
|
+
homePath(state: {
|
|
26
|
+
modules: {
|
|
27
|
+
id: number;
|
|
28
|
+
code: string;
|
|
29
|
+
title: string;
|
|
30
|
+
icon?: string | undefined;
|
|
31
|
+
defaultRoute?: string | undefined;
|
|
32
|
+
sort: number;
|
|
33
|
+
}[];
|
|
34
|
+
currentModuleId: number | null;
|
|
35
|
+
defaultModuleId: number | null;
|
|
36
|
+
menuTree: {
|
|
37
|
+
id: number;
|
|
38
|
+
parentId: number;
|
|
39
|
+
type: import('../types/menu').MenuType;
|
|
40
|
+
title: string;
|
|
41
|
+
path?: string | undefined;
|
|
42
|
+
component?: string | undefined;
|
|
43
|
+
icon?: string | undefined;
|
|
44
|
+
sort: number;
|
|
45
|
+
visible: boolean;
|
|
46
|
+
children: /*elided*/ any[];
|
|
47
|
+
}[];
|
|
48
|
+
permissionCodes: string[];
|
|
49
|
+
permissionsLoaded: boolean;
|
|
50
|
+
isSuperAdmin: boolean;
|
|
51
|
+
routesReady: boolean;
|
|
52
|
+
} & import('pinia').PiniaCustomStateProperties<{
|
|
53
|
+
modules: AppModule[];
|
|
54
|
+
currentModuleId: number | null;
|
|
55
|
+
defaultModuleId: number | null;
|
|
56
|
+
menuTree: MenuNode[];
|
|
57
|
+
permissionCodes: string[];
|
|
58
|
+
permissionsLoaded: boolean;
|
|
59
|
+
isSuperAdmin: boolean;
|
|
60
|
+
routesReady: boolean;
|
|
61
|
+
}>): string;
|
|
62
|
+
/**
|
|
63
|
+
* 按钮级权限判定(v-auth 指令与 render 函数内按钮共用同一套规则)。
|
|
64
|
+
* 超管 → 全放行;取码失败/未加载 → fail-closed(不谎报"有");否则精确命中权限码(= 规范化路由)。
|
|
65
|
+
* render 函数里 v-auth 指令用不了,按钮需调本 getter 做条件渲染,故显隐规则必须收敛到这一处。
|
|
66
|
+
*/
|
|
67
|
+
hasPerm(state: {
|
|
68
|
+
modules: {
|
|
69
|
+
id: number;
|
|
70
|
+
code: string;
|
|
71
|
+
title: string;
|
|
72
|
+
icon?: string | undefined;
|
|
73
|
+
defaultRoute?: string | undefined;
|
|
74
|
+
sort: number;
|
|
75
|
+
}[];
|
|
76
|
+
currentModuleId: number | null;
|
|
77
|
+
defaultModuleId: number | null;
|
|
78
|
+
menuTree: {
|
|
79
|
+
id: number;
|
|
80
|
+
parentId: number;
|
|
81
|
+
type: import('../types/menu').MenuType;
|
|
82
|
+
title: string;
|
|
83
|
+
path?: string | undefined;
|
|
84
|
+
component?: string | undefined;
|
|
85
|
+
icon?: string | undefined;
|
|
86
|
+
sort: number;
|
|
87
|
+
visible: boolean;
|
|
88
|
+
children: /*elided*/ any[];
|
|
89
|
+
}[];
|
|
90
|
+
permissionCodes: string[];
|
|
91
|
+
permissionsLoaded: boolean;
|
|
92
|
+
isSuperAdmin: boolean;
|
|
93
|
+
routesReady: boolean;
|
|
94
|
+
} & import('pinia').PiniaCustomStateProperties<{
|
|
95
|
+
modules: AppModule[];
|
|
96
|
+
currentModuleId: number | null;
|
|
97
|
+
defaultModuleId: number | null;
|
|
98
|
+
menuTree: MenuNode[];
|
|
99
|
+
permissionCodes: string[];
|
|
100
|
+
permissionsLoaded: boolean;
|
|
101
|
+
isSuperAdmin: boolean;
|
|
102
|
+
routesReady: boolean;
|
|
103
|
+
}>): (code: string) => boolean;
|
|
104
|
+
}, {
|
|
105
|
+
reset(): void;
|
|
106
|
+
}>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { defineStore as t } from "pinia";
|
|
2
|
+
import { useTabsStore as u } from "./tabs.js";
|
|
3
|
+
function d(e) {
|
|
4
|
+
var s, i;
|
|
5
|
+
for (const r of e) {
|
|
6
|
+
if (r.path && !((s = r.children) != null && s.length)) return r.path;
|
|
7
|
+
const o = (i = r.children) != null && i.length ? d(r.children) : void 0;
|
|
8
|
+
if (o) return o;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const a = t("auth", {
|
|
12
|
+
state: () => ({
|
|
13
|
+
modules: [],
|
|
14
|
+
currentModuleId: null,
|
|
15
|
+
// 用户的默认应用(后端 SysUser.DefaultModuleId),随 enterInitial 拉取;不持久化,仅供选择页标记。
|
|
16
|
+
defaultModuleId: null,
|
|
17
|
+
menuTree: [],
|
|
18
|
+
// 登录进门户时由 useModule.enterInitial 填入(GET /personal/permissions);超管为空集 → v-auth fail-open,服务端 sadm 兜底。
|
|
19
|
+
permissionCodes: [],
|
|
20
|
+
// 权限码是否已成功拉取。区分"取码失败/未加载"(fail-closed 藏按钮)与"已加载"(按码匹配)。
|
|
21
|
+
// 不持久化——F5 后由守卫重新拉取。
|
|
22
|
+
permissionsLoaded: !1,
|
|
23
|
+
// 当前用户是否超管;由 enterInitial 经 /personal/profile 填入,不持久化。
|
|
24
|
+
// v-auth 只对超管 fail-open;普通用户空集则按码匹配(必然不命中 → 隐藏),避免"空集=超管"的误放行。
|
|
25
|
+
isSuperAdmin: !1,
|
|
26
|
+
routesReady: !1
|
|
27
|
+
}),
|
|
28
|
+
getters: {
|
|
29
|
+
/**
|
|
30
|
+
* 当前应用的首页:模块自己的 DefaultRoute → 菜单树第一个叶子 → 应用选择器兜底。
|
|
31
|
+
* 每个应用一个首页,所以 '/' 的落点不能写死(由守卫在路由就绪后取用,见 router/index.ts)。
|
|
32
|
+
* 兜底是 /module 而非某个固定页:一个菜单都没配的应用没有首页可言,把人送回选择器,
|
|
33
|
+
* 好过让他撞上一个"不属于本应用"的路径吃 404。
|
|
34
|
+
*/
|
|
35
|
+
homePath(e) {
|
|
36
|
+
const s = e.modules.find((i) => i.id === e.currentModuleId);
|
|
37
|
+
return (s == null ? void 0 : s.defaultRoute) || d(e.menuTree) || "/module";
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* 按钮级权限判定(v-auth 指令与 render 函数内按钮共用同一套规则)。
|
|
41
|
+
* 超管 → 全放行;取码失败/未加载 → fail-closed(不谎报"有");否则精确命中权限码(= 规范化路由)。
|
|
42
|
+
* render 函数里 v-auth 指令用不了,按钮需调本 getter 做条件渲染,故显隐规则必须收敛到这一处。
|
|
43
|
+
*/
|
|
44
|
+
hasPerm(e) {
|
|
45
|
+
return (s) => e.isSuperAdmin ? !0 : e.permissionsLoaded && e.permissionCodes.includes(s);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
actions: {
|
|
49
|
+
reset() {
|
|
50
|
+
this.modules = [], this.currentModuleId = null, this.defaultModuleId = null, this.menuTree = [], this.permissionCodes = [], this.permissionsLoaded = !1, this.isSuperAdmin = !1, this.routesReady = !1, u().clearTabs();
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
// 仅存 currentModuleId(见上方注释);routesReady/menuTree 绝不入库,否则 F5 跳过重建。
|
|
54
|
+
persist: { pick: ["currentModuleId"] }
|
|
55
|
+
});
|
|
56
|
+
export {
|
|
57
|
+
a as useAuthStore
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["../../src/stores/auth.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport type { AppModule, MenuNode } from '#/types/menu'\nimport { useTabsStore } from '#/stores/tabs'\n\nfunction firstLeafPath(tree: MenuNode[]): string | undefined {\n for (const n of tree) {\n if (n.path && !n.children?.length) return n.path\n const deeper = n.children?.length ? firstLeafPath(n.children) : undefined\n if (deeper) return deeper\n }\n return undefined\n}\n\n/**\n * 授权态:模块 / 菜单树 / 权限码 / 路由是否已建。\n * **只持久化 currentModuleId 一项**——F5/深链时守卫据它重建\"上次所在应用\"的动态路由,\n * 跨应用深链(默认应用 ≠ 当前应用)才不会落 404。\n * menuTree/modules/routesReady 一律不持久化:动态路由只活在 router 内存里,刷新后由守卫重建;\n * 尤其 routesReady 若被持久化成 true,F5 会跳过重建导致每条动态路由 404。\n */\nexport const useAuthStore = defineStore('auth', {\n state: () => ({\n modules: [] as AppModule[],\n currentModuleId: null as number | null,\n // 用户的默认应用(后端 SysUser.DefaultModuleId),随 enterInitial 拉取;不持久化,仅供选择页标记。\n defaultModuleId: null as number | null,\n menuTree: [] as MenuNode[],\n // 登录进门户时由 useModule.enterInitial 填入(GET /personal/permissions);超管为空集 → v-auth fail-open,服务端 sadm 兜底。\n permissionCodes: [] as string[],\n // 权限码是否已成功拉取。区分\"取码失败/未加载\"(fail-closed 藏按钮)与\"已加载\"(按码匹配)。\n // 不持久化——F5 后由守卫重新拉取。\n permissionsLoaded: false,\n // 当前用户是否超管;由 enterInitial 经 /personal/profile 填入,不持久化。\n // v-auth 只对超管 fail-open;普通用户空集则按码匹配(必然不命中 → 隐藏),避免\"空集=超管\"的误放行。\n isSuperAdmin: false,\n routesReady: false,\n }),\n getters: {\n /**\n * 当前应用的首页:模块自己的 DefaultRoute → 菜单树第一个叶子 → 应用选择器兜底。\n * 每个应用一个首页,所以 '/' 的落点不能写死(由守卫在路由就绪后取用,见 router/index.ts)。\n * 兜底是 /module 而非某个固定页:一个菜单都没配的应用没有首页可言,把人送回选择器,\n * 好过让他撞上一个\"不属于本应用\"的路径吃 404。\n */\n homePath(state): string {\n const m = state.modules.find(x => x.id === state.currentModuleId)\n return m?.defaultRoute || firstLeafPath(state.menuTree) || '/module'\n },\n /**\n * 按钮级权限判定(v-auth 指令与 render 函数内按钮共用同一套规则)。\n * 超管 → 全放行;取码失败/未加载 → fail-closed(不谎报\"有\");否则精确命中权限码(= 规范化路由)。\n * render 函数里 v-auth 指令用不了,按钮需调本 getter 做条件渲染,故显隐规则必须收敛到这一处。\n */\n hasPerm(state): (code: string) => boolean {\n return code =>\n state.isSuperAdmin ? true : state.permissionsLoaded && state.permissionCodes.includes(code)\n },\n },\n actions: {\n reset() {\n this.modules = []\n this.currentModuleId = null\n this.defaultModuleId = null\n this.menuTree = []\n this.permissionCodes = []\n this.permissionsLoaded = false\n this.isSuperAdmin = false\n this.routesReady = false\n useTabsStore().clearTabs() // 登出销毁授权态时一并清标签(reset 仅登出路径调用,故不会在 F5 误清)\n },\n },\n // 仅存 currentModuleId(见上方注释);routesReady/menuTree 绝不入库,否则 F5 跳过重建。\n persist: { pick: ['currentModuleId'] },\n})\n"],"names":["firstLeafPath","tree","n","_a","deeper","_b","useAuthStore","defineStore","state","m","x","code","useTabsStore"],"mappings":";;AAIA,SAASA,EAAcC,GAAsC;;AAC3D,aAAWC,KAAKD,GAAM;AACpB,QAAIC,EAAE,QAAQ,GAACC,IAAAD,EAAE,aAAF,QAAAC,EAAY,gBAAeD,EAAE;AAC5C,UAAME,KAASC,IAAAH,EAAE,aAAF,QAAAG,EAAY,SAASL,EAAcE,EAAE,QAAQ,IAAI;AAChE,QAAIE,EAAQ,QAAOA;AAAA,EACrB;AAEF;AASO,MAAME,IAAeC,EAAY,QAAQ;AAAA,EAC9C,OAAO,OAAO;AAAA,IACZ,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA;AAAA,IAEjB,iBAAiB;AAAA,IACjB,UAAU,CAAA;AAAA;AAAA,IAEV,iBAAiB,CAAA;AAAA;AAAA;AAAA,IAGjB,mBAAmB;AAAA;AAAA;AAAA,IAGnB,cAAc;AAAA,IACd,aAAa;AAAA,EAAA;AAAA,EAEf,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOP,SAASC,GAAe;AACtB,YAAMC,IAAID,EAAM,QAAQ,KAAK,OAAKE,EAAE,OAAOF,EAAM,eAAe;AAChE,cAAOC,KAAA,gBAAAA,EAAG,iBAAgBT,EAAcQ,EAAM,QAAQ,KAAK;AAAA,IAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,QAAQA,GAAkC;AACxC,aAAO,CAAAG,MACLH,EAAM,eAAe,KAAOA,EAAM,qBAAqBA,EAAM,gBAAgB,SAASG,CAAI;AAAA,IAC9F;AAAA,EAAA;AAAA,EAEF,SAAS;AAAA,IACP,QAAQ;AACN,WAAK,UAAU,CAAA,GACf,KAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,WAAW,CAAA,GAChB,KAAK,kBAAkB,CAAA,GACvB,KAAK,oBAAoB,IACzB,KAAK,eAAe,IACpB,KAAK,cAAc,IACnBC,EAAA,EAAe,UAAA;AAAA,IACjB;AAAA,EAAA;AAAA;AAAA,EAGF,SAAS,EAAE,MAAM,CAAC,iBAAiB,EAAA;AACrC,CAAC;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter } from 'vue';
|
|
2
|
+
import { DictItem } from '../types/api';
|
|
3
|
+
export declare const useDictStore: import('pinia').StoreDefinition<"dict", {
|
|
4
|
+
cache: Record<string, DictItem[]>;
|
|
5
|
+
}, {}, {
|
|
6
|
+
load(typeCode: string): Promise<DictItem[]>;
|
|
7
|
+
/** 字典管理页增删改后调用;不传清全部。连同 pending 一起清,防失效后新 load 命中旧的在途请求。 */
|
|
8
|
+
invalidate(typeCode?: string): void;
|
|
9
|
+
}>;
|
|
10
|
+
/** setup 糖:触发加载并返回响应式字典项;typeCode 可为 ref/getter(级联场景变化自动加载)。失败静默——字典是配角,下拉留空不打断主流程;要提示的页面自己 load().catch。 */
|
|
11
|
+
export declare function useDictOptions(typeCode: MaybeRefOrGetter<string>): ComputedRef<DictItem[]>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { watchEffect as s, toValue as a, computed as h } from "vue";
|
|
2
|
+
import { defineStore as f } from "pinia";
|
|
3
|
+
import { dictApi as o } from "../api/index.js";
|
|
4
|
+
const c = /* @__PURE__ */ new Map(), l = f("dict", {
|
|
5
|
+
state: () => ({ cache: {} }),
|
|
6
|
+
actions: {
|
|
7
|
+
async load(t) {
|
|
8
|
+
const i = this.cache[t];
|
|
9
|
+
if (i) return i;
|
|
10
|
+
let n = c.get(t);
|
|
11
|
+
if (!n) {
|
|
12
|
+
const e = o.items(t).then((r) => (c.get(t) === e && (this.cache[t] = r), r)).finally(() => {
|
|
13
|
+
c.get(t) === e && c.delete(t);
|
|
14
|
+
});
|
|
15
|
+
c.set(t, e), n = e;
|
|
16
|
+
}
|
|
17
|
+
return n;
|
|
18
|
+
},
|
|
19
|
+
/** 字典管理页增删改后调用;不传清全部。连同 pending 一起清,防失效后新 load 命中旧的在途请求。 */
|
|
20
|
+
invalidate(t) {
|
|
21
|
+
t ? (delete this.cache[t], c.delete(t)) : (this.cache = {}, c.clear());
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
function d(t) {
|
|
26
|
+
const i = l();
|
|
27
|
+
return s(() => {
|
|
28
|
+
i.load(a(t)).catch(() => {
|
|
29
|
+
});
|
|
30
|
+
}), h(() => i.cache[a(t)] ?? []);
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
d as useDictOptions,
|
|
34
|
+
l as useDictStore
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=dict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dict.js","sources":["../../src/stores/dict.ts"],"sourcesContent":["// 字典缓存(会话级内存缓存,不持久化——字典是服务端数据,进 localStorage 只会陈旧):\n// load 命中缓存直接回;进行中共享同一 Promise(并发去重);失败不写缓存、清 pending →\n// 下次访问自然重试(被动重试,不做定时/退避)。字典管理页增删改后调 invalidate 失效。\nimport { computed, toValue, watchEffect, type ComputedRef, type MaybeRefOrGetter } from 'vue'\nimport { defineStore } from 'pinia'\nimport { dictApi } from '#/api'\nimport type { DictItem } from '#/types/api'\n\n// 并发去重表:模块级,不进 state(Promise 不该进 devtools/持久化序列化)。\nconst pending = new Map<string, Promise<DictItem[]>>()\n\nexport const useDictStore = defineStore('dict', {\n state: () => ({ cache: {} as Record<string, DictItem[]> }),\n actions: {\n async load(typeCode: string): Promise<DictItem[]> {\n const hit = this.cache[typeCode]\n if (hit) return hit\n let p = pending.get(typeCode)\n if (!p) {\n const req: Promise<DictItem[]> = dictApi\n .items(typeCode)\n .then(items => {\n // 失效竞态守卫:invalidate 已把本请求从 pending 摘除时,在途结果不得写回(旧数据)。\n if (pending.get(typeCode) === req) this.cache[typeCode] = items\n return items\n })\n .finally(() => {\n if (pending.get(typeCode) === req) pending.delete(typeCode)\n })\n pending.set(typeCode, req)\n p = req\n }\n return p\n },\n /** 字典管理页增删改后调用;不传清全部。连同 pending 一起清,防失效后新 load 命中旧的在途请求。 */\n invalidate(typeCode?: string) {\n if (typeCode) {\n delete this.cache[typeCode]\n pending.delete(typeCode)\n } else {\n this.cache = {}\n pending.clear()\n }\n },\n },\n})\n\n/** setup 糖:触发加载并返回响应式字典项;typeCode 可为 ref/getter(级联场景变化自动加载)。失败静默——字典是配角,下拉留空不打断主流程;要提示的页面自己 load().catch。 */\nexport function useDictOptions(typeCode: MaybeRefOrGetter<string>): ComputedRef<DictItem[]> {\n const store = useDictStore()\n watchEffect(() => {\n void store.load(toValue(typeCode)).catch(() => {})\n })\n return computed(() => store.cache[toValue(typeCode)] ?? [])\n}\n"],"names":["pending","useDictStore","defineStore","typeCode","hit","p","req","dictApi","items","useDictOptions","store","watchEffect","toValue","computed"],"mappings":";;;AASA,MAAMA,wBAAc,IAAA,GAEPC,IAAeC,EAAY,QAAQ;AAAA,EAC9C,OAAO,OAAO,EAAE,OAAO,CAAA;EACvB,SAAS;AAAA,IACP,MAAM,KAAKC,GAAuC;AAChD,YAAMC,IAAM,KAAK,MAAMD,CAAQ;AAC/B,UAAIC,EAAK,QAAOA;AAChB,UAAIC,IAAIL,EAAQ,IAAIG,CAAQ;AAC5B,UAAI,CAACE,GAAG;AACN,cAAMC,IAA2BC,EAC9B,MAAMJ,CAAQ,EACd,KAAK,CAAAK,OAEAR,EAAQ,IAAIG,CAAQ,MAAMG,MAAK,KAAK,MAAMH,CAAQ,IAAIK,IACnDA,EACR,EACA,QAAQ,MAAM;AACb,UAAIR,EAAQ,IAAIG,CAAQ,MAAMG,KAAKN,EAAQ,OAAOG,CAAQ;AAAA,QAC5D,CAAC;AACH,QAAAH,EAAQ,IAAIG,GAAUG,CAAG,GACzBD,IAAIC;AAAA,MACN;AACA,aAAOD;AAAA,IACT;AAAA;AAAA,IAEA,WAAWF,GAAmB;AAC5B,MAAIA,KACF,OAAO,KAAK,MAAMA,CAAQ,GAC1BH,EAAQ,OAAOG,CAAQ,MAEvB,KAAK,QAAQ,CAAA,GACbH,EAAQ,MAAA;AAAA,IAEZ;AAAA,EAAA;AAEJ,CAAC;AAGM,SAASS,EAAeN,GAA6D;AAC1F,QAAMO,IAAQT,EAAA;AACd,SAAAU,EAAY,MAAM;AAChB,IAAKD,EAAM,KAAKE,EAAQT,CAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnD,CAAC,GACMU,EAAS,MAAMH,EAAM,MAAME,EAAQT,CAAQ,CAAC,KAAK,EAAE;AAC5D;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { RouteLocationNormalized } from 'vue-router';
|
|
2
|
+
export interface TabItem {
|
|
3
|
+
path: string;
|
|
4
|
+
fullPath: string;
|
|
5
|
+
title: string;
|
|
6
|
+
name: string;
|
|
7
|
+
icon?: string;
|
|
8
|
+
affix?: boolean;
|
|
9
|
+
pinned?: boolean;
|
|
10
|
+
titleFixed?: boolean;
|
|
11
|
+
noCache?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 多标签页会话:标签列表 + keep-alive 缓存名。sessionStorage 持久化(F5 恢复,新标签页从净态开始)。
|
|
15
|
+
* 首页标签不写死:每个应用首页不同(homePath()),故 affix 在 addTab 时按当前应用判定。
|
|
16
|
+
*/
|
|
17
|
+
export declare const useTabsStore: import('pinia').StoreDefinition<"tabs", {
|
|
18
|
+
tabs: TabItem[];
|
|
19
|
+
reloadKey: number;
|
|
20
|
+
excludeName: string;
|
|
21
|
+
}, {
|
|
22
|
+
cachedNames(state: {
|
|
23
|
+
tabs: {
|
|
24
|
+
path: string;
|
|
25
|
+
fullPath: string;
|
|
26
|
+
title: string;
|
|
27
|
+
name: string;
|
|
28
|
+
icon?: string | undefined;
|
|
29
|
+
affix?: boolean | undefined;
|
|
30
|
+
pinned?: boolean | undefined;
|
|
31
|
+
titleFixed?: boolean | undefined;
|
|
32
|
+
noCache?: boolean | undefined;
|
|
33
|
+
}[];
|
|
34
|
+
reloadKey: number;
|
|
35
|
+
excludeName: string;
|
|
36
|
+
} & import('pinia').PiniaCustomStateProperties<{
|
|
37
|
+
tabs: TabItem[];
|
|
38
|
+
reloadKey: number;
|
|
39
|
+
excludeName: string;
|
|
40
|
+
}>): string[];
|
|
41
|
+
}, {
|
|
42
|
+
addTab(route: RouteLocationNormalized): void;
|
|
43
|
+
removeTab(path: string): void;
|
|
44
|
+
closeOthers(path: string): void;
|
|
45
|
+
closeAll(): void;
|
|
46
|
+
closeLeft(path: string): void;
|
|
47
|
+
closeRight(path: string): void;
|
|
48
|
+
togglePin(path: string): void;
|
|
49
|
+
_ensureActive(preferPath: string): void;
|
|
50
|
+
refreshTab(name: string): void;
|
|
51
|
+
setTitle(path: string, title: string): void;
|
|
52
|
+
clearTabs(): void;
|
|
53
|
+
}>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { defineStore as o } from "pinia";
|
|
2
|
+
import { router as n } from "../router/index.js";
|
|
3
|
+
import { useAuthStore as f } from "./auth.js";
|
|
4
|
+
const u = o("tabs", {
|
|
5
|
+
state: () => ({
|
|
6
|
+
tabs: [],
|
|
7
|
+
reloadKey: 0,
|
|
8
|
+
// 变更 → 强制页面重挂(refreshTab)
|
|
9
|
+
excludeName: ""
|
|
10
|
+
// 临时逐出 keep-alive 实例(refreshTab)
|
|
11
|
+
}),
|
|
12
|
+
getters: {
|
|
13
|
+
// 供 keep-alive :include。noCache 标签(详情等瞬时页)排除出缓存;再剪掉 F5 重建期失效的名。
|
|
14
|
+
cachedNames(s) {
|
|
15
|
+
return s.tabs.filter((t) => !t.noCache).map((t) => t.name).filter((t) => n.hasRoute(t));
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
actions: {
|
|
19
|
+
addTab(s) {
|
|
20
|
+
const t = String(s.name ?? "");
|
|
21
|
+
if (!t) return;
|
|
22
|
+
const e = s.path, i = s.meta.title || t || e, h = s.meta.icon, a = this.tabs.find((r) => r.path === e);
|
|
23
|
+
a ? (a.fullPath = s.fullPath, a.titleFixed || (a.title = i), h && (a.icon = h)) : this.tabs.push({
|
|
24
|
+
path: e,
|
|
25
|
+
fullPath: s.fullPath,
|
|
26
|
+
title: i,
|
|
27
|
+
name: t,
|
|
28
|
+
icon: h,
|
|
29
|
+
affix: e === f().homePath,
|
|
30
|
+
noCache: s.meta.noCache === !0
|
|
31
|
+
// 详情等瞬时页不进 keep-alive
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
removeTab(s) {
|
|
35
|
+
const t = this.tabs.findIndex((i) => i.path === s);
|
|
36
|
+
if (t === -1 || this.tabs[t].affix || this.tabs[t].pinned) return;
|
|
37
|
+
const e = n.currentRoute.value.path === s;
|
|
38
|
+
if (this.tabs.splice(t, 1), e) {
|
|
39
|
+
const i = this.tabs[t] ?? this.tabs[t - 1] ?? this.tabs[0];
|
|
40
|
+
n.push(i.fullPath);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
closeOthers(s) {
|
|
44
|
+
this.tabs = this.tabs.filter((t) => t.affix || t.pinned || t.path === s), this._ensureActive(s);
|
|
45
|
+
},
|
|
46
|
+
closeAll() {
|
|
47
|
+
this.tabs = this.tabs.filter((s) => s.affix || s.pinned), this._ensureActive(f().homePath);
|
|
48
|
+
},
|
|
49
|
+
closeLeft(s) {
|
|
50
|
+
const t = this.tabs.findIndex((e) => e.path === s);
|
|
51
|
+
t <= 0 || (this.tabs = this.tabs.filter((e, i) => e.affix || e.pinned || i >= t), this._ensureActive(s));
|
|
52
|
+
},
|
|
53
|
+
closeRight(s) {
|
|
54
|
+
const t = this.tabs.findIndex((e) => e.path === s);
|
|
55
|
+
t !== -1 && (this.tabs = this.tabs.filter((e, i) => e.affix || e.pinned || i <= t), this._ensureActive(s));
|
|
56
|
+
},
|
|
57
|
+
// 用户手动固定/取消固定(右键菜单);应用首页 affix 恒固定,不受此影响。
|
|
58
|
+
togglePin(s) {
|
|
59
|
+
const t = this.tabs.find((e) => e.path === s);
|
|
60
|
+
t && !t.affix && (t.pinned = !t.pinned);
|
|
61
|
+
},
|
|
62
|
+
// 当前激活标签被批量关闭后,导航到 preferPath(通常是右键的那个)或末尾标签。
|
|
63
|
+
_ensureActive(s) {
|
|
64
|
+
const t = n.currentRoute.value.path;
|
|
65
|
+
if (this.tabs.some((i) => i.path === t)) return;
|
|
66
|
+
const e = this.tabs.find((i) => i.path === s) ?? this.tabs[this.tabs.length - 1];
|
|
67
|
+
e && n.push(e.fullPath);
|
|
68
|
+
},
|
|
69
|
+
// 逐出缓存实例并发信号;default.vue 监听 reloadKey 做 v-if 重挂,重挂后清 excludeName。
|
|
70
|
+
refreshTab(s) {
|
|
71
|
+
this.excludeName = s, this.reloadKey++;
|
|
72
|
+
},
|
|
73
|
+
// 详情页数据加载后设置动态标签标题(如记录名);titleFixed 防 addTab 复访用 meta.title 覆盖回去。
|
|
74
|
+
setTitle(s, t) {
|
|
75
|
+
const e = this.tabs.find((i) => i.path === s);
|
|
76
|
+
e && (e.title = t, e.titleFixed = !0);
|
|
77
|
+
},
|
|
78
|
+
// 切应用/登出:标签清空。新应用首页由 router.afterEach 的 addTab 自然补成第一个(affix)标签。
|
|
79
|
+
clearTabs() {
|
|
80
|
+
this.tabs = [];
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
persist: { storage: sessionStorage, pick: ["tabs"] }
|
|
84
|
+
});
|
|
85
|
+
export {
|
|
86
|
+
u as useTabsStore
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sources":["../../src/stores/tabs.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport type { RouteLocationNormalized } from 'vue-router'\nimport { router } from '#/router'\nimport { useAuthStore } from '#/stores/auth'\n\nexport interface TabItem {\n path: string // 主键(与 keep-alive 单实例一致)\n fullPath: string // 最后一次访问的完整 URL(含 query),点击标签时导航到此\n title: string // 原始 meta.title(可能是 i18n key)\n name: string // 路由名 → keep-alive include\n icon?: string\n affix?: boolean // 固定标签(= 当前应用的首页),不可关闭\n pinned?: boolean // 用户手动固定(右键「固定」);与 affix 同样不可关闭,但可取消固定\n titleFixed?: boolean // setTitle 置真:动态标题(如记录名),addTab 复访不再用 meta.title 覆盖\n noCache?: boolean // meta.noCache:排除出 keep-alive(详情等瞬时页,复访本就该拉新数据)\n}\n\n/**\n * 多标签页会话:标签列表 + keep-alive 缓存名。sessionStorage 持久化(F5 恢复,新标签页从净态开始)。\n * 首页标签不写死:每个应用首页不同(homePath()),故 affix 在 addTab 时按当前应用判定。\n */\nexport const useTabsStore = defineStore('tabs', {\n state: () => ({\n tabs: [] as TabItem[],\n reloadKey: 0, // 变更 → 强制页面重挂(refreshTab)\n excludeName: '', // 临时逐出 keep-alive 实例(refreshTab)\n }),\n getters: {\n // 供 keep-alive :include。noCache 标签(详情等瞬时页)排除出缓存;再剪掉 F5 重建期失效的名。\n cachedNames(state): string[] {\n return state.tabs\n .filter(t => !t.noCache)\n .map(t => t.name)\n .filter(n => router.hasRoute(n))\n },\n },\n actions: {\n addTab(route: RouteLocationNormalized) {\n const name = String(route.name ?? '')\n if (!name) return\n const path = route.path\n const title = (route.meta.title as string) || name || path\n const icon = route.meta.icon as string | undefined\n const existing = this.tabs.find(t => t.path === path)\n if (existing) {\n existing.fullPath = route.fullPath\n if (!existing.titleFixed) existing.title = title // 动态标题(setTitle 设过)不被 meta.title 复访覆盖\n if (icon) existing.icon = icon\n } else {\n // 当前应用的首页 → 固定标签,不可关闭(每个应用各有一个)\n this.tabs.push({\n path,\n fullPath: route.fullPath,\n title,\n name,\n icon,\n affix: path === useAuthStore().homePath,\n noCache: route.meta.noCache === true, // 详情等瞬时页不进 keep-alive\n })\n }\n },\n removeTab(path: string) {\n const idx = this.tabs.findIndex(t => t.path === path)\n if (idx === -1 || this.tabs[idx]!.affix || this.tabs[idx]!.pinned) return\n const wasActive = router.currentRoute.value.path === path\n this.tabs.splice(idx, 1)\n if (wasActive) {\n const next = this.tabs[idx] ?? this.tabs[idx - 1] ?? this.tabs[0]!\n router.push(next.fullPath)\n }\n },\n closeOthers(path: string) {\n this.tabs = this.tabs.filter(t => t.affix || t.pinned || t.path === path)\n this._ensureActive(path)\n },\n closeAll() {\n this.tabs = this.tabs.filter(t => t.affix || t.pinned)\n this._ensureActive(useAuthStore().homePath)\n },\n closeLeft(path: string) {\n const idx = this.tabs.findIndex(t => t.path === path)\n if (idx <= 0) return\n this.tabs = this.tabs.filter((t, i) => t.affix || t.pinned || i >= idx)\n this._ensureActive(path)\n },\n closeRight(path: string) {\n const idx = this.tabs.findIndex(t => t.path === path)\n if (idx === -1) return\n this.tabs = this.tabs.filter((t, i) => t.affix || t.pinned || i <= idx)\n this._ensureActive(path)\n },\n // 用户手动固定/取消固定(右键菜单);应用首页 affix 恒固定,不受此影响。\n togglePin(path: string) {\n const tab = this.tabs.find(t => t.path === path)\n if (tab && !tab.affix) tab.pinned = !tab.pinned\n },\n // 当前激活标签被批量关闭后,导航到 preferPath(通常是右键的那个)或末尾标签。\n _ensureActive(preferPath: string) {\n const cur = router.currentRoute.value.path\n if (this.tabs.some(t => t.path === cur)) return\n const target = this.tabs.find(t => t.path === preferPath) ?? this.tabs[this.tabs.length - 1]\n if (target) router.push(target.fullPath)\n },\n // 逐出缓存实例并发信号;default.vue 监听 reloadKey 做 v-if 重挂,重挂后清 excludeName。\n refreshTab(name: string) {\n this.excludeName = name\n this.reloadKey++\n },\n // 详情页数据加载后设置动态标签标题(如记录名);titleFixed 防 addTab 复访用 meta.title 覆盖回去。\n setTitle(path: string, title: string) {\n const tab = this.tabs.find(t => t.path === path)\n if (!tab) return\n tab.title = title\n tab.titleFixed = true\n },\n // 切应用/登出:标签清空。新应用首页由 router.afterEach 的 addTab 自然补成第一个(affix)标签。\n clearTabs() {\n this.tabs = []\n },\n },\n persist: { storage: sessionStorage, pick: ['tabs'] },\n})\n"],"names":["useTabsStore","defineStore","state","router","n","route","name","path","title","icon","existing","t","useAuthStore","idx","wasActive","next","tab","preferPath","cur","target"],"mappings":";;;AAqBO,MAAMA,IAAeC,EAAY,QAAQ;AAAA,EAC9C,OAAO,OAAO;AAAA,IACZ,MAAM,CAAA;AAAA,IACN,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,EAAA;AAAA,EAEf,SAAS;AAAA;AAAA,IAEP,YAAYC,GAAiB;AAC3B,aAAOA,EAAM,KACV,OAAO,OAAK,CAAC,EAAE,OAAO,EACtB,IAAI,CAAA,MAAK,EAAE,IAAI,EACf,OAAO,OAAKC,EAAO,SAASC,CAAC,CAAC;AAAA,IACnC;AAAA,EAAA;AAAA,EAEF,SAAS;AAAA,IACP,OAAOC,GAAgC;AACrC,YAAMC,IAAO,OAAOD,EAAM,QAAQ,EAAE;AACpC,UAAI,CAACC,EAAM;AACX,YAAMC,IAAOF,EAAM,MACbG,IAASH,EAAM,KAAK,SAAoBC,KAAQC,GAChDE,IAAOJ,EAAM,KAAK,MAClBK,IAAW,KAAK,KAAK,KAAK,CAAAC,MAAKA,EAAE,SAASJ,CAAI;AACpD,MAAIG,KACFA,EAAS,WAAWL,EAAM,UACrBK,EAAS,eAAYA,EAAS,QAAQF,IACvCC,QAAe,OAAOA,MAG1B,KAAK,KAAK,KAAK;AAAA,QACb,MAAAF;AAAA,QACA,UAAUF,EAAM;AAAA,QAChB,OAAAG;AAAA,QACA,MAAAF;AAAA,QACA,MAAAG;AAAA,QACA,OAAOF,MAASK,EAAA,EAAe;AAAA,QAC/B,SAASP,EAAM,KAAK,YAAY;AAAA;AAAA,MAAA,CACjC;AAAA,IAEL;AAAA,IACA,UAAUE,GAAc;AACtB,YAAMM,IAAM,KAAK,KAAK,UAAU,CAAAF,MAAKA,EAAE,SAASJ,CAAI;AACpD,UAAIM,MAAQ,MAAM,KAAK,KAAKA,CAAG,EAAG,SAAS,KAAK,KAAKA,CAAG,EAAG,OAAQ;AACnE,YAAMC,IAAYX,EAAO,aAAa,MAAM,SAASI;AAErD,UADA,KAAK,KAAK,OAAOM,GAAK,CAAC,GACnBC,GAAW;AACb,cAAMC,IAAO,KAAK,KAAKF,CAAG,KAAK,KAAK,KAAKA,IAAM,CAAC,KAAK,KAAK,KAAK,CAAC;AAChE,QAAAV,EAAO,KAAKY,EAAK,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,YAAYR,GAAc;AACxB,WAAK,OAAO,KAAK,KAAK,OAAO,CAAA,MAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAASA,CAAI,GACxE,KAAK,cAAcA,CAAI;AAAA,IACzB;AAAA,IACA,WAAW;AACT,WAAK,OAAO,KAAK,KAAK,OAAO,OAAKI,EAAE,SAASA,EAAE,MAAM,GACrD,KAAK,cAAcC,EAAA,EAAe,QAAQ;AAAA,IAC5C;AAAA,IACA,UAAUL,GAAc;AACtB,YAAMM,IAAM,KAAK,KAAK,UAAU,CAAAF,MAAKA,EAAE,SAASJ,CAAI;AACpD,MAAIM,KAAO,MACX,KAAK,OAAO,KAAK,KAAK,OAAO,CAACF,GAAG,MAAMA,EAAE,SAASA,EAAE,UAAU,KAAKE,CAAG,GACtE,KAAK,cAAcN,CAAI;AAAA,IACzB;AAAA,IACA,WAAWA,GAAc;AACvB,YAAMM,IAAM,KAAK,KAAK,UAAU,CAAAF,MAAKA,EAAE,SAASJ,CAAI;AACpD,MAAIM,MAAQ,OACZ,KAAK,OAAO,KAAK,KAAK,OAAO,CAACF,GAAG,MAAMA,EAAE,SAASA,EAAE,UAAU,KAAKE,CAAG,GACtE,KAAK,cAAcN,CAAI;AAAA,IACzB;AAAA;AAAA,IAEA,UAAUA,GAAc;AACtB,YAAMS,IAAM,KAAK,KAAK,KAAK,CAAAL,MAAKA,EAAE,SAASJ,CAAI;AAC/C,MAAIS,KAAO,CAACA,EAAI,UAAOA,EAAI,SAAS,CAACA,EAAI;AAAA,IAC3C;AAAA;AAAA,IAEA,cAAcC,GAAoB;AAChC,YAAMC,IAAMf,EAAO,aAAa,MAAM;AACtC,UAAI,KAAK,KAAK,KAAK,OAAKQ,EAAE,SAASO,CAAG,EAAG;AACzC,YAAMC,IAAS,KAAK,KAAK,KAAK,OAAKR,EAAE,SAASM,CAAU,KAAK,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC;AAC3F,MAAIE,KAAQhB,EAAO,KAAKgB,EAAO,QAAQ;AAAA,IACzC;AAAA;AAAA,IAEA,WAAWb,GAAc;AACvB,WAAK,cAAcA,GACnB,KAAK;AAAA,IACP;AAAA;AAAA,IAEA,SAASC,GAAcC,GAAe;AACpC,YAAMQ,IAAM,KAAK,KAAK,KAAK,CAAAL,MAAKA,EAAE,SAASJ,CAAI;AAC/C,MAAKS,MACLA,EAAI,QAAQR,GACZQ,EAAI,aAAa;AAAA,IACnB;AAAA;AAAA,IAEA,YAAY;AACV,WAAK,OAAO,CAAA;AAAA,IACd;AAAA,EAAA;AAAA,EAEF,SAAS,EAAE,SAAS,gBAAgB,MAAM,CAAC,MAAM,EAAA;AACnD,CAAC;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { LoginOutput } from '../types/api';
|
|
2
|
+
interface UserInfo {
|
|
3
|
+
userId: number;
|
|
4
|
+
account: string;
|
|
5
|
+
name: string;
|
|
6
|
+
/** 头像 ViewUrl;登录出参不含,由 useModule.enterInitial 经 /personal/profile 回填,profile 页保存时同步。 */
|
|
7
|
+
avatar?: string | null;
|
|
8
|
+
/** 是否需强制改密(管理员建号/重置后首登为 true);路由守卫据此强制跳改密页。 */
|
|
9
|
+
mustChangePassword: boolean;
|
|
10
|
+
/** 登录时快照的超管标记;profile 故障时 v-auth 用此值 fail-open。 */
|
|
11
|
+
isSuperAdmin?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 判定是否为 Cookie 会话:
|
|
15
|
+
* - sessionMode === 'cookie' / csrfRequired === true(后端 AuthCookieService 显式信号)
|
|
16
|
+
* - 或 body 下发了 access 但 refresh 为空(兼容未 regen OpenAPI 的过渡期)
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCookieSession(data: Pick<LoginOutput, 'sessionMode' | 'csrfRequired' | 'accessToken' | 'refreshToken'>): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 令牌 + 用户信息。
|
|
21
|
+
* - 默认模式:持久化 access/refresh 到 localStorage(与历史行为完全一致)。
|
|
22
|
+
* - Cookie 会话:access 仅内存;refresh 在 HttpOnly Cookie;storage 只记 cookieSession 标记,
|
|
23
|
+
* 绝不以 localStorage/sessionStorage 存放 access/refresh。
|
|
24
|
+
*/
|
|
25
|
+
export declare const useUserStore: import('pinia').StoreDefinition<"user", {
|
|
26
|
+
accessToken: string;
|
|
27
|
+
refreshToken: string;
|
|
28
|
+
/**
|
|
29
|
+
* Cookie 会话标记(可持久化,不含任何令牌)。
|
|
30
|
+
* F5 后 access 已丢,靠此标记 + HttpOnly refresh Cookie 触发静默刷新。
|
|
31
|
+
*/
|
|
32
|
+
cookieSession: boolean;
|
|
33
|
+
userInfo: UserInfo | null;
|
|
34
|
+
}, {
|
|
35
|
+
isLoggedIn: (s: {
|
|
36
|
+
accessToken: string;
|
|
37
|
+
refreshToken: string;
|
|
38
|
+
cookieSession: boolean;
|
|
39
|
+
userInfo: {
|
|
40
|
+
userId: number;
|
|
41
|
+
account: string;
|
|
42
|
+
name: string;
|
|
43
|
+
avatar?: string | null
|
|
44
|
+
/** 是否需强制改密(管理员建号/重置后首登为 true);路由守卫据此强制跳改密页。 */
|
|
45
|
+
| undefined;
|
|
46
|
+
mustChangePassword: boolean;
|
|
47
|
+
isSuperAdmin?: boolean | undefined;
|
|
48
|
+
} | null;
|
|
49
|
+
} & import('pinia').PiniaCustomStateProperties<{
|
|
50
|
+
accessToken: string;
|
|
51
|
+
refreshToken: string;
|
|
52
|
+
/**
|
|
53
|
+
* Cookie 会话标记(可持久化,不含任何令牌)。
|
|
54
|
+
* F5 后 access 已丢,靠此标记 + HttpOnly refresh Cookie 触发静默刷新。
|
|
55
|
+
*/
|
|
56
|
+
cookieSession: boolean;
|
|
57
|
+
userInfo: UserInfo | null;
|
|
58
|
+
}>) => boolean;
|
|
59
|
+
}, {
|
|
60
|
+
/** 用登录/刷新出参落地会话。 */
|
|
61
|
+
setSession(data: LoginOutput): void;
|
|
62
|
+
clear(): void;
|
|
63
|
+
}>;
|
|
64
|
+
export {};
|