smart-admin-web 10.15.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 +1 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +39 -5
- package/dist/assets/icons/ph-subset.json.js +5 -5
- 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/TableTotal/index.vue.d.ts +6 -0
- 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/useModule.js +39 -29
- package/dist/composables/useModule.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 +15 -0
- package/dist/composables/useSite.js +16 -14
- 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 +219 -205
- 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/loginHero.d.ts +2 -2
- package/dist/lib/loginHero.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- 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 +221 -15
- package/dist/locales/en-US.js +230 -21
- 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 +221 -15
- package/dist/locales/zh-CN.js +238 -28
- 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 +8 -8
- 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.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.js +3 -3
- package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
- 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 +2 -2
- package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/BrandSection.vue.js +2 -2
- package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgRow.vue.js +1 -1
- package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
- package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +2 -2
- package/dist/views/system/config/components/JobSection2.vue.js +46 -44
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/LoginMock.vue.js +3 -3
- package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
- package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
- package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
- package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
- package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
- package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
- package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
- package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
- package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
- package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
- package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/UploadSection.vue.js +2 -2
- package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
- 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 +2 -2
- package/dist/views/system/config/draft.js.map +1 -1
- package/dist/views/system/config/groups.d.ts +4 -1
- package/dist/views/system/config/groups.js +54 -49
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +3 -2
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +173 -148
- 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/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 +3 -5
- 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.d.ts +0 -16
- 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.d.ts +0 -3
- 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 -65
- package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
- 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/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/WatermarkSection.vue.d.ts} +0 -0
|
@@ -1,20 +1,35 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import { useConfirm as
|
|
10
|
-
import { logApi as
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
1
|
+
import { defineComponent as j, ref as m, computed as b, h as d, resolveDirective as K, openBlock as f, createElementBlock as z, Fragment as Q, createVNode as r, unref as t, withCtx as a, withDirectives as X, createBlock as _, createTextVNode as k, toDisplayString as i, normalizeStyle as Y, normalizeClass as Z, createElementVNode as c, createCommentVNode as O } from "vue";
|
|
2
|
+
import { useElementSize as ee } from "@vueuse/core";
|
|
3
|
+
import { useMessage as te, NButton as D, NDrawer as le, NDrawerContent as oe, NDescriptions as ae, NDescriptionsItem as n, NTag as re } from "naive-ui";
|
|
4
|
+
import { useI18n as se } from "vue-i18n";
|
|
5
|
+
import { SmartTable as ie } from "smart-naive-table";
|
|
6
|
+
import ne from "../../../../components/AppIcon.vue.js";
|
|
7
|
+
import ce from "../../../../components/CodeBlock/index.vue.js";
|
|
8
|
+
import ue from "../../../../components/ExportColumnsModal/index.vue.js";
|
|
9
|
+
import { useConfirm as pe } from "../../../../composables/useConfirm.js";
|
|
10
|
+
import { logApi as C, userApi as me } from "../../../../api/index.js";
|
|
11
|
+
import { useAuthStore as de } from "../../../../stores/auth.js";
|
|
12
|
+
import { translateError as I } from "../../../../utils/error.js";
|
|
13
|
+
import { createFlatFilterSerializer as fe, SEARCH_ACTIONS as g, deriveHeaderFilters as he, flatSearchOf as ge, loadWithinServerMax as ve } from "../../../../utils/tableFilter.js";
|
|
14
|
+
import { TABLE_TOOLBAR as ye, TABLE_MIN_ROW_HEIGHT as be } from "../../../../utils/tableToolbar.js";
|
|
15
|
+
import _e from "../../../../components/TableTotal/index.vue.js";
|
|
16
|
+
import { operatorText as A, fmtDateTime as B } from "../../../../utils/format.js";
|
|
17
|
+
import { triggerBlobDownload as ke } from "../../../../utils/download.js";
|
|
18
|
+
const we = { class: "break" }, xe = { class: "mono break" }, Te = { class: "num" }, Ce = { class: "exception" }, Ne = { class: "num" }, Ee = { class: "mono" }, Se = { class: "muted break" }, Me = { class: "num" }, ze = { key: 1 }, Ke = /* @__PURE__ */ j({
|
|
15
19
|
__name: "index",
|
|
16
|
-
setup(
|
|
17
|
-
const { t: e } =
|
|
20
|
+
setup(Oe) {
|
|
21
|
+
const { t: e } = se(), w = te(), { confirm: R } = pe(), H = de(), v = m(), y = m(!1), x = m(!1), L = b(
|
|
22
|
+
() => {
|
|
23
|
+
var l;
|
|
24
|
+
return (l = v.value) == null ? void 0 : l.$el;
|
|
25
|
+
}
|
|
26
|
+
), { width: N } = ee(L), p = b(() => N.value > 0 && N.value < 600), $ = b(
|
|
27
|
+
() => H.hasPerm("GET:/api/v1/sys/log/op/export") ? [{ label: e("export.button"), key: "export" }] : []
|
|
28
|
+
), F = b(() => ({ ...ye, more: $.value }));
|
|
29
|
+
function J(l) {
|
|
30
|
+
l === "export" && (y.value = !0);
|
|
31
|
+
}
|
|
32
|
+
const P = [
|
|
18
33
|
{ key: "Title", title: e("log.opName") },
|
|
19
34
|
{ key: "HttpMethod", title: e("log.method") },
|
|
20
35
|
{ key: "Path", title: e("log.path") },
|
|
@@ -26,70 +41,95 @@ const Y = { class: "exception" }, Z = { key: 1 }, ge = /* @__PURE__ */ P({
|
|
|
26
41
|
{ key: "CreateTime", title: e("common.createTime") },
|
|
27
42
|
{ key: "ExceptionMessage", title: e("log.exceptionMessage"), defaultSelected: !1 }
|
|
28
43
|
];
|
|
29
|
-
async function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
v.value = !0;
|
|
44
|
+
async function V(l) {
|
|
45
|
+
const o = ge(v.value, E);
|
|
46
|
+
x.value = !0;
|
|
33
47
|
try {
|
|
34
|
-
const
|
|
48
|
+
const h = await C.opExport({
|
|
35
49
|
title: o.title || void 0,
|
|
36
50
|
success: o.success,
|
|
37
51
|
operatorId: o.operatorId != null ? Number(o.operatorId) : void 0,
|
|
38
52
|
path: o.path || void 0,
|
|
39
53
|
createTime: o.createTime ?? null,
|
|
40
|
-
columns:
|
|
54
|
+
columns: l.join(",")
|
|
41
55
|
});
|
|
42
|
-
|
|
43
|
-
} catch (
|
|
44
|
-
|
|
56
|
+
ke(h, e("logOp.fileName")), y.value = !1, w.success(e("export.done"));
|
|
57
|
+
} catch (h) {
|
|
58
|
+
w.error(I(h));
|
|
45
59
|
} finally {
|
|
46
|
-
|
|
60
|
+
x.value = !1;
|
|
47
61
|
}
|
|
48
62
|
}
|
|
49
|
-
const
|
|
63
|
+
const E = fe({ ranges: ["createTime"] }), S = m([]);
|
|
64
|
+
async function W() {
|
|
65
|
+
try {
|
|
66
|
+
const { items: l } = await ve(me.page, 1e3);
|
|
67
|
+
S.value = l.map((o) => ({ label: `${o.name}(${o.account})`, value: o.id }));
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
W();
|
|
72
|
+
const M = [
|
|
50
73
|
{ type: "index", title: () => e("common.rowNo"), width: 64, align: "center" },
|
|
51
|
-
{ key: "title", title: () => e("log.opName"), search:
|
|
74
|
+
{ key: "title", title: () => e("log.opName"), search: { actions: g.fuzzy } },
|
|
52
75
|
{ key: "httpMethod", title: () => e("log.method"), width: 90 },
|
|
53
|
-
{
|
|
76
|
+
{
|
|
77
|
+
key: "path",
|
|
78
|
+
title: () => e("log.path"),
|
|
79
|
+
ellipsis: { tooltip: !0 },
|
|
80
|
+
search: { actions: g.fuzzy },
|
|
81
|
+
render: (l) => d("span", { class: "mono muted" }, l.path)
|
|
82
|
+
},
|
|
54
83
|
{
|
|
55
84
|
key: "success",
|
|
56
85
|
title: () => e("log.result"),
|
|
57
86
|
tag: !0,
|
|
58
|
-
search:
|
|
87
|
+
search: { actions: g.exact },
|
|
59
88
|
options: [
|
|
60
89
|
{ label: () => e("log.success"), value: !0, tagType: "success" },
|
|
61
90
|
{ label: () => e("log.failed"), value: !1, tagType: "error" }
|
|
62
91
|
]
|
|
63
92
|
},
|
|
64
|
-
{
|
|
93
|
+
{
|
|
94
|
+
key: "resultCode",
|
|
95
|
+
title: () => e("log.resultCode"),
|
|
96
|
+
width: 100,
|
|
97
|
+
render: (l) => d("span", { class: "num" }, String(l.resultCode))
|
|
98
|
+
},
|
|
65
99
|
{
|
|
66
100
|
key: "operator",
|
|
67
101
|
title: () => e("log.operator"),
|
|
68
102
|
width: 120,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
103
|
+
ellipsis: { tooltip: !0 },
|
|
104
|
+
render: (l) => A(l)
|
|
105
|
+
},
|
|
106
|
+
// 操作人搜索项:日志只存 OperatorId(姓名是读取时回填的),按人筛必须是精确 Id(后端 OperatorId ==)。
|
|
107
|
+
// 只作搜索项,不进表格也不进列设置;展示列是上面的 operator。
|
|
108
|
+
{
|
|
109
|
+
key: "operatorId",
|
|
110
|
+
title: () => e("log.operator"),
|
|
111
|
+
hideInTable: !0,
|
|
112
|
+
options: S,
|
|
113
|
+
search: { actions: g.exact, props: { clearable: !0, filterable: !0 } }
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
key: "elapsedMs",
|
|
117
|
+
title: () => e("log.elapsed"),
|
|
118
|
+
width: 100,
|
|
119
|
+
render: (l) => d("span", { class: "num" }, `${l.elapsedMs} ms`)
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
key: "ip",
|
|
123
|
+
title: () => e("log.ip"),
|
|
124
|
+
render: (l) => d("span", { class: "mono muted" }, l.ip || "—")
|
|
83
125
|
},
|
|
84
|
-
{ key: "elapsedMs", title: () => e("log.elapsed"), width: 100, render: (a) => `${a.elapsedMs} ms` },
|
|
85
|
-
{ key: "ip", title: () => e("log.ip"), render: (a) => a.ip || "—" },
|
|
86
126
|
// 时间范围是审计最常用的一刀("上周三下午谁删了那批数据");daterange 回传 ['YYYY-MM-DD','YYYY-MM-DD'],
|
|
87
127
|
// api 层拆成 StartTime/EndTime 并把结束日补到 23:59:59。
|
|
88
128
|
{
|
|
89
129
|
key: "createTime",
|
|
90
130
|
title: () => e("common.createTime"),
|
|
91
|
-
|
|
92
|
-
search: { type: "daterange" }
|
|
131
|
+
render: (l) => d("span", { class: "num muted", style: "white-space: nowrap" }, B(l.createTime)),
|
|
132
|
+
search: { type: "daterange", actions: g.dayRange }
|
|
93
133
|
},
|
|
94
134
|
{
|
|
95
135
|
key: "op",
|
|
@@ -97,236 +137,234 @@ const Y = { class: "exception" }, Z = { key: 1 }, ge = /* @__PURE__ */ P({
|
|
|
97
137
|
width: 90,
|
|
98
138
|
fixed: "right",
|
|
99
139
|
hideInSetting: !0,
|
|
100
|
-
render: (
|
|
101
|
-
|
|
102
|
-
{ size: "small", quaternary: !0, type: "primary", onClick: () =>
|
|
140
|
+
render: (l) => d(
|
|
141
|
+
D,
|
|
142
|
+
{ size: "small", quaternary: !0, type: "primary", onClick: () => G(l) },
|
|
103
143
|
() => e("log.detail")
|
|
104
144
|
)
|
|
105
145
|
}
|
|
106
|
-
]
|
|
107
|
-
|
|
108
|
-
|
|
146
|
+
];
|
|
147
|
+
he(M);
|
|
148
|
+
const T = m(!1), s = m(null);
|
|
149
|
+
function G(l) {
|
|
150
|
+
s.value = l, T.value = !0;
|
|
109
151
|
}
|
|
110
|
-
function
|
|
152
|
+
function U(l) {
|
|
111
153
|
try {
|
|
112
|
-
return JSON.stringify(JSON.parse(
|
|
154
|
+
return JSON.stringify(JSON.parse(l), null, 2);
|
|
113
155
|
} catch {
|
|
114
|
-
return
|
|
156
|
+
return l;
|
|
115
157
|
}
|
|
116
158
|
}
|
|
117
|
-
function
|
|
118
|
-
|
|
159
|
+
function q() {
|
|
160
|
+
R({
|
|
119
161
|
type: "error",
|
|
120
162
|
content: e("log.clearOpConfirm"),
|
|
121
|
-
action: () =>
|
|
163
|
+
action: () => C.opClear(),
|
|
122
164
|
successMsg: e("log.cleared")
|
|
123
|
-
}).then((
|
|
165
|
+
}).then((l) => {
|
|
124
166
|
var o;
|
|
125
|
-
|
|
167
|
+
l && ((o = v.value) == null || o.refresh());
|
|
126
168
|
});
|
|
127
169
|
}
|
|
128
|
-
return (
|
|
129
|
-
const
|
|
130
|
-
return
|
|
131
|
-
r(t(
|
|
132
|
-
"default-page-size": 100,
|
|
170
|
+
return (l, o) => {
|
|
171
|
+
const h = K("auth");
|
|
172
|
+
return f(), z(Q, null, [
|
|
173
|
+
r(t(ie), {
|
|
133
174
|
ref_key: "tableRef",
|
|
134
|
-
ref:
|
|
135
|
-
columns:
|
|
136
|
-
fetcher: t(
|
|
137
|
-
|
|
138
|
-
"
|
|
175
|
+
ref: v,
|
|
176
|
+
columns: M,
|
|
177
|
+
fetcher: t(C).opPage,
|
|
178
|
+
search: { container: "table" },
|
|
179
|
+
"filter-serializer": t(E),
|
|
180
|
+
toolbar: F.value,
|
|
181
|
+
"fill-height": "",
|
|
182
|
+
"min-row-height": t(be),
|
|
183
|
+
"card-on-narrow": "",
|
|
139
184
|
"storage-key": "sys-log-op",
|
|
140
|
-
|
|
185
|
+
onMoreSelect: J,
|
|
186
|
+
onError: o[0] || (o[0] = (u) => t(w).error(t(I)(u)))
|
|
141
187
|
}, {
|
|
142
|
-
|
|
143
|
-
|
|
188
|
+
"pagination-prefix": a(({ itemCount: u }) => [
|
|
189
|
+
r(_e, { count: u }, null, 8, ["count"])
|
|
190
|
+
]),
|
|
191
|
+
"toolbar-right": a(() => [
|
|
192
|
+
X((f(), _(t(D), {
|
|
144
193
|
type: "error",
|
|
145
194
|
secondary: "",
|
|
146
|
-
onClick:
|
|
195
|
+
onClick: q
|
|
147
196
|
}, {
|
|
148
|
-
icon:
|
|
149
|
-
r(
|
|
197
|
+
icon: a(() => [
|
|
198
|
+
r(ne, {
|
|
150
199
|
icon: "ph:trash",
|
|
151
200
|
size: 16
|
|
152
201
|
})
|
|
153
202
|
]),
|
|
154
|
-
default:
|
|
155
|
-
|
|
156
|
-
]),
|
|
157
|
-
_: 1
|
|
158
|
-
})), [
|
|
159
|
-
[c, "DELETE:/api/v1/sys/log/op"]
|
|
160
|
-
]),
|
|
161
|
-
x((d(), g(t(k), {
|
|
162
|
-
onClick: o[0] || (o[0] = (n) => f.value = !0)
|
|
163
|
-
}, {
|
|
164
|
-
icon: l(() => [
|
|
165
|
-
r(T, {
|
|
166
|
-
icon: "ph:download-simple",
|
|
167
|
-
size: 16
|
|
168
|
-
})
|
|
169
|
-
]),
|
|
170
|
-
default: l(() => [
|
|
171
|
-
p(" " + i(t(e)("export.button")), 1)
|
|
203
|
+
default: a(() => [
|
|
204
|
+
k(" " + i(t(e)("log.clear")), 1)
|
|
172
205
|
]),
|
|
173
206
|
_: 1
|
|
174
207
|
})), [
|
|
175
|
-
[
|
|
208
|
+
[h, "DELETE:/api/v1/sys/log/op"]
|
|
176
209
|
])
|
|
177
210
|
]),
|
|
178
211
|
_: 1
|
|
179
|
-
}, 8, ["fetcher"]),
|
|
180
|
-
r(
|
|
181
|
-
show:
|
|
182
|
-
"onUpdate:show": o[
|
|
183
|
-
columns:
|
|
184
|
-
loading:
|
|
185
|
-
onConfirm:
|
|
212
|
+
}, 8, ["fetcher", "filter-serializer", "toolbar", "min-row-height"]),
|
|
213
|
+
r(ue, {
|
|
214
|
+
show: y.value,
|
|
215
|
+
"onUpdate:show": o[1] || (o[1] = (u) => y.value = u),
|
|
216
|
+
columns: P,
|
|
217
|
+
loading: x.value,
|
|
218
|
+
onConfirm: V
|
|
186
219
|
}, null, 8, ["show", "loading"]),
|
|
187
|
-
r(t(
|
|
188
|
-
show:
|
|
189
|
-
"onUpdate:show": o[
|
|
190
|
-
|
|
191
|
-
|
|
220
|
+
r(t(le), {
|
|
221
|
+
show: T.value,
|
|
222
|
+
"onUpdate:show": o[2] || (o[2] = (u) => T.value = u),
|
|
223
|
+
placement: p.value ? "bottom" : "right",
|
|
224
|
+
width: p.value ? void 0 : "min(560px, 100vw)",
|
|
225
|
+
height: p.value ? "auto" : void 0,
|
|
226
|
+
class: Z(p.value ? "st-sheet" : ""),
|
|
227
|
+
style: Y(p.value ? "max-height: 85vh" : "")
|
|
192
228
|
}, {
|
|
193
|
-
default:
|
|
194
|
-
r(t(
|
|
229
|
+
default: a(() => [
|
|
230
|
+
r(t(oe), {
|
|
195
231
|
title: t(e)("log.detail"),
|
|
196
|
-
closable: ""
|
|
232
|
+
closable: "",
|
|
233
|
+
"native-scrollbar": p.value
|
|
197
234
|
}, {
|
|
198
|
-
default:
|
|
199
|
-
s.value ? (
|
|
235
|
+
default: a(() => [
|
|
236
|
+
s.value ? (f(), _(t(ae), {
|
|
200
237
|
key: 0,
|
|
201
238
|
"label-placement": "left",
|
|
202
239
|
column: 1,
|
|
203
240
|
bordered: "",
|
|
204
|
-
size: "small"
|
|
241
|
+
size: "small",
|
|
242
|
+
"label-style": "width: 96px"
|
|
205
243
|
}, {
|
|
206
|
-
default:
|
|
207
|
-
r(t(
|
|
244
|
+
default: a(() => [
|
|
245
|
+
r(t(n), {
|
|
208
246
|
label: t(e)("log.opName")
|
|
209
247
|
}, {
|
|
210
|
-
default:
|
|
211
|
-
|
|
248
|
+
default: a(() => [
|
|
249
|
+
c("span", we, i(s.value.title), 1)
|
|
212
250
|
]),
|
|
213
251
|
_: 1
|
|
214
252
|
}, 8, ["label"]),
|
|
215
|
-
r(t(
|
|
253
|
+
r(t(n), {
|
|
216
254
|
label: t(e)("log.method")
|
|
217
255
|
}, {
|
|
218
|
-
default:
|
|
219
|
-
|
|
256
|
+
default: a(() => [
|
|
257
|
+
k(i(s.value.httpMethod), 1)
|
|
220
258
|
]),
|
|
221
259
|
_: 1
|
|
222
260
|
}, 8, ["label"]),
|
|
223
|
-
r(t(
|
|
261
|
+
r(t(n), {
|
|
224
262
|
label: t(e)("log.path")
|
|
225
263
|
}, {
|
|
226
|
-
default:
|
|
227
|
-
|
|
264
|
+
default: a(() => [
|
|
265
|
+
c("span", xe, i(s.value.path), 1)
|
|
228
266
|
]),
|
|
229
267
|
_: 1
|
|
230
268
|
}, 8, ["label"]),
|
|
231
|
-
r(t(
|
|
269
|
+
r(t(n), {
|
|
232
270
|
label: t(e)("log.result")
|
|
233
271
|
}, {
|
|
234
|
-
default:
|
|
235
|
-
r(t(
|
|
272
|
+
default: a(() => [
|
|
273
|
+
r(t(re), {
|
|
236
274
|
type: s.value.success ? "success" : "error",
|
|
237
275
|
size: "small",
|
|
238
276
|
bordered: !1
|
|
239
277
|
}, {
|
|
240
|
-
default:
|
|
241
|
-
|
|
278
|
+
default: a(() => [
|
|
279
|
+
k(i(s.value.success ? t(e)("log.success") : t(e)("log.failed")), 1)
|
|
242
280
|
]),
|
|
243
281
|
_: 1
|
|
244
282
|
}, 8, ["type"])
|
|
245
283
|
]),
|
|
246
284
|
_: 1
|
|
247
285
|
}, 8, ["label"]),
|
|
248
|
-
r(t(
|
|
286
|
+
r(t(n), {
|
|
249
287
|
label: t(e)("log.resultCode")
|
|
250
288
|
}, {
|
|
251
|
-
default:
|
|
252
|
-
|
|
289
|
+
default: a(() => [
|
|
290
|
+
c("span", Te, i(s.value.resultCode), 1)
|
|
253
291
|
]),
|
|
254
292
|
_: 1
|
|
255
293
|
}, 8, ["label"]),
|
|
256
|
-
s.value.exceptionMessage ? (
|
|
294
|
+
s.value.exceptionMessage ? (f(), _(t(n), {
|
|
257
295
|
key: 0,
|
|
258
296
|
label: t(e)("log.exception")
|
|
259
297
|
}, {
|
|
260
|
-
default:
|
|
261
|
-
|
|
298
|
+
default: a(() => [
|
|
299
|
+
c("pre", Ce, i(s.value.exceptionMessage), 1)
|
|
262
300
|
]),
|
|
263
301
|
_: 1
|
|
264
|
-
}, 8, ["label"])) :
|
|
265
|
-
r(t(
|
|
302
|
+
}, 8, ["label"])) : O("", !0),
|
|
303
|
+
r(t(n), {
|
|
266
304
|
label: t(e)("log.elapsed")
|
|
267
305
|
}, {
|
|
268
|
-
default:
|
|
269
|
-
|
|
306
|
+
default: a(() => [
|
|
307
|
+
c("span", Ne, i(s.value.elapsedMs) + " ms", 1)
|
|
270
308
|
]),
|
|
271
309
|
_: 1
|
|
272
310
|
}, 8, ["label"]),
|
|
273
|
-
r(t(
|
|
311
|
+
r(t(n), {
|
|
274
312
|
label: t(e)("log.operator")
|
|
275
313
|
}, {
|
|
276
|
-
default:
|
|
277
|
-
|
|
314
|
+
default: a(() => [
|
|
315
|
+
k(i(t(A)(s.value)), 1)
|
|
278
316
|
]),
|
|
279
317
|
_: 1
|
|
280
318
|
}, 8, ["label"]),
|
|
281
|
-
r(t(
|
|
319
|
+
r(t(n), {
|
|
282
320
|
label: t(e)("log.ip")
|
|
283
321
|
}, {
|
|
284
|
-
default:
|
|
285
|
-
|
|
322
|
+
default: a(() => [
|
|
323
|
+
c("span", Ee, i(s.value.ip || "—"), 1)
|
|
286
324
|
]),
|
|
287
325
|
_: 1
|
|
288
326
|
}, 8, ["label"]),
|
|
289
|
-
r(t(
|
|
327
|
+
r(t(n), {
|
|
290
328
|
label: t(e)("log.userAgent")
|
|
291
329
|
}, {
|
|
292
|
-
default:
|
|
293
|
-
|
|
330
|
+
default: a(() => [
|
|
331
|
+
c("span", Se, i(s.value.userAgent || "—"), 1)
|
|
294
332
|
]),
|
|
295
333
|
_: 1
|
|
296
334
|
}, 8, ["label"]),
|
|
297
|
-
r(t(
|
|
335
|
+
r(t(n), {
|
|
298
336
|
label: t(e)("common.createTime")
|
|
299
337
|
}, {
|
|
300
|
-
default:
|
|
301
|
-
|
|
338
|
+
default: a(() => [
|
|
339
|
+
c("span", Me, i(t(B)(s.value.createTime)), 1)
|
|
302
340
|
]),
|
|
303
341
|
_: 1
|
|
304
342
|
}, 8, ["label"]),
|
|
305
|
-
r(t(
|
|
343
|
+
r(t(n), {
|
|
306
344
|
label: t(e)("log.param")
|
|
307
345
|
}, {
|
|
308
|
-
default:
|
|
309
|
-
s.value.paramJson ? (
|
|
346
|
+
default: a(() => [
|
|
347
|
+
s.value.paramJson ? (f(), _(ce, {
|
|
310
348
|
key: 0,
|
|
311
|
-
code:
|
|
312
|
-
}, null, 8, ["code"])) : (
|
|
349
|
+
code: U(s.value.paramJson)
|
|
350
|
+
}, null, 8, ["code"])) : (f(), z("span", ze, "—"))
|
|
313
351
|
]),
|
|
314
352
|
_: 1
|
|
315
353
|
}, 8, ["label"])
|
|
316
354
|
]),
|
|
317
355
|
_: 1
|
|
318
|
-
})) :
|
|
356
|
+
})) : O("", !0)
|
|
319
357
|
]),
|
|
320
358
|
_: 1
|
|
321
|
-
}, 8, ["title"])
|
|
359
|
+
}, 8, ["title", "native-scrollbar"])
|
|
322
360
|
]),
|
|
323
361
|
_: 1
|
|
324
|
-
}, 8, ["show"])
|
|
362
|
+
}, 8, ["show", "placement", "width", "height", "class", "style"])
|
|
325
363
|
], 64);
|
|
326
364
|
};
|
|
327
365
|
}
|
|
328
366
|
});
|
|
329
367
|
export {
|
|
330
|
-
|
|
368
|
+
Ke as default
|
|
331
369
|
};
|
|
332
370
|
//# sourceMappingURL=index2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../../../src/views/system/log/op/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 操作日志 = 只读 SmartTable + 详情抽屉。后端无 op/{id},分页项已含全字段 → 抽屉直接用行数据。\n// 搜索区要能答审计的三个问题:谁(操作人)、什么时候(时间范围)、干了什么(操作名/路径/成败)。\n// paramJson 走 CodeBlock(json 高亮 + 复制;美化是 parse→stringify,失败原样);异常堆栈保持危险色 <pre>——堆栈非代码,高亮无意义。\n// 导出:ExportColumnsModal 选列 + 当前筛选条件。\nimport { h, ref } from 'vue'\nimport {\n NButton,\n NTag,\n NDrawer,\n NDrawerContent,\n NDescriptions,\n NDescriptionsItem,\n useMessage,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport CodeBlock from '#/components/CodeBlock/index.vue'\nimport UserSelect from '#/components/UserSelect/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { logApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { operatorText } from '#/utils/format'\nimport { triggerBlobDownload } from '#/utils/download'\nimport type { ExportColumnDef, SysOpLog } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst tableRef = ref<SmartTableInst<SysOpLog>>()\n\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n/** 与后端 OpLogExportProfile.Columns 对齐。 */\nconst opExportColumns: ExportColumnDef[] = [\n { key: 'Title', title: t('log.opName') },\n { key: 'HttpMethod', title: t('log.method') },\n { key: 'Path', title: t('log.path') },\n { key: 'ResultCode', title: t('log.resultCode') },\n { key: 'Success', title: t('log.success') },\n { key: 'OperatorName', title: t('log.operator') },\n { key: 'Ip', title: t('log.ip') },\n { key: 'ElapsedMs', title: t('log.elapsed') },\n { key: 'CreateTime', title: t('common.createTime') },\n { key: 'ExceptionMessage', title: t('log.exceptionMessage'), defaultSelected: false },\n]\n\nasync function onExport(keys: string[]) {\n const p = tableRef.value?.params ?? {}\n exporting.value = true\n try {\n const blob = await logApi.opExport({\n title: p.title || undefined,\n success: p.success,\n operatorId: p.operatorId != null ? Number(p.operatorId) : undefined,\n path: p.path || undefined,\n createTime: p.createTime ?? null,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('logOp.fileName'))\n exportShow.value = false\n message.success(t('export.done'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n exporting.value = false\n }\n}\n\nconst columns: SmartTableColumn<SysOpLog>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'title', title: () => t('log.opName'), search: true },\n { key: 'httpMethod', title: () => t('log.method'), width: 90 },\n { key: 'path', title: () => t('log.path'), ellipsis: { tooltip: true }, search: true },\n {\n key: 'success',\n title: () => t('log.result'),\n tag: true,\n search: true,\n options: [\n { label: () => t('log.success'), value: true, tagType: 'success' },\n { label: () => t('log.failed'), value: false, tagType: 'error' },\n ],\n },\n { key: 'resultCode', title: () => t('log.resultCode'), width: 100 },\n {\n key: 'operator',\n title: () => t('log.operator'),\n width: 120,\n render: r => operatorText(r),\n // 日志只存 OperatorId(姓名是读取时回填的),故按人筛必须是精确 Id → 复用现成的人员选择器,搜索键用 operatorId。\n search: {\n key: 'operatorId',\n label: () => t('log.operator'),\n render: ({ value, setValue, search }) =>\n h(UserSelect, {\n value: value as number | null,\n clearable: true,\n placeholder: t('log.operatorPlaceholder'),\n 'onUpdate:value': (v: number | null) => {\n setValue(v)\n search()\n },\n }),\n },\n },\n { key: 'elapsedMs', title: () => t('log.elapsed'), width: 100, render: r => `${r.elapsedMs} ms` },\n { key: 'ip', title: () => t('log.ip'), render: r => r.ip || '—' },\n // 时间范围是审计最常用的一刀(\"上周三下午谁删了那批数据\");daterange 回传 ['YYYY-MM-DD','YYYY-MM-DD'],\n // api 层拆成 StartTime/EndTime 并把结束日补到 23:59:59。\n {\n key: 'createTime',\n title: () => t('common.createTime'),\n format: 'datetime',\n search: { type: 'daterange' },\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 90,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openDetail(r) },\n () => t('log.detail'),\n ),\n },\n]\n\n// ── 详情抽屉(只读,行数据直填)──\nconst showDetail = ref(false)\nconst detailRow = ref<SysOpLog | null>(null)\nfunction openDetail(r: SysOpLog) {\n detailRow.value = r\n showDetail.value = true\n}\n/** paramJson 美化:parse→stringify(2);非法 JSON 原样返回。空值占位由模板判空。 */\nfunction prettyParam(json: string) {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch {\n return json\n }\n}\n\nfunction clearLogs() {\n confirm({\n type: 'error',\n content: t('log.clearOpConfirm'),\n action: () => logApi.opClear(),\n successMsg: t('log.cleared'),\n }).then(ok => {\n if (ok) tableRef.value?.refresh()\n })\n}\n</script>\n\n<template>\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"logApi.opPage\"\n flex-height\n virtual-scroll\n storage-key=\"sys-log-op\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'DELETE:/api/v1/sys/log/op'\" type=\"error\" secondary @click=\"clearLogs\">\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('log.clear') }}\n </n-button>\n <n-button v-auth=\"'GET:/api/v1/sys/log/op/export'\" @click=\"exportShow = true\">\n <template #icon><AppIcon icon=\"ph:download-simple\" :size=\"16\" /></template>\n {{ t('export.button') }}\n </n-button>\n </template>\n </SmartTable>\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"opExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n\n <n-drawer v-model:show=\"showDetail\" :width=\"560\" placement=\"right\">\n <n-drawer-content :title=\"t('log.detail')\" closable>\n <n-descriptions v-if=\"detailRow\" label-placement=\"left\" :column=\"1\" bordered size=\"small\">\n <n-descriptions-item :label=\"t('log.opName')\">{{ detailRow.title }}</n-descriptions-item>\n <n-descriptions-item :label=\"t('log.method')\">\n {{ detailRow.httpMethod }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.path')\">{{ detailRow.path }}</n-descriptions-item>\n <n-descriptions-item :label=\"t('log.result')\">\n <n-tag :type=\"detailRow.success ? 'success' : 'error'\" size=\"small\" :bordered=\"false\">\n {{ detailRow.success ? t('log.success') : t('log.failed') }}\n </n-tag>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.resultCode')\">\n {{ detailRow.resultCode }}\n </n-descriptions-item>\n <n-descriptions-item v-if=\"detailRow.exceptionMessage\" :label=\"t('log.exception')\">\n <pre class=\"exception\">{{ detailRow.exceptionMessage }}</pre>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.elapsed')\">\n {{ detailRow.elapsedMs }} ms\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.operator')\">\n {{ operatorText(detailRow) }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.ip')\">{{ detailRow.ip || '—' }}</n-descriptions-item>\n <n-descriptions-item :label=\"t('log.userAgent')\">\n {{ detailRow.userAgent || '—' }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('common.createTime')\">\n {{ detailRow.createTime }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.param')\">\n <CodeBlock v-if=\"detailRow.paramJson\" :code=\"prettyParam(detailRow.paramJson)\" />\n <span v-else>—</span>\n </n-descriptions-item>\n </n-descriptions>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.exception {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 12px;\n line-height: 1.5;\n color: var(--color-danger);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","tableRef","ref","exportShow","exporting","opExportColumns","onExport","keys","p","_a","blob","logApi","triggerBlobDownload","e","translateError","columns","r","operatorText","value","setValue","search","h","UserSelect","v","NButton","openDetail","showDetail","detailRow","prettyParam","json","clearLogs","ok","_createVNode","_unref","SmartTable","_cache","_createBlock","AppIcon","_createTextVNode","ExportColumnsModal","$event","NDrawer","NDrawerContent","NDescriptions","NDescriptionsItem","_toDisplayString","NTag","_createElementVNode","_hoisted_1","CodeBlock","_openBlock","_createElementBlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../../src/views/system/log/op/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 操作日志 = 只读 SmartTable + 详情抽屉。后端无 op/{id},分页项已含全字段 → 抽屉直接用行数据。\n// 搜索区要能答审计的三个问题:谁(操作人)、什么时候(时间范围)、干了什么(操作名/路径/成败)。\n// paramJson 走 CodeBlock(json 高亮 + 复制;美化是 parse→stringify,失败原样);异常堆栈保持危险色 <pre>——堆栈非代码,高亮无意义。\n// 导出:ExportColumnsModal 选列 + 当前筛选条件。\nimport { computed, h, ref } from 'vue'\nimport { useElementSize } from '@vueuse/core'\nimport {\n NButton,\n NTag,\n NDrawer,\n NDrawerContent,\n NDescriptions,\n NDescriptionsItem,\n useMessage,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport CodeBlock from '#/components/CodeBlock/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { logApi, userApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport {\n SEARCH_ACTIONS,\n createFlatFilterSerializer,\n flatSearchOf,\n loadWithinServerMax,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { fmtDateTime, operatorText } from '#/utils/format'\nimport { triggerBlobDownload } from '#/utils/download'\nimport type { ExportColumnDef, SysOpLog } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysOpLog>>()\n\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n// 详情抽屉的窄档判据:直接读表格根节点的宽度,与库的窄档(容器 < 600,卡片列表)同源同值,\n// 不用视口近似。窄档详情从底部抽屉弹出(宽档右侧抽屉)。未量到宽度(0)时按宽档处理。\nconst tableEl = computed(\n () => (tableRef.value as unknown as { $el?: HTMLElement } | undefined)?.$el,\n)\nconst { width: tableWidth } = useElementSize(tableEl)\nconst isNarrow = computed(() => tableWidth.value > 0 && tableWidth.value < 600)\n\n// 导出收进表格内置的「更多」菜单;没有导出权限时 more 为空数组,按钮不出现。\nconst toolbarMore = computed(() =>\n authStore.hasPerm('GET:/api/v1/sys/log/op/export')\n ? [{ label: t('export.button'), key: 'export' }]\n : [],\n)\n// 引用稳定的 toolbar 配置:不要把 `{ ...TABLE_TOOLBAR, more }` 直接写进模板,那样每次重渲染都会新建一个对象\nconst toolbar = computed(() => ({ ...TABLE_TOOLBAR, more: toolbarMore.value }))\nfunction onMoreSelect(key: string | number) {\n if (key === 'export') exportShow.value = true\n}\n\n/** 与后端 OpLogExportProfile.Columns 对齐。 */\nconst opExportColumns: ExportColumnDef[] = [\n { key: 'Title', title: t('log.opName') },\n { key: 'HttpMethod', title: t('log.method') },\n { key: 'Path', title: t('log.path') },\n { key: 'ResultCode', title: t('log.resultCode') },\n { key: 'Success', title: t('log.success') },\n { key: 'OperatorName', title: t('log.operator') },\n { key: 'Ip', title: t('log.ip') },\n { key: 'ElapsedMs', title: t('log.elapsed') },\n { key: 'CreateTime', title: t('common.createTime') },\n { key: 'ExceptionMessage', title: t('log.exceptionMessage'), defaultSelected: false },\n]\n\nasync function onExport(keys: string[]) {\n // 搜索值在过滤态里,flatSearchOf 用同一个序列化器还原成与列表请求一致的扁平键\n const p = flatSearchOf(tableRef.value, filterSerializer)\n exporting.value = true\n try {\n const blob = await logApi.opExport({\n title: p.title || undefined,\n success: p.success,\n operatorId: p.operatorId != null ? Number(p.operatorId) : undefined,\n path: p.path || undefined,\n createTime: p.createTime ?? null,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('logOp.fileName'))\n exportShow.value = false\n message.success(t('export.done'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n exporting.value = false\n }\n}\n\n// 日期区间:条件构造器里是同一字段的两行(大于等于 + 小于等于),序列化器合并成 [起, 止],\n// api 层 splitRange 再拆成 StartTime/EndTime 并给结束日补 23:59:59。\nconst filterSerializer = createFlatFilterSerializer({ ranges: ['createTime'] })\n\n// 操作人下拉的选项源:取前 1000 个用户。\n// 用选项列而不是 UserSelect(远程搜索):条件构造器放不下自定义控件。\n// 当前限制:用户超过 1000 时,排在后面的人在这里选不到。\nconst operatorOptions = ref<{ label: string; value: number }[]>([])\nasync function loadOperatorOptions() {\n try {\n // 应用把 MaxPageSize 调到 1000 以下时,loadWithinServerMax 按后端回的上限重取一次\n const { items } = await loadWithinServerMax(userApi.page, 1000)\n operatorOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n // 静默:人员下拉是筛选辅助,拉取失败不打断列表\n }\n}\nvoid loadOperatorOptions()\n\nconst columns: SmartTableColumn<SysOpLog>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'title', title: () => t('log.opName'), search: { actions: SEARCH_ACTIONS.fuzzy } },\n { key: 'httpMethod', title: () => t('log.method'), width: 90 },\n {\n key: 'path',\n title: () => t('log.path'),\n ellipsis: { tooltip: true },\n search: { actions: SEARCH_ACTIONS.fuzzy },\n render: r => h('span', { class: 'mono muted' }, r.path),\n },\n {\n key: 'success',\n title: () => t('log.result'),\n tag: true,\n search: { actions: SEARCH_ACTIONS.exact },\n options: [\n { label: () => t('log.success'), value: true, tagType: 'success' },\n { label: () => t('log.failed'), value: false, tagType: 'error' },\n ],\n },\n {\n key: 'resultCode',\n title: () => t('log.resultCode'),\n width: 100,\n render: r => h('span', { class: 'num' }, String(r.resultCode)),\n },\n {\n key: 'operator',\n title: () => t('log.operator'),\n width: 120,\n ellipsis: { tooltip: true },\n render: r => operatorText(r),\n },\n // 操作人搜索项:日志只存 OperatorId(姓名是读取时回填的),按人筛必须是精确 Id(后端 OperatorId ==)。\n // 只作搜索项,不进表格也不进列设置;展示列是上面的 operator。\n {\n key: 'operatorId',\n title: () => t('log.operator'),\n hideInTable: true,\n options: operatorOptions,\n search: { actions: SEARCH_ACTIONS.exact, props: { clearable: true, filterable: true } },\n },\n {\n key: 'elapsedMs',\n title: () => t('log.elapsed'),\n width: 100,\n render: r => h('span', { class: 'num' }, `${r.elapsedMs} ms`),\n },\n {\n key: 'ip',\n title: () => t('log.ip'),\n render: r => h('span', { class: 'mono muted' }, r.ip || '—'),\n },\n // 时间范围是审计最常用的一刀(\"上周三下午谁删了那批数据\");daterange 回传 ['YYYY-MM-DD','YYYY-MM-DD'],\n // api 层拆成 StartTime/EndTime 并把结束日补到 23:59:59。\n {\n key: 'createTime',\n title: () => t('common.createTime'),\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n search: { type: 'daterange', actions: SEARCH_ACTIONS.dayRange },\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 90,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openDetail(r) },\n () => t('log.detail'),\n ),\n },\n]\nderiveHeaderFilters(columns)\n\n// ── 详情抽屉(只读,行数据直填)──\nconst showDetail = ref(false)\nconst detailRow = ref<SysOpLog | null>(null)\nfunction openDetail(r: SysOpLog) {\n detailRow.value = r\n showDetail.value = true\n}\n/** paramJson 美化:parse→stringify(2);非法 JSON 原样返回。空值占位由模板判空。 */\nfunction prettyParam(json: string) {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch {\n return json\n }\n}\n\nfunction clearLogs() {\n confirm({\n type: 'error',\n content: t('log.clearOpConfirm'),\n action: () => logApi.opClear(),\n successMsg: t('log.cleared'),\n }).then(ok => {\n if (ok) tableRef.value?.refresh()\n })\n}\n</script>\n\n<template>\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"logApi.opPage\"\n :search=\"{ container: 'table' }\"\n :filter-serializer=\"filterSerializer\"\n :toolbar=\"toolbar\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-log-op\"\n @more-select=\"onMoreSelect\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <n-button v-auth=\"'DELETE:/api/v1/sys/log/op'\" type=\"error\" secondary @click=\"clearLogs\">\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('log.clear') }}\n </n-button>\n </template>\n </SmartTable>\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"opExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n\n <!-- 详情抽屉:宽档右侧 560,窄档底部抽屉(.st-sheet 由全局样式补圆角与滚动链);没有响应体,只有脱敏后的入参 -->\n <n-drawer\n v-model:show=\"showDetail\"\n :placement=\"isNarrow ? 'bottom' : 'right'\"\n :width=\"isNarrow ? undefined : 'min(560px, 100vw)'\"\n :height=\"isNarrow ? 'auto' : undefined\"\n :class=\"isNarrow ? 'st-sheet' : ''\"\n :style=\"isNarrow ? 'max-height: 85vh' : ''\"\n >\n <n-drawer-content :title=\"t('log.detail')\" closable :native-scrollbar=\"isNarrow\">\n <n-descriptions\n v-if=\"detailRow\"\n label-placement=\"left\"\n :column=\"1\"\n bordered\n size=\"small\"\n label-style=\"width: 96px\"\n >\n <n-descriptions-item :label=\"t('log.opName')\">\n <span class=\"break\">{{ detailRow.title }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.method')\">\n {{ detailRow.httpMethod }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.path')\">\n <span class=\"mono break\">{{ detailRow.path }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.result')\">\n <n-tag :type=\"detailRow.success ? 'success' : 'error'\" size=\"small\" :bordered=\"false\">\n {{ detailRow.success ? t('log.success') : t('log.failed') }}\n </n-tag>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.resultCode')\">\n <span class=\"num\">{{ detailRow.resultCode }}</span>\n </n-descriptions-item>\n <n-descriptions-item v-if=\"detailRow.exceptionMessage\" :label=\"t('log.exception')\">\n <pre class=\"exception\">{{ detailRow.exceptionMessage }}</pre>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.elapsed')\">\n <span class=\"num\">{{ detailRow.elapsedMs }} ms</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.operator')\">\n {{ operatorText(detailRow) }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.ip')\">\n <span class=\"mono\">{{ detailRow.ip || '—' }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.userAgent')\">\n <span class=\"muted break\">{{ detailRow.userAgent || '—' }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('common.createTime')\">\n <span class=\"num\">{{ fmtDateTime(detailRow.createTime) }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.param')\">\n <CodeBlock v-if=\"detailRow.paramJson\" :code=\"prettyParam(detailRow.paramJson)\" />\n <span v-else>—</span>\n </n-descriptions-item>\n </n-descriptions>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.break {\n word-break: break-all;\n}\n.exception {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 13px;\n line-height: 1.5;\n color: var(--err, var(--color-danger));\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","exportShow","exporting","tableEl","computed","_a","tableWidth","useElementSize","isNarrow","toolbarMore","toolbar","TABLE_TOOLBAR","onMoreSelect","key","opExportColumns","onExport","keys","p","flatSearchOf","filterSerializer","blob","logApi","triggerBlobDownload","e","translateError","createFlatFilterSerializer","operatorOptions","loadOperatorOptions","items","loadWithinServerMax","userApi","u","columns","SEARCH_ACTIONS","h","r","operatorText","fmtDateTime","NButton","openDetail","deriveHeaderFilters","showDetail","detailRow","prettyParam","json","clearLogs","ok","_createVNode","_unref","SmartTable","TABLE_MIN_ROW_HEIGHT","_cache","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","ExportColumnsModal","$event","NDrawer","NDrawerContent","NDescriptions","NDescriptionsItem","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","NTag","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","CodeBlock","_openBlock","_createElementBlock"],"mappings":"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"}
|