smart-admin-web 10.14.0 → 10.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/api/index.d.ts +41 -2
- package/dist/api/index.js +36 -15
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +418 -6
- package/dist/assets/icons/ph-subset.json.js +7 -7
- package/dist/assets/smart-logo.svg.js +5 -0
- package/dist/assets/smart-logo.svg.js.map +1 -0
- package/dist/components/AppIcon.vue.js +9 -9
- package/dist/components/AppIcon.vue.js.map +1 -1
- package/dist/components/AppWatermark.vue.d.ts +14 -0
- package/dist/components/AppWatermark.vue.js +38 -0
- package/dist/components/AppWatermark.vue.js.map +1 -0
- package/dist/components/AppWatermark2.vue.js +5 -0
- package/dist/components/AppWatermark2.vue.js.map +1 -0
- package/dist/components/Chart/PieChart.vue.d.ts +1 -1
- package/dist/components/Chart/echarts.js +15 -20
- package/dist/components/Chart/echarts.js.map +1 -1
- package/dist/components/CronEditor/index.vue.js +1 -1
- package/dist/components/CronEditor/index2.vue.js +2 -1
- package/dist/components/CronEditor/index2.vue.js.map +1 -1
- package/dist/components/DetailPage/index.vue.js +2 -2
- package/dist/components/DetailPage/index2.vue.js.map +1 -1
- package/dist/components/DictTag/index.vue.js.map +1 -1
- package/dist/components/ErrorBoundary/index.vue.js +2 -2
- package/dist/components/ErrorBoundary/index2.vue.js +1 -1
- package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
- package/dist/components/FormContainer/index.vue.js +91 -56
- package/dist/components/FormContainer/index.vue.js.map +1 -1
- package/dist/components/ImportWizard/index.vue.js +1 -1
- package/dist/components/ImportWizard/index2.vue.js +44 -41
- package/dist/components/ImportWizard/index2.vue.js.map +1 -1
- package/dist/components/MenuSearch.vue.js +2 -2
- package/dist/components/MenuSearch2.vue.js +19 -18
- package/dist/components/MenuSearch2.vue.js.map +1 -1
- package/dist/components/PasswordStrength/index.vue.js +2 -2
- package/dist/components/PasswordStrength/index2.vue.js +20 -18
- package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
- package/dist/components/SmartLogo.vue.d.ts +3 -0
- package/dist/components/SmartLogo.vue.js +1 -1
- package/dist/components/SmartLogo2.vue.js +22 -64
- package/dist/components/SmartLogo2.vue.js.map +1 -1
- package/dist/{views/system/config/components/GroupExtraConfig.vue.d.ts → components/TableTotal/index.vue.d.ts} +1 -4
- package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
- package/dist/components/TableTotal/index2.vue.js +16 -0
- package/dist/components/TableTotal/index2.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index.vue.js.map +1 -1
- package/dist/components/UserPicker/index.vue.js +2 -2
- package/dist/components/UserPicker/index2.vue.js +176 -117
- package/dist/components/UserPicker/index2.vue.js.map +1 -1
- package/dist/composables/useBatchDelete.js.map +1 -1
- package/dist/composables/useLayoutMenu.js +17 -16
- package/dist/composables/useLayoutMenu.js.map +1 -1
- package/dist/composables/useLoginHero.d.ts +2 -0
- package/dist/composables/useLoginHero.js +22 -0
- package/dist/composables/useLoginHero.js.map +1 -0
- package/dist/composables/useModule.js +39 -29
- package/dist/composables/useModule.js.map +1 -1
- package/dist/composables/usePageTitle.js +16 -14
- package/dist/composables/usePageTitle.js.map +1 -1
- package/dist/composables/useShellBreakpoint.d.ts +19 -0
- package/dist/composables/useShellBreakpoint.js +37 -0
- package/dist/composables/useShellBreakpoint.js.map +1 -0
- package/dist/composables/useSite.d.ts +20 -0
- package/dist/composables/useSite.js +18 -13
- package/dist/composables/useSite.js.map +1 -1
- package/dist/composables/useTabTitle.js.map +1 -1
- package/dist/composables/useTableTitle.d.ts +6 -0
- package/dist/composables/useTableTitle.js +11 -0
- package/dist/composables/useTableTitle.js.map +1 -0
- package/dist/composables/useTableZoom.d.ts +5 -0
- package/dist/composables/useTableZoom.js.map +1 -1
- package/dist/composables/useTheme.d.ts +2 -2
- package/dist/composables/useTheme.js +23 -20
- package/dist/composables/useTheme.js.map +1 -1
- package/dist/createSmartAdmin.d.ts +12 -2
- package/dist/createSmartAdmin.js +72 -60
- package/dist/createSmartAdmin.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +223 -208
- package/dist/index.js.map +1 -1
- package/dist/layouts/AccentPicker.vue.js +8 -0
- package/dist/layouts/AccentPicker.vue.js.map +1 -0
- package/dist/layouts/AccentPicker2.vue.js +131 -0
- package/dist/layouts/AccentPicker2.vue.js.map +1 -0
- package/dist/layouts/AppHeader.vue.d.ts +8 -1
- package/dist/layouts/AppHeader.vue.js +2 -2
- package/dist/layouts/AppHeader2.vue.js +317 -235
- package/dist/layouts/AppHeader2.vue.js.map +1 -1
- package/dist/layouts/NoticeBell.vue.js +2 -2
- package/dist/layouts/NoticeBell2.vue.js +1 -1
- package/dist/layouts/NoticeBell2.vue.js.map +1 -1
- package/dist/layouts/PersonalLayout.vue.js +2 -2
- package/dist/layouts/PersonalLayout2.vue.js +69 -47
- package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
- package/dist/layouts/SettingsDrawer.vue.js +3 -3
- package/dist/layouts/SettingsDrawer2.vue.js +261 -325
- package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
- package/dist/layouts/TabsBar.vue.js +2 -2
- package/dist/layouts/TabsBar2.vue.js +97 -69
- package/dist/layouts/TabsBar2.vue.js.map +1 -1
- package/dist/layouts/components/SideNav.vue.d.ts +3 -0
- package/dist/layouts/components/SideNav.vue.js +1 -1
- package/dist/layouts/components/SideNav2.vue.js +54 -26
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/layouts/default.vue.js +1 -1
- package/dist/layouts/default2.vue.js +170 -140
- package/dist/layouts/default2.vue.js.map +1 -1
- package/dist/lib/favicon.d.ts +1 -0
- package/dist/lib/favicon.js +12 -0
- package/dist/lib/favicon.js.map +1 -0
- package/dist/lib/loginHero.d.ts +16 -0
- package/dist/lib/loginHero.js +33 -0
- package/dist/lib/loginHero.js.map +1 -0
- package/dist/lib/logoCrop.d.ts +25 -0
- package/dist/lib/logoCrop.js +22 -0
- package/dist/lib/logoCrop.js.map +1 -0
- package/dist/lib/runtime.d.ts +2 -0
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/runtime.js.map +1 -1
- package/dist/lib/securityRules.d.ts +26 -0
- package/dist/lib/securityRules.js +86 -0
- package/dist/lib/securityRules.js.map +1 -0
- package/dist/lib/watermark.d.ts +110 -0
- package/dist/lib/watermark.js +151 -0
- package/dist/lib/watermark.js.map +1 -0
- package/dist/locales/en-US.d.ts +462 -42
- package/dist/locales/en-US.js +491 -78
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/kernelMenuTitles.d.ts +1 -0
- package/dist/locales/kernelMenuTitles.js +128 -0
- package/dist/locales/kernelMenuTitles.js.map +1 -0
- package/dist/locales/menuTitle.d.ts +3 -0
- package/dist/locales/menuTitle.js +14 -12
- package/dist/locales/menuTitle.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +462 -42
- package/dist/locales/zh-CN.js +490 -81
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/index.js +41 -32
- package/dist/router/index.js.map +1 -1
- package/dist/router/namedPage.d.ts +4 -0
- package/dist/router/namedPage.js +7 -7
- package/dist/router/namedPage.js.map +1 -1
- package/dist/router/viewRegistry.js +12 -12
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/stores/app.d.ts +0 -12
- package/dist/stores/app.js +11 -12
- package/dist/stores/app.js.map +1 -1
- package/dist/stores/tabs.js.map +1 -1
- package/dist/stores/user.d.ts +10 -0
- package/dist/stores/user.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/accentTokens.d.ts +27 -0
- package/dist/theme/accentTokens.js +54 -0
- package/dist/theme/accentTokens.js.map +1 -0
- package/dist/theme/accents.d.ts +21 -1
- package/dist/theme/accents.js +11 -2
- package/dist/theme/accents.js.map +1 -1
- package/dist/theme/mix.d.ts +58 -7
- package/dist/theme/mix.js +115 -30
- package/dist/theme/mix.js.map +1 -1
- package/dist/theme/naive-theme.d.ts +5 -2
- package/dist/theme/naive-theme.js +405 -75
- package/dist/theme/naive-theme.js.map +1 -1
- package/dist/utils/jwt.d.ts +8 -0
- package/dist/utils/jwt.js +14 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/menuIcon.d.ts +2 -0
- package/dist/utils/menuIcon.js +8 -0
- package/dist/utils/menuIcon.js.map +1 -0
- package/dist/utils/oauthBrand.d.ts +34 -9
- package/dist/utils/oauthBrand.js +70 -74
- package/dist/utils/oauthBrand.js.map +1 -1
- package/dist/utils/tableFilter.d.ts +88 -0
- package/dist/utils/tableFilter.js +116 -0
- package/dist/utils/tableFilter.js.map +1 -0
- package/dist/utils/tableToolbar.d.ts +18 -0
- package/dist/utils/tableToolbar.js +11 -0
- package/dist/utils/tableToolbar.js.map +1 -0
- package/dist/utils/treeFilter.d.ts +20 -0
- package/dist/utils/treeFilter.js +24 -0
- package/dist/utils/treeFilter.js.map +1 -0
- package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
- package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
- package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
- package/dist/views/dashboard/biz.vue.js +1 -1
- package/dist/views/dashboard/biz2.vue.js +310 -257
- package/dist/views/dashboard/biz2.vue.js.map +1 -1
- package/dist/views/dashboard/workbench.vue.js +2 -2
- package/dist/views/dashboard/workbench2.vue.js +141 -155
- package/dist/views/dashboard/workbench2.vue.js.map +1 -1
- package/dist/views/embed/iframe.vue.js +2 -2
- package/dist/views/embed/iframe2.vue.js +22 -15
- package/dist/views/embed/iframe2.vue.js.map +1 -1
- package/dist/views/error/404.vue.js +2 -2
- package/dist/views/error/4042.vue.js +33 -24
- package/dist/views/error/4042.vue.js.map +1 -1
- package/dist/views/error/BootError.vue.js +1 -1
- package/dist/views/error/BootError2.vue.js +59 -48
- package/dist/views/error/BootError2.vue.js.map +1 -1
- package/dist/views/error/MissingRoute.vue.js +2 -2
- package/dist/views/error/MissingRoute2.vue.js +34 -15
- package/dist/views/error/MissingRoute2.vue.js.map +1 -1
- package/dist/views/login/LoginForm.vue.d.ts +7 -1
- package/dist/views/login/LoginForm.vue.js +2 -2
- package/dist/views/login/LoginForm2.vue.js +580 -488
- package/dist/views/login/LoginForm2.vue.js.map +1 -1
- package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
- package/dist/views/login/components/LoginDesk.vue.js +9 -0
- package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
- package/dist/views/login/components/LoginDesk2.vue.js +100 -0
- package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js +61 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
- package/dist/views/login/index.vue.js +1 -1
- package/dist/views/login/index2.vue.js +141 -71
- package/dist/views/login/index2.vue.js.map +1 -1
- package/dist/views/login/layout.d.ts +11 -0
- package/dist/views/login/layout.js +27 -0
- package/dist/views/login/layout.js.map +1 -0
- package/dist/views/mfa/index.vue.js +2 -2
- package/dist/views/mfa/index2.vue.js +367 -321
- package/dist/views/mfa/index2.vue.js.map +1 -1
- package/dist/views/module/index.vue.js +2 -2
- package/dist/views/module/index2.vue.js +132 -99
- package/dist/views/module/index2.vue.js.map +1 -1
- package/dist/views/oauth/callback.vue.js +2 -2
- package/dist/views/oauth/callback2.vue.js +65 -51
- package/dist/views/oauth/callback2.vue.js.map +1 -1
- package/dist/views/personal/bindings.vue.js +2 -2
- package/dist/views/personal/bindings2.vue.js +98 -94
- package/dist/views/personal/bindings2.vue.js.map +1 -1
- package/dist/views/personal/notice2.vue.js +103 -76
- package/dist/views/personal/notice2.vue.js.map +1 -1
- package/dist/views/personal/password2.vue.js +47 -40
- package/dist/views/personal/password2.vue.js.map +1 -1
- package/dist/views/personal/profile.vue.js +3 -3
- package/dist/views/personal/profile2.vue.js +24 -18
- package/dist/views/personal/profile2.vue.js.map +1 -1
- package/dist/views/personal/security.vue.js +2 -2
- package/dist/views/personal/security2.vue.js +65 -53
- package/dist/views/personal/security2.vue.js.map +1 -1
- package/dist/views/personal/sessions.vue.js +2 -2
- package/dist/views/personal/sessions2.vue.js +67 -62
- package/dist/views/personal/sessions2.vue.js.map +1 -1
- package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
- package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
- package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
- package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
- package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
- package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
- package/dist/views/system/ai-model/index.vue.js +2 -2
- package/dist/views/system/ai-model/index2.vue.js +99 -99
- package/dist/views/system/ai-model/index2.vue.js.map +1 -1
- package/dist/views/system/ai-model/presets.d.ts +1 -1
- package/dist/views/system/ai-model/presets.js +18 -18
- package/dist/views/system/ai-model/presets.js.map +1 -1
- package/dist/views/system/ai-usage/index.vue.js +2 -2
- package/dist/views/system/ai-usage/index2.vue.js +356 -258
- package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
- package/dist/views/system/api-docs/index.vue.js +5 -2
- package/dist/views/system/api-docs/index.vue.js.map +1 -1
- package/dist/views/system/api-docs/index2.vue.js +92 -42
- package/dist/views/system/api-docs/index2.vue.js.map +1 -1
- package/dist/views/system/cache/index.vue.js +2 -2
- package/dist/views/system/cache/index2.vue.js +74 -80
- package/dist/views/system/cache/index2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdminMock.vue.js +8 -0
- package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
- package/dist/views/system/config/components/AdminMock2.vue.js +93 -0
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js +8 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js +163 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
- package/dist/views/system/config/components/BrandSection.vue.js +8 -0
- package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection2.vue.js +266 -0
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
- package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
- package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
- package/dist/views/system/config/components/CfgRow.vue.js +9 -0
- package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow2.vue.js +54 -0
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
- package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
- package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js +45 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js +4 -1
- package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +72 -60
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +8 -0
- package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
- package/dist/views/system/config/components/JobSection2.vue.js +140 -0
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock.vue.d.ts +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock2.vue.js +132 -0
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
- package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
- package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
- package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js +161 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
- package/dist/{layouts/SettingRow.vue.d.ts → views/system/config/components/ScaleToFit.vue.d.ts} +2 -1
- package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
- package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +30 -0
- package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
- package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js +69 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
- package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js +417 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js +214 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection.vue.js +8 -0
- package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
- package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection.vue.js +8 -0
- package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection2.vue.js +176 -0
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
- package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
- package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
- package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
- package/dist/views/system/config/draft.d.ts +148 -0
- package/dist/views/system/config/draft.js +170 -0
- package/dist/views/system/config/draft.js.map +1 -0
- package/dist/views/system/config/flash.d.ts +2 -0
- package/dist/views/system/config/flash.js +9 -0
- package/dist/views/system/config/flash.js.map +1 -0
- package/dist/views/system/config/groups.d.ts +38 -7
- package/dist/views/system/config/groups.js +104 -14
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +6 -2
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +201 -111
- package/dist/views/system/config/index2.vue.js.map +1 -1
- package/dist/views/system/config/layoutMode.d.ts +23 -0
- package/dist/views/system/config/layoutMode.js +28 -0
- package/dist/views/system/config/layoutMode.js.map +1 -0
- package/dist/views/system/config/providerForm.d.ts +33 -0
- package/dist/views/system/config/providerForm.js +63 -0
- package/dist/views/system/config/providerForm.js.map +1 -0
- package/dist/views/system/dict/index.vue.js +2 -2
- package/dist/views/system/dict/index2.vue.js +471 -366
- package/dist/views/system/dict/index2.vue.js.map +1 -1
- package/dist/views/system/file/index2.vue.js +91 -76
- package/dist/views/system/file/index2.vue.js.map +1 -1
- package/dist/views/system/job/index.vue.js +3 -3
- package/dist/views/system/job/index2.vue.js +897 -828
- package/dist/views/system/job/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
- package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
- package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
- package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
- package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
- package/dist/views/system/job-log/index.vue.js +2 -2
- package/dist/views/system/job-log/index2.vue.js +193 -207
- package/dist/views/system/job-log/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/runStatus.d.ts +13 -0
- package/dist/views/system/job-log/runStatus.js +26 -0
- package/dist/views/system/job-log/runStatus.js.map +1 -0
- package/dist/views/system/job-monitor/index.vue.js +2 -2
- package/dist/views/system/job-monitor/index2.vue.js +172 -180
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
- package/dist/views/system/log/exception/index.vue.js +2 -2
- package/dist/views/system/log/exception/index2.vue.js +135 -96
- package/dist/views/system/log/exception/index2.vue.js.map +1 -1
- package/dist/views/system/log/login/index2.vue.js +62 -41
- package/dist/views/system/log/login/index2.vue.js.map +1 -1
- package/dist/views/system/log/op/index.vue.js +2 -2
- package/dist/views/system/log/op/index2.vue.js +200 -162
- package/dist/views/system/log/op/index2.vue.js.map +1 -1
- package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
- package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
- package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
- package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
- package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
- package/dist/views/system/menu/index.vue.js +1 -1
- package/dist/views/system/menu/index2.vue.js +216 -183
- package/dist/views/system/menu/index2.vue.js.map +1 -1
- package/dist/views/system/module/index.vue.js +1 -1
- package/dist/views/system/module/index2.vue.js +177 -144
- package/dist/views/system/module/index2.vue.js.map +1 -1
- package/dist/views/system/monitor/index.vue.js +2 -2
- package/dist/views/system/monitor/index2.vue.js +134 -149
- package/dist/views/system/monitor/index2.vue.js.map +1 -1
- package/dist/views/system/notice/index.vue.js +1 -1
- package/dist/views/system/notice/index2.vue.js +209 -181
- package/dist/views/system/notice/index2.vue.js.map +1 -1
- package/dist/views/system/org/index.vue.js +1 -1
- package/dist/views/system/org/index2.vue.js +278 -248
- package/dist/views/system/org/index2.vue.js.map +1 -1
- package/dist/views/system/position/index.vue.js +5 -2
- package/dist/views/system/position/index.vue.js.map +1 -1
- package/dist/views/system/position/index2.vue.js +128 -92
- package/dist/views/system/position/index2.vue.js.map +1 -1
- package/dist/views/system/recycle/index.vue.js +2 -2
- package/dist/views/system/recycle/index2.vue.js +90 -67
- package/dist/views/system/recycle/index2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
- package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
- package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
- package/dist/views/system/role/components/MatchText.vue.js +8 -0
- package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
- package/dist/views/system/role/components/MatchText2.vue.js +29 -0
- package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
- package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
- package/dist/views/system/role/components/grantMenuGroups.js +110 -48
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
- package/dist/views/system/role/index.vue.js +5 -2
- package/dist/views/system/role/index.vue.js.map +1 -1
- package/dist/views/system/role/index2.vue.js +181 -165
- package/dist/views/system/role/index2.vue.js.map +1 -1
- package/dist/views/system/session/index2.vue.js +75 -49
- package/dist/views/system/session/index2.vue.js.map +1 -1
- package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
- package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
- package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
- package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
- package/dist/views/system/user/index.vue.js +2 -2
- package/dist/views/system/user/index2.vue.js +362 -275
- package/dist/views/system/user/index2.vue.js.map +1 -1
- package/package.json +6 -8
- package/dist/components/SelectTable/index.vue.d.ts +0 -76
- package/dist/components/SelectTable/index2.vue.js +0 -256
- package/dist/components/SelectTable/index2.vue.js.map +0 -1
- package/dist/composables/useTableRowSort.d.ts +0 -20
- package/dist/composables/useTableRowSort.js +0 -59
- package/dist/composables/useTableRowSort.js.map +0 -1
- package/dist/layouts/LayoutModeCards.vue.js +0 -8
- package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
- package/dist/layouts/LayoutModeCards2.vue.js +0 -67
- package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
- package/dist/layouts/SettingRow.vue.js +0 -8
- package/dist/layouts/SettingRow.vue.js.map +0 -1
- package/dist/layouts/SettingRow2.vue.js +0 -23
- package/dist/layouts/SettingRow2.vue.js.map +0 -1
- package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
- package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
- package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
- package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel.vue.js +0 -8
- package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel2.vue.js +0 -85
- package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight.vue.js +0 -8
- package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight2.vue.js +0 -36
- package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
- package/dist/views/login/skins.d.ts +0 -8
- package/dist/views/login/skins.js +0 -13
- package/dist/views/login/skins.js.map +0 -1
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
- package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
- package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
- package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig.vue.js +0 -5
- package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
- package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
- package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
- package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
- package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
- package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
- package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
- package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig.vue.d.ts +0 -3
- package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
- package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
- package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
- /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
- /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/AdminMock.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/SplitPanel.vue.d.ts → system/config/components/AdvancedSection.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/Spotlight.vue.d.ts → system/config/components/JobSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{JobConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → UploadSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → WatermarkSection.vue.d.ts} +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useMessage as F, NCard as S, NSpin as
|
|
1
|
+
import { defineComponent as I, ref as s, reactive as C, onMounted as $, openBlock as k, createBlock as B, unref as e, withCtx as t, createVNode as l, createElementVNode as V, createElementBlock as z, Fragment as A, createTextVNode as m, toDisplayString as f, createCommentVNode as E } from "vue";
|
|
2
|
+
import { useMessage as F, NCard as S, NSpin as q, NForm as M, NFormItem as u, NAvatar as R, NButton as y, NInput as d } from "naive-ui";
|
|
3
3
|
import { useI18n as D } from "vue-i18n";
|
|
4
4
|
import { personalApi as N } from "../../api/index.js";
|
|
5
5
|
import { useUserStore as L } from "../../stores/user.js";
|
|
6
|
-
import { translateError as
|
|
6
|
+
import { translateError as w } from "../../utils/error.js";
|
|
7
7
|
import P from "../../components/DictSelect/index.vue.js";
|
|
8
8
|
import T from "../../components/FileUpload/index.vue.js";
|
|
9
9
|
import j from "../../components/AppIcon.vue.js";
|
|
10
|
-
const G = { class: "avatar-field" }, ae = /* @__PURE__ */
|
|
10
|
+
const G = { class: "avatar-field" }, ae = /* @__PURE__ */ I({
|
|
11
11
|
__name: "profile",
|
|
12
12
|
setup(H) {
|
|
13
|
-
const { t: r } = D(),
|
|
13
|
+
const { t: r } = D(), c = F(), v = L(), b = s(!0), g = s(!1), p = s(!1), h = s(null), a = C({
|
|
14
14
|
account: "",
|
|
15
15
|
name: "",
|
|
16
16
|
nickname: "",
|
|
@@ -20,7 +20,7 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
|
|
|
20
20
|
avatar: null,
|
|
21
21
|
org: "",
|
|
22
22
|
position: ""
|
|
23
|
-
}),
|
|
23
|
+
}), U = {
|
|
24
24
|
phone: {
|
|
25
25
|
validator: (n, o) => !o || /^1[3-9]\d{9}$/.test(o),
|
|
26
26
|
message: () => r("profile.phoneInvalid"),
|
|
@@ -37,12 +37,12 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
|
|
|
37
37
|
const n = await N.profile();
|
|
38
38
|
a.account = n.account, a.name = n.name, a.nickname = n.nickname ?? "", a.phone = n.phone ?? "", a.email = n.email ?? "", a.gender = n.gender ?? null, a.avatar = n.avatar ?? null, a.org = n.orgName ?? "—", a.position = n.positionName ?? "—";
|
|
39
39
|
} catch (n) {
|
|
40
|
-
|
|
40
|
+
c.error(w(n));
|
|
41
41
|
} finally {
|
|
42
42
|
b.value = !1;
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
|
-
async function
|
|
45
|
+
async function x() {
|
|
46
46
|
var n;
|
|
47
47
|
try {
|
|
48
48
|
await ((n = h.value) == null ? void 0 : n.validate());
|
|
@@ -58,28 +58,31 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
|
|
|
58
58
|
email: a.email || null,
|
|
59
59
|
gender: a.gender,
|
|
60
60
|
avatar: a.avatar
|
|
61
|
-
}),
|
|
61
|
+
}), v.userInfo && (v.userInfo.name = a.name, v.userInfo.avatar = a.avatar), c.success(r("profile.saved"));
|
|
62
62
|
} catch (o) {
|
|
63
|
-
|
|
63
|
+
c.error(w(o));
|
|
64
64
|
} finally {
|
|
65
65
|
g.value = !1;
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
return (n, o) => (k(), B(e(S), {
|
|
69
|
+
class: "a-card",
|
|
69
70
|
bordered: !0,
|
|
70
71
|
title: e(r)("profile.title"),
|
|
71
|
-
style:
|
|
72
|
+
"content-style": "padding: 20px 24px",
|
|
73
|
+
style: { "max-width": "560px", width: "100%" }
|
|
72
74
|
}, {
|
|
73
75
|
default: t(() => [
|
|
74
|
-
l(e(
|
|
76
|
+
l(e(q), { show: b.value }, {
|
|
75
77
|
default: t(() => [
|
|
76
|
-
l(e(
|
|
78
|
+
l(e(M), {
|
|
77
79
|
ref_key: "formRef",
|
|
78
80
|
ref: h,
|
|
79
81
|
model: a,
|
|
80
|
-
rules:
|
|
82
|
+
rules: U,
|
|
81
83
|
"label-placement": "left",
|
|
82
|
-
"label-width": 80
|
|
84
|
+
"label-width": 80,
|
|
85
|
+
"require-mark-placement": "left"
|
|
83
86
|
}, {
|
|
84
87
|
default: t(() => [
|
|
85
88
|
l(e(u), {
|
|
@@ -87,7 +90,7 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
|
|
|
87
90
|
}, {
|
|
88
91
|
default: t(() => [
|
|
89
92
|
V("div", G, [
|
|
90
|
-
l(e(
|
|
93
|
+
l(e(R), {
|
|
91
94
|
round: "",
|
|
92
95
|
size: 48,
|
|
93
96
|
style: { "flex-shrink": "0" },
|
|
@@ -231,13 +234,16 @@ const G = { class: "avatar-field" }, ae = /* @__PURE__ */ x({
|
|
|
231
234
|
]),
|
|
232
235
|
_: 1
|
|
233
236
|
}, 8, ["label"]),
|
|
234
|
-
l(e(u), {
|
|
237
|
+
l(e(u), {
|
|
238
|
+
label: " ",
|
|
239
|
+
"show-feedback": !1
|
|
240
|
+
}, {
|
|
235
241
|
default: t(() => [
|
|
236
242
|
l(e(y), {
|
|
237
243
|
type: "primary",
|
|
238
244
|
loading: g.value,
|
|
239
245
|
disabled: !a.name.trim(),
|
|
240
|
-
onClick:
|
|
246
|
+
onClick: x
|
|
241
247
|
}, {
|
|
242
248
|
default: t(() => [
|
|
243
249
|
m(f(e(r)("common.save")), 1)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile2.vue.js","sources":["../../../src/views/personal/profile.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人资料:自己能改的字段全在这(姓名/昵称/性别/手机/邮箱/头像);机构/职位由管理员维护,只读展示。\n// 提交是全量替换语义(后端 UpdateProfileInput):整表单一把梭,别做单字段 PATCH。\n// 手机/邮箱直接改不做二次验证——内核无短信/邮件通道,管理员本可在用户管理任改,操作日志留痕(后端注释同款理由)。\nimport { onMounted, reactive, ref } from 'vue'\nimport {\n NCard,\n NForm,\n NFormItem,\n NInput,\n NButton,\n NSpin,\n NAvatar,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { personalApi } from '#/api'\nimport { useUserStore } from '#/stores/user'\nimport { translateError } from '#/utils/error'\nimport DictSelect from '#/components/DictSelect/index.vue'\nimport FileUpload from '#/components/FileUpload/index.vue'\nimport AppIcon from '#/components/AppIcon.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst user = useUserStore()\n\nconst loading = ref(true)\nconst saving = ref(false)\nconst avatarUploading = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst model = reactive({\n account: '',\n name: '',\n nickname: '',\n phone: '',\n email: '',\n gender: null as string | null,\n avatar: null as string | null,\n org: '',\n position: '',\n})\n\n// 手机/邮箱选填,填了才校验格式(与管理端 user 页同规则;后端存自由字符串)\nconst rules: FormRules = {\n phone: {\n validator: (_r, v: string) => !v || /^1[3-9]\\d{9}$/.test(v),\n message: () => t('profile.phoneInvalid'),\n trigger: ['input', 'blur'],\n },\n email: {\n validator: (_r, v: string) => !v || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(v),\n message: () => t('profile.emailInvalid'),\n trigger: ['input', 'blur'],\n },\n}\n\nconst initial = (name: string) => name.trim().charAt(0).toUpperCase() || '?'\n\nonMounted(async () => {\n try {\n const p = await personalApi.profile()\n model.account = p.account\n model.name = p.name\n model.nickname = p.nickname ?? ''\n model.phone = p.phone ?? ''\n model.email = p.email ?? ''\n model.gender = p.gender ?? null\n model.avatar = p.avatar ?? null\n // 展示名称而非 Id:雪花主键是 14 位数字,甩给用户看没有任何意义。\n // 名称由 /personal/profile 一并返回(该端点是 [ActiveSession],人人可读);机构/职位被删则回落占位符。\n model.org = p.orgName ?? '—'\n model.position = p.positionName ?? '—'\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n})\n\nasync function save() {\n try {\n await formRef.value?.validate()\n } catch {\n return // 校验失败:表单项已就地标红,不另叠 toast\n }\n saving.value = true\n try {\n await personalApi.updateProfile({\n name: model.name,\n nickname: model.nickname || null,\n phone: model.phone || null,\n email: model.email || null,\n gender: model.gender,\n avatar: model.avatar,\n })\n if (user.userInfo) {\n user.userInfo.name = model.name\n user.userInfo.avatar = model.avatar // 顶栏头像即时同步,不等下次 enterInitial\n }\n message.success(t('profile.saved'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-card :bordered=\"true\" :title=\"t('profile.title')\" style=\"max-width: 560px\">\n <n-spin :show=\"loading\">\n <n-form ref=\"formRef\" :model=\"model\" :rules=\"rules\" label-placement=\"left\" :label-width=\"80\">\n <n-form-item :label=\"t('profile.avatar')\">\n <div class=\"avatar-field\">\n <n-avatar round :size=\"48\" style=\"flex-shrink: 0\" :src=\"model.avatar || undefined\">\n <template #fallback>{{ initial(model.name) }}</template>\n <template v-if=\"!model.avatar\">{{ initial(model.name) }}</template>\n </n-avatar>\n <FileUpload\n accept=\"image/*\"\n :show-file-list=\"false\"\n @loading-change=\"v => (avatarUploading = v)\"\n @uploaded=\"o => (model.avatar = o.viewUrl ?? null)\"\n >\n <n-button size=\"small\" :loading=\"avatarUploading\" :disabled=\"avatarUploading\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"14\" /></template>\n {{ avatarUploading ? t('profile.avatarUploading') : t('profile.avatar') }}\n </n-button>\n </FileUpload>\n </div>\n </n-form-item>\n <n-form-item :label=\"t('profile.account')\">\n <n-input :value=\"model.account\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.name')\" required>\n <n-input v-model:value=\"model.name\" :placeholder=\"t('profile.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.nickname')\">\n <n-input v-model:value=\"model.nickname\" :placeholder=\"t('profile.nickname')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.gender')\">\n <DictSelect\n v-model:value=\"model.gender\"\n type-code=\"gender\"\n clearable\n :placeholder=\"t('profile.gender')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('profile.phone')\" path=\"phone\">\n <n-input v-model:value=\"model.phone\" :placeholder=\"t('profile.phone')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.email')\" path=\"email\">\n <n-input v-model:value=\"model.email\" :placeholder=\"t('profile.email')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.org')\">\n <n-input :value=\"model.org\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.position')\">\n <n-input :value=\"model.position\" disabled />\n </n-form-item>\n <n-form-item :label=\"' '\">\n <n-button type=\"primary\" :loading=\"saving\" :disabled=\"!model.name.trim()\" @click=\"save\">\n {{ t('common.save') }}\n </n-button>\n </n-form-item>\n </n-form>\n </n-spin>\n </n-card>\n</template>\n\n<style scoped>\n.avatar-field {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","user","useUserStore","loading","ref","saving","avatarUploading","formRef","model","reactive","rules","_r","v","initial","name","onMounted","p","personalApi","e","translateError","save","_a","_createBlock","_unref","NCard","_createVNode","NSpin","NForm","NFormItem","_createElementVNode","_hoisted_1","NAvatar","_createElementBlock","_Fragment","FileUpload","_cache","o","NButton","AppIcon","_createTextVNode","_toDisplayString","NInput","$event","DictSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profile2.vue.js","sources":["../../../src/views/personal/profile.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人资料:自己能改的字段全在这(姓名/昵称/性别/手机/邮箱/头像);机构/职位由管理员维护,只读展示。\n// 提交是全量替换语义(后端 UpdateProfileInput):整表单一把梭,别做单字段 PATCH。\n// 手机/邮箱直接改不做二次验证——内核无短信/邮件通道,管理员本可在用户管理任改,操作日志留痕(后端注释同款理由)。\nimport { onMounted, reactive, ref } from 'vue'\nimport {\n NCard,\n NForm,\n NFormItem,\n NInput,\n NButton,\n NSpin,\n NAvatar,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { personalApi } from '#/api'\nimport { useUserStore } from '#/stores/user'\nimport { translateError } from '#/utils/error'\nimport DictSelect from '#/components/DictSelect/index.vue'\nimport FileUpload from '#/components/FileUpload/index.vue'\nimport AppIcon from '#/components/AppIcon.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst user = useUserStore()\n\nconst loading = ref(true)\nconst saving = ref(false)\nconst avatarUploading = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst model = reactive({\n account: '',\n name: '',\n nickname: '',\n phone: '',\n email: '',\n gender: null as string | null,\n avatar: null as string | null,\n org: '',\n position: '',\n})\n\n// 手机/邮箱选填,填了才校验格式(与管理端 user 页同规则;后端存自由字符串)\nconst rules: FormRules = {\n phone: {\n validator: (_r, v: string) => !v || /^1[3-9]\\d{9}$/.test(v),\n message: () => t('profile.phoneInvalid'),\n trigger: ['input', 'blur'],\n },\n email: {\n validator: (_r, v: string) => !v || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(v),\n message: () => t('profile.emailInvalid'),\n trigger: ['input', 'blur'],\n },\n}\n\nconst initial = (name: string) => name.trim().charAt(0).toUpperCase() || '?'\n\nonMounted(async () => {\n try {\n const p = await personalApi.profile()\n model.account = p.account\n model.name = p.name\n model.nickname = p.nickname ?? ''\n model.phone = p.phone ?? ''\n model.email = p.email ?? ''\n model.gender = p.gender ?? null\n model.avatar = p.avatar ?? null\n // 展示名称而非 Id:雪花主键是 14 位数字,甩给用户看没有任何意义。\n // 名称由 /personal/profile 一并返回(该端点是 [ActiveSession],人人可读);机构/职位被删则回落占位符。\n model.org = p.orgName ?? '—'\n model.position = p.positionName ?? '—'\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n})\n\nasync function save() {\n try {\n await formRef.value?.validate()\n } catch {\n return // 校验失败:表单项已就地标红,不另叠 toast\n }\n saving.value = true\n try {\n await personalApi.updateProfile({\n name: model.name,\n nickname: model.nickname || null,\n phone: model.phone || null,\n email: model.email || null,\n gender: model.gender,\n avatar: model.avatar,\n })\n if (user.userInfo) {\n user.userInfo.name = model.name\n user.userInfo.avatar = model.avatar // 顶栏头像即时同步,不等下次 enterInitial\n }\n message.success(t('profile.saved'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-card\n class=\"a-card\"\n :bordered=\"true\"\n :title=\"t('profile.title')\"\n content-style=\"padding: 20px 24px\"\n style=\"max-width: 560px; width: 100%\"\n >\n <n-spin :show=\"loading\">\n <n-form\n ref=\"formRef\"\n :model=\"model\"\n :rules=\"rules\"\n label-placement=\"left\"\n :label-width=\"80\"\n require-mark-placement=\"left\"\n >\n <n-form-item :label=\"t('profile.avatar')\">\n <div class=\"avatar-field\">\n <n-avatar round :size=\"48\" style=\"flex-shrink: 0\" :src=\"model.avatar || undefined\">\n <template #fallback>{{ initial(model.name) }}</template>\n <template v-if=\"!model.avatar\">{{ initial(model.name) }}</template>\n </n-avatar>\n <FileUpload\n accept=\"image/*\"\n :show-file-list=\"false\"\n @loading-change=\"v => (avatarUploading = v)\"\n @uploaded=\"o => (model.avatar = o.viewUrl ?? null)\"\n >\n <n-button size=\"small\" :loading=\"avatarUploading\" :disabled=\"avatarUploading\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"14\" /></template>\n {{ avatarUploading ? t('profile.avatarUploading') : t('profile.avatar') }}\n </n-button>\n </FileUpload>\n </div>\n </n-form-item>\n <n-form-item :label=\"t('profile.account')\">\n <n-input :value=\"model.account\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.name')\" required>\n <n-input v-model:value=\"model.name\" :placeholder=\"t('profile.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.nickname')\">\n <n-input v-model:value=\"model.nickname\" :placeholder=\"t('profile.nickname')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.gender')\">\n <DictSelect\n v-model:value=\"model.gender\"\n type-code=\"gender\"\n clearable\n :placeholder=\"t('profile.gender')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('profile.phone')\" path=\"phone\">\n <n-input v-model:value=\"model.phone\" :placeholder=\"t('profile.phone')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.email')\" path=\"email\">\n <n-input v-model:value=\"model.email\" :placeholder=\"t('profile.email')\" />\n </n-form-item>\n <n-form-item :label=\"t('profile.org')\">\n <n-input :value=\"model.org\" disabled />\n </n-form-item>\n <n-form-item :label=\"t('profile.position')\">\n <n-input :value=\"model.position\" disabled />\n </n-form-item>\n <n-form-item :label=\"' '\" :show-feedback=\"false\">\n <n-button type=\"primary\" :loading=\"saving\" :disabled=\"!model.name.trim()\" @click=\"save\">\n {{ t('common.save') }}\n </n-button>\n </n-form-item>\n </n-form>\n </n-spin>\n </n-card>\n</template>\n\n<style scoped>\n.avatar-field {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","user","useUserStore","loading","ref","saving","avatarUploading","formRef","model","reactive","rules","_r","v","initial","name","onMounted","p","personalApi","e","translateError","save","_a","_createBlock","_unref","NCard","_createVNode","NSpin","NForm","NFormItem","_createElementVNode","_hoisted_1","NAvatar","_createElementBlock","_Fragment","FileUpload","_cache","o","NButton","AppIcon","_createTextVNode","_toDisplayString","NInput","$event","DictSelect"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./security2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-339c19c7"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
p as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=security.vue.js.map
|
|
@@ -1,82 +1,94 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useRouter as
|
|
3
|
-
import { NCard as g, NAlert as m,
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { defineComponent as x, computed as k, openBlock as p, createBlock as l, unref as e, withCtx as r, createElementVNode as c, createVNode as s, createTextVNode as a, toDisplayString as n, createCommentVNode as w } from "vue";
|
|
2
|
+
import { useRouter as N } from "vue-router";
|
|
3
|
+
import { NCard as g, NAlert as m, NButton as y } from "naive-ui";
|
|
4
|
+
import { Icon as f } from "@iconify/vue";
|
|
5
|
+
import { useI18n as C } from "vue-i18n";
|
|
6
|
+
import { useUserStore as b } from "../../stores/user.js";
|
|
6
7
|
import { useAuthStore as A } from "../../stores/auth.js";
|
|
7
|
-
const B = { class: "sec-desc" },
|
|
8
|
+
const B = { class: "sec" }, V = { class: "sec-desc" }, I = { class: "sec-actions" }, q = { class: "sec-note" }, U = /* @__PURE__ */ x({
|
|
8
9
|
__name: "security",
|
|
9
|
-
setup(
|
|
10
|
-
const { t } =
|
|
11
|
-
function u(
|
|
12
|
-
var
|
|
13
|
-
const
|
|
14
|
-
|
|
10
|
+
setup(D) {
|
|
11
|
+
const { t } = C(), h = N(), _ = b(), v = A(), S = k(() => v.hasPerm("GET:/api/v1/sys/config/page"));
|
|
12
|
+
function u(d) {
|
|
13
|
+
var i;
|
|
14
|
+
const o = (i = _.userInfo) == null ? void 0 : i.account;
|
|
15
|
+
h.push({
|
|
15
16
|
path: "/mfa/bind",
|
|
16
17
|
query: {
|
|
17
|
-
...
|
|
18
|
-
...
|
|
18
|
+
...o ? { account: o } : {},
|
|
19
|
+
...d === "recovery" ? { mode: "recovery" } : {}
|
|
19
20
|
}
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
|
-
return (
|
|
23
|
+
return (d, o) => (p(), l(e(g), {
|
|
24
|
+
class: "a-card",
|
|
23
25
|
bordered: !0,
|
|
24
26
|
title: e(t)("personalSecurity.title"),
|
|
25
|
-
style:
|
|
27
|
+
"content-style": "padding: 20px 24px",
|
|
28
|
+
style: { "max-width": "560px", width: "100%" }
|
|
26
29
|
}, {
|
|
27
|
-
default:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
default: o(() => [
|
|
52
|
-
a(e(y), {
|
|
30
|
+
default: r(() => [
|
|
31
|
+
c("div", B, [
|
|
32
|
+
s(e(m), {
|
|
33
|
+
type: "info",
|
|
34
|
+
bordered: !1
|
|
35
|
+
}, {
|
|
36
|
+
default: r(() => [
|
|
37
|
+
a(n(e(t)("personalSecurity.hint")), 1)
|
|
38
|
+
]),
|
|
39
|
+
_: 1
|
|
40
|
+
}),
|
|
41
|
+
S.value ? (p(), l(e(m), {
|
|
42
|
+
key: 0,
|
|
43
|
+
type: "warning",
|
|
44
|
+
bordered: !1
|
|
45
|
+
}, {
|
|
46
|
+
default: r(() => [
|
|
47
|
+
a(n(e(t)("personalSecurity.adminHint")), 1)
|
|
48
|
+
]),
|
|
49
|
+
_: 1
|
|
50
|
+
})) : w("", !0),
|
|
51
|
+
c("p", V, n(e(t)("personalSecurity.bindDesc")), 1),
|
|
52
|
+
c("div", I, [
|
|
53
|
+
s(e(y), {
|
|
53
54
|
type: "primary",
|
|
54
|
-
onClick:
|
|
55
|
+
onClick: o[0] || (o[0] = (i) => u())
|
|
55
56
|
}, {
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
icon: r(() => [
|
|
58
|
+
s(e(f), {
|
|
59
|
+
icon: "ph:shield-check",
|
|
60
|
+
width: 16
|
|
61
|
+
})
|
|
62
|
+
]),
|
|
63
|
+
default: r(() => [
|
|
64
|
+
a(" " + n(e(t)("personalSecurity.setupAuthenticator")), 1)
|
|
58
65
|
]),
|
|
59
66
|
_: 1
|
|
60
67
|
}),
|
|
61
|
-
|
|
68
|
+
s(e(y), {
|
|
62
69
|
quaternary: "",
|
|
63
|
-
onClick:
|
|
70
|
+
onClick: o[1] || (o[1] = (i) => u("recovery"))
|
|
64
71
|
}, {
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
icon: r(() => [
|
|
73
|
+
s(e(f), {
|
|
74
|
+
icon: "ph:key",
|
|
75
|
+
width: 16
|
|
76
|
+
})
|
|
77
|
+
]),
|
|
78
|
+
default: r(() => [
|
|
79
|
+
a(" " + n(e(t)("personalSecurity.useRecovery")), 1)
|
|
67
80
|
]),
|
|
68
81
|
_: 1
|
|
69
82
|
})
|
|
70
83
|
]),
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
d("p", V, n(e(t)("personalSecurity.note")), 1)
|
|
84
|
+
c("div", q, n(e(t)("personalSecurity.note")), 1)
|
|
85
|
+
])
|
|
74
86
|
]),
|
|
75
87
|
_: 1
|
|
76
88
|
}, 8, ["title"]));
|
|
77
89
|
}
|
|
78
90
|
});
|
|
79
91
|
export {
|
|
80
|
-
|
|
92
|
+
U as default
|
|
81
93
|
};
|
|
82
94
|
//# sourceMappingURL=security2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security2.vue.js","sources":["../../../src/views/personal/security.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人安全:TOTP
|
|
1
|
+
{"version":3,"file":"security2.vue.js","sources":["../../../src/views/personal/security.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 个人安全:TOTP 自助绑定/恢复入口。不进业务菜单,顶栏用户下拉进入。\n// 管理员配置路径类文案(系统配置/安全策略)只给能进配置的人看,普通用户不暴露运维指引。\nimport { computed } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NCard, NButton, NAlert } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst user = useUserStore()\nconst auth = useAuthStore()\n\n// hasPerm 对超管恒 true;普通用户须具备系统配置读权限才看运维提示。\nconst showAdminHint = computed(() => auth.hasPerm('GET:/api/v1/sys/config/page'))\n\nfunction goBind(mode?: 'recovery') {\n const account = user.userInfo?.account\n router.push({\n path: '/mfa/bind',\n query: {\n ...(account ? { account } : {}),\n ...(mode === 'recovery' ? { mode: 'recovery' } : {}),\n },\n })\n}\n</script>\n\n<template>\n <n-card\n class=\"a-card\"\n :bordered=\"true\"\n :title=\"t('personalSecurity.title')\"\n content-style=\"padding: 20px 24px\"\n style=\"max-width: 560px; width: 100%\"\n >\n <div class=\"sec\">\n <n-alert type=\"info\" :bordered=\"false\">\n {{ t('personalSecurity.hint') }}\n </n-alert>\n <n-alert v-if=\"showAdminHint\" type=\"warning\" :bordered=\"false\">\n {{ t('personalSecurity.adminHint') }}\n </n-alert>\n <p class=\"sec-desc\">{{ t('personalSecurity.bindDesc') }}</p>\n <div class=\"sec-actions\">\n <n-button type=\"primary\" @click=\"goBind()\">\n <template #icon><Icon icon=\"ph:shield-check\" :width=\"16\" /></template>\n {{ t('personalSecurity.setupAuthenticator') }}\n </n-button>\n <n-button quaternary @click=\"goBind('recovery')\">\n <template #icon><Icon icon=\"ph:key\" :width=\"16\" /></template>\n {{ t('personalSecurity.useRecovery') }}\n </n-button>\n </div>\n <div class=\"sec-note\">{{ t('personalSecurity.note') }}</div>\n </div>\n </n-card>\n</template>\n\n<style scoped>\n.sec {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.sec-desc {\n margin: 4px 0 0;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-2);\n}\n.sec-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n.sec-note {\n font-size: 13px;\n line-height: 1.6;\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","router","useRouter","user","useUserStore","auth","useAuthStore","showAdminHint","computed","goBind","mode","account","_a","_createBlock","_unref","NCard","_createElementVNode","_hoisted_1","_createVNode","NAlert","_hoisted_2","_toDisplayString","_hoisted_3","NButton","Icon","_createTextVNode","_hoisted_4"],"mappings":";;;;;;;;;;AAWA,UAAM,EAAE,EAAA,IAAMA,EAAA,GACRC,IAASC,EAAA,GACTC,IAAOC,EAAA,GACPC,IAAOC,EAAA,GAGPC,IAAgBC,EAAS,MAAMH,EAAK,QAAQ,6BAA6B,CAAC;AAEhF,aAASI,EAAOC,GAAmB;;AACjC,YAAMC,KAAUC,IAAAT,EAAK,aAAL,gBAAAS,EAAe;AAC/B,MAAAX,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,UACL,GAAIU,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAAA,UAC5B,GAAID,MAAS,aAAa,EAAE,MAAM,WAAA,IAAe,CAAA;AAAA,QAAC;AAAA,MACpD,CACD;AAAA,IACH;2BAIEG,EA2BSC,EAAAC,CAAA,GAAA;AAAA,MA1BP,OAAM;AAAA,MACL,UAAU;AAAA,MACV,OAAOD,EAAA,CAAA,EAAC,wBAAA;AAAA,MACT,iBAAc;AAAA,MACd,OAAA,EAAA,aAAA,SAAA,OAAA,OAAA;AAAA,IAAA;iBAEA,MAmBM;AAAA,QAnBNE,EAmBM,OAnBNC,GAmBM;AAAA,UAlBJC,EAEUJ,EAAAK,CAAA,GAAA;AAAA,YAFD,MAAK;AAAA,YAAQ,UAAU;AAAA,UAAA;uBAC9B,MAAgC;AAAA,kBAA7BL,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAESP,EAAA,cAAfM,EAEUC,EAAAK,CAAA,GAAA;AAAA;YAFoB,MAAK;AAAA,YAAW,UAAU;AAAA,UAAA;uBACtD,MAAqC;AAAA,kBAAlCL,EAAA,CAAA,EAAC,4BAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAENE,EAA4D,KAA5DI,GAA4DC,EAArCP,EAAA,CAAA,EAAC,2BAAA,CAAA,GAAA,CAAA;AAAA,UACxBE,EASM,OATNM,GASM;AAAA,YARJJ,EAGWJ,EAAAS,CAAA,GAAA;AAAA,cAHD,MAAK;AAAA,cAAW,gCAAOd,EAAA;AAAA,YAAM;cAC1B,QAAK,MAA2C;AAAA,gBAA3CS,EAA2CJ,EAAAU,CAAA,GAAA;AAAA,kBAArC,MAAK;AAAA,kBAAmB,OAAO;AAAA,gBAAA;;yBAAiB,MACtE;AAAA,gBADsEC,EAAA,QACnEX,EAAA,CAAA,EAAC,qCAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAENI,EAGWJ,EAAAS,CAAA,GAAA;AAAA,cAHD,YAAA;AAAA,cAAY,gCAAOd,EAAM,UAAA;AAAA,YAAA;cACtB,QAAK,MAAkC;AAAA,gBAAlCS,EAAkCJ,EAAAU,CAAA,GAAA;AAAA,kBAA5B,MAAK;AAAA,kBAAU,OAAO;AAAA,gBAAA;;yBAAiB,MAC7D;AAAA,gBAD6DC,EAAA,QAC1DX,EAAA,CAAA,EAAC,8BAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAGRE,EAA4D,OAA5DU,GAA4DL,EAAnCP,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,QAAA;;;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./sessions2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import s from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const a = /* @__PURE__ */ s(o, [["__scopeId", "data-v-6e7e3dea"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
a as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=sessions.vue.js.map
|
|
@@ -1,101 +1,106 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useMessage as
|
|
1
|
+
import { defineComponent as k, ref as c, onMounted as y, openBlock as _, createElementBlock as w, createVNode as m, unref as r, withCtx as T, h as t } from "vue";
|
|
2
|
+
import { useMessage as v, NTag as x, NButton as A } from "naive-ui";
|
|
3
3
|
import { useI18n as b } from "vue-i18n";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
4
|
+
import { SmartTable as C } from "smart-naive-table";
|
|
5
|
+
import { personalApi as d } from "../../api/index.js";
|
|
6
|
+
import { uaSummary as B } from "../../utils/ua.js";
|
|
7
|
+
import { useConfirm as I } from "../../composables/useConfirm.js";
|
|
8
|
+
import { translateError as E } from "../../utils/error.js";
|
|
9
|
+
import { fmtDateTime as p } from "../../utils/format.js";
|
|
10
|
+
import { TABLE_MIN_ROW_HEIGHT as M, TABLE_TOOLBAR as N } from "../../utils/tableToolbar.js";
|
|
11
|
+
import S from "../../components/TableTotal/index.vue.js";
|
|
12
|
+
import { deriveHeaderFilters as H } from "../../utils/tableFilter.js";
|
|
13
|
+
const L = { class: "fill-page" }, Q = /* @__PURE__ */ k({
|
|
10
14
|
__name: "sessions",
|
|
11
|
-
setup(
|
|
12
|
-
const { t:
|
|
13
|
-
async function
|
|
14
|
-
|
|
15
|
+
setup(O) {
|
|
16
|
+
const { t: o } = b(), u = v(), { confirm: f } = I(), i = c(!0), s = c([]);
|
|
17
|
+
async function n() {
|
|
18
|
+
i.value = !0;
|
|
15
19
|
try {
|
|
16
|
-
|
|
20
|
+
s.value = await d.sessions();
|
|
17
21
|
} catch (e) {
|
|
18
|
-
|
|
22
|
+
u.error(E(e));
|
|
19
23
|
} finally {
|
|
20
|
-
|
|
24
|
+
i.value = !1;
|
|
21
25
|
}
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
|
|
27
|
+
y(n);
|
|
28
|
+
function g(e) {
|
|
29
|
+
f({
|
|
26
30
|
type: "warning",
|
|
27
|
-
content:
|
|
28
|
-
action: () =>
|
|
29
|
-
successMsg:
|
|
30
|
-
}).then((
|
|
31
|
-
|
|
31
|
+
content: o("session.kickMineConfirm"),
|
|
32
|
+
action: () => d.kickSession(e.sessionId),
|
|
33
|
+
successMsg: o("session.kicked")
|
|
34
|
+
}).then((l) => {
|
|
35
|
+
l && n();
|
|
32
36
|
});
|
|
33
37
|
}
|
|
34
|
-
const
|
|
38
|
+
const a = [
|
|
39
|
+
{ type: "index", title: () => o("common.rowNo"), width: 64, align: "center" },
|
|
35
40
|
{
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
render: (e
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
key: "device",
|
|
44
|
-
title: () => s("session.device"),
|
|
45
|
-
render: (e) => i("div", { class: "device-cell" }, [
|
|
46
|
-
i("span", M(e.userAgent)),
|
|
47
|
-
e.isCurrent ? i(T, { type: "success", size: "small", bordered: !1 }, () => s("session.current")) : null
|
|
41
|
+
// 搜索按原始 UA 字符串「包含」求值(输入 Chrome / Windows 都能命中);单元格显示解析后的「浏览器 · 系统」
|
|
42
|
+
key: "userAgent",
|
|
43
|
+
title: () => o("session.device"),
|
|
44
|
+
search: {},
|
|
45
|
+
render: (e) => t("div", { class: "device-cell" }, [
|
|
46
|
+
t("span", B(e.userAgent)),
|
|
47
|
+
e.isCurrent ? t(x, { type: "success", size: "small", bordered: !1 }, () => o("session.current")) : null
|
|
48
48
|
])
|
|
49
49
|
},
|
|
50
|
-
{ key: "ip", title: () =>
|
|
50
|
+
{ key: "ip", title: () => o("session.ip"), width: 140, search: {}, render: (e) => e.ip || "—" },
|
|
51
51
|
{
|
|
52
52
|
key: "loginTime",
|
|
53
|
-
title: () =>
|
|
53
|
+
title: () => o("session.loginTime"),
|
|
54
54
|
width: 180,
|
|
55
|
-
render: (e) =>
|
|
55
|
+
render: (e) => p(e.loginTime)
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
key: "expiresAt",
|
|
59
|
-
title: () =>
|
|
59
|
+
title: () => o("session.expiresAt"),
|
|
60
60
|
width: 180,
|
|
61
|
-
render: (e) =>
|
|
61
|
+
render: (e) => p(e.expiresAt)
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
key: "op",
|
|
65
|
-
title: () =>
|
|
65
|
+
title: () => o("common.operation"),
|
|
66
66
|
width: 110,
|
|
67
|
-
|
|
67
|
+
fixed: "right",
|
|
68
|
+
hideInSetting: !0,
|
|
69
|
+
render: (e) => t(
|
|
68
70
|
A,
|
|
69
71
|
{
|
|
70
72
|
size: "small",
|
|
71
73
|
quaternary: !0,
|
|
72
74
|
type: "error",
|
|
73
75
|
disabled: e.isCurrent,
|
|
74
|
-
onClick: () =>
|
|
76
|
+
onClick: () => g(e)
|
|
75
77
|
},
|
|
76
|
-
() =>
|
|
78
|
+
() => o("session.kick")
|
|
77
79
|
)
|
|
78
80
|
}
|
|
79
81
|
];
|
|
80
|
-
return (e,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
82
|
+
return H(a), (e, l) => (_(), w("div", L, [
|
|
83
|
+
m(r(C), {
|
|
84
|
+
columns: a,
|
|
85
|
+
data: s.value,
|
|
86
|
+
"row-key": "sessionId",
|
|
87
|
+
loading: i.value,
|
|
88
|
+
toolbar: r(N),
|
|
89
|
+
search: { container: "table" },
|
|
90
|
+
"fill-height": "",
|
|
91
|
+
"min-row-height": r(M),
|
|
92
|
+
"card-on-narrow": "",
|
|
93
|
+
"storage-key": "personal-sessions"
|
|
94
|
+
}, {
|
|
95
|
+
"pagination-prefix": T(({ itemCount: h }) => [
|
|
96
|
+
m(S, { count: h }, null, 8, ["count"])
|
|
97
|
+
]),
|
|
98
|
+
_: 1
|
|
99
|
+
}, 8, ["data", "loading", "toolbar", "min-row-height"])
|
|
100
|
+
]));
|
|
96
101
|
}
|
|
97
102
|
});
|
|
98
103
|
export {
|
|
99
|
-
|
|
104
|
+
Q as default
|
|
100
105
|
};
|
|
101
106
|
//# sourceMappingURL=sessions2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions2.vue.js","sources":["../../../src/views/personal/sessions.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 我的会话(个人视角的\"登录设备\"):[ActiveSession] 人人可用,静态路由不进菜单(理由同 notice)。\n// 数据量受会话并发上限约束(个位数)→
|
|
1
|
+
{"version":3,"file":"sessions2.vue.js","sources":["../../../src/views/personal/sessions.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 我的会话(个人视角的\"登录设备\"):[ActiveSession] 人人可用,静态路由不进菜单(理由同 notice)。\n// 数据量受会话并发上限约束(个位数)→ onMounted 拉一次,交给 SmartTable 的静态数据模式\n// (前端分页 / 前端求值搜索 / 窄档卡片列表都是它内置的)。\n// 踢当前设备置灰:那等于自杀,请走\"退出登录\";管理端全量视角在 system/session。\nimport { h, onMounted, ref } from 'vue'\nimport { NButton, NTag, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { personalApi } from '#/api'\nimport type { MySessionItem } from '#/types/api'\nimport { uaSummary } from '#/utils/ua'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateError } from '#/utils/error'\nimport { fmtDateTime } from '#/utils/format'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\n\nimport { deriveHeaderFilters } from '#/utils/tableFilter'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\n\nconst loading = ref(true)\nconst rows = ref<MySessionItem[]>([])\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await personalApi.sessions()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\nfunction kick(r: MySessionItem) {\n confirm({\n type: 'warning',\n content: t('session.kickMineConfirm'),\n action: () => personalApi.kickSession(r.sessionId),\n successMsg: t('session.kicked'),\n }).then(ok => {\n if (ok) load()\n })\n}\n\nconst columns: SmartTableColumn<MySessionItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n // 搜索按原始 UA 字符串「包含」求值(输入 Chrome / Windows 都能命中);单元格显示解析后的「浏览器 · 系统」\n key: 'userAgent',\n title: () => t('session.device'),\n search: {},\n render: r =>\n h('div', { class: 'device-cell' }, [\n h('span', uaSummary(r.userAgent)),\n r.isCurrent\n ? h(NTag, { type: 'success', size: 'small', bordered: false }, () => t('session.current'))\n : null,\n ]),\n },\n { key: 'ip', title: () => t('session.ip'), width: 140, search: {}, render: r => r.ip || '—' },\n {\n key: 'loginTime',\n title: () => t('session.loginTime'),\n width: 180,\n render: r => fmtDateTime(r.loginTime),\n },\n {\n key: 'expiresAt',\n title: () => t('session.expiresAt'),\n width: 180,\n render: r => fmtDateTime(r.expiresAt),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 110,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'error',\n disabled: r.isCurrent,\n onClick: () => kick(r),\n },\n () => t('session.kick'),\n ),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- .fill-page:高度链在 styles/layout.css,卡片吃满内容区,滚动只发生在表体里。 -->\n <div class=\"fill-page\">\n <SmartTable\n :columns=\"columns\"\n :data=\"rows\"\n row-key=\"sessionId\"\n :loading=\"loading\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"personal-sessions\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n </div>\n</template>\n\n<style scoped>\n:deep(.device-cell) {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","loading","ref","rows","load","personalApi","translateError","onMounted","kick","r","ok","columns","h","uaSummary","NTag","fmtDateTime","NButton","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_withCtx","itemCount","TableTotal"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./ProviderCard2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import r from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-a5f75b1c"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
m as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=ProviderCard.vue.js.map
|