@liujitcn/kratos-admin-core 0.0.1
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 +168 -0
- package/build/getEnv.ts +46 -0
- package/build/plugins.ts +206 -0
- package/build/proxy.ts +29 -0
- package/dist/package/declarations/build/getEnv.d.ts +13 -0
- package/dist/package/declarations/build/plugins.d.ts +20 -0
- package/dist/package/declarations/build/proxy.d.ts +10 -0
- package/dist/package/declarations/index.d.ts +7 -0
- package/dist/package/declarations/src/App.vue.d.ts +3 -0
- package/dist/package/declarations/src/api/base/config.d.ts +7 -0
- package/dist/package/declarations/src/api/base/file.d.ts +11 -0
- package/dist/package/declarations/src/api/base/login.d.ts +18 -0
- package/dist/package/declarations/src/api/base/oauth.d.ts +12 -0
- package/dist/package/declarations/src/api/system/auth.d.ts +13 -0
- package/dist/package/declarations/src/api/system/base_dict.d.ts +8 -0
- package/dist/package/declarations/src/api/system/base_tenant.d.ts +9 -0
- package/dist/package/declarations/src/auth.d.ts +1 -0
- package/dist/package/declarations/src/bootstrap.d.ts +23 -0
- package/dist/package/declarations/src/components/Card/DataPanelCard.vue.d.ts +23 -0
- package/dist/package/declarations/src/components/CronExpression/index.vue.d.ts +15 -0
- package/dist/package/declarations/src/components/Dialog/FormDialog.vue.d.ts +74 -0
- package/dist/package/declarations/src/components/Dialog/ProDialog.vue.d.ts +58 -0
- package/dist/package/declarations/src/components/Dict/DictLabel.vue.d.ts +11 -0
- package/dist/package/declarations/src/components/Dict/index.vue.d.ts +30 -0
- package/dist/package/declarations/src/components/ECharts/config/index.d.ts +7 -0
- package/dist/package/declarations/src/components/ECharts/index.vue.d.ts +22 -0
- package/dist/package/declarations/src/components/ErrorMessage/index.vue.d.ts +12 -0
- package/dist/package/declarations/src/components/Grid/components/GridItem.vue.d.ts +34 -0
- package/dist/package/declarations/src/components/Grid/index.vue.d.ts +28 -0
- package/dist/package/declarations/src/components/Grid/interface/index.d.ts +7 -0
- package/dist/package/declarations/src/components/ImportExcel/index.vue.d.ts +26 -0
- package/dist/package/declarations/src/components/Loading/fullScreen.d.ts +5 -0
- package/dist/package/declarations/src/components/Loading/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/components/PasswordStrength/index.vue.d.ts +13 -0
- package/dist/package/declarations/src/components/ProForm/components/DynamicList.vue.d.ts +15 -0
- package/dist/package/declarations/src/components/ProForm/components/KvList.vue.d.ts +26 -0
- package/dist/package/declarations/src/components/ProForm/components/ProFormItem.vue.d.ts +28 -0
- package/dist/package/declarations/src/components/ProForm/index.vue.d.ts +36 -0
- package/dist/package/declarations/src/components/ProForm/interface/index.d.ts +47 -0
- package/dist/package/declarations/src/components/ProTable/components/ColSetting.vue.d.ts +9 -0
- package/dist/package/declarations/src/components/ProTable/components/Pagination.vue.d.ts +15 -0
- package/dist/package/declarations/src/components/ProTable/components/TableColumn.vue.d.ts +9 -0
- package/dist/package/declarations/src/components/ProTable/interface/index.d.ts +187 -0
- package/dist/package/declarations/src/components/ProTable.d.ts +5 -0
- package/dist/package/declarations/src/components/SearchForm/components/SearchFormItem.vue.d.ts +21 -0
- package/dist/package/declarations/src/components/SearchForm/index.vue.d.ts +22 -0
- package/dist/package/declarations/src/components/SelectFilter/index.vue.d.ts +44 -0
- package/dist/package/declarations/src/components/SelectIcon/index.vue.d.ts +19 -0
- package/dist/package/declarations/src/components/SvgIcon/index.vue.d.ts +15 -0
- package/dist/package/declarations/src/components/SwitchDark/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/components/TreeFilter/index.vue.d.ts +5866 -0
- package/dist/package/declarations/src/components/Upload/File.vue.d.ts +24 -0
- package/dist/package/declarations/src/components/Upload/Files.vue.d.ts +26 -0
- package/dist/package/declarations/src/components/Upload/Img.vue.d.ts +43 -0
- package/dist/package/declarations/src/components/Upload/Imgs.vue.d.ts +46 -0
- package/dist/package/declarations/src/components/WangEditor/index.vue.d.ts +29 -0
- package/dist/package/declarations/src/config/index.d.ts +6 -0
- package/dist/package/declarations/src/config/nprogress.d.ts +3 -0
- package/dist/package/declarations/src/directives/index.d.ts +5 -0
- package/dist/package/declarations/src/directives/modules/auth.d.ts +3 -0
- package/dist/package/declarations/src/directives/modules/copy.d.ts +8 -0
- package/dist/package/declarations/src/directives/modules/debounce.d.ts +8 -0
- package/dist/package/declarations/src/directives/modules/draggable.d.ts +3 -0
- package/dist/package/declarations/src/directives/modules/longpress.d.ts +7 -0
- package/dist/package/declarations/src/directives/modules/throttle.d.ts +3 -0
- package/dist/package/declarations/src/directives/modules/waterMarker.d.ts +5 -0
- package/dist/package/declarations/src/enums/httpEnum.d.ts +29 -0
- package/dist/package/declarations/src/format.d.ts +1 -0
- package/dist/package/declarations/src/hooks/interface/index.d.ts +36 -0
- package/dist/package/declarations/src/hooks/useAuthButtons.d.ts +8 -0
- package/dist/package/declarations/src/hooks/useDownload.d.ts +9 -0
- package/dist/package/declarations/src/hooks/useHandleData.d.ts +10 -0
- package/dist/package/declarations/src/hooks/useOnline.d.ts +6 -0
- package/dist/package/declarations/src/hooks/useSelection.d.ts +10 -0
- package/dist/package/declarations/src/hooks/useTable.d.ts +46 -0
- package/dist/package/declarations/src/hooks/useTheme.d.ts +12 -0
- package/dist/package/declarations/src/hooks/useTime.d.ts +13 -0
- package/dist/package/declarations/src/index.d.ts +3 -0
- package/dist/package/declarations/src/layouts/LayoutClassic/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/LayoutColumns/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/LayoutTransverse/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/LayoutVertical/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Footer/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/ToolBarLeft.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/ToolBarRight.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/AssemblySize.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/Avatar.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/Breadcrumb.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/CollapseIcon.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/Fullscreen.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/InfoDialog.vue.d.ts +5 -0
- package/dist/package/declarations/src/layouts/components/Header/components/PasswordDialog.vue.d.ts +5 -0
- package/dist/package/declarations/src/layouts/components/Header/components/SearchMenu.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Header/components/ThemeSetting.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Main/components/Maximize.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Main/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Menu/SubMenu.vue.d.ts +7 -0
- package/dist/package/declarations/src/layouts/components/Tabs/components/MoreButton.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/Tabs/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/components/ThemeDrawer/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/layouts/indexAsync.vue.d.ts +3 -0
- package/dist/package/declarations/src/modules/index.d.ts +117 -0
- package/dist/package/declarations/src/modules/kratosAdmin.d.ts +4 -0
- package/dist/package/declarations/src/navigation.d.ts +2 -0
- package/dist/package/declarations/src/request.d.ts +2 -0
- package/dist/package/declarations/src/routers/index.d.ts +21 -0
- package/dist/package/declarations/src/routers/modules/dynamicRouter.d.ts +4 -0
- package/dist/package/declarations/src/routers/modules/staticRouter.d.ts +25 -0
- package/dist/package/declarations/src/rpc/base/v1/config.d.ts +23 -0
- package/dist/package/declarations/src/rpc/base/v1/file.d.ts +52 -0
- package/dist/package/declarations/src/rpc/base/v1/login.d.ts +107 -0
- package/dist/package/declarations/src/rpc/base/v1/oauth.d.ts +167 -0
- package/dist/package/declarations/src/rpc/common/v1/common.d.ts +57 -0
- package/dist/package/declarations/src/rpc/common/v1/enum.d.ts +58 -0
- package/dist/package/declarations/src/rpc/common/v1/types.d.ts +60 -0
- package/dist/package/declarations/src/rpc/google/protobuf/empty.d.ts +11 -0
- package/dist/package/declarations/src/rpc/google/protobuf/wrappers.d.ts +108 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +156 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +215 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_tenant.d.ts +112 -0
- package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +67 -0
- package/dist/package/declarations/src/security.d.ts +3 -0
- package/dist/package/declarations/src/stores/helper/persist.d.ts +9 -0
- package/dist/package/declarations/src/stores/index.d.ts +2 -0
- package/dist/package/declarations/src/stores/interface/index.d.ts +90 -0
- package/dist/package/declarations/src/stores/modules/auth.d.ts +168 -0
- package/dist/package/declarations/src/stores/modules/config.d.ts +26 -0
- package/dist/package/declarations/src/stores/modules/dict.d.ts +32 -0
- package/dist/package/declarations/src/stores/modules/global.d.ts +4 -0
- package/dist/package/declarations/src/stores/modules/keepAlive.d.ts +6 -0
- package/dist/package/declarations/src/stores/modules/tabs.d.ts +13 -0
- package/dist/package/declarations/src/stores/modules/user.d.ts +29 -0
- package/dist/package/declarations/src/stores/runtime.d.ts +4 -0
- package/dist/package/declarations/src/styles/theme/aside.d.ts +4 -0
- package/dist/package/declarations/src/styles/theme/header.d.ts +4 -0
- package/dist/package/declarations/src/styles/theme/menu.d.ts +4 -0
- package/dist/package/declarations/src/table.d.ts +1 -0
- package/dist/package/declarations/src/tenant.d.ts +1 -0
- package/dist/package/declarations/src/utils/color.d.ts +28 -0
- package/dist/package/declarations/src/utils/dict.d.ts +15 -0
- package/dist/package/declarations/src/utils/eleValidate.d.ts +4 -0
- package/dist/package/declarations/src/utils/errorHandler.d.ts +5 -0
- package/dist/package/declarations/src/utils/index.d.ts +192 -0
- package/dist/package/declarations/src/utils/is/index.d.ts +72 -0
- package/dist/package/declarations/src/utils/mittBus.d.ts +2 -0
- package/dist/package/declarations/src/utils/oauthProvider.d.ts +19 -0
- package/dist/package/declarations/src/utils/passwordCrypto.d.ts +6 -0
- package/dist/package/declarations/src/utils/passwordStrength.d.ts +36 -0
- package/dist/package/declarations/src/utils/proTable.d.ts +44 -0
- package/dist/package/declarations/src/utils/request.d.ts +11 -0
- package/dist/package/declarations/src/utils/router.d.ts +14 -0
- package/dist/package/declarations/src/utils/svg.d.ts +4 -0
- package/dist/package/declarations/src/utils/tenant.d.ts +6 -0
- package/dist/package/declarations/src/utils/utils.d.ts +12 -0
- package/dist/package/declarations/src/views/error/403.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/error/404.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/error/500.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/error/pending.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/login/components/LoginForm.vue.d.ts +4 -0
- package/dist/package/declarations/src/views/login/index.vue.d.ts +3 -0
- package/dist/package/declarations/vite.config.d.ts +13 -0
- package/dist/package/src/App.vue +25 -0
- package/dist/package/src/api/base/config.ts +19 -0
- package/dist/package/src/api/base/file.ts +75 -0
- package/dist/package/src/api/base/login.ts +81 -0
- package/dist/package/src/api/base/oauth.ts +50 -0
- package/dist/package/src/api/system/auth.ts +45 -0
- package/dist/package/src/api/system/base_dict.ts +19 -0
- package/dist/package/src/api/system/base_tenant.ts +20 -0
- package/dist/package/src/assets/fonts/DIN.otf +0 -0
- package/dist/package/src/assets/fonts/MetroDF.ttf +0 -0
- package/dist/package/src/assets/fonts/YouSheBiaoTiHei.ttf +0 -0
- package/dist/package/src/assets/fonts/font.scss +14 -0
- package/dist/package/src/assets/iconfont/iconfont.scss +47 -0
- package/dist/package/src/assets/iconfont/iconfont.ttf +0 -0
- package/dist/package/src/assets/images/403.png +0 -0
- package/dist/package/src/assets/images/404.png +0 -0
- package/dist/package/src/assets/images/500.png +0 -0
- package/dist/package/src/assets/images/avatar.png +0 -0
- package/dist/package/src/assets/images/login_bg.svg +33 -0
- package/dist/package/src/assets/images/login_left.png +0 -0
- package/dist/package/src/assets/images/logo.svg +1 -0
- package/dist/package/src/assets/images/notData.png +0 -0
- package/dist/package/src/assets/images/oauth/dingtalk.png +0 -0
- package/dist/package/src/assets/images/oauth/feishu.png +0 -0
- package/dist/package/src/assets/images/oauth/gitee.png +0 -0
- package/dist/package/src/assets/images/oauth/github.png +0 -0
- package/dist/package/src/assets/images/oauth/google.png +0 -0
- package/dist/package/src/assets/images/oauth/wechat.png +0 -0
- package/dist/package/src/assets/images/oauth/wechatwork.png +0 -0
- package/dist/package/src/auth.ts +1 -0
- package/dist/package/src/bootstrap.ts +69 -0
- package/dist/package/src/components/Card/DataPanelCard.vue +67 -0
- package/dist/package/src/components/CronExpression/index.vue +713 -0
- package/dist/package/src/components/Dialog/FormDialog.vue +160 -0
- package/dist/package/src/components/Dialog/ProDialog.vue +96 -0
- package/dist/package/src/components/Dict/DictLabel.vue +62 -0
- package/dist/package/src/components/Dict/index.vue +157 -0
- package/dist/package/src/components/ECharts/config/index.ts +45 -0
- package/dist/package/src/components/ECharts/index.vue +108 -0
- package/dist/package/src/components/ErrorMessage/index.vue +63 -0
- package/dist/package/src/components/Grid/components/GridItem.vue +69 -0
- package/dist/package/src/components/Grid/index.vue +169 -0
- package/dist/package/src/components/Grid/interface/index.ts +8 -0
- package/dist/package/src/components/ImportExcel/index.scss +3 -0
- package/dist/package/src/components/ImportExcel/index.vue +150 -0
- package/dist/package/src/components/Loading/fullScreen.ts +45 -0
- package/dist/package/src/components/Loading/index.scss +67 -0
- package/dist/package/src/components/Loading/index.vue +13 -0
- package/dist/package/src/components/PasswordStrength/index.vue +127 -0
- package/dist/package/src/components/ProForm/components/DynamicList.vue +59 -0
- package/dist/package/src/components/ProForm/components/KvList.vue +73 -0
- package/dist/package/src/components/ProForm/components/ProFormItem.vue +191 -0
- package/dist/package/src/components/ProForm/index.vue +120 -0
- package/dist/package/src/components/ProForm/interface/index.ts +74 -0
- package/dist/package/src/components/ProTable/components/ColSetting.vue +45 -0
- package/dist/package/src/components/ProTable/components/Pagination.vue +58 -0
- package/dist/package/src/components/ProTable/components/TableColumn.vue +234 -0
- package/dist/package/src/components/ProTable/index.vue +567 -0
- package/dist/package/src/components/ProTable/interface/index.ts +223 -0
- package/dist/package/src/components/ProTable.ts +8 -0
- package/dist/package/src/components/SearchForm/components/SearchFormItem.vue +168 -0
- package/dist/package/src/components/SearchForm/index.vue +105 -0
- package/dist/package/src/components/SelectFilter/index.scss +63 -0
- package/dist/package/src/components/SelectFilter/index.vue +113 -0
- package/dist/package/src/components/SelectIcon/index.scss +39 -0
- package/dist/package/src/components/SelectIcon/index.vue +105 -0
- package/dist/package/src/components/SvgIcon/index.vue +35 -0
- package/dist/package/src/components/SwitchDark/index.vue +12 -0
- package/dist/package/src/components/TreeFilter/index.scss +44 -0
- package/dist/package/src/components/TreeFilter/index.vue +207 -0
- package/dist/package/src/components/Upload/File.vue +201 -0
- package/dist/package/src/components/Upload/Files.vue +234 -0
- package/dist/package/src/components/Upload/Img.vue +306 -0
- package/dist/package/src/components/Upload/Imgs.vue +320 -0
- package/dist/package/src/components/WangEditor/index.scss +28 -0
- package/dist/package/src/components/WangEditor/index.vue +154 -0
- package/dist/package/src/config/index.ts +19 -0
- package/dist/package/src/config/nprogress.ts +12 -0
- package/dist/package/src/directives/index.ts +28 -0
- package/dist/package/src/directives/modules/auth.ts +25 -0
- package/dist/package/src/directives/modules/copy.ts +39 -0
- package/dist/package/src/directives/modules/debounce.ts +32 -0
- package/dist/package/src/directives/modules/draggable.ts +50 -0
- package/dist/package/src/directives/modules/longpress.ts +49 -0
- package/dist/package/src/directives/modules/throttle.ts +42 -0
- package/dist/package/src/directives/modules/waterMarker.ts +36 -0
- package/dist/package/src/enums/httpEnum.ts +35 -0
- package/dist/package/src/format.ts +1 -0
- package/dist/package/src/hooks/interface/index.ts +38 -0
- package/dist/package/src/hooks/useAuthButtons.ts +25 -0
- package/dist/package/src/hooks/useDownload.ts +44 -0
- package/dist/package/src/hooks/useHandleData.ts +38 -0
- package/dist/package/src/hooks/useOnline.ts +27 -0
- package/dist/package/src/hooks/useSelection.ts +34 -0
- package/dist/package/src/hooks/useTable.ts +151 -0
- package/dist/package/src/hooks/useTheme.ts +111 -0
- package/dist/package/src/hooks/useTime.ts +38 -0
- package/dist/package/src/index.ts +9 -0
- package/dist/package/src/layouts/LayoutClassic/index.scss +60 -0
- package/dist/package/src/layouts/LayoutClassic/index.vue +64 -0
- package/dist/package/src/layouts/LayoutColumns/index.scss +95 -0
- package/dist/package/src/layouts/LayoutColumns/index.vue +113 -0
- package/dist/package/src/layouts/LayoutTransverse/index.scss +60 -0
- package/dist/package/src/layouts/LayoutTransverse/index.vue +70 -0
- package/dist/package/src/layouts/LayoutVertical/index.scss +70 -0
- package/dist/package/src/layouts/LayoutVertical/index.vue +119 -0
- package/dist/package/src/layouts/components/Footer/index.scss +11 -0
- package/dist/package/src/layouts/components/Footer/index.vue +21 -0
- package/dist/package/src/layouts/components/Header/ToolBarLeft.vue +23 -0
- package/dist/package/src/layouts/components/Header/ToolBarRight.vue +44 -0
- package/dist/package/src/layouts/components/Header/components/AssemblySize.vue +39 -0
- package/dist/package/src/layouts/components/Header/components/Avatar.vue +226 -0
- package/dist/package/src/layouts/components/Header/components/Breadcrumb.vue +117 -0
- package/dist/package/src/layouts/components/Header/components/CollapseIcon.vue +21 -0
- package/dist/package/src/layouts/components/Header/components/Fullscreen.vue +28 -0
- package/dist/package/src/layouts/components/Header/components/InfoDialog.vue +22 -0
- package/dist/package/src/layouts/components/Header/components/PasswordDialog.vue +22 -0
- package/dist/package/src/layouts/components/Header/components/SearchMenu.vue +207 -0
- package/dist/package/src/layouts/components/Header/components/ThemeSetting.vue +14 -0
- package/dist/package/src/layouts/components/Main/components/Maximize.vue +39 -0
- package/dist/package/src/layouts/components/Main/index.scss +14 -0
- package/dist/package/src/layouts/components/Main/index.vue +90 -0
- package/dist/package/src/layouts/components/Menu/SubMenu.vue +132 -0
- package/dist/package/src/layouts/components/Tabs/components/MoreButton.vue +83 -0
- package/dist/package/src/layouts/components/Tabs/index.scss +69 -0
- package/dist/package/src/layouts/components/Tabs/index.vue +111 -0
- package/dist/package/src/layouts/components/ThemeDrawer/index.scss +137 -0
- package/dist/package/src/layouts/components/ThemeDrawer/index.vue +191 -0
- package/dist/package/src/layouts/index.vue +50 -0
- package/dist/package/src/layouts/indexAsync.vue +54 -0
- package/dist/package/src/modules/index.ts +233 -0
- package/dist/package/src/modules/kratosAdmin.ts +17 -0
- package/dist/package/src/navigation.ts +2 -0
- package/dist/package/src/request.ts +2 -0
- package/dist/package/src/routers/index.ts +143 -0
- package/dist/package/src/routers/modules/dynamicRouter.ts +160 -0
- package/dist/package/src/routers/modules/staticRouter.ts +73 -0
- package/dist/package/src/rpc/base/v1/config.ts +34 -0
- package/dist/package/src/rpc/base/v1/file.ts +66 -0
- package/dist/package/src/rpc/base/v1/login.ts +128 -0
- package/dist/package/src/rpc/base/v1/oauth.ts +199 -0
- package/dist/package/src/rpc/common/v1/common.ts +71 -0
- package/dist/package/src/rpc/common/v1/enum.ts +71 -0
- package/dist/package/src/rpc/common/v1/types.ts +77 -0
- package/dist/package/src/rpc/google/protobuf/empty.ts +19 -0
- package/dist/package/src/rpc/google/protobuf/wrappers.ts +124 -0
- package/dist/package/src/rpc/system/admin/v1/auth.ts +208 -0
- package/dist/package/src/rpc/system/admin/v1/base_dict.ts +249 -0
- package/dist/package/src/rpc/system/admin/v1/base_tenant.ts +134 -0
- package/dist/package/src/rpc/system/common/v1/enum.ts +80 -0
- package/dist/package/src/security.ts +3 -0
- package/dist/package/src/stores/helper/persist.ts +19 -0
- package/dist/package/src/stores/index.ts +8 -0
- package/dist/package/src/stores/interface/index.ts +102 -0
- package/dist/package/src/stores/modules/auth.ts +73 -0
- package/dist/package/src/stores/modules/config.ts +119 -0
- package/dist/package/src/stores/modules/dict.ts +65 -0
- package/dist/package/src/stores/modules/global.ts +54 -0
- package/dist/package/src/stores/modules/keepAlive.ts +22 -0
- package/dist/package/src/stores/modules/tabs.ts +77 -0
- package/dist/package/src/stores/modules/user.ts +109 -0
- package/dist/package/src/stores/runtime.ts +4 -0
- package/dist/package/src/styles/common.scss +144 -0
- package/dist/package/src/styles/element-dark.scss +46 -0
- package/dist/package/src/styles/element.scss +333 -0
- package/dist/package/src/styles/reset.scss +143 -0
- package/dist/package/src/styles/theme/aside.ts +16 -0
- package/dist/package/src/styles/theme/header.ts +25 -0
- package/dist/package/src/styles/theme/menu.ts +31 -0
- package/dist/package/src/styles/var.scss +2 -0
- package/dist/package/src/table.ts +1 -0
- package/dist/package/src/tenant.ts +1 -0
- package/dist/package/src/typings/global.d.ts +74 -0
- package/dist/package/src/typings/utils.d.ts +17 -0
- package/dist/package/src/typings/window.d.ts +8 -0
- package/dist/package/src/utils/color.ts +59 -0
- package/dist/package/src/utils/dict.ts +17 -0
- package/dist/package/src/utils/eleValidate.ts +14 -0
- package/dist/package/src/utils/errorHandler.ts +27 -0
- package/dist/package/src/utils/index.ts +403 -0
- package/dist/package/src/utils/is/index.ts +125 -0
- package/dist/package/src/utils/mittBus.ts +5 -0
- package/dist/package/src/utils/oauthProvider.ts +79 -0
- package/dist/package/src/utils/passwordCrypto.ts +71 -0
- package/dist/package/src/utils/passwordStrength.ts +86 -0
- package/dist/package/src/utils/proTable.ts +124 -0
- package/dist/package/src/utils/request.ts +296 -0
- package/dist/package/src/utils/router.ts +43 -0
- package/dist/package/src/utils/svg.ts +13 -0
- package/dist/package/src/utils/tenant.ts +10 -0
- package/dist/package/src/utils/utils.ts +40 -0
- package/dist/package/src/views/error/403.vue +8 -0
- package/dist/package/src/views/error/404.vue +8 -0
- package/dist/package/src/views/error/500.vue +8 -0
- package/dist/package/src/views/error/pending.vue +16 -0
- package/dist/package/src/views/login/components/LoginForm.vue +797 -0
- package/dist/package/src/views/login/index.scss +103 -0
- package/dist/package/src/views/login/index.vue +108 -0
- package/dist/package/src/vite-env.d.ts +3 -0
- package/dist/package/types/generated/auto-imports.d.ts +124 -0
- package/dist/package/types/generated/components.d.ts +151 -0
- package/package.json +199 -0
- package/tsconfig.json +21 -0
- package/types/generated/auto-imports.d.ts +124 -0
- package/types/generated/components.d.ts +151 -0
- package/vite.config.ts +239 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-dialog v-model="dialogVisible" title="修改密码" width="500px" draggable>
|
|
3
|
+
<span>This is Password</span>
|
|
4
|
+
<template #footer>
|
|
5
|
+
<span class="dialog-footer">
|
|
6
|
+
<el-button @click="dialogVisible = false">取消</el-button>
|
|
7
|
+
<el-button type="primary" @click="dialogVisible = false">确认</el-button>
|
|
8
|
+
</span>
|
|
9
|
+
</template>
|
|
10
|
+
</el-dialog>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup lang="ts">
|
|
14
|
+
import { ref } from "vue";
|
|
15
|
+
|
|
16
|
+
const dialogVisible = ref(false);
|
|
17
|
+
const openDialog = () => {
|
|
18
|
+
dialogVisible.value = true;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
defineExpose({ openDialog });
|
|
22
|
+
</script>
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="search-menu">
|
|
3
|
+
<el-tooltip effect="dark" content="菜单搜索" placement="bottom" :show-after="200">
|
|
4
|
+
<i :class="'iconfont icon-sousuo'" class="toolBar-icon" @click="handleOpen"></i>
|
|
5
|
+
</el-tooltip>
|
|
6
|
+
<el-dialog class="search-dialog" v-model="isShowSearch" :width="600" :show-close="false" top="10vh">
|
|
7
|
+
<el-input
|
|
8
|
+
v-model="searchMenu"
|
|
9
|
+
ref="menuInputRef"
|
|
10
|
+
placeholder="菜单搜索:支持菜单名称、路径"
|
|
11
|
+
size="large"
|
|
12
|
+
clearable
|
|
13
|
+
:prefix-icon="Search"
|
|
14
|
+
></el-input>
|
|
15
|
+
<div v-if="searchList.length" class="menu-list" ref="menuListRef">
|
|
16
|
+
<div
|
|
17
|
+
v-for="item in searchList"
|
|
18
|
+
:key="item.path"
|
|
19
|
+
:class="['menu-item', { 'menu-active': item.path === activePath }]"
|
|
20
|
+
@mouseenter="mouseoverMenuItem(item)"
|
|
21
|
+
@click="handleClickMenu()"
|
|
22
|
+
>
|
|
23
|
+
<div class="menu-lf">
|
|
24
|
+
<el-icon class="menu-icon">
|
|
25
|
+
<component :is="getRouteMetaIcon(item.meta)"></component>
|
|
26
|
+
</el-icon>
|
|
27
|
+
<span class="menu-title">{{ getRouteMetaTitle(item.meta) }}</span>
|
|
28
|
+
</div>
|
|
29
|
+
<i :class="'iconfont icon-huiche'" class="menu-enter" @click="handleOpen"></i>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
<el-empty v-else class="mt20 mb20" :image-size="100" description="暂无菜单" />
|
|
33
|
+
</el-dialog>
|
|
34
|
+
</div>
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<script setup lang="ts">
|
|
38
|
+
import { ref, computed, nextTick, watch } from "vue";
|
|
39
|
+
import { InputInstance } from "element-plus";
|
|
40
|
+
import { Search } from "@element-plus/icons-vue";
|
|
41
|
+
import { useAuthStore } from "../../../../stores/modules/auth";
|
|
42
|
+
import { useRouter } from "vue-router";
|
|
43
|
+
import { useDebounceFn } from "@vueuse/core";
|
|
44
|
+
import type { RouteItem } from "../../../../rpc/system/admin/v1/auth";
|
|
45
|
+
import { getRouteMetaHidden, getRouteMetaIcon, getRouteMetaTitle, getRouteTarget, isExternalPath } from "../../../../utils";
|
|
46
|
+
|
|
47
|
+
/** 可被菜单搜索展示的路由项。 */
|
|
48
|
+
interface SearchRouteItem extends RouteItem {
|
|
49
|
+
path: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const router = useRouter();
|
|
53
|
+
const authStore = useAuthStore();
|
|
54
|
+
const menuList = computed<SearchRouteItem[]>(() => {
|
|
55
|
+
return authStore.flatMenuListGet.filter((item): item is SearchRouteItem => {
|
|
56
|
+
return Boolean(item.path) && !getRouteMetaHidden(item.meta);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const activePath = ref("");
|
|
61
|
+
/** 鼠标移入菜单项时同步当前高亮路径。 */
|
|
62
|
+
const mouseoverMenuItem = (menu: SearchRouteItem) => {
|
|
63
|
+
activePath.value = menu.path;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const menuInputRef = ref<InputInstance | null>(null);
|
|
67
|
+
const isShowSearch = ref<boolean>(false);
|
|
68
|
+
const searchMenu = ref<string>("");
|
|
69
|
+
|
|
70
|
+
watch(isShowSearch, val => {
|
|
71
|
+
if (val) {
|
|
72
|
+
document.addEventListener("keydown", keyboardOperation);
|
|
73
|
+
} else {
|
|
74
|
+
document.removeEventListener("keydown", keyboardOperation);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
/** 打开菜单搜索弹窗并聚焦输入框。 */
|
|
79
|
+
const handleOpen = () => {
|
|
80
|
+
isShowSearch.value = true;
|
|
81
|
+
nextTick(() => {
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
menuInputRef.value?.focus();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const searchList = ref<SearchRouteItem[]>([]);
|
|
89
|
+
/** 根据关键词刷新可跳转菜单列表。 */
|
|
90
|
+
const updateSearchList = () => {
|
|
91
|
+
searchList.value = searchMenu.value
|
|
92
|
+
? menuList.value.filter(
|
|
93
|
+
item =>
|
|
94
|
+
(item.path.toLowerCase().includes(searchMenu.value.toLowerCase()) ||
|
|
95
|
+
getRouteMetaTitle(item.meta).toLowerCase().includes(searchMenu.value.toLowerCase())) &&
|
|
96
|
+
!getRouteMetaHidden(item.meta)
|
|
97
|
+
)
|
|
98
|
+
: [];
|
|
99
|
+
activePath.value = searchList.value.length ? searchList.value[0].path : "";
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const debouncedUpdateSearchList = useDebounceFn(updateSearchList, 300);
|
|
103
|
+
|
|
104
|
+
watch(searchMenu, debouncedUpdateSearchList);
|
|
105
|
+
|
|
106
|
+
const menuListRef = ref<Element | null>(null);
|
|
107
|
+
/** 处理键盘上下键切换菜单高亮项。 */
|
|
108
|
+
const keyPressUpOrDown = (direction: number) => {
|
|
109
|
+
const length = searchList.value.length;
|
|
110
|
+
if (length === 0) return;
|
|
111
|
+
const index = searchList.value.findIndex(item => item.path === activePath.value);
|
|
112
|
+
const newIndex = (index + direction + length) % length;
|
|
113
|
+
activePath.value = searchList.value[newIndex].path;
|
|
114
|
+
nextTick(() => {
|
|
115
|
+
if (!menuListRef.value?.firstElementChild) return;
|
|
116
|
+
const menuItemHeight = menuListRef.value.firstElementChild.clientHeight + 12 || 0;
|
|
117
|
+
menuListRef.value.scrollTop = newIndex * menuItemHeight;
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/** 处理菜单搜索弹窗内的键盘导航。 */
|
|
122
|
+
const keyboardOperation = (event: KeyboardEvent) => {
|
|
123
|
+
if (event.key === "ArrowUp") {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
keyPressUpOrDown(-1);
|
|
126
|
+
} else if (event.key === "ArrowDown") {
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
keyPressUpOrDown(1);
|
|
129
|
+
} else if (event.key === "Enter") {
|
|
130
|
+
event.preventDefault();
|
|
131
|
+
handleClickMenu();
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/** 跳转到当前选中的菜单路径。 */
|
|
136
|
+
const handleClickMenu = () => {
|
|
137
|
+
const menu = searchList.value.find(item => item.path === activePath.value);
|
|
138
|
+
if (!menu) return;
|
|
139
|
+
const target = getRouteTarget(menu);
|
|
140
|
+
if (!target) return;
|
|
141
|
+
if (isExternalPath(target)) {
|
|
142
|
+
window.open(target, "_blank", "noopener,noreferrer");
|
|
143
|
+
} else {
|
|
144
|
+
router.push(target);
|
|
145
|
+
}
|
|
146
|
+
searchMenu.value = "";
|
|
147
|
+
isShowSearch.value = false;
|
|
148
|
+
};
|
|
149
|
+
</script>
|
|
150
|
+
|
|
151
|
+
<style scoped lang="scss">
|
|
152
|
+
.search-menu {
|
|
153
|
+
:deep(.el-dialog) {
|
|
154
|
+
border-radius: 4px;
|
|
155
|
+
.el-dialog__header {
|
|
156
|
+
display: none;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
.menu-list {
|
|
160
|
+
max-height: 515px;
|
|
161
|
+
margin-top: 15px;
|
|
162
|
+
overflow: auto;
|
|
163
|
+
.menu-item {
|
|
164
|
+
position: relative;
|
|
165
|
+
display: flex;
|
|
166
|
+
align-items: center;
|
|
167
|
+
justify-content: space-between;
|
|
168
|
+
height: 45px;
|
|
169
|
+
padding: 0 20px;
|
|
170
|
+
margin: 10px 0;
|
|
171
|
+
color: var(--el-text-color-secondary);
|
|
172
|
+
cursor: pointer;
|
|
173
|
+
background-color: transparent;
|
|
174
|
+
border: 1px solid var(--el-border-color);
|
|
175
|
+
border-radius: 6px;
|
|
176
|
+
transition: all 0.2s ease;
|
|
177
|
+
.menu-lf {
|
|
178
|
+
display: flex;
|
|
179
|
+
align-items: center;
|
|
180
|
+
}
|
|
181
|
+
.menu-icon {
|
|
182
|
+
margin-right: 8px;
|
|
183
|
+
font-size: 16px;
|
|
184
|
+
}
|
|
185
|
+
.menu-title {
|
|
186
|
+
font-size: 14px;
|
|
187
|
+
}
|
|
188
|
+
.menu-enter {
|
|
189
|
+
font-size: 17px;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
.menu-active {
|
|
193
|
+
color: #ffffff;
|
|
194
|
+
background-color: var(--el-color-primary);
|
|
195
|
+
.menu-icon {
|
|
196
|
+
font-size: 18px;
|
|
197
|
+
}
|
|
198
|
+
.menu-title {
|
|
199
|
+
font-size: 16px;
|
|
200
|
+
}
|
|
201
|
+
.menu-enter {
|
|
202
|
+
font-size: 19px;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="theme-setting">
|
|
3
|
+
<el-tooltip effect="dark" content="主题设置" placement="bottom" :show-after="200">
|
|
4
|
+
<i :class="'iconfont icon-zhuti'" class="toolBar-icon" @click="openDrawer"></i>
|
|
5
|
+
</el-tooltip>
|
|
6
|
+
</div>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script setup lang="ts">
|
|
10
|
+
import mittBus from "../../../../utils/mittBus";
|
|
11
|
+
const openDrawer = () => {
|
|
12
|
+
mittBus.emit("openThemeDrawer");
|
|
13
|
+
};
|
|
14
|
+
</script>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="maximize" @click="exitMaximize">
|
|
3
|
+
<i :class="'iconfont icon-tuichu'"></i>
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { useGlobalStore } from "../../../../stores/modules/global";
|
|
9
|
+
|
|
10
|
+
const globalStore = useGlobalStore();
|
|
11
|
+
const exitMaximize = () => {
|
|
12
|
+
globalStore.setGlobalState("maximize", false);
|
|
13
|
+
};
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<style scoped lang="scss">
|
|
17
|
+
.maximize {
|
|
18
|
+
position: fixed;
|
|
19
|
+
top: -25px;
|
|
20
|
+
right: -25px;
|
|
21
|
+
z-index: 999;
|
|
22
|
+
width: 55px;
|
|
23
|
+
height: 55px;
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
background-color: var(--el-color-info);
|
|
26
|
+
border-radius: 50%;
|
|
27
|
+
opacity: 0.9;
|
|
28
|
+
&:hover {
|
|
29
|
+
background-color: var(--el-color-info-dark-2);
|
|
30
|
+
}
|
|
31
|
+
.iconfont {
|
|
32
|
+
position: relative;
|
|
33
|
+
top: 46%;
|
|
34
|
+
left: 19%;
|
|
35
|
+
font-size: 14px;
|
|
36
|
+
color: #ffffff;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
.el-main {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
height: 100%;
|
|
6
|
+
min-height: 0;
|
|
7
|
+
padding: 10px 12px;
|
|
8
|
+
overflow-x: hidden;
|
|
9
|
+
background-color: var(--el-bg-color-page);
|
|
10
|
+
}
|
|
11
|
+
.el-footer {
|
|
12
|
+
height: auto;
|
|
13
|
+
padding: 0;
|
|
14
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Maximize v-show="maximize" />
|
|
3
|
+
<Tabs v-show="tabs" />
|
|
4
|
+
<el-main>
|
|
5
|
+
<router-view v-slot="{ Component, route }">
|
|
6
|
+
<transition appear name="fade-transform" mode="out-in">
|
|
7
|
+
<keep-alive :include="keepAliveName">
|
|
8
|
+
<component :is="createComponentWrapper(Component, route)" v-if="isRouterShow" :key="route.fullPath" />
|
|
9
|
+
</keep-alive>
|
|
10
|
+
</transition>
|
|
11
|
+
</router-view>
|
|
12
|
+
</el-main>
|
|
13
|
+
<el-footer v-show="footer">
|
|
14
|
+
<Footer />
|
|
15
|
+
</el-footer>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script setup lang="ts">
|
|
19
|
+
import { ref, onBeforeUnmount, provide, watch, h } from "vue";
|
|
20
|
+
import { storeToRefs } from "pinia";
|
|
21
|
+
import { useDebounceFn } from "@vueuse/core";
|
|
22
|
+
import { useGlobalStore } from "../../../stores/modules/global";
|
|
23
|
+
import { useKeepAliveStore } from "../../../stores/modules/keepAlive";
|
|
24
|
+
import Maximize from "./components/Maximize.vue";
|
|
25
|
+
import Tabs from "../../../layouts/components/Tabs/index.vue";
|
|
26
|
+
import Footer from "../../../layouts/components/Footer/index.vue";
|
|
27
|
+
|
|
28
|
+
const globalStore = useGlobalStore();
|
|
29
|
+
const { maximize, isCollapse, layout, tabs, footer } = storeToRefs(globalStore);
|
|
30
|
+
|
|
31
|
+
const keepAliveStore = useKeepAliveStore();
|
|
32
|
+
const { keepAliveName } = storeToRefs(keepAliveStore);
|
|
33
|
+
|
|
34
|
+
// 注入刷新页面方法
|
|
35
|
+
const isRouterShow = ref(true);
|
|
36
|
+
const refreshCurrentPage = (val: boolean) => (isRouterShow.value = val);
|
|
37
|
+
provide("refresh", refreshCurrentPage);
|
|
38
|
+
|
|
39
|
+
// 解决详情页 keep-alive 问题
|
|
40
|
+
const wrapperMap = new Map();
|
|
41
|
+
function createComponentWrapper(component, route) {
|
|
42
|
+
if (!component) return;
|
|
43
|
+
const wrapperName = route.fullPath;
|
|
44
|
+
const wrapperCache = wrapperMap.get(wrapperName);
|
|
45
|
+
if (!wrapperCache || wrapperCache.component !== component) {
|
|
46
|
+
// 按完整路由生成独立包装组件,避免多标签切换时复用同一个动态组件实例导致内容串页。
|
|
47
|
+
const wrapper = { name: wrapperName, render: () => h(component) };
|
|
48
|
+
wrapperMap.set(wrapperName, { component, wrapper });
|
|
49
|
+
return wrapper;
|
|
50
|
+
}
|
|
51
|
+
return wrapperCache.wrapper;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 监听当前页面是否最大化,动态添加 class
|
|
55
|
+
watch(
|
|
56
|
+
() => maximize.value,
|
|
57
|
+
() => {
|
|
58
|
+
const app = document.getElementById("app") as HTMLElement;
|
|
59
|
+
if (maximize.value) app.classList.add("main-maximize");
|
|
60
|
+
else app.classList.remove("main-maximize");
|
|
61
|
+
},
|
|
62
|
+
{ immediate: true }
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
// 监听布局变化,在 body 上添加相对应的 layout class
|
|
66
|
+
watch(
|
|
67
|
+
() => layout.value,
|
|
68
|
+
() => {
|
|
69
|
+
const body = document.body as HTMLElement;
|
|
70
|
+
body.setAttribute("class", layout.value);
|
|
71
|
+
},
|
|
72
|
+
{ immediate: true }
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// 监听窗口大小变化,折叠侧边栏
|
|
76
|
+
const screenWidth = ref(0);
|
|
77
|
+
const listeningWindow = useDebounceFn(() => {
|
|
78
|
+
screenWidth.value = document.body.clientWidth;
|
|
79
|
+
if (!isCollapse.value && screenWidth.value < 1200) globalStore.setGlobalState("isCollapse", true);
|
|
80
|
+
if (isCollapse.value && screenWidth.value > 1200) globalStore.setGlobalState("isCollapse", false);
|
|
81
|
+
}, 100);
|
|
82
|
+
window.addEventListener("resize", listeningWindow, false);
|
|
83
|
+
onBeforeUnmount(() => {
|
|
84
|
+
window.removeEventListener("resize", listeningWindow);
|
|
85
|
+
});
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
|
+
<style scoped lang="scss">
|
|
89
|
+
@use "./index.scss" as *;
|
|
90
|
+
</style>
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<template v-for="subItem in menuList" :key="getRouteMenuKey(subItem)">
|
|
3
|
+
<el-sub-menu v-if="isSubMenu(subItem)" :index="getRouteMenuKey(subItem)">
|
|
4
|
+
<template #title>
|
|
5
|
+
<el-icon v-if="getRouteMetaIcon(subItem.meta)">
|
|
6
|
+
<component :is="getRouteMetaIcon(subItem.meta)"></component>
|
|
7
|
+
</el-icon>
|
|
8
|
+
<span class="sle">{{ getRouteMetaTitle(subItem.meta) }}</span>
|
|
9
|
+
</template>
|
|
10
|
+
<SubMenu :menu-list="getSubMenuChildren(subItem)" />
|
|
11
|
+
</el-sub-menu>
|
|
12
|
+
<el-menu-item v-else :index="getRouteMenuKey(getMenuItem(subItem))" @click="handleClickMenu(getMenuItem(subItem))">
|
|
13
|
+
<el-icon v-if="getRouteMetaIcon(getMenuItem(subItem).meta)">
|
|
14
|
+
<component :is="getRouteMetaIcon(getMenuItem(subItem).meta)"></component>
|
|
15
|
+
</el-icon>
|
|
16
|
+
<template #title>
|
|
17
|
+
<span class="sle">{{ getRouteMetaTitle(getMenuItem(subItem).meta) }}</span>
|
|
18
|
+
</template>
|
|
19
|
+
</el-menu-item>
|
|
20
|
+
</template>
|
|
21
|
+
</template>
|
|
22
|
+
|
|
23
|
+
<script setup lang="ts">
|
|
24
|
+
import { useRouter } from "vue-router";
|
|
25
|
+
import type { RouteItem } from "../../../rpc/system/admin/v1/auth";
|
|
26
|
+
import {
|
|
27
|
+
getRouteTarget,
|
|
28
|
+
getRouteMenuKey,
|
|
29
|
+
getRouteMetaAlwaysShow,
|
|
30
|
+
getRouteMetaHidden,
|
|
31
|
+
getRouteMetaIcon,
|
|
32
|
+
getRouteMetaTitle,
|
|
33
|
+
isExternalPath
|
|
34
|
+
} from "../../../utils";
|
|
35
|
+
|
|
36
|
+
defineProps<{ menuList: RouteItem[] }>();
|
|
37
|
+
|
|
38
|
+
const router = useRouter();
|
|
39
|
+
/** 侧边菜单渲染时必须具备路径的菜单项。 */
|
|
40
|
+
type VisibleRouteItem = RouteItem & { path: string };
|
|
41
|
+
|
|
42
|
+
const ensureRoutePath = (subItem: RouteItem): VisibleRouteItem => {
|
|
43
|
+
return {
|
|
44
|
+
...subItem,
|
|
45
|
+
path: subItem.path ?? ""
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** 获取当前菜单节点应继续渲染的可见子菜单。 */
|
|
50
|
+
const getSubMenuChildren = (subItem: RouteItem) => {
|
|
51
|
+
const visibleChildren = (subItem.children ?? []).filter(item => !getRouteMetaHidden(item.meta));
|
|
52
|
+
if (getRouteMetaAlwaysShow(subItem.meta) || visibleChildren.length !== 1) return visibleChildren;
|
|
53
|
+
return visibleChildren[0].children ?? [];
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const getMenuItem = (subItem: RouteItem): VisibleRouteItem => {
|
|
57
|
+
const visibleChildren = (subItem.children ?? []).filter(item => !getRouteMetaHidden(item.meta));
|
|
58
|
+
if (getRouteMetaAlwaysShow(subItem.meta) || visibleChildren.length !== 1) return ensureRoutePath(subItem);
|
|
59
|
+
return ensureRoutePath(visibleChildren[0]);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/** 判断当前节点是否需要渲染为子菜单容器。 */
|
|
63
|
+
const isSubMenu = (subItem: RouteItem) => {
|
|
64
|
+
const visibleChildren = (subItem.children ?? []).filter(item => !getRouteMetaHidden(item.meta));
|
|
65
|
+
if (!visibleChildren.length) return false;
|
|
66
|
+
return getRouteMetaAlwaysShow(subItem.meta) || visibleChildren.length > 1;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** 处理侧边菜单点击并跳转内部路由或外链。 */
|
|
70
|
+
const handleClickMenu = (subItem: RouteItem) => {
|
|
71
|
+
const menuItem = getMenuItem(subItem);
|
|
72
|
+
const target = getRouteTarget(menuItem);
|
|
73
|
+
if (!target) return;
|
|
74
|
+
if (isExternalPath(target)) {
|
|
75
|
+
window.open(target, "_blank", "noopener,noreferrer");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
router.push(target);
|
|
79
|
+
};
|
|
80
|
+
</script>
|
|
81
|
+
|
|
82
|
+
<style lang="scss">
|
|
83
|
+
.el-sub-menu .el-sub-menu__title:hover {
|
|
84
|
+
color: var(--el-menu-hover-text-color) !important;
|
|
85
|
+
background-color: transparent !important;
|
|
86
|
+
}
|
|
87
|
+
.el-menu--collapse {
|
|
88
|
+
.is-active {
|
|
89
|
+
.el-sub-menu__title {
|
|
90
|
+
color: #ffffff !important;
|
|
91
|
+
background-color: var(--el-color-primary) !important;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
.el-menu-item {
|
|
96
|
+
&:hover {
|
|
97
|
+
color: var(--el-menu-hover-text-color);
|
|
98
|
+
}
|
|
99
|
+
&.is-active {
|
|
100
|
+
color: var(--el-menu-active-color) !important;
|
|
101
|
+
background-color: var(--el-menu-active-bg-color) !important;
|
|
102
|
+
&::before {
|
|
103
|
+
position: absolute;
|
|
104
|
+
top: 0;
|
|
105
|
+
bottom: 0;
|
|
106
|
+
width: 4px;
|
|
107
|
+
content: "";
|
|
108
|
+
background-color: var(--el-color-primary);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
.vertical,
|
|
113
|
+
.classic,
|
|
114
|
+
.transverse {
|
|
115
|
+
.el-menu-item {
|
|
116
|
+
&.is-active {
|
|
117
|
+
&::before {
|
|
118
|
+
left: 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
.columns {
|
|
124
|
+
.el-menu-item {
|
|
125
|
+
&.is-active {
|
|
126
|
+
&::before {
|
|
127
|
+
right: 0;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
</style>
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-dropdown trigger="click" :teleported="false">
|
|
3
|
+
<div class="more-button">
|
|
4
|
+
<i :class="'iconfont icon-xiala'"></i>
|
|
5
|
+
</div>
|
|
6
|
+
<template #dropdown>
|
|
7
|
+
<el-dropdown-menu>
|
|
8
|
+
<el-dropdown-item @click="refresh">
|
|
9
|
+
<el-icon><Refresh /></el-icon>刷新当前
|
|
10
|
+
</el-dropdown-item>
|
|
11
|
+
<el-dropdown-item @click="maximize">
|
|
12
|
+
<el-icon><FullScreen /></el-icon>最大化
|
|
13
|
+
</el-dropdown-item>
|
|
14
|
+
<el-dropdown-item divided @click="closeCurrentTab">
|
|
15
|
+
<el-icon><Remove /></el-icon>关闭当前
|
|
16
|
+
</el-dropdown-item>
|
|
17
|
+
<el-dropdown-item @click="tabStore.closeTabsOnSide(currentTabPath, 'left')">
|
|
18
|
+
<el-icon><DArrowLeft /></el-icon>关闭左侧
|
|
19
|
+
</el-dropdown-item>
|
|
20
|
+
<el-dropdown-item @click="tabStore.closeTabsOnSide(currentTabPath, 'right')">
|
|
21
|
+
<el-icon><DArrowRight /></el-icon>关闭右侧
|
|
22
|
+
</el-dropdown-item>
|
|
23
|
+
<el-dropdown-item divided @click="tabStore.closeMultipleTab(currentTabPath)">
|
|
24
|
+
<el-icon><CircleClose /></el-icon>关闭其他
|
|
25
|
+
</el-dropdown-item>
|
|
26
|
+
<el-dropdown-item @click="closeAllTab">
|
|
27
|
+
<el-icon><FolderDelete /></el-icon>关闭全部
|
|
28
|
+
</el-dropdown-item>
|
|
29
|
+
</el-dropdown-menu>
|
|
30
|
+
</template>
|
|
31
|
+
</el-dropdown>
|
|
32
|
+
</template>
|
|
33
|
+
|
|
34
|
+
<script setup lang="ts">
|
|
35
|
+
import { computed, inject, nextTick } from "vue";
|
|
36
|
+
import { HOME_URL } from "../../../../config";
|
|
37
|
+
import { getAdminTabPath } from "../../../../modules";
|
|
38
|
+
import { useTabsStore } from "../../../../stores/modules/tabs";
|
|
39
|
+
import { useGlobalStore } from "../../../../stores/modules/global";
|
|
40
|
+
import { useKeepAliveStore } from "../../../../stores/modules/keepAlive";
|
|
41
|
+
import { useRoute, useRouter } from "vue-router";
|
|
42
|
+
|
|
43
|
+
const route = useRoute();
|
|
44
|
+
const router = useRouter();
|
|
45
|
+
const tabStore = useTabsStore();
|
|
46
|
+
const globalStore = useGlobalStore();
|
|
47
|
+
const keepAliveStore = useKeepAliveStore();
|
|
48
|
+
const currentTabPath = computed(() => getAdminTabPath(route));
|
|
49
|
+
|
|
50
|
+
// refresh current page
|
|
51
|
+
const refreshCurrentPage: Function = inject("refresh") as Function;
|
|
52
|
+
const refresh = () => {
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
route.meta.keepAlive && keepAliveStore.removeKeepAliveName(currentTabPath.value);
|
|
55
|
+
refreshCurrentPage(false);
|
|
56
|
+
nextTick(() => {
|
|
57
|
+
route.meta.keepAlive && keepAliveStore.addKeepAliveName(currentTabPath.value);
|
|
58
|
+
refreshCurrentPage(true);
|
|
59
|
+
});
|
|
60
|
+
}, 0);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// maximize current page
|
|
64
|
+
const maximize = () => {
|
|
65
|
+
globalStore.setGlobalState("maximize", true);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Close Current
|
|
69
|
+
const closeCurrentTab = () => {
|
|
70
|
+
if (route.meta.affix) return;
|
|
71
|
+
tabStore.removeTabs(currentTabPath.value);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Close All
|
|
75
|
+
const closeAllTab = () => {
|
|
76
|
+
tabStore.closeMultipleTab();
|
|
77
|
+
router.push(HOME_URL);
|
|
78
|
+
};
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<style scoped lang="scss">
|
|
82
|
+
@use "../index.scss" as *;
|
|
83
|
+
</style>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
.tabs-box {
|
|
2
|
+
background-color: var(--el-bg-color);
|
|
3
|
+
.tabs-menu {
|
|
4
|
+
position: relative;
|
|
5
|
+
width: 100%;
|
|
6
|
+
.el-dropdown {
|
|
7
|
+
position: absolute;
|
|
8
|
+
top: 0;
|
|
9
|
+
right: 0;
|
|
10
|
+
bottom: 0;
|
|
11
|
+
.more-button {
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
justify-content: center;
|
|
15
|
+
width: 43px;
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
border-left: 1px solid var(--el-border-color-light);
|
|
18
|
+
transition: all 0.3s;
|
|
19
|
+
&:hover {
|
|
20
|
+
background-color: var(--el-color-info-light-9);
|
|
21
|
+
}
|
|
22
|
+
.iconfont {
|
|
23
|
+
font-size: 12.5px;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
:deep(.el-tabs) {
|
|
28
|
+
.el-tabs__header {
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
height: 40px;
|
|
31
|
+
padding: 0 10px;
|
|
32
|
+
margin: 0;
|
|
33
|
+
.el-tabs__nav-wrap {
|
|
34
|
+
position: absolute;
|
|
35
|
+
width: calc(100% - 70px);
|
|
36
|
+
.el-tabs__nav {
|
|
37
|
+
display: flex;
|
|
38
|
+
border: none;
|
|
39
|
+
.el-tabs__item {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
color: #afafaf;
|
|
44
|
+
border: none;
|
|
45
|
+
.tabs-icon {
|
|
46
|
+
margin: 1.5px 4px 0 0;
|
|
47
|
+
font-size: 15px;
|
|
48
|
+
}
|
|
49
|
+
.is-icon-close {
|
|
50
|
+
margin-top: 1px;
|
|
51
|
+
}
|
|
52
|
+
&.is-active {
|
|
53
|
+
color: var(--el-color-primary);
|
|
54
|
+
&::before {
|
|
55
|
+
position: absolute;
|
|
56
|
+
bottom: 0;
|
|
57
|
+
width: 100%;
|
|
58
|
+
height: 0;
|
|
59
|
+
content: "";
|
|
60
|
+
border-bottom: 2px solid var(--el-color-primary) !important;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|