From e96599b4113a2d2ae657516cd4431df28cb8b91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=9E=97?= <320730042@qq.com> Date: Mon, 29 Apr 2024 17:11:45 +0800 Subject: [PATCH] first commit --- .editorconfig | 15 + .env.development | 16 + .env.production | 6 + .eslintignore | 14 + .eslintrc-auto-import.json | 284 +++ .eslintrc.cjs | 88 + .gitignore | 18 + .husky/commit-msg | 4 + .husky/pre-commit | 4 + .prettierignore | 11 + .prettierrc.cjs | 46 + .stylelintignore | 11 + .stylelintrc.cjs | 51 + .vscode/extensions.json | 11 + .vscode/settings.json | 80 + CHANGELOG.md | 199 ++ README.md | 49 + commitlint.config.cjs | 93 + index.html | 62 + package.json | 120 ++ public/favicon.ico | Bin 0 -> 9351 bytes src/App.vue | 39 + src/api/article.ts | 88 + src/api/auth/index.ts | 45 + src/api/auth/types.ts | 59 + src/api/dept/index.ts | 77 + src/api/dept/types.ts | 71 + src/api/device-type-ver/index.ts | 69 + src/api/device-type-ver/types.ts | 33 + src/api/device-type/index.ts | 24 + src/api/device-type/types.ts | 31 + src/api/dict/index.ts | 150 ++ src/api/dict/types.ts | 142 ++ src/api/domain/index.ts | 49 + src/api/domain/types.ts | 29 + src/api/file-list/index.ts | 13 + src/api/file-list/types.ts | 43 + src/api/file-server/index.ts | 30 + src/api/file-server/types.ts | 39 + src/api/file/index.ts | 33 + src/api/file/types.ts | 7 + src/api/menu/index.ts | 87 + src/api/menu/types.ts | 124 ++ src/api/role/index.ts | 112 ++ src/api/role/types.ts | 78 + src/api/type-ver-ext/index.ts | 19 + src/api/type-ver-ext/types.ts | 16 + src/api/user/index.ts | 140 ++ src/api/user/types.ts | 124 ++ src/assets/icons/api.svg | 1 + src/assets/icons/captcha.svg | 1 + src/assets/icons/cascader.svg | 1 + src/assets/icons/client.svg | 1 + src/assets/icons/close.svg | 1 + src/assets/icons/close_all.svg | 1 + src/assets/icons/close_left.svg | 1 + src/assets/icons/close_other.svg | 1 + src/assets/icons/close_right.svg | 1 + src/assets/icons/dict.svg | 1 + src/assets/icons/document.svg | 1 + src/assets/icons/download.svg | 1 + src/assets/icons/edit.svg | 1 + src/assets/icons/eye-open.svg | 1 + src/assets/icons/eye.svg | 1 + src/assets/icons/folder.svg | 1 + src/assets/icons/fullscreen-exit.svg | 1 + src/assets/icons/fullscreen.svg | 1 + src/assets/icons/github.svg | 1 + src/assets/icons/homepage.svg | 1 + src/assets/icons/indent-decrease.svg | 1 + src/assets/icons/ip.svg | 1 + src/assets/icons/language.svg | 1 + src/assets/icons/link.svg | 1 + src/assets/icons/menu.svg | 1 + src/assets/icons/message.svg | 1 + src/assets/icons/money.svg | 1 + src/assets/icons/monitor.svg | 1 + src/assets/icons/moon.svg | 1 + src/assets/icons/order.svg | 1 + src/assets/icons/peoples.svg | 1 + src/assets/icons/project.svg | 1 + src/assets/icons/publish.svg | 1 + src/assets/icons/refresh.svg | 1 + src/assets/icons/role.svg | 1 + src/assets/icons/security.svg | 1 + src/assets/icons/setting.svg | 1 + src/assets/icons/size.svg | 1 + src/assets/icons/sunny.svg | 1 + src/assets/icons/system.svg | 1 + src/assets/icons/table.svg | 1 + src/assets/icons/todolist.svg | 1 + src/assets/icons/tree.svg | 1 + src/assets/icons/user.svg | 1 + src/assets/icons/visit.svg | 1 + src/assets/images/401.gif | Bin 0 -> 162867 bytes src/assets/images/404.png | Bin 0 -> 20613 bytes src/assets/images/404_cloud.png | Bin 0 -> 2644 bytes src/assets/images/login-bg-dark.jpg | Bin 0 -> 20471 bytes src/assets/images/login-bg.jpg | Bin 0 -> 32872 bytes src/assets/logo.png | Bin 0 -> 5441 bytes src/components/AppLink/index.vue | 40 + src/components/Breadcrumb/index.vue | 97 + src/components/Dictionary/index.vue | 73 + src/components/Hamburger/index.vue | 39 + src/components/IconSelect/index.vue | 200 ++ src/components/LangSelect/index.vue | 45 + src/components/Pagination/index.vue | 79 + src/components/SizeSelect/index.vue | 34 + src/components/SvgIcon/index.vue | 45 + src/components/Table/AnyTable.vue | 40 + src/components/Table/TableBar.vue | 120 ++ src/components/WangEditor/index.vue | 74 + src/directive/index.ts | 9 + src/directive/permission/index.ts | 55 + src/enums/LayoutEnum.ts | 18 + src/enums/MenuTypeEnum.ts | 22 + src/enums/ThemeEnum.ts | 18 + src/lang/index.ts | 25 + src/lang/package/en.ts | 19 + src/lang/package/zh-cn.ts | 19 + src/layout/components/AppMain/index.vue | 82 + .../NavBar/components/NavbarLeft.vue | 19 + .../NavBar/components/NavbarRight.vue | 116 ++ src/layout/components/NavBar/index.vue | 18 + .../Settings/components/LayoutSelect.vue | 108 + .../Settings/components/ThemeColorPicker.vue | 41 + src/layout/components/Settings/index.vue | 141 ++ .../Sidebar/components/SidebarLogo.vue | 63 + .../Sidebar/components/SidebarMenu.vue | 82 + .../Sidebar/components/SidebarMenuItem.vue | 191 ++ .../components/SidebarMenuItemTitle.vue | 42 + .../Sidebar/components/SidebarMixTopMenu.vue | 83 + src/layout/components/Sidebar/index.vue | 37 + src/layout/components/TagsView/index.vue | 470 +++++ src/layout/index.vue | 343 ++++ src/main.ts | 29 + src/plugins/i18n.ts | 7 + src/plugins/icons.ts | 9 + src/plugins/index.ts | 3 + src/plugins/permission.ts | 60 + src/router/index.ts | 104 + src/settings.ts | 19 + src/store/index.ts | 16 + src/store/modules/app.ts | 95 + src/store/modules/permission.ts | 122 ++ src/store/modules/settings.ts | 124 ++ src/store/modules/tagsView.ts | 211 ++ src/store/modules/user.ts | 94 + src/styles/index.scss | 71 + src/styles/reset.scss | 76 + src/styles/table.scss | 48 + src/styles/variables.module.scss | 10 + src/styles/variables.scss | 29 + src/typings/auto-imports.d.ts | 1783 +++++++++++++++++ src/typings/components.d.ts | 115 ++ src/typings/env.d.ts | 36 + src/typings/global.d.ts | 96 + src/typings/router.d.ts | 22 + src/typings/shims-vue.d.ts | 1 + src/utils/color.ts | 287 +++ src/utils/i18n.ts | 12 + src/utils/index.ts | 80 + src/utils/nprogress.ts | 18 + src/utils/request.ts | 66 + src/views/dashboard/index.vue | 90 + src/views/error-page/401.vue | 113 ++ src/views/error-page/404.vue | 276 +++ src/views/login/index.vue | 282 +++ src/views/redirect/index.vue | 15 + .../components/DeviceTypeToVer.vue | 347 ++++ .../components/DeviceTypeVersionEdit.vue | 531 +++++ src/views/resources/device-type/index.vue | 212 ++ .../file-list/components/FolderTree.vue | 92 + src/views/resources/file-list/index.vue | 124 ++ .../file-server/components/FileServerForm.vue | 153 ++ src/views/resources/file-server/index.vue | 108 + src/views/system/dept/index.vue | 335 ++++ .../system/dict/components/dict-item.vue | 341 ++++ src/views/system/dict/index.vue | 349 ++++ .../system/domain/components/DomainForm.vue | 155 ++ src/views/system/domain/index.vue | 127 ++ src/views/system/menu/index.vue | 524 +++++ src/views/system/role/index.vue | 418 ++++ .../system/user/components/dept-tree.vue | 69 + src/views/system/user/index.vue | 727 +++++++ src/views/table/index.vue | 44 + tsconfig.json | 35 + uno.config.ts | 43 + vite.config.ts | 237 +++ 189 files changed, 15295 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc-auto-import.json create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc.cjs create mode 100644 .stylelintignore create mode 100644 .stylelintrc.cjs create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 commitlint.config.cjs create mode 100644 index.html create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/api/article.ts create mode 100644 src/api/auth/index.ts create mode 100644 src/api/auth/types.ts create mode 100644 src/api/dept/index.ts create mode 100644 src/api/dept/types.ts create mode 100644 src/api/device-type-ver/index.ts create mode 100644 src/api/device-type-ver/types.ts create mode 100644 src/api/device-type/index.ts create mode 100644 src/api/device-type/types.ts create mode 100644 src/api/dict/index.ts create mode 100644 src/api/dict/types.ts create mode 100644 src/api/domain/index.ts create mode 100644 src/api/domain/types.ts create mode 100644 src/api/file-list/index.ts create mode 100644 src/api/file-list/types.ts create mode 100644 src/api/file-server/index.ts create mode 100644 src/api/file-server/types.ts create mode 100644 src/api/file/index.ts create mode 100644 src/api/file/types.ts create mode 100644 src/api/menu/index.ts create mode 100644 src/api/menu/types.ts create mode 100644 src/api/role/index.ts create mode 100644 src/api/role/types.ts create mode 100644 src/api/type-ver-ext/index.ts create mode 100644 src/api/type-ver-ext/types.ts create mode 100644 src/api/user/index.ts create mode 100644 src/api/user/types.ts create mode 100644 src/assets/icons/api.svg create mode 100644 src/assets/icons/captcha.svg create mode 100644 src/assets/icons/cascader.svg create mode 100644 src/assets/icons/client.svg create mode 100644 src/assets/icons/close.svg create mode 100644 src/assets/icons/close_all.svg create mode 100644 src/assets/icons/close_left.svg create mode 100644 src/assets/icons/close_other.svg create mode 100644 src/assets/icons/close_right.svg create mode 100644 src/assets/icons/dict.svg create mode 100644 src/assets/icons/document.svg create mode 100644 src/assets/icons/download.svg create mode 100644 src/assets/icons/edit.svg create mode 100644 src/assets/icons/eye-open.svg create mode 100644 src/assets/icons/eye.svg create mode 100644 src/assets/icons/folder.svg create mode 100644 src/assets/icons/fullscreen-exit.svg create mode 100644 src/assets/icons/fullscreen.svg create mode 100644 src/assets/icons/github.svg create mode 100644 src/assets/icons/homepage.svg create mode 100644 src/assets/icons/indent-decrease.svg create mode 100644 src/assets/icons/ip.svg create mode 100644 src/assets/icons/language.svg create mode 100644 src/assets/icons/link.svg create mode 100644 src/assets/icons/menu.svg create mode 100644 src/assets/icons/message.svg create mode 100644 src/assets/icons/money.svg create mode 100644 src/assets/icons/monitor.svg create mode 100644 src/assets/icons/moon.svg create mode 100644 src/assets/icons/order.svg create mode 100644 src/assets/icons/peoples.svg create mode 100644 src/assets/icons/project.svg create mode 100644 src/assets/icons/publish.svg create mode 100644 src/assets/icons/refresh.svg create mode 100644 src/assets/icons/role.svg create mode 100644 src/assets/icons/security.svg create mode 100644 src/assets/icons/setting.svg create mode 100644 src/assets/icons/size.svg create mode 100644 src/assets/icons/sunny.svg create mode 100644 src/assets/icons/system.svg create mode 100644 src/assets/icons/table.svg create mode 100644 src/assets/icons/todolist.svg create mode 100644 src/assets/icons/tree.svg create mode 100644 src/assets/icons/user.svg create mode 100644 src/assets/icons/visit.svg create mode 100644 src/assets/images/401.gif create mode 100644 src/assets/images/404.png create mode 100644 src/assets/images/404_cloud.png create mode 100644 src/assets/images/login-bg-dark.jpg create mode 100644 src/assets/images/login-bg.jpg create mode 100644 src/assets/logo.png create mode 100644 src/components/AppLink/index.vue create mode 100644 src/components/Breadcrumb/index.vue create mode 100644 src/components/Dictionary/index.vue create mode 100644 src/components/Hamburger/index.vue create mode 100644 src/components/IconSelect/index.vue create mode 100644 src/components/LangSelect/index.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/SizeSelect/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/Table/AnyTable.vue create mode 100644 src/components/Table/TableBar.vue create mode 100644 src/components/WangEditor/index.vue create mode 100644 src/directive/index.ts create mode 100644 src/directive/permission/index.ts create mode 100644 src/enums/LayoutEnum.ts create mode 100644 src/enums/MenuTypeEnum.ts create mode 100644 src/enums/ThemeEnum.ts create mode 100644 src/lang/index.ts create mode 100644 src/lang/package/en.ts create mode 100644 src/lang/package/zh-cn.ts create mode 100644 src/layout/components/AppMain/index.vue create mode 100644 src/layout/components/NavBar/components/NavbarLeft.vue create mode 100644 src/layout/components/NavBar/components/NavbarRight.vue create mode 100644 src/layout/components/NavBar/index.vue create mode 100644 src/layout/components/Settings/components/LayoutSelect.vue create mode 100644 src/layout/components/Settings/components/ThemeColorPicker.vue create mode 100644 src/layout/components/Settings/index.vue create mode 100644 src/layout/components/Sidebar/components/SidebarLogo.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMenu.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMenuItem.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMixTopMenu.vue create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/TagsView/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/main.ts create mode 100644 src/plugins/i18n.ts create mode 100644 src/plugins/icons.ts create mode 100644 src/plugins/index.ts create mode 100644 src/plugins/permission.ts create mode 100644 src/router/index.ts create mode 100644 src/settings.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app.ts create mode 100644 src/store/modules/permission.ts create mode 100644 src/store/modules/settings.ts create mode 100644 src/store/modules/tagsView.ts create mode 100644 src/store/modules/user.ts create mode 100644 src/styles/index.scss create mode 100644 src/styles/reset.scss create mode 100644 src/styles/table.scss create mode 100644 src/styles/variables.module.scss create mode 100644 src/styles/variables.scss create mode 100644 src/typings/auto-imports.d.ts create mode 100644 src/typings/components.d.ts create mode 100644 src/typings/env.d.ts create mode 100644 src/typings/global.d.ts create mode 100644 src/typings/router.d.ts create mode 100644 src/typings/shims-vue.d.ts create mode 100644 src/utils/color.ts create mode 100644 src/utils/i18n.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/nprogress.ts create mode 100644 src/utils/request.ts create mode 100644 src/views/dashboard/index.vue create mode 100644 src/views/error-page/401.vue create mode 100644 src/views/error-page/404.vue create mode 100644 src/views/login/index.vue create mode 100644 src/views/redirect/index.vue create mode 100644 src/views/resources/device-type/components/DeviceTypeToVer.vue create mode 100644 src/views/resources/device-type/components/DeviceTypeVersionEdit.vue create mode 100644 src/views/resources/device-type/index.vue create mode 100644 src/views/resources/file-list/components/FolderTree.vue create mode 100644 src/views/resources/file-list/index.vue create mode 100644 src/views/resources/file-server/components/FileServerForm.vue create mode 100644 src/views/resources/file-server/index.vue create mode 100644 src/views/system/dept/index.vue create mode 100644 src/views/system/dict/components/dict-item.vue create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/domain/components/DomainForm.vue create mode 100644 src/views/system/domain/index.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/user/components/dept-tree.vue create mode 100644 src/views/system/user/index.vue create mode 100644 src/views/table/index.vue create mode 100644 tsconfig.json create mode 100644 uno.config.ts create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..00ee2de --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org +root = true + +# 表示所有文件适用 +[*] +charset = utf-8 # 设置文件字符集为 utf-8 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +insert_final_newline = true # 始终在文件末尾插入一个新行 + +# 表示仅 md 文件适用以下规则 +[*.md] +max_line_length = off # 关闭最大行长度限制 +trim_trailing_whitespace = false # 关闭末尾空格修剪 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..4bf2cce --- /dev/null +++ b/.env.development @@ -0,0 +1,16 @@ +## 开发环境 +NODE_ENV='development' + +# 应用端口 +VITE_APP_PORT = 3000 + +# 代理前缀 +VITE_APP_BASE_API = '/dev-api' + +# 线上接口地址 +#VITE_APP_API_URL = http://vapi.youlai.tech +# 开发接口地址 +VITE_APP_API_URL = http://localhost:8989 + +# 是否启用 Mock 服务 +VITE_MOCK_DEV_SERVER = false diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..a2d828c --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +## 生产环境 +NODE_ENV='production' + +# 代理前缀 +VITE_APP_BASE_API = '/prod-api' + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..43af40f --- /dev/null +++ b/.eslintignore @@ -0,0 +1,14 @@ +dist +node_modules +public +.husky +.vscode +.idea +*.sh +*.md + +src/assets + +.eslintrc.cjs +.prettierrc.cjs +.stylelintrc.cjs diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json new file mode 100644 index 0000000..f4738bf --- /dev/null +++ b/.eslintrc-auto-import.json @@ -0,0 +1,284 @@ +{ + "globals": { + "Component": true, + "ComponentPublicInstance": true, + "ComputedRef": true, + "EffectScope": true, + "ElMessage": true, + "ElMessageBox": true, + "ElNotification": true, + "InjectionKey": true, + "PropType": true, + "Ref": true, + "VNode": true, + "asyncComputed": true, + "autoResetRef": true, + "computed": true, + "computedAsync": true, + "computedEager": true, + "computedInject": true, + "computedWithControl": true, + "controlledComputed": true, + "controlledRef": true, + "createApp": true, + "createEventHook": true, + "createGlobalState": true, + "createInjectionState": true, + "createReactiveFn": true, + "createReusableTemplate": true, + "createSharedComposable": true, + "createTemplatePromise": true, + "createUnrefFn": true, + "customRef": true, + "debouncedRef": true, + "debouncedWatch": true, + "defineAsyncComponent": true, + "defineComponent": true, + "eagerComputed": true, + "effectScope": true, + "extendRef": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "ignorableWatch": true, + "inject": true, + "isDefined": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "makeDestructurable": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onClickOutside": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onKeyStroke": true, + "onLongPress": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onStartTyping": true, + "onUnmounted": true, + "onUpdated": true, + "pausableWatch": true, + "provide": true, + "reactify": true, + "reactifyObject": true, + "reactive": true, + "reactiveComputed": true, + "reactiveOmit": true, + "reactivePick": true, + "readonly": true, + "ref": true, + "refAutoReset": true, + "refDebounced": true, + "refDefault": true, + "refThrottled": true, + "refWithControl": true, + "resolveComponent": true, + "resolveRef": true, + "resolveUnref": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "syncRef": true, + "syncRefs": true, + "templateRef": true, + "throttledRef": true, + "throttledWatch": true, + "toRaw": true, + "toReactive": true, + "toRef": true, + "toRefs": true, + "toValue": true, + "triggerRef": true, + "tryOnBeforeMount": true, + "tryOnBeforeUnmount": true, + "tryOnMounted": true, + "tryOnScopeDispose": true, + "tryOnUnmounted": true, + "unref": true, + "unrefElement": true, + "until": true, + "useActiveElement": true, + "useAnimate": true, + "useArrayDifference": true, + "useArrayEvery": true, + "useArrayFilter": true, + "useArrayFind": true, + "useArrayFindIndex": true, + "useArrayFindLast": true, + "useArrayIncludes": true, + "useArrayJoin": true, + "useArrayMap": true, + "useArrayReduce": true, + "useArraySome": true, + "useArrayUnique": true, + "useAsyncQueue": true, + "useAsyncState": true, + "useAttrs": true, + "useBase64": true, + "useBattery": true, + "useBluetooth": true, + "useBreakpoints": true, + "useBroadcastChannel": true, + "useBrowserLocation": true, + "useCached": true, + "useClipboard": true, + "useCloned": true, + "useColorMode": true, + "useConfirmDialog": true, + "useCounter": true, + "useCssModule": true, + "useCssVar": true, + "useCssVars": true, + "useCurrentElement": true, + "useCycleList": true, + "useDark": true, + "useDateFormat": true, + "useDebounce": true, + "useDebounceFn": true, + "useDebouncedRefHistory": true, + "useDeviceMotion": true, + "useDeviceOrientation": true, + "useDevicePixelRatio": true, + "useDevicesList": true, + "useDisplayMedia": true, + "useDocumentVisibility": true, + "useDraggable": true, + "useDropZone": true, + "useElementBounding": true, + "useElementByPoint": true, + "useElementHover": true, + "useElementSize": true, + "useElementVisibility": true, + "useEventBus": true, + "useEventListener": true, + "useEventSource": true, + "useEyeDropper": true, + "useFavicon": true, + "useFetch": true, + "useFileDialog": true, + "useFileSystemAccess": true, + "useFocus": true, + "useFocusWithin": true, + "useFps": true, + "useFullscreen": true, + "useGamepad": true, + "useGeolocation": true, + "useIdle": true, + "useImage": true, + "useInfiniteScroll": true, + "useIntersectionObserver": true, + "useInterval": true, + "useIntervalFn": true, + "useKeyModifier": true, + "useLastChanged": true, + "useLocalStorage": true, + "useMagicKeys": true, + "useManualRefHistory": true, + "useMediaControls": true, + "useMediaQuery": true, + "useMemoize": true, + "useMemory": true, + "useMounted": true, + "useMouse": true, + "useMouseInElement": true, + "useMousePressed": true, + "useMutationObserver": true, + "useNavigatorLanguage": true, + "useNetwork": true, + "useNow": true, + "useObjectUrl": true, + "useOffsetPagination": true, + "useOnline": true, + "usePageLeave": true, + "useParallax": true, + "useParentElement": true, + "usePerformanceObserver": true, + "usePermission": true, + "usePointer": true, + "usePointerLock": true, + "usePointerSwipe": true, + "usePreferredColorScheme": true, + "usePreferredContrast": true, + "usePreferredDark": true, + "usePreferredLanguages": true, + "usePreferredReducedMotion": true, + "usePrevious": true, + "useRafFn": true, + "useRefHistory": true, + "useResizeObserver": true, + "useScreenOrientation": true, + "useScreenSafeArea": true, + "useScriptTag": true, + "useScroll": true, + "useScrollLock": true, + "useSessionStorage": true, + "useShare": true, + "useSlots": true, + "useSorted": true, + "useSpeechRecognition": true, + "useSpeechSynthesis": true, + "useStepper": true, + "useStorage": true, + "useStorageAsync": true, + "useStyleTag": true, + "useSupported": true, + "useSwipe": true, + "useTemplateRefsList": true, + "useTextDirection": true, + "useTextSelection": true, + "useTextareaAutosize": true, + "useThrottle": true, + "useThrottleFn": true, + "useThrottledRefHistory": true, + "useTimeAgo": true, + "useTimeout": true, + "useTimeoutFn": true, + "useTimeoutPoll": true, + "useTimestamp": true, + "useTitle": true, + "useToNumber": true, + "useToString": true, + "useToggle": true, + "useTransition": true, + "useUrlSearchParams": true, + "useUserMedia": true, + "useVModel": true, + "useVModels": true, + "useVibrate": true, + "useVirtualList": true, + "useWakeLock": true, + "useWebNotification": true, + "useWebSocket": true, + "useWebWorker": true, + "useWebWorkerFn": true, + "useWindowFocus": true, + "useWindowScroll": true, + "useWindowSize": true, + "watch": true, + "watchArray": true, + "watchAtMost": true, + "watchDebounced": true, + "watchDeep": true, + "watchEffect": true, + "watchIgnorable": true, + "watchImmediate": true, + "watchOnce": true, + "watchPausable": true, + "watchPostEffect": true, + "watchSyncEffect": true, + "watchThrottled": true, + "watchTriggerable": true, + "watchWithFilter": true, + "whenever": true + } +} diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..8ae169a --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,88 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + parser: "vue-eslint-parser", + extends: [ + // https://eslint.vuejs.org/user-guide/#usage + "plugin:vue/vue3-recommended", + "./.eslintrc-auto-import.json", + "prettier", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + ], + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + parser: "@typescript-eslint/parser", + project: "./tsconfig.*?.json", + createDefaultProgram: false, + extraFileExtensions: [".vue"], + }, + plugins: ["vue", "@typescript-eslint"], + rules: { + // https://eslint.vuejs.org/rules/#priority-a-essential-error-prevention + "vue/multi-word-component-names": "off", + "vue/no-v-model-argument": "off", + "vue/script-setup-uses-vars": "error", + "vue/no-reserved-component-names": "off", + "vue/custom-event-name-casing": "off", + "vue/attributes-order": "off", + "vue/one-component-per-file": "off", + "vue/html-closing-bracket-newline": "off", + "vue/max-attributes-per-line": "off", + "vue/multiline-html-element-content-newline": "off", + "vue/singleline-html-element-content-newline": "off", + "vue/attribute-hyphenation": "off", + "vue/require-default-prop": "off", + "vue/require-explicit-emits": "off", + "vue/html-self-closing": [ + "error", + { + html: { + void: "always", + normal: "never", + component: "always", + }, + svg: "always", + math: "always", + }, + ], + + "@typescript-eslint/no-empty-function": "off", // 关闭空方法检查 + "@typescript-eslint/no-explicit-any": "off", // 关闭any类型的警告 + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-unused-vars": "off", + + "prettier/prettier": [ + "error", + { + useTabs: false, // 不使用制表符 + }, + ], + }, + // eslint不能对html文件生效 + overrides: [ + { + files: ["*.html"], + processor: "vue/.vue", + }, + ], + // https://eslint.org/docs/latest/use/configure/language-options#specifying-globals + globals: { + OptionType: "readonly", + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fee6999 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +.history + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +pnpm-lock.yaml +stats.html diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..e8511ea --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..37568d1 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run lint:lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f3e9850 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +dist +node_modules +public +.husky +.vscode +.idea +*.sh +*.md + +src/assets +stats.html diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..347fb32 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,46 @@ +module.exports = { + // (x)=>{},单个参数箭头函数是否显示小括号。(always:始终显示;avoid:省略括号。默认:always) + arrowParens: "always", + // 开始标签的右尖括号是否跟随在最后一行属性末尾,默认false + bracketSameLine: false, + // 对象字面量的括号之间打印空格 (true - Example: { foo: bar } ; false - Example: {foo:bar}) + bracketSpacing: true, + // 是否格式化一些文件中被嵌入的代码片段的风格(auto|off;默认auto) + embeddedLanguageFormatting: "auto", + // 指定 HTML 文件的空格敏感度 (css|strict|ignore;默认css) + htmlWhitespaceSensitivity: "css", + // 当文件已经被 Prettier 格式化之后,是否会在文件顶部插入一个特殊的 @format 标记,默认false + insertPragma: false, + // 在 JSX 中使用单引号替代双引号,默认false + jsxSingleQuote: false, + // 每行最多字符数量,超出换行(默认80) + printWidth: 80, + // 超出打印宽度 (always | never | preserve ) + proseWrap: "preserve", + // 对象属性是否使用引号(as-needed | consistent | preserve;默认as-needed:对象的属性需要加引号才添加;) + quoteProps: "as-needed", + // 是否只格式化在文件顶部包含特定注释(@prettier| @format)的文件,默认false + requirePragma: false, + // 结尾添加分号 + semi: true, + // 使用单引号 (true:单引号;false:双引号) + singleQuote: false, + // 缩进空格数,默认2个空格 + tabWidth: 2, + // 元素末尾是否加逗号,默认es5: ES5中的 objects, arrays 等会添加逗号,TypeScript 中的 type 后不加逗号 + trailingComma: "es5", + // 指定缩进方式,空格或tab,默认false,即使用空格 + useTabs: false, + // vue 文件中是否缩进 + diff --git a/package.json b/package.json new file mode 100644 index 0000000..2ace145 --- /dev/null +++ b/package.json @@ -0,0 +1,120 @@ +{ + "name": "ITMS终端综合管理系统", + "version": "2.9.2", + "private": true, + "type": "module", + "scripts": { + "preinstall": "npx only-allow pnpm", + "dev": "vite serve --mode development", + "build:prod": "vite build --mode production && vue-tsc --noEmit", + "prepare": "husky install", + "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", + "lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint \"**/*.{css,scss,vue}\" --fix", + "lint:lint-staged": "lint-staged", + "commit": "git-cz" + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + }, + "lint-staged": { + "*.{js,ts}": [ + "eslint --fix", + "prettier --write" + ], + "*.{cjs,json}": [ + "prettier --write" + ], + "*.{vue,html}": [ + "eslint --fix", + "prettier --write", + "stylelint --fix" + ], + "*.{scss,css}": [ + "stylelint --fix", + "prettier --write" + ], + "*.md": [ + "prettier --write" + ] + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "^10.9.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "5.1.10", + "animate.css": "^4.1.1", + "axios": "^1.6.7", + "echarts": "^5.5.0", + "element-plus": "^2.6.0", + "lodash-es": "^4.17.21", + "net": "^1.0.2", + "nprogress": "^0.2.0", + "path-browserify": "^1.0.1", + "path-to-regexp": "^6.2.1", + "pinia": "^2.1.7", + "sockjs-client": "1.6.1", + "sortablejs": "^1.15.2", + "stompjs": "^2.3.3", + "vue": "^3.4.21", + "vue-i18n": "9.9.1", + "vue-router": "^4.3.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@commitlint/cli": "^18.6.1", + "@commitlint/config-conventional": "^18.6.2", + "@iconify-json/ep": "^1.1.14", + "@types/lodash": "^4.14.202", + "@types/node": "^20.11.24", + "@types/nprogress": "^0.2.3", + "@types/path-browserify": "^1.0.2", + "@types/sockjs-client": "^1.5.4", + "@types/sortablejs": "^1.15.8", + "@types/stompjs": "^2.3.9", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "@vitejs/plugin-vue": "^5.0.4", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "autoprefixer": "^10.4.18", + "commitizen": "^4.3.0", + "cz-git": "^1.9.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-vue": "^9.22.0", + "fast-glob": "^3.3.2", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", + "postcss": "^8.4.35", + "postcss-html": "^1.6.0", + "postcss-scss": "^4.0.9", + "prettier": "^3.2.5", + "sass": "^1.71.1", + "stylelint": "^16.2.1", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^4.6.0", + "stylelint-config-recommended-scss": "^14.0.0", + "stylelint-config-recommended-vue": "^1.5.0", + "stylelint-config-standard": "^36.0.0", + "terser": "^5.28.1", + "typescript": "^5.3.3", + "unocss": "^0.58.5", + "unplugin-auto-import": "^0.17.5", + "unplugin-icons": "^0.18.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^5.1.5", + "vite-plugin-mock-dev-server": "^1.4.7", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^2.0.4" + }, + "repository": "https://bellmann.com", + "author": "bellmann", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8071065c0809033d8658cd6701ad0c028c7bd471 GIT binary patch literal 9351 zcmV;2BzW72P)PyA07*naRCr$PoeS75RaM8Ai6R;|(Nqj05Xs8ChiIaqlnP{dNzH@^4Ki=3rKUb! zx>06$$)X^Yj8Zc+6e?7_lp1AOq$q+S<^@bF5VbVW`F-s9nltBpXZBiq?U_CE&U&8r zIS05!t=n^T*G1%_24DbA{ohx{HnNo4Spy3|^lt?q zI7~#22*17cO$=J&lOpo=@cVlaxnj`XC*Iitkp2g_zlhvB`~U?2nX;TOBJUKD_lMtq zO?fi8$G!k$wT2%cB1Z;L9FqGXjM)DFipYCJ zgQDw2JX=KG9Kf=yEF!Y$0NJep3c!KoX_4#CDFB7vxtpwzO$Eq(8^GXAViCC{{OZ5+C;#Rlw-u3t!q&0=lWin_$8(9MeR@R8mK_T9K`yrc5VVn6N)0_&7&@cgid9A1s>hpY`b)H^w>D3jfG zO%)(mrt0m~jU67OrU`tQ&I>LYxM_StQ+b54Y|ps&!NKzWBUtiSN!fOtI>OwOyPP6G zxXWPG;4nUfaBg^ui2O|e#ic`Znz0YIVgQD_pdS~JT{HI8Y#P%r+b&kx$;gxd!b`ss+$r4f^`LOwJ!^Uz#bzk#t&qh<)DhVJjs3!8l zl*z29`wtZd)$fSN?A@}R^%mRQ(*jVqz4sD0!2rphdo`HSPALFk)nN7Tk}m{cyi`Q4 z^J;WyXQc+dt0K00hKM}bSwE~$Jik$;1b|>-^)x4*5)@n1UUt-{JWS`@Q2`X#V7vqu zl~KL3#|8-T&UbgxCU$kq!W&I8;H1lxW{$7i@qf+n-U@5u<5LEdQg=*%d{#vEO&NTn zF7XFAFMidjy``Bn4csX>C_X5yneEzmH*m{8xQqpmZ#vBs?k0f2W#1y@Y2Y_RUYF9yQg<{BaL>hkSE}H^ z`ufyHV(JeC5d3U@GiE>?WjKKUl!*LQVmnLqaW%l1gtJMia5eC@)JFR14*`%TiO4Ja z2GaBI9LD)-EMB*XiY%l$K35)>fZV-gbxX+&ke?Be*Caj^0{-t8vL_`rwNx)i13w!a zM^lFMpCa;*oQ9g50Ksle&WRMcEKu2$PK=N;$4#!w3IG8{ia@B1;U`O2bS{8=cev3` zq5S-ahdTEY>LYT@HWxttB5}ZY;U1b}!b_XQY9RIUn8;IHTwEmw zK%Sd8&`&I6)2`2WDvjMzMDW5+5qHa$H$d>@OfkI?3qWiEe=f3l8X$_4t+iD+kNimG z-1r%51MPaA0O7^PlQtz(mbx34#mMVn&ZHgKA5#+a5NO4HnTvP=1R{i#ff0+oxT?E6 z*2y>W$m&D;#)MfALxO8dvUmaHml6krzdwHei!2(bHSom5Gzu;sTn~W2^ZMR|=lY_m zu6HbY!f=+V1!*9~ck4reuseyp(E}joh{%JDO2w}V7QaP?)c{nkUkv$5zBX*v>fQ*J zvU&mI|Mx5E9vc->0YaeuD~to+mK=)%R4_3j}ekE^*&-FA6WJb0Y{J{)3npl|xe)Is&sXEm@8LEsUNF-c7Y zWdR83&sc8nYET9P<=pY_hPqR)f?b~vOR8X%A&C%ams7+maH%;4RycsdWnGTEgs`Qs zdRbOJ!Y**JSBV86DN7w&GPVnwCZ7CXweGlkf>zZk4+v)pYyGZz{~;m}EI`NP?KYGW zN5WYKN7`u70_1K91keyjlayuCB-Kl`OJ6DUoV$w%ByR+x;oh-Vh6jT+450AyB-pTS z4#R@Skhr||6Eaw>u@vs0E z@8m^XNJ3Elr-^f|tN*(35)jK9ru8V%0OVyN!i%mI+}}OPskQy5l)q89tN7`VKs5H! ziPUc1FIe9^j&Y_#Vk-hgj|Y!gbL?Ip%RRy>!ogiD+&@JDH5MS;X0m!qZJ_L0U7R}|_QwEYx1QSTbjAUfn3%Bz=e$&szEyKz zYs5C&Q^?Iu+KLq69kcK=zdfwDoqfjugg|(fS*>uHg?X=J`92Z(`RY>ZL=lOxh`=I` zK5(>b%HH8Y-?4znUL9_Yy|-FS4O2Y?eqMr)8N62ime?S%MCwaG5y2qQX?W=a2>Cl$ z32>&<2wM@5%^9RbVJihF`1P$AP}1Nihl>XckE_ILQOTtnwjG`?ay`zJOS*M)g*z?P zpn+A&vJ#!$XN2ejh;>FNSE^NXm)_oW1u%r9u6P{QEf>*%3)AmP=>rJv&A23J1cxwg+`U~4G-GI& zWhJbEaf?V`0FD^39ui~PPAPL?h^V_VrI8hNalywU*;9xqvRolF$6#e?#C2-z5uytq zp!#18T7bzNuhmineqikRtR7v$R*G@Q0)w`4`ZIax?<_H#xC*1`ZpVBvV9hpcCL9YXL(tOq42z@{kn+YVc;zs)KkgM852AQ znqV~Qtli?R0|7=KuX4Sw1{k#s#RNt_;Z@_vrgy8Tnm9{n1jT8Qt7*TlZ0xGR zp_RF%X2xap7=nGCZIn6^u1{IUf45qSV!9(epT|Yyu3<}gKuo8NGAmc;bpWwEd`zdO zC;sdbE%0{suVdrcsb`B5AHt~J9c166uOf&s|^tL^Oq_Ic~#}a#^h3ypTu@cEH$CK z?1}pXyEf#zLpt|A9NJ@LClB;CKydfg zvW^T%#(*ynK-@E8#<;ow4o|M8A9TJ`STzkOL2-;ML5A`aAXXh$5pS`$0dc?esd^x7 zfN-Py1m!4ILGa49+r_a{$GD|akNoVAOn6EP7jeuu;KAig1;37%Ny1zo#zT1PC|L+N=H{zIa-PK=zO9BfZ7y-5fg( zg0T)vaD9pGXI(i6IXL?OkRin@HhtZg`QUI%u959?NE0A{BgXT!*%8RM($dEam;qP{ttRAuV9qoDN7#A-R){R`^ z!R!$;HY|ZK!XFt^I8zzY%yBhD@c65hGE0)%L&PU{&8X(#*MYbC`4s{k& zb6e3-jCsnZlae$jrYl@J&WkCiEJJ84jFEuDnk81*WoL0b5ioWPEd-ruvng*;SJeRF zCOpP7ww@SC+GE_zwTiIjplkQj$#tY1R0w0WRx8sw<>HIa66_@qDnQDRDtHd>5M`Fy zV5`15E!c|wi2?-_q--cnJVR+y=BDNE<)gSS0KweG8AKyEv!!NPZT5$anu|*Ea(D`i z>ttL_5yE+MX5}ShSnCSGd1VCOqSS|LjZ`y#LNEHlk=7B zf#-_UR_Z6Jn^Z^;w6OuSb3$gemcC52=$h1T-0uL2+(|(_UdW+Cuw%x|?u0B{8hHo+ z(Ppm2e_vw_h#3(1zMm0OFtJR{*scMJ<&sG=%vG6=xX|NQr)bu+H)dHp0tkM}MJ|^* zH*Ux^tL~!!2w!f#;IV?wmiJjf8}AW2)^+8$#f9_%|0?J?w?iyfRKS5Sr@s;xgt(bB zf2s2uqdxaI?DKP;*HY(ojgl(%cmRT%11XMUh3yIlL{G8!?0fbPi#->N=Txp3C=shw z{llcK(U0f2rqUL>5Y8NYp-UEy1sdYJrveaO3=Q)~j@*OVps11`!X}LkKmZKy*#BHQ z#87h^MdQx{AX*mp91Ii|LxEzROVJD(z?%XCLk<_248z@OQXBJh5&+Ti@SYWH@1B#$ zZA$eV>(bWs5qkKiu^pX~XkDsa1wc5UY8=^M_|_ciV-=`HcWk>$IX?~HD+f5VytjTM zNNWj_k+s>RRy2J&0D=E?A4R`hykW}o7NXlcTtmFawX`RKVFu3T($jkPJu9t0)|mi= zdksy7)*N~7m>7`dAOB)PA9LC58rIkVR^)VmhRkVCHQ- z-taQ-3z>>><>WVz6cOR?n<{Y5)}SakP^pCHV-C5skT%?FfMk|2N@W#cHGyt)Q(RO4 zL=6fu;w}=W0m!TQplD=^w1Hb|Zm%^0{}N`xQiQL=QH>vzn{yGYPgoiW55`x`Gne>W zbQCiWO9Ixt0SMHT>M+J;IL zp5j>9V!Q+(q!}Q+vPM`vN@VeC&w==3a^TfJO+2zjAJ($Ck@LGGuv-!v&jEXCfk@W* z4_Ob(o+iZ{j*W-a+`K#>@*%_uwsp=SQxme6VlL))Ph$ov&pEf#aC^4Bw6&uKAmM;U zHddf2eSH0ZSkC#%#tIfJO^{V=yJM6i)mHO&v(_Lq>8G{h=i>8!w3U|fY7LMETAQ%v zS&$9Z0KxB{SPYGfZR*vG)mk<;9Z}9CsMa~pu^u0P76FYw_4Jk+AY8s_!zoKK^=c-q zEt{K;Xy1z36c+JC@@jwtLQv0Y1V6x!)&Q{(`$82;DCV5Sa*3+Z$5tLZO@*bbNds@H z*n1wXtO-TwwKYI2do&m>QgR6@$2&@K%O$F2pag|!P3)TXm$KJufV(73lA>+)(54lI zgSW+7v*<3ZkMcg|y z6(&}e3&)&Hlz=MM1MROI)`Ge$2WEIUj{o~u~SA3J!ew*f*{ zSgjkocTV!s9+sB%MKgX392h!s2=4KH+h0tdbB%WPihU>8h~D zo2#O=G5eZ_LBJE+fE*IzfI4SqNnUjBn08etm-u}gS+`}Cf`~=HdZUpNvzltg-&Gc( z2$<({$kj>@Q_UD~g6w)Z0MJ321}9eb=_2w{<(OXy;+z4|sJV((|R%&#B znUz)BQ)1$;=jtfQxr@X3_GMqBVjs4Oyks3fFb`rT)W~&ViQ@1#H-VJxuuPL;Nr#oi z)9LfQ72(5ud&WCg3zp@~h_?jWtDU$Rx|C$G|Gz*)UYzMg8nfBlfm4tPpl>fBUD_== z8siH)*ZeCOAGAA}R|I~womAEZ5cb75BWi@W-@Av~XHC7*%fjIJ@{EH-*PKN>gslbf z3|%r6RvN87VvG~3+Fa{V&;<~DcA%lr3TGE0@#Z9WcjjariSj@hvEuBIIc!GgJ2rXY5CEN$E)mRB62&g##XfB<@9-a<$-)m z&p7AECqNFF^9;|Y(~8&!5O{C7UDOIDHkeZ8B)QKaPcQ`btkN$l9V^~C;ls7ZoE}V= z3t4#|YnWH(`L7Qkux^lzNE6S?7zuIYEJB{`xroI&qM18)65LIsNX!KpUs>(0AZ1KL z)a50&L}s2HXlmDvu@4|rafGOc~!5|YzXfEfR~B%XC*F330^YVWwL zIvc8lUPjOn)#>Ps>fcCJyJxV!I_Kjj(yND znWzie7=X|>q+5`0X@%T^+{({IP7)C)DRT)c6xKsaO6Hg?Aj~y*@Q#`M$Xj=qtSwtp z^!3KR!NdZDm|j*9{E{@nfsh+r61dMnax*+hxBk9Lz0Q z1|BCOSiO2h0}$exSw(K#+v?5*j;)->h|HUVysgR{dt~N`@Im3j5-TyW4|CgIS@?F* zC+EoMJRur@(6}}uZvB8i7PeYnjD6w-m&4W`_4P@ZL$CR<(Kh!dFmd$BoVHiD532`G zo?5}B9oP0K(E=nTc!)?v2(PCuWaPRaV=Q^CAEG+@E@`na5+WUQPc^6Q6|9FR8eSxJ zKu{hoMOqr-$l4@cx@Of1P20nl@>URfeu>sLd& zb=`>JK7>85g^h#TPA2%(n2riA!xE2^+f6c$kx*Prn1nR95{7kcpnkvVzb#hi)rb9OsxP4W`n39mPcLdGt=;8oq5%($s?e zo(sQN;ckU(;nc-KY{;CsZomyktph7S=+u&wq<%nNj(KA~aO(}Ob?M=+!V9bvbYGSCz-LrP^(DF6bK?>TQX(g zV9gvf`D^O=l98F!L!0V+t9}YVs84t;2Ud%`E6{FUYpGmFouO9|?X-ER0LYXDt08_< z7%VKpZTp#)iXH&L^@LS~J+4LOVEQe26(MknE!LDJ#zT4C{F2GRQ&$iM_Lz#B7Yl(^ zrv4CN!{8&)MUr6EO-en^EY`1XO23|UaS5?{U|botR$Nk>#RDL8ZoOfrEW^LLp;gKTC~etdS%izkzS#WUcD(??eE?LK_v`I(bpdE<9u%S% zjZKVREhgQ-P=kC?)zJ%w>MTP)oSQf|aPMIe2q_?@NER=EFc1!`fW*4hfU1VeM(s+C=O1B6b9d1g;;mFQp=YX=$YL2|+PaYY$JroOczWdo@j ztm5vFnFAn9E;VKXZ%s15PEj~qdZ#mp(F1*A?3k*2IFSyO&~8G!T_qPl*hk`NiaWMd zaK=kniLCv4)Uz_dSo>acJ>=Y%MREg#L3?aBaP=mC+!Vi(+((cW z!duu@aVVYQWnfCsQ&W$4apcS&ne40>`_MhipMV21vNrcz>=<*F^9BhAazLk!Z^${x z$hL_IKP|FsSFxCoi&gJy zXRLqs`cP!CSglgZkN}~7=t%GC@O1D3#=0La!gS;I|7cB3&48b zM6qf@jg$2?20$3}HTTi2m^)&D4GVcXNI(eWoHh&Tc(FuNTuUKLQ<>4VS5^E&vG*AcdBh{fG{}h z*pM%K2?uzr9CM&K_0q`@?ZCRpc1oK>vukXlCmSsRASlSn9KTMvgjoU-Yq;hRFVtN6 zAmR^T@UsRut)fX4Iqpa26$Ez5~O$v zmz21?@S9WiT~8hLwZ%mzmvlH_5*+3!mjp}Xn>`y%ZL36pFelO!0}>8?-a?9MK*HS# ztIHz&8psI@dglTVGySFgLm9S2sQ^I>`vj0!+%jUc$QKKc0G7q#wOV7jfkCfk-rSgn zoLZ)2fYft)asW!MR0CXC0uspY0L>!T$JBEc$g!2G^?PAhHE?1rR;BIZ z?1{ucPg!t^#JvYY2*B8Lpvk;7P(tAnG#Qy9Ku|7TuzZOCiX}fu$^*jf9H8J`3X^2% zOpq`X65^s~?fYkFRXCf<#C9!C#4%_ts2teV>S^ru8 z-3vT52(UH*2L7!7KEyeqPiK5EVAv$6ZPGFqfbbB=zFTj*N_{BY;6qizkF!nv_vW9B zeUET9sQ=`g(ENY96gojn=4_{k&zXhH2_W?Y;r1Qo43a($eLk7ROJSJAWex9y&l~C& zTV;*_sg(^CCm;bV9O@VG*8p3{+HHr7PP3Ca1EhXfFly95VH>tcx&}7JpKTKWQojxm zX#*5~w@QCUHnIgMhwxwHw-FxEn*@;hjmAwI>KKB3xGYAEzHUNX)XQns-k1=mLK$<$dPXjC*@HbJo?5shNlsDqR#@@o~rJSO51cFYvSqvX)-}V%1!KJqXnRO$``g?77h= z@T>V}`~T50WD@o7nl=B;N>GDg$^_T_njEpjw*Y*IFT|WQV21zz002ovPDHLkV1oO} BdT{^% literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..066b137 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/api/article.ts b/src/api/article.ts new file mode 100644 index 0000000..2547a4b --- /dev/null +++ b/src/api/article.ts @@ -0,0 +1,88 @@ +import request from "@/utils/request"; + +export interface ArticleQuery { + page?: number; + limit?: number; + sort?: string; + title?: string; + type?: string; + importance?: number; +} + +export interface ArticleDetail { + id: number; + timestamp: number; + title: string; + type: string; + status: string; + importance: number; + content?: string; + remark?: string; +} + +export interface ArticleCreate { + type: string; + timestamp: Date; + title: string; + status?: string; + importance?: number; + remark?: string; +} + +export interface ArticleUpdate { + id: number; + type?: string; + timestamp?: Date; + title?: string; + status?: string; + importance?: number; + remark?: string; +} + +export function fetchList(query: ArticleQuery) { + return request({ + url: "/api/v1/article/list", + method: "get", + params: query, + }); +} + +export function fetchArticle(id: number) { + return request({ + url: "/api/v1/article/detail", + method: "get", + params: { id }, + }); +} + +export function fetchPv(id: number) { + return request({ + url: "/api/v1/article/pv", + method: "get", + params: { id }, + }); +} + +export function createArticle(data: ArticleCreate) { + return request({ + url: "/api/v1/article/create", + method: "post", + data, + }); +} + +export function updateArticle(data: ArticleUpdate) { + return request({ + url: "/api/v1/article/update", + method: "post", + data, + }); +} + +export function deleteArticle(id: number) { + return request({ + url: "/api/v1/article/delete", + method: "post", + data: { id }, + }); +} diff --git a/src/api/auth/index.ts b/src/api/auth/index.ts new file mode 100644 index 0000000..645628e --- /dev/null +++ b/src/api/auth/index.ts @@ -0,0 +1,45 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { CaptchaResult, LoginData, LoginResult } from "./types"; + +/** + * 登录API + * + * @param data {LoginData} + * @returns + */ +export function loginApi(data: LoginData): AxiosPromise { + const formData = new FormData(); + formData.append("username", data.username); + formData.append("password", data.password); + formData.append("captchaKey", data.captchaKey || ""); + formData.append("captchaCode", data.captchaCode || ""); + return request({ + url: "/api/v1/auth/login", + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +/** + * 注销API + */ +export function logoutApi() { + return request({ + url: "/api/v1/auth/logout", + method: "delete", + }); +} + +/** + * 获取验证码 + */ +export function getCaptchaApi(): AxiosPromise { + return request({ + url: "/api/v1/auth/captcha", + method: "get", + }); +} diff --git a/src/api/auth/types.ts b/src/api/auth/types.ts new file mode 100644 index 0000000..0da661e --- /dev/null +++ b/src/api/auth/types.ts @@ -0,0 +1,59 @@ +/** + * 登录请求参数 + */ +export interface LoginData { + /** + * 用户名 + */ + username: string; + /** + * 密码 + */ + password: string; + + /** + * 验证码缓存key + */ + captchaKey?: string; + + /** + * 验证码 + */ + captchaCode?: string; +} + +/** + * 登录响应 + */ +export interface LoginResult { + /** + * 访问token + */ + accessToken?: string; + /** + * 过期时间(单位:毫秒) + */ + expires?: number; + /** + * 刷新token + */ + refreshToken?: string; + /** + * token 类型 + */ + tokenType?: string; +} + +/** + * 验证码响应 + */ +export interface CaptchaResult { + /** + * 验证码缓存key + */ + captchaKey: string; + /** + * 验证码图片Base64字符串 + */ + captchaBase64: string; +} diff --git a/src/api/dept/index.ts b/src/api/dept/index.ts new file mode 100644 index 0000000..f5e0466 --- /dev/null +++ b/src/api/dept/index.ts @@ -0,0 +1,77 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { DeptForm, DeptQuery, DeptVO } from "./types"; + +/** + * 部门树形表格 + * + * @param queryParams + */ +export function listDepts(queryParams?: DeptQuery): AxiosPromise { + return request({ + url: "/api/v1/dept", + method: "get", + params: queryParams, + }); +} + +/** + * 部门下拉列表 + */ +export function getDeptOptions(): AxiosPromise { + return request({ + url: "/api/v1/dept/options", + method: "get", + }); +} + +/** + * 获取部门详情 + * + * @param id + */ +export function getDeptForm(id: number): AxiosPromise { + return request({ + url: "/api/v1/dept/" + id + "/form", + method: "get", + }); +} + +/** + * 新增部门 + * + * @param data + */ +export function addDept(data: DeptForm) { + return request({ + url: "/api/v1/dept", + method: "post", + data: data, + }); +} + +/** + * 修改部门 + * + * @param id + * @param data + */ +export function updateDept(id: number, data: DeptForm) { + return request({ + url: "/api/v1/dept/" + id, + method: "put", + data: data, + }); +} + +/** + * 删除部门 + * + * @param ids + */ +export function deleteDept(ids: string) { + return request({ + url: "/api/v1/dept/" + ids, + method: "delete", + }); +} diff --git a/src/api/dept/types.ts b/src/api/dept/types.ts new file mode 100644 index 0000000..408c39c --- /dev/null +++ b/src/api/dept/types.ts @@ -0,0 +1,71 @@ +/** + * 部门查询参数 + */ +export interface DeptQuery { + keywords?: string; + status?: number; +} + +/** + * 部门类型 + */ +export interface DeptVO { + /** + * 子部门 + */ + children?: DeptVO[]; + /** + * 创建时间 + */ + createTime?: Date; + /** + * 部门ID + */ + id?: number; + /** + * 部门名称 + */ + name?: string; + /** + * 父部门ID + */ + parentId?: number; + /** + * 排序 + */ + sort?: number; + /** + * 状态(1:启用;0:禁用) + */ + status?: number; + /** + * 修改时间 + */ + updateTime?: Date; +} + +/** + * 部门表单类型 + */ +export interface DeptForm { + /** + * 部门ID(新增不填) + */ + id?: number; + /** + * 部门名称 + */ + name?: string; + /** + * 父部门ID + */ + parentId: number; + /** + * 排序 + */ + sort?: number; + /** + * 状态(1:启用;0:禁用) + */ + status?: number; +} diff --git a/src/api/device-type-ver/index.ts b/src/api/device-type-ver/index.ts new file mode 100644 index 0000000..9dba39d --- /dev/null +++ b/src/api/device-type-ver/index.ts @@ -0,0 +1,69 @@ +import { + DeviceTypeToVerPageResult, + DeviceTypeToVerQuery, + DeviceTypeVerForm, +} from "@/api/device-type-ver/types"; +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; + +export function deviceTypeToVerPage( + data: DeviceTypeToVerQuery +): AxiosPromise { + return request({ + url: "/api/device-type-ver/v1/device-type/page", + method: "POST", + data, + }); +} + +export function updateTypeAndVersionState(typeAndVerId: number) { + return request({ + url: `/api/device-type-ver/v1/audit-soft-state/${typeAndVerId}`, + method: "PUT", + }); +} + +export function updateTypeNewSoftState(typeAndVerId: number) { + return request({ + url: `/api/device-type-ver/v1/audit-new-soft-state/${typeAndVerId}`, + method: "PUT", + }); +} + +export function copySoftVerToOtherOui(devTypeId: any, typeAndVerId: number) { + return request({ + url: `/api/device-type-ver/v1/audit-new-soft-state/${typeAndVerId}/${devTypeId}`, + method: "PUT", + }); +} +export function deleteDeviceTypeVersionById(typeAndVerId: number) { + return request({ + url: `/api/device-type-ver/v1/delete-device-type/${typeAndVerId}`, + method: "DELETE", + }); +} +export function deleteDeviceTypeVersionFile( + typeAndVerId: number, + fileId: number +) { + return request({ + url: `/api/device-type-ver/v1/delete-device-ver-file/${typeAndVerId}/${fileId}`, + method: "DELETE", + }); +} +export function findDevTypeVerEditForm( + typeAndVerId: number +): AxiosPromise { + return request({ + url: `/api/device-type-ver/v1/find-dev-type-ver-edit-form/${typeAndVerId}`, + method: "GET", + }); +} + +export function editDevTypeVerForm(data: DeviceTypeVerForm) { + return request({ + url: "/api/device-type-ver/v1/edit-dev-type-ver-form", + method: "POST", + data, + }); +} diff --git a/src/api/device-type-ver/types.ts b/src/api/device-type-ver/types.ts new file mode 100644 index 0000000..00ab325 --- /dev/null +++ b/src/api/device-type-ver/types.ts @@ -0,0 +1,33 @@ +export interface DeviceTypeToVerQuery extends PageQuery { + devTypeId?: number; +} +export interface DeviceTypeToVerVO { + typeAndVerId?: number; + softVer?: string; + fileName?: string; + fileId?: string; + fileCreateTime?: string; + auditTime?: string; + auditUserName?: string; + devTypeVerStatus?: string; + newSoftStatus?: string; +} +export type DeviceTypeToVerPageResult = PageResult; + +export interface DeviceTypeVerForm { + typeAndVerId?: number; + softVer?: string; + auditTime?: string; + auditUserName?: string; + connectReqUsername?: string; + connectReqPassword?: string; + acsUrlPassword?: string; + devTypeVerDesc?: string; + provisionFlag?: string; + devAccessType?: string; + devTypeName?: string; + devTypeNameNew?: string; + oldCASeparation?: string; + specVer?: string; +} + diff --git a/src/api/device-type/index.ts b/src/api/device-type/index.ts new file mode 100644 index 0000000..ef26932 --- /dev/null +++ b/src/api/device-type/index.ts @@ -0,0 +1,24 @@ +import { + DeviceTypePageResult, + DeviceTypeQuery, + DeviceTypeVO, +} from "@/api/device-type/types"; +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; + +export function getDeviceTypePage( + data: DeviceTypeQuery +): AxiosPromise { + return request({ + url: "/api/dev-type/v1/page", + method: "POST", + data, + }); +} + +export function findDevTypeById(devTypeId: number): AxiosPromise { + return request({ + url: `/api/dev-type/v1/${devTypeId}`, + method: "GET", + }); +} diff --git a/src/api/device-type/types.ts b/src/api/device-type/types.ts new file mode 100644 index 0000000..cc49bb4 --- /dev/null +++ b/src/api/device-type/types.ts @@ -0,0 +1,31 @@ +import { DictTypePageVO } from "@/api/dict/types"; + +export interface DeviceTypeQuery extends PageQuery { + devVendorName?: string; + devVendorOui?: string; + devTypeName?: string; + devHardVer?: string; +} + +export interface DeviceTypePageVO { + devTypeId?: number; + devVendorName?: string; + devVendorOui?: string; + devTypeName?: string; + devHardVer?: string; + typeAndVerId?: number; + devTypeVerStatus?: string; + tr069VerName?: string; + devTypeNameNew?: string; + softVer?: string; +} +export type DeviceTypePageResult = PageResult; + +export interface DeviceTypeVO { + devTypeId?: number; + devVendorName?: string; + devVendorOui?: string; + devTypeName?: string; + devHardVer?: string; + devTypeDesc?: string; +} diff --git a/src/api/dict/index.ts b/src/api/dict/index.ts new file mode 100644 index 0000000..635297e --- /dev/null +++ b/src/api/dict/index.ts @@ -0,0 +1,150 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + DictTypeQuery, + DictTypePageResult, + DictTypeForm, + DictQuery, + DictForm, + DictPageResult, +} from "./types"; + +/** + * 字典类型分页列表 + * + * @param queryParams + */ +export function getDictTypePage( + queryParams: DictTypeQuery +): AxiosPromise { + return request({ + url: "/api/v1/dict/types/page", + method: "get", + params: queryParams, + }); +} + +/** + * 字典类型表单数据 + * + * @param id + */ +export function getDictTypeForm(id: number): AxiosPromise { + return request({ + url: "/api/v1/dict/types/" + id + "/form", + method: "get", + }); +} + +/** + * 新增字典类型 + * + * @param data + */ +export function addDictType(data: DictTypeForm) { + return request({ + url: "/api/v1/dict/types", + method: "post", + data: data, + }); +} + +/** + * 修改字典类型 + * + * @param id + * @param data + */ +export function updateDictType(id: number, data: DictTypeForm) { + return request({ + url: "/api/v1/dict/types/" + id, + method: "put", + data: data, + }); +} + +/** + * 删除字典类型 + */ +export function deleteDictTypes(ids: string) { + return request({ + url: "/api/v1/dict/types/" + ids, + method: "delete", + }); +} + +/** + * 获取字典类型的数据项 + * + * @param typeCode 字典类型编码 + */ +export function getDictOptions(typeCode: string): AxiosPromise { + return request({ + url: "/api/v1/dict/" + typeCode + "/options", + method: "get", + }); +} + +/** + * 字典分页列表 + */ +export function getDictPage( + queryParams: DictQuery +): AxiosPromise { + return request({ + url: "/api/v1/dict/page", + method: "get", + params: queryParams, + }); +} + +/** + * 获取字典表单数据 + * + * @param id + */ +export function getDictFormData(id: number): AxiosPromise { + return request({ + url: "/api/v1/dict/" + id + "/form", + method: "get", + }); +} + +/** + * 新增字典 + * + * @param data + */ +export function addDict(data: DictForm) { + return request({ + url: "/api/v1/dict", + method: "post", + data: data, + }); +} + +/** + * 修改字典项 + * + * @param id + * @param data + */ +export function updateDict(id: number, data: DictForm) { + return request({ + url: "/api/v1/dict/" + id, + method: "put", + data: data, + }); +} + +/** + * 删除字典 + * + * @param ids 字典项ID,多个以英文逗号(,)分割 + */ +export function deleteDict(ids: string) { + return request({ + url: "/api/v1/dict/" + ids, + method: "delete", + }); +} diff --git a/src/api/dict/types.ts b/src/api/dict/types.ts new file mode 100644 index 0000000..315da6d --- /dev/null +++ b/src/api/dict/types.ts @@ -0,0 +1,142 @@ +/** + * 字典类型查询参数 + */ +export interface DictTypeQuery extends PageQuery { + /** + * 关键字(字典类型名称/编码) + */ + keywords?: string; +} + +/** + * 字典类型分页对象 + */ +export interface DictTypePageVO { + /** + * 字典类型ID + */ + id: number; + /** + * 类型编码 + */ + code: string; + /** + * 类型名称 + */ + name: string; + /** + * 状态(1:启用;0:禁用) + */ + status?: number; + /** + * 备注 + */ + remark?: string; +} + +/** + * 字典分页项类型声明 + */ +export type DictTypePageResult = PageResult; + +/** + * 字典表单类型声明 + */ +export interface DictTypeForm { + /** + * 字典类型ID + */ + id?: number; + /** + * 类型名称 + */ + name?: string; + /** + * 类型编码 + */ + code?: string; + /** + * 类型状态:1:启用;0:禁用 + */ + status: number; + /** + * 备注 + */ + remark?: string; +} + +/** + * 字典查询参数 + */ +export interface DictQuery extends PageQuery { + /** + * 字典项名称 + */ + name?: string; + /** + * 字典类型编码 + */ + typeCode?: string; +} + +/** + * 字典分页对象 + */ +export interface DictPageVO { + /** + * 字典ID + */ + id?: number; + /** + * 字典名称 + */ + name?: string; + /** + * 状态(1:启用;0:禁用) + */ + status?: number; + /** + * 字典值 + */ + value?: string; +} + +/** + * 字典分页 + */ +export type DictPageResult = PageResult; + +/** + * 字典表单 + */ +export interface DictForm { + /** + * 字典ID + */ + id?: number; + /** + * 字典名称 + */ + name?: string; + /** + * 排序 + */ + sort?: number; + /** + * 状态(1:启用;0:禁用) + */ + status?: number; + /** + * 类型编码 + */ + typeCode?: string; + /** + * 值 + */ + value?: string; + + /** + * 备注 + */ + remark?: string; +} diff --git a/src/api/domain/index.ts b/src/api/domain/index.ts new file mode 100644 index 0000000..ab88c2d --- /dev/null +++ b/src/api/domain/index.ts @@ -0,0 +1,49 @@ +import { DomainForm, DomainQuery, DomainVo } from "@/api/domain/types"; +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; + +export function getDomainList( + data: DomainQuery +): AxiosPromise> { + return request({ + url: "/api/domain/v1/list", + method: "POST", + data, + }); +} + +export function getDomainOptions(): AxiosPromise { + return request({ + url: "/api/domain/v1/options", + method: "GET", + }); +} + +export function addDomain(data: DomainForm) { + return request({ + url: "/api/domain/v1/add_domain", + method: "POST", + data, + }); +} + +export function editDomain(data: DomainForm) { + return request({ + url: "/api/domain/v1/edit_domain", + method: "POST", + data, + }); +} +export function deleteDomain(groupId: number) { + return request({ + url: `/api/domain/v1/${groupId}`, + method: "DELETE", + }); +} + +export function getDomainByGroupId(groupId: number): AxiosPromise { + return request({ + url: `/api/domain/v1/${groupId}`, + method: "GET", + }); +} diff --git a/src/api/domain/types.ts b/src/api/domain/types.ts new file mode 100644 index 0000000..17da989 --- /dev/null +++ b/src/api/domain/types.ts @@ -0,0 +1,29 @@ +export interface DomainQuery extends PageQuery { + keywords?: string; +} + +export interface DomainVo { + id?: number; + + groupId?: number; + + groupName?: string; + + parentGroupId?: number; + + description?: string; + + children?: Array; +} + +export interface DomainForm { + id?: number; + + groupId?: number; + + groupName?: string; + + parentGroupId?: number; + + description?: string; +} diff --git a/src/api/file-list/index.ts b/src/api/file-list/index.ts new file mode 100644 index 0000000..bcf0f00 --- /dev/null +++ b/src/api/file-list/index.ts @@ -0,0 +1,13 @@ +import { FileListPageResult, FileListQuery } from "@/api/file-list/types"; +import { AxiosPromise } from "axios"; +import request from "@/utils/request"; + +export function getPageData( + data: FileListQuery +): AxiosPromise { + return request({ + url: "/api/file_list/v1/page", + method: "POST", + data, + }); +} diff --git a/src/api/file-list/types.ts b/src/api/file-list/types.ts new file mode 100644 index 0000000..c05ca59 --- /dev/null +++ b/src/api/file-list/types.ts @@ -0,0 +1,43 @@ +import { FileServerVO } from "@/api/file-server/types"; + +export interface FileListQuery extends PageQuery { + fileName?: string; + fileType?: string; + fileServerId?: number | undefined; +} + +export interface FileListVO { + fileId?: number; + + /** + * 上传者 + */ + userName?: string; + + /** + * 文件类型 + */ + fileType?: string; + + /** + * 文件名称 + */ + fileName?: string; + + /** + * 文件上传时间 + */ + + fileCreateTime?: string; + + /** + * 文件描述 + */ + fileDesc?: string; + + /** + * 文件服务器ID + */ + fileServId?: number; +} +export type FileListPageResult = PageResult; diff --git a/src/api/file-server/index.ts b/src/api/file-server/index.ts new file mode 100644 index 0000000..3cc41f3 --- /dev/null +++ b/src/api/file-server/index.ts @@ -0,0 +1,30 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { FileServerForm, FileServerPageResult } from "@/api/file-server/types"; + +export function getFileServerPage( + data: PageQuery +): AxiosPromise { + return request({ + url: "/api/file_server/v1/page", + method: "POST", + data, + }); +} + +export function findFileServerFormById( + id: number +): AxiosPromise { + return request({ + url: `/api/file_server/v1/${id}`, + method: "GET", + }); +} + +export function editFileServer(data: FileServerForm) { + return request({ + url: "/api/file_server/v1/edit", + method: "POST", + data, + }); +} diff --git a/src/api/file-server/types.ts b/src/api/file-server/types.ts new file mode 100644 index 0000000..2adc91e --- /dev/null +++ b/src/api/file-server/types.ts @@ -0,0 +1,39 @@ +import { DictTypePageVO } from "@/api/dict/types"; + +export interface FileServerVO { + fileServId?: number; + + fileServName?: string; + + supportMode?: string; + + ftpIp?: string; + + ftpPort?: string; + + ftpUserName?: string; + + ftpRootDir?: string; +} + +export type FileServerPageResult = PageResult; + +export interface FileServerForm { + fileServId?: number; + + fileServName?: string; + + supportMode?: string; + + ftpIp?: string; + + ftpPort?: string; + + ftpUserName?: string; + + ftpRootDir?: string; + + ftpVerifyPassword?: string; + + ftpPassword?: string; +} diff --git a/src/api/file/index.ts b/src/api/file/index.ts new file mode 100644 index 0000000..16fcec7 --- /dev/null +++ b/src/api/file/index.ts @@ -0,0 +1,33 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { FileInfo } from "./types"; + +/** + * 上传文件 + * + * @param file + */ +export function uploadFileApi(file: File): AxiosPromise { + const formData = new FormData(); + formData.append("file", file); + return request({ + url: "/api/file-option/v1/upload", + method: "POST", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +/** + * 文件下载 + * @param fileId + */ +export function downloadFileApi(fileId: number) { + return request({ + url: `/api/file-option/v1/download/${fileId}`, + method: "GET", + responseType: "blob", + }); +} diff --git a/src/api/file/types.ts b/src/api/file/types.ts new file mode 100644 index 0000000..22b2be5 --- /dev/null +++ b/src/api/file/types.ts @@ -0,0 +1,7 @@ +/** + * 文件API类型声明 + */ +export interface FileInfo { + name: string; + url: string; +} diff --git a/src/api/menu/index.ts b/src/api/menu/index.ts new file mode 100644 index 0000000..032e0a9 --- /dev/null +++ b/src/api/menu/index.ts @@ -0,0 +1,87 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { MenuQuery, MenuVO, MenuForm } from "./types"; + +/** + * 获取路由列表 + */ +export function listRoutes() { + return request({ + url: "/api/v1/menus/routes", + method: "get", + }); +} + +/** + * 获取菜单树形列表 + * + * @param queryParams + */ +export function listMenus(queryParams: MenuQuery): AxiosPromise { + return request({ + url: "/api/v1/menus", + method: "get", + params: queryParams, + }); +} + +/** + * 获取菜单下拉树形列表 + */ +export function getMenuOptions(): AxiosPromise { + return request({ + url: "/api/v1/menus/options", + method: "get", + }); +} + +/** + * 获取菜单表单数据 + * + * @param id + */ +export function getMenuForm(id: number): AxiosPromise { + return request({ + url: "/api/v1/menus/" + id + "/form", + method: "get", + }); +} + +/** + * 添加菜单 + * + * @param data + */ +export function addMenu(data: MenuForm) { + return request({ + url: "/api/v1/menus", + method: "post", + data: data, + }); +} + +/** + * 修改菜单 + * + * @param id + * @param data + */ +export function updateMenu(id: string, data: MenuForm) { + return request({ + url: "/api/v1/menus/" + id, + method: "put", + data: data, + }); +} + +/** + * 删除菜单 + * + * @param id 菜单ID + */ +export function deleteMenu(id: number) { + return request({ + url: "/api/v1/menus/" + id, + method: "delete", + }); +} diff --git a/src/api/menu/types.ts b/src/api/menu/types.ts new file mode 100644 index 0000000..38101e8 --- /dev/null +++ b/src/api/menu/types.ts @@ -0,0 +1,124 @@ +import { MenuTypeEnum } from "@/enums/MenuTypeEnum"; + +/** + * 菜单查询参数类型 + */ +export interface MenuQuery { + keywords?: string; +} + +/** + * 菜单视图对象类型 + */ +export interface MenuVO { + /** + * 子菜单 + */ + children?: MenuVO[]; + /** + * 组件路径 + */ + component?: string; + /** + * ICON + */ + icon?: string; + /** + * 菜单ID + */ + id?: number; + /** + * 菜单名称 + */ + name?: string; + /** + * 父菜单ID + */ + parentId?: number; + /** + * 按钮权限标识 + */ + perm?: string; + /** + * 跳转路径 + */ + redirect?: string; + /** + * 路由名称 + */ + routeName?: string; + /** + * 路由相对路径 + */ + routePath?: string; + /** + * 菜单排序(数字越小排名越靠前) + */ + sort?: number; + /** + * 菜单类型 + */ + type?: MenuTypeEnum; + /** + * 菜单是否可见(1:显示;0:隐藏) + */ + visible?: number; +} + +/** + * 菜单表单对象类型 + */ +export interface MenuForm { + /** + * 菜单ID + */ + id?: string; + /** + * 父菜单ID + */ + parentId?: number; + /** + * 菜单名称 + */ + name?: string; + /** + * 菜单是否可见(1:是;0:否;) + */ + visible: number; + icon?: string; + /** + * 排序 + */ + sort: number; + /** + * 组件路径 + */ + component?: string; + /** + * 路由路径 + */ + path?: string; + /** + * 跳转路由路径 + */ + redirect?: string; + + /** + * 菜单类型 + */ + type: MenuTypeEnum; + + /** + * 权限标识 + */ + perm?: string; + /** + * 【菜单】是否开启页面缓存 + */ + keepAlive?: number; + + /** + * 【目录】只有一个子路由是否始终显示 + */ + alwaysShow?: number; +} diff --git a/src/api/role/index.ts b/src/api/role/index.ts new file mode 100644 index 0000000..fdbc65c --- /dev/null +++ b/src/api/role/index.ts @@ -0,0 +1,112 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { RoleQuery, RolePageResult, RoleForm } from "./types"; + +/** + * 获取角色分页数据 + * + * @param queryParams + */ +export function getRolePage( + queryParams?: RoleQuery +): AxiosPromise { + return request({ + url: "/api/v1/roles/page", + method: "get", + params: queryParams, + }); +} + +/** + * 获取角色下拉数据 + * + * @param queryParams + */ +export function getRoleOptions( + queryParams?: RoleQuery +): AxiosPromise { + return request({ + url: "/api/v1/roles/options", + method: "get", + params: queryParams, + }); +} + +/** + * 获取角色的菜单ID集合 + * + * @param queryParams + */ +export function getRoleMenuIds(roleId: number): AxiosPromise { + return request({ + url: "/api/v1/roles/" + roleId + "/menuIds", + method: "get", + }); +} + +/** + * 分配菜单权限给角色 + * + * @param queryParams + */ +export function updateRoleMenus( + roleId: number, + data: number[] +): AxiosPromise { + return request({ + url: "/api/v1/roles/" + roleId + "/menus", + method: "put", + data: data, + }); +} + +/** + * 获取角色详情 + * + * @param id + */ +export function getRoleForm(id: number): AxiosPromise { + return request({ + url: "/api/v1/roles/" + id + "/form", + method: "get", + }); +} + +/** + * 添加角色 + * + * @param data + */ +export function addRole(data: RoleForm) { + return request({ + url: "/api/v1/roles", + method: "post", + data: data, + }); +} + +/** + * 更新角色 + * + * @param id + * @param data + */ +export function updateRole(id: number, data: RoleForm) { + return request({ + url: "/api/v1/roles/" + id, + method: "put", + data: data, + }); +} + +/** + * 批量删除角色,多个以英文逗号(,)分割 + * + * @param ids + */ +export function deleteRoles(ids: string) { + return request({ + url: "/api/v1/roles/" + ids, + method: "delete", + }); +} diff --git a/src/api/role/types.ts b/src/api/role/types.ts new file mode 100644 index 0000000..2d259c7 --- /dev/null +++ b/src/api/role/types.ts @@ -0,0 +1,78 @@ +/** + * 角色查询参数 + */ +export interface RoleQuery extends PageQuery { + keywords?: string; +} + +/** + * 角色分页对象 + */ +export interface RolePageVO { + /** + * 角色编码 + */ + code?: string; + + /** + * 角色ID + */ + id?: number; + /** + * 角色名称 + */ + name?: string; + /** + * 排序 + */ + sort?: number; + /** + * 角色状态 + */ + status?: number; + /** + * 创建时间 + */ + createTime?: Date; + /** + * 修改时间 + */ + updateTime?: Date; +} + +/** + * 角色分页 + */ +export type RolePageResult = PageResult; + +/** + * 角色表单对象 + */ +export interface RoleForm { + /** + * 角色ID + */ + id?: number; + + /** + * 角色编码 + */ + code: string; + /** + * 数据权限 + */ + dataScope?: number; + + /** + * 角色名称 + */ + name: string; + /** + * 排序 + */ + sort?: number; + /** + * 角色状态(1-正常;0-停用) + */ + status?: number; +} diff --git a/src/api/type-ver-ext/index.ts b/src/api/type-ver-ext/index.ts new file mode 100644 index 0000000..4a97017 --- /dev/null +++ b/src/api/type-ver-ext/index.ts @@ -0,0 +1,19 @@ +import { AxiosPromise } from "axios"; +import { CapabilityForm } from "@/api/type-ver-ext/types"; +import request from "@/utils/request"; + +export function getCapabilityForm( + typeAndVerId: string +): AxiosPromise { + return request({ + url: `/api/type-ver-ext/v1/${typeAndVerId}`, + method: "GET", + }); +} +export function editCapabilityForm(data: CapabilityForm) { + return request({ + url: `/api/type-ver-ext/v1/edit`, + method: "POST", + data, + }); +} diff --git a/src/api/type-ver-ext/types.ts b/src/api/type-ver-ext/types.ts new file mode 100644 index 0000000..174b9fd --- /dev/null +++ b/src/api/type-ver-ext/types.ts @@ -0,0 +1,16 @@ +export interface CapabilityForm { + typeAndVerId?: string | number; + lanNumber?: string; + voipPortNumber?: string; + gePortNumber?: string; + fePortNumber?: string; + wifiType?: string; + wifiConfig?: string; + voipProtocol?: string; + capability?: string; + mesh?: string; + ywg?: string; + tr143?: string; + ipv6Enable?: string; + reboot?: string; +} diff --git a/src/api/user/index.ts b/src/api/user/index.ts new file mode 100644 index 0000000..3c7087a --- /dev/null +++ b/src/api/user/index.ts @@ -0,0 +1,140 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { UserForm, UserInfo, UserPageVO, UserQuery } from "./types"; + +/** + * 登录成功后获取用户信息(昵称、头像、权限集合和角色集合) + */ +export function getUserInfoApi(): AxiosPromise { + return request({ + url: "/api/v1/users/me", + method: "get", + }); +} + +/** + * 获取用户分页列表 + * + * @param queryParams + */ +export function getUserPage( + queryParams: UserQuery +): AxiosPromise> { + return request({ + url: "/api/v1/users/page", + method: "get", + params: queryParams, + }); +} + +/** + * 获取用户表单详情 + * + * @param userId + */ +export function getUserForm(userId: number): AxiosPromise { + return request({ + url: "/api/v1/users/" + userId + "/form", + method: "get", + }); +} + +/** + * 添加用户 + * + * @param data + */ +export function addUser(data: any) { + return request({ + url: "/api/v1/users", + method: "post", + data: data, + }); +} + +/** + * 修改用户 + * + * @param id + * @param data + */ +export function updateUser(id: number, data: UserForm) { + return request({ + url: "/api/v1/users/" + id, + method: "put", + data: data, + }); +} + +/** + * 修改用户密码 + * + * @param id + * @param password + */ +export function updateUserPassword(id: number, password: string) { + return request({ + url: "/api/v1/users/" + id + "/password", + method: "patch", + params: { password: password }, + }); +} + +/** + * 删除用户 + * + * @param ids + */ +export function deleteUsers(ids: string) { + return request({ + url: "/api/v1/users/" + ids, + method: "delete", + }); +} + +/** + * 下载用户导入模板 + * + * @returns + */ +export function downloadTemplateApi() { + return request({ + url: "/api/v1/users/template", + method: "get", + responseType: "arraybuffer", + }); +} + +/** + * 导出用户 + * + * @param queryParams + * @returns + */ +export function exportUser(queryParams: UserQuery) { + return request({ + url: "/api/v1/users/_export", + method: "get", + params: queryParams, + responseType: "arraybuffer", + }); +} + +/** + * 导入用户 + * + * @param file + */ +export function importUser(deptId: number, file: File) { + const formData = new FormData(); + formData.append("file", file); + return request({ + url: "/api/v1/users/_import", + method: "post", + params: { deptId: deptId }, + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} diff --git a/src/api/user/types.ts b/src/api/user/types.ts new file mode 100644 index 0000000..bd6335c --- /dev/null +++ b/src/api/user/types.ts @@ -0,0 +1,124 @@ +/** + * 登录用户信息 + */ +export interface UserInfo { + userId?: number; + username?: string; + nickname?: string; + avatar?: string; + roles: string[]; + perms: string[]; +} + +/** + * 用户查询对象类型 + */ +export interface UserQuery extends PageQuery { + keywords?: string; + status?: number; + deptId?: number; + startTime?: string; + endTime?: string; + groupId?: number; +} + +/** + * 用户分页对象 + */ +export interface UserPageVO { + /** + * 用户头像地址 + */ + avatar?: string; + /** + * 创建时间 + */ + createTime?: Date; + /** + * 部门名称 + */ + deptName?: string; + /** + * 用户邮箱 + */ + email?: string; + /** + * 性别 + */ + genderLabel?: string; + /** + * 用户ID + */ + id?: number; + /** + * 手机号 + */ + mobile?: string; + /** + * 用户昵称 + */ + nickname?: string; + /** + * 角色名称,多个使用英文逗号(,)分割 + */ + roleNames?: string; + /** + * 用户状态(1:启用;0:禁用) + */ + status?: number; + /** + * 用户名 + */ + username?: string; + /** + * xi + */ + groupName?: string; +} + +/** + * 用户表单类型 + */ +export interface UserForm { + /** + * 用户头像 + */ + avatar?: string; + /** + * 部门ID + */ + deptId?: number; + /** + * 邮箱 + */ + email?: string; + /** + * 性别 + */ + gender?: number; + /** + * 用户ID + */ + id?: number; + mobile?: string; + /** + * 昵称 + */ + nickname?: string; + /** + * 角色ID集合 + */ + roleIds?: number[]; + /** + * 用户状态(1:正常;0:禁用) + */ + status?: number; + /** + * 用户名 + */ + username?: string; + /** + * 系统管理域 + */ + domainGroupId?: number; +} diff --git a/src/assets/icons/api.svg b/src/assets/icons/api.svg new file mode 100644 index 0000000..0181bdd --- /dev/null +++ b/src/assets/icons/api.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/captcha.svg b/src/assets/icons/captcha.svg new file mode 100644 index 0000000..8b1da30 --- /dev/null +++ b/src/assets/icons/captcha.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/cascader.svg b/src/assets/icons/cascader.svg new file mode 100644 index 0000000..57209bf --- /dev/null +++ b/src/assets/icons/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/client.svg b/src/assets/icons/client.svg new file mode 100644 index 0000000..7373b3d --- /dev/null +++ b/src/assets/icons/client.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close.svg b/src/assets/icons/close.svg new file mode 100644 index 0000000..e99c978 --- /dev/null +++ b/src/assets/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_all.svg b/src/assets/icons/close_all.svg new file mode 100644 index 0000000..2005198 --- /dev/null +++ b/src/assets/icons/close_all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_left.svg b/src/assets/icons/close_left.svg new file mode 100644 index 0000000..fc5cf71 --- /dev/null +++ b/src/assets/icons/close_left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_other.svg b/src/assets/icons/close_other.svg new file mode 100644 index 0000000..27ffc32 --- /dev/null +++ b/src/assets/icons/close_other.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_right.svg b/src/assets/icons/close_right.svg new file mode 100644 index 0000000..b96dc1c --- /dev/null +++ b/src/assets/icons/close_right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dict.svg b/src/assets/icons/dict.svg new file mode 100644 index 0000000..db60220 --- /dev/null +++ b/src/assets/icons/dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/document.svg b/src/assets/icons/document.svg new file mode 100644 index 0000000..aaa0574 --- /dev/null +++ b/src/assets/icons/document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/download.svg b/src/assets/icons/download.svg new file mode 100644 index 0000000..a8077dc --- /dev/null +++ b/src/assets/icons/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/edit.svg b/src/assets/icons/edit.svg new file mode 100644 index 0000000..82152b5 --- /dev/null +++ b/src/assets/icons/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/eye-open.svg b/src/assets/icons/eye-open.svg new file mode 100644 index 0000000..b80fd2b --- /dev/null +++ b/src/assets/icons/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/eye.svg b/src/assets/icons/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/src/assets/icons/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/folder.svg b/src/assets/icons/folder.svg new file mode 100644 index 0000000..f4c406d --- /dev/null +++ b/src/assets/icons/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fullscreen-exit.svg b/src/assets/icons/fullscreen-exit.svg new file mode 100644 index 0000000..2452f2b --- /dev/null +++ b/src/assets/icons/fullscreen-exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fullscreen.svg b/src/assets/icons/fullscreen.svg new file mode 100644 index 0000000..4b6ee11 --- /dev/null +++ b/src/assets/icons/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/github.svg b/src/assets/icons/github.svg new file mode 100644 index 0000000..1adfa4e --- /dev/null +++ b/src/assets/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/homepage.svg b/src/assets/icons/homepage.svg new file mode 100644 index 0000000..1e1feab --- /dev/null +++ b/src/assets/icons/homepage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/indent-decrease.svg b/src/assets/icons/indent-decrease.svg new file mode 100644 index 0000000..1507568 --- /dev/null +++ b/src/assets/icons/indent-decrease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/ip.svg b/src/assets/icons/ip.svg new file mode 100644 index 0000000..a50d9bb --- /dev/null +++ b/src/assets/icons/ip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/language.svg b/src/assets/icons/language.svg new file mode 100644 index 0000000..e754062 --- /dev/null +++ b/src/assets/icons/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/link.svg b/src/assets/icons/link.svg new file mode 100644 index 0000000..15a5c62 --- /dev/null +++ b/src/assets/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/menu.svg b/src/assets/icons/menu.svg new file mode 100644 index 0000000..f5875d3 --- /dev/null +++ b/src/assets/icons/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/message.svg b/src/assets/icons/message.svg new file mode 100644 index 0000000..c83af99 --- /dev/null +++ b/src/assets/icons/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/money.svg b/src/assets/icons/money.svg new file mode 100644 index 0000000..db7a2b4 --- /dev/null +++ b/src/assets/icons/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/monitor.svg b/src/assets/icons/monitor.svg new file mode 100644 index 0000000..f153b9c --- /dev/null +++ b/src/assets/icons/monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/moon.svg b/src/assets/icons/moon.svg new file mode 100644 index 0000000..1b66489 --- /dev/null +++ b/src/assets/icons/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/order.svg b/src/assets/icons/order.svg new file mode 100644 index 0000000..7ba029e --- /dev/null +++ b/src/assets/icons/order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/peoples.svg b/src/assets/icons/peoples.svg new file mode 100644 index 0000000..5b21639 --- /dev/null +++ b/src/assets/icons/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/project.svg b/src/assets/icons/project.svg new file mode 100644 index 0000000..e74a210 --- /dev/null +++ b/src/assets/icons/project.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/publish.svg b/src/assets/icons/publish.svg new file mode 100644 index 0000000..d41061f --- /dev/null +++ b/src/assets/icons/publish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/refresh.svg b/src/assets/icons/refresh.svg new file mode 100644 index 0000000..e598ed1 --- /dev/null +++ b/src/assets/icons/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/role.svg b/src/assets/icons/role.svg new file mode 100644 index 0000000..5d25278 --- /dev/null +++ b/src/assets/icons/role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/security.svg b/src/assets/icons/security.svg new file mode 100644 index 0000000..0e64336 --- /dev/null +++ b/src/assets/icons/security.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/setting.svg b/src/assets/icons/setting.svg new file mode 100644 index 0000000..fbc4945 --- /dev/null +++ b/src/assets/icons/setting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/size.svg b/src/assets/icons/size.svg new file mode 100644 index 0000000..f92f852 --- /dev/null +++ b/src/assets/icons/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/sunny.svg b/src/assets/icons/sunny.svg new file mode 100644 index 0000000..655a72e --- /dev/null +++ b/src/assets/icons/sunny.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/system.svg b/src/assets/icons/system.svg new file mode 100644 index 0000000..2e6045b --- /dev/null +++ b/src/assets/icons/system.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/table.svg b/src/assets/icons/table.svg new file mode 100644 index 0000000..1a16abb --- /dev/null +++ b/src/assets/icons/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/todolist.svg b/src/assets/icons/todolist.svg new file mode 100644 index 0000000..cd55ade --- /dev/null +++ b/src/assets/icons/todolist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tree.svg b/src/assets/icons/tree.svg new file mode 100644 index 0000000..51aea8f --- /dev/null +++ b/src/assets/icons/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/user.svg b/src/assets/icons/user.svg new file mode 100644 index 0000000..0015cc4 --- /dev/null +++ b/src/assets/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/visit.svg b/src/assets/icons/visit.svg new file mode 100644 index 0000000..997f690 --- /dev/null +++ b/src/assets/icons/visit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/401.gif b/src/assets/images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c930e72a698889a0f5666d8599652c5808cfc70 GIT binary patch literal 162867 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 z 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�Q#E@9P%v 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 RAD1R`%-z%NxyyxH{|8NN4M_k1 literal 0 HcmV?d00001 diff --git a/src/assets/images/404_cloud.png b/src/assets/images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..a81d8daa2c5a025f0137a27d81ed61ce7064039f GIT binary patch literal 2644 zcmaJ?cU)7+77jtmh9IJ#fQ71Jk5N&UCS9ZoSp+E(QBi}^9?e2g0Y#8%g4iCc!YYEW zf(0o-kj`2_KoO8mLIQ+@^n0_D#OK@h&zs-9GiT0x=R4mybMwn}Hy3+llokqsKqxyL zuyF@#9(Yp~Wxx82X1!pjiqA_-Te1IlUmJ1tc^UL|G8BAh91rfvwaJ@SqB5y8x9q3ty}s zfF%Ghi3i99{J@Z$N)3p`1;vWklB(H!Xhsq;!~CI;#Sz0mI;lbmLm*|4vVp3BL6M03 z83H`g?lIV65*kzZvmCHxa$rc(q`5^YvjC6-9&iyHzG#X86pGUU5_CDo+LMj2f|oF&@n1g zM41=RSwboc;)*N%0pJKkprupu0?NGD!{$oVN^B+<2FNLpS*f3>Y%m$c&q@Qh+ zwrha{^C8jPBE;fA((jWe6n_i=5183Jh{+X`gRAs)oiqnO4F12|T|5vl3!0E&Lq!6l zaQRaHFO%r5kvS%P$y;g-kG02TzwRKM_{YqaCYE|v{lM_2(RXjh>bX9xr}%diFl3>| zn=a1l1x-dBe;v2ALq7OHV`M*Lyw0X~xNmQF&rRVp{o}~j>2>hihN^zrY&~tPy|=sh zU1fXI{5SV6WK{9CixGiYANAi~+tg79@ox9jp7m#bHufQP8g^7p<2uSezpoxDe7Ec3 zUn>1CJ`7iLk3VtEcdVHj_;}z!S^R7Z>E-(yCacrkJdZThUF>YBxO_T^J}NZ7P98Ei ztCbtWPCFet?G{@~-e9@dpcj$U7oMH_;c8`1;zO$0*pm}f??41Xj^*3jx${9`sd=7@fFLQnq8tdYEJZ8StOFv&L#${~J^(Iofe9`f+FikO&xwm(0JbLPE){=*^k?l0bo$NsmBJb0(LtAsNz%|E` z)Nh5-Q$;upwX=O$^77*j!G;65J&fJQtDD=%-|sfaT}UkIGC;-O+8p+n_@(L;YY91X zBF48WKmONqafO@R_ZVg18SZ=&S0-;rYQmlB?+e3h&(Yi;kXMVO zY8z=ODmx~HZ>v(%ic)J=H(Q~IR=Qya+3H<}CX}8}Zj@=j4<>cl)@!$o4mp!r(Fl*? zV+1FsPu@me7>vf#yY6D#yak z5bgBpft$tw6@4{%8-2wj8SM}&e83&q0!;ZGT;3xILFSjrs{8x%pzxOa8HUKiRmR@bu=f)covKG|b7-m300p94P9X8JQ1?S{*8NA?Y(;92jPu{z`mX(j| zT(cJRQf%ekzFqF0Qrn^{8pEAVaw|`}*ZXVw%6Q#LU$dw@I)Asherm^r7vA5;DOP#< zxd!4QhC~<{Y=RESrnU?Tv%Y z2R>A=g9FS~x!~z#kxaZ+`wp+0X^Xz8N`#Mfou4o6iEj_MgC4=ovAorzt8p;Iu9w_5=V}YOF0k2QW zp)W=4BO*LOwfy*u?m*q@?|uV|L67EA%o;^ z-q~@?yEn#9wF^BeYW?`3mr|R4a5tf(yVR{|&^a(FZEer9kmfNAMHjkHI7y(IyA{87 z5O_{4j2T}p3?B_{gChQ$Mhs}4|o1pD^iTk#h#08@_qFs53sg0A?U!G$6oZ2%ParL>X$)&>S z%(2Durzw7z6I`@e6`{`imjfAq(H{)=Dy`CrWb z;xGU5e+B>80e<*v)rjMNmHf>IK}+dI@IfQ^;cwJGhfE=Krv&<+{P15@T-W}Ow>vHW z-#luk^lwNEUDa>cIr2k>SHH=~bzhbK27Lp&>9qa+5t#D2Exdku&%=fS-}?XP>?ueZ zPd6j|IME5>a%#)jkBgbU{9TJT-XPff1-)Juou_s4k9Mw9EwybYyLZUCGT-#wTJetw zqpWEF(AB`U{@VAM`EgH%v_0crv~br@`?^;ugTpT>+ESIw=c;G7LfqFqSCNb_L&|F%iVz#aC zd^2k0O;qH|Ka05Sdqr2OazloYida(UaqkSdeHHdLzRiFlLl?Z4jtC>oH;~46MjG#< zLx|pX)*c5M6!P~LNJh@V)5Ox;Uq~Nx2%me4bY|=%Jh^TTm5r}oZa+k|Uh*Byx%X0% zs|3pVy9q{+VQ-JPeG?W zSVUmkwp^9Gi6Y&$H-wn&Gv6}O_8t2dsxys@x5b&=vBfmE@7NP#SCL}GZEtf+e$sn8 zQlc_pl-PHTPQ|wb$Y6Egl5bCV1m${X@NmaWYE!n-S7Lge2;s14d<7p+Vzg`gQMZTNQMyDj7StA;qTQ_1GH^bae$X$yFwt-*`Z}L-?k*t$Slr zM5r9Q-U*PqgXg~AmT$O3Fco!XTcvgf7e!Mxv@tkRml4uyQRp41Y#c&%?ymGq6U z8ER!1DbV8lgO~^U5CxgKB8L*#jWABLr3Ownt#q&GXRoa>3oLe9!jio)L7Q$7(M)&j zVKbC=6%kyNO29NUNl8P&FNN;<)53SQzJdUUqMpOC7=f$npk_0^=)7Y1&vp@%SQ#Dw zf-My$+~|@1v;-=AT#JbDsyxGhkI^7LWHtz#fn+I}9$Nu`z)ejl^6^%Ao@c11BAW1QTja&e&*^9(ODJXx7AO%5CxJqRfvbTcYa$MF3Jb)2Ml^2t- zjS}sKxdX$NXJYZz&Bi)W&>Dv$aP>=pg$ zq19Hd86fD{dcHSE;-$-jVr=tsb8^E+r~{#yFykS3A=uSbwHuU)UbQCK_?i(|vI3Dr zL_n}e z=t`gW)TJfN$8C@pXrOE?v1$_)VFVmb*$3t|UnJrxJIeIAt{TyhOLmTvb74t*N;YN`OK6QHIS5jG)nHz)3wZNPj6Z!|JdjDY~W%?dyd^aPZm* z-RU9C=pSYhRrL&9*HV_4BqGbJd^xss3IZLXxLVZ`c@cE3k(Sx;!h|gSDu}A}LY(b@ z0_0TJNPZ?0f>qAeLUtIH*wWH1=ZT8q*Gk#3cv9?Pz``5~mdTOQ*p>_oLoaHbZmqUsV8IZpqRj(3@}tJ6e)07!&jA+ z!c3yyO3g&rH$0)_BQLW^y+10P@zGRFc1Q)Gu|z|-rH zA5Fwo_^B`(_|&11PoOB5C2ZoHJk}NfGM}ksdamasVbLj2I{=7MLUBzzD_4+!Wgoh$N_dHej{jRP6y?joliMOSKix zfw;56Ehp}hzBARrO|($10+yleOpWG90jF^QFf0uOuSq@?2$~*(YfduhHILUwgj9-o{OWRyP2Aai_koN zDk8cPM8Ti@{4E+6>S}!pb!S3dRVf0!afc#VnguY^OUFb^F&hwRh{&L_!8}Sta>Qv9 zTCv^mQYkBIxGE@Cbdzz6RPlj37H$A-gL7W2X{gv)5C|fN-xn^rmo218_yJJb60g-P z$(N3facII+@F?WOJ`iMN(F0yn%P4?|P9d#?G+d~nUl7D8=W>zg=EJ+m=yyO zHtFrbgfMZ^o?f)AdJXDvthyppVMYpAB6)G3HFag?HG{qNRdnu{r8@*T(cK0HTbG$a zMB)MklvqZT1pT}^>qCNNb`L{se6UE5X!dBtMFhm7qDrh{$po@osK=GT6H*hJD>25H zAta_?wP~vH;cPy=EhFXeD z{P{XTJECfaauZq|&rZ3BFL21D1R`6HfpQ|@e{fE62?*vHVxu(krP?AO`7???S0f>+ zGAAy_Lr<8b9--e0vy2)`iVKHqYa9y}&@!s9pNR0fJwVfuv3S%j@p z!SkW@Jw=(uKgqmL_?#?2lc?eX*YufUCqYRn%;+`Dea`^GY8VlL24KZBg4hg(mP#1M zav)?O^j97P?bbqrRzcH?vVp6h+d;EI&TxfQYnc)dn-sg{Kd?AKyO(8`eLZo^P#WK% zStMp1Ll6oDfH7(#s`;0gK@4E>ql*JkYm%zN%AzEp9xJDa1@S@wOHa{1Co2TYbIe~z zm_Udlh#|ub2x6BP3fzlBmn-am=TsFBWjHtrQ-Xo-RY^z4-EfaTOk{4)mJ67Qm~!Zi zxZstE-jh-jW`r4EHdwsP$Zo2&b0;Gjr)GS58+l>rDynoI1p7zG_{^MKlKe{#LuFOp zIYMjdL~;}_X0u6oc(24~R!LH>R8>_nL4=CASR2(ucs$o)7NfKBA|o(!*U>5H6rLz? zmKa95h}=_#iUDvQBaf^!Neatqm6QoN3B67F7({MDV8=#Pkb83$85{abshCc)Iso`| zz^8;_Xg${v<*4|ppF8mzt3;T-u-x-DljN(QIHxL%rgR83WoVh`u}&|79T-96rvWC9 za_No|rysV1Hsq(a-&HdWnd$*!4a;Zh29*eV;{~P8& z(Achy(H7!0BJJx!C?!p1Hd*A^r6nD9G&wV7h8zcRYz_*or-605)X@iP$X9xiG1n7L zay7)zWf2&*$VZIpn>dPt?k!A-!kx0gRa7!ToG0oYDXubXAce8%#<81{=|^*|XX-}a z-WtdfKVk=#|^N1!?Mt&m1M} z=n7+W1lZ(kNXjrdXN5g3&JQnC8>2O|xQJahw947TD|NVoN+uau9<2yW{U|5VVx^)? zIYEdBurTQuzcAsTdVC8RYGvYEWfhRwCA(bcTG7#r<4%~)w1Kf$-Ft8wNL5%=l$^N1 zXQWRgmh&?_B8}tJ&dju_W~tM=K2;McwyVdzG8>h$x;g8yUQ(*5CTS~f#O8iz;7hr> z^Y&9LYRuXuIawt68G9bzDE*eSs}aPLuoWLjSn?~rEr5KB@nXG$^Q5XIbe2!p!FZ^U zL)e5X^DiX=I{fBV!RRWV4z@{d25uD*uoYWTVMlj#D~#PKg4y*ef%ZDa0LLV&i1D)1 zCkSa~f{XN`6HjzXVDdhB3zbM+G{i!0d7fpgr(O@3+=KLfT%?`Up=Rv^%`GTYj0HtR zz+S?x3@fVPzy*QorbRrByI<+FDcag~ErBOG5oM$DWS*7FdApZKt#2b)AavpaaTKAQ z%KG>n72~)G0pQ54v*Yt@Fu5vGdFySQ9w5UB4%P^avZzc@+!W+7a5?UORjtSpvUN~= z76r=M`|-3X9#(|H+PgI3acfmx4x@H4uh!Y}D$6(?>X2Nw;+82=H*3M#<68j$q+mN^ z541WPUiPw+d3zX1vS7zSI&C7yA~aKFTNih+F_jQBCf}}-QC5xeWI*s^@@WAVHq!dot#`<_K%4L5=)JpcH>hwgSQFE#T_DvXT*$t zg-`Y``{g&xevXZVhHj=!Gik)>1YF_a+jp=@%uzWaM2;`)o8iMJvKuK**0s|~jNVea zhc`A6SgRZr^TA~Cq7=<}6U+ z*+JZC#*O>p-S)2LRK$)@Ms9-#;BeLNW>txXixxWQPU271ES`_mUHei=smDZ-<>Ks< z`BA@m)9KhY`O3^qr%f}xZx6#T4vzG@WU7GWD>3M^Uh-r)SzkRWt14ri&@wGEJMA2# zzg4J75IJ`T@W_@&ESDZ3mdUeGXY}){JPN{qXmWc0FzpuFILkWV4xA!EOv*>eV6iHf z-+enG&L-^bwBlwu>vkI9f!3jJ-z5}@G9exnSF3iv{i|OlE1BQG*A2S`vgw3&;ukr0 z5K7*XW6;CFi{7dtSEv$_#dy|i#M2grCW#NB?@l2ZV^id6b=F^$cJh5|gk|>?1Rmovd%$z0pyBRkOz)1_HU?YQ$aJ zmDT1R<#GPU4*H0xcm+DUe&o^3riVY7PCJd13@V1uyJamKp?KeVF#qOBS#xI!=B#nk z%%;CppgRNM@0LgG6c^{^a=jQmI-VzF4G5)~PFm*lwAIvhLOe3>0x5N5QS#+5U$2h( z>%sXEx?|t5Yc6JR$E098EW7W5MQnLyFo%H+UJSjds1S#}-#S1hW||tiPvdL`kO|$h z>($wCJ*t^wCh0aB@o8~rS`V=3J2L{_WYmc6LN2}X~OFibYDw3>Af;z^e|fh@q1N8BwL z(f!PRQxc<}^+r*<&$cjeEG(KtmisY_8@0zQ6`50&l`!}B{Z*UDdE)XwH4cJC{ApS= zbSDh=Ih`W9*UVvF!zUz1rCweH@o9Y8J?+TM%zAu}S%Qu!R?xlZqlJpho@GEma?@yH z&8JKWcSAe8ZkWSRJab1Kz>2te5YA@BAxRNLI=a1E22RYf!YtQ=FX!3voOyy-{1oSj zFIqz59*^_9Mae(aIKi_%yve4snZ(V{p%GW$C~BWAVRDee`Yq&LBp&56mm=KicK14EguucsNc?v%y3_ zT;PyW+kH^?Y^3tbUy6k+R;+ehC3^?6&r@8K<%-p2AC&%<**|}jjN1KGzUKH`sfn6) zyW|?3w233^143nyB*5MpNuD{CK}+zJPFo=x0&2DwO8DyOZ#`f0<-}FkL$lFf5yn!& z+R*NU5{2o7x5dSiHoKY5q(S3=#6BJy1mD^RR7Wi4{73D+%u~cGLnbtxq+NT_VD@$U zpn{=Sm&E?X*>J^z$|zqOI68T?cgT>&AU1qCh_Zv;!NbiR*wb#GA z0MG2V#Hws{ub**1LxPuHj7bjJuGkwm2*VsYOVodq%Pd;JLo8En+;tZXGOs=J1YAns zD64N!Rkk9DrDmK?S%kG>H`8igK%~pfY&KYwYk){6S{<2S*z$T0OSSZ5<~-}QJ3Wcn z7o9^U+OcT`${2>dTk467-0Ve<9RxO(Y&<<+0o6SS*e(n10!U5987?d(>$4$CS!T?5 z7S8NxD|EB{As(1|3VTF4Fu2OgOYC79o|^lIADHfY;yXaw`HL)f&I(v_b>Y5gHMD8z z_c3%md9{0-){Vhq3Krz-YozJ>_`$?Eb0JKyfh;G$Y^sU*G}-RLL-v=gFI_>I9BJF4 z8IVM|>HE3y0YWT+W0!M`+jYz|X6vcIAMAcC^<;(A=2_0N;CT=L!k$hi*qbNFARA^l z*y;2+23O{g^uTmAQDN^41&E)4^C!tskBvVS5vj(^@`gjv_qd!=!b@3wn~k_r^p%yV zFrB0=^rM*_;NNgA}Y-IR=-$xtPC zc7`hGNP}OR#kRf=pVsd5<~A8SdQx%Q z4zqiCRoACxx4Yc1QC!N&EmpNta=B6&2Hd4m_a22tZyVL~;1O;g3b z$q*L(o(i<%`Hs^(x-G|~R_e<@1@~Z!0TYgn;KK=&+*!h}8)D3C)|WZ-*@Cl1q#+5d zuA5{)=ye+?xgBLw8IvKF4tc`Mm=|@~^Ox=#?A3{E#UiGmNYwMITEN~lE0%6LePGq0BN>Uld<@U9C4Avm0YQPF z$uR&EH6|k}5;7REST)v!vY zvd}XkmceO_F~)isX86OV1&TORMUS!1L)i?rfH;Q39=R_%32+Cm> z4#iUBzCcxR9FIvTv;+inNP)0Cf-{Hdz>TW54G4hM1O3IhP+s<6g98w@8{fukZ~`A! zDxZ5!1WU)t4(&vG`uk#ZkOBniP|iumxv%mcXeqGIxB_WJw1@7xC1T$&b1>27 zk|g)?$RWG<@oNxbLfgX59~Fe4;3>a3+Zn4O7Klgo>_ez3Z_s3NTU)D-V1uz51LvyE zU=bU1Y)~Hu$(M-}{F5bLz9bK`p!<-YYKDX4+(CgxWOWgBtAnR1O$r|Rf&Ob(Hz>w~ z1hDJ3usOYkPtDD?c}2K?5Wap~ZJJcZ9zP|1JP;8) zXk8PhB;mw`JCWfleIeKT>JsVlfR}TXLZWTWpl4Gqv+zZc&qE@K1UkJHXM7|^LLmkv`d zg~eqb7p}|U7t5uKoElc@@a@CbWEh8^ZrjuYTOqp7ZIJX0!Q`f)e@Ip!_d`@qLtm#$ zzq%YwhY?TQLDgqSx4bb2V1z?p8ozJ=Ew1e}$a+|>3eL{#!b(g3hQ7Em0`)uzmm;JG zH%8p(dQ4nGZ9JvN;k6u8U*qK1K3mRw&0F#*1&s+Fl^jlyoi2+noK#EMfMi+}n=clN zx|+|>V7}#3R{IWVX6x0^R>H1q8i=jA^~EY;5fX&v4tp8@i;Mxx@^dLt)$_= zO2FBaTFeiXH_>gSd}|>}90W4>*p~3}M7#RsL9kUm??LVbEG;+s;D!EPQuX6CYq(@B z+sEnzq2r%)*p#`KZSH6|{PaV+t-c1yof7-Hso#oLw6|LtMJ-tBZqX!WvW+eW_Fune zv7`NB=K}<$-tLaN=h=8|yweacwZ2ouYs|moPPHI;y(7)K10w{#xYJj>99wy}NbOyG zg6?i-?1}RD;n&VTTz}YOWmToJYuBw?pu_sHZxbHMY$8>+t1Wj5#WN(&-YJ|NVpL95 zhNhbmibUWt=OV^UE%6PM49s@UtpbkjIFK=Zp0XW*F;|S)8iN4Q?xhtM~|F$rV&kW*h9(R&W({;G#nM z)kFd$#nn=GA&d}{BAv9Ts?}cs!T!Wsm2>qci}SfOK))X=R_-$%_iIAAQd)vvmo)D(7^eV z0||qXiFRhbn#|ccuSTXWK$1R zp*Nb-iDqXY=YEJ_62gU?EUoxWn=GmLA&=}|H%^6HQqyQ2!y@NCu4%al#f+$W4FxW8 zm7iJU4Heykr?MROa9x3mj&l9CV(VrS8b?;|Q|NHOdH~)2I{2_dTiVgwdl?stECFHq zTvS5#`t>9drpHJmD_1Oc6^%|1lFp!2mc3j!;+EQSf(%q>unNQ`ft)*MMd}n6Ui=b^ zdyjrZ><47r5J8}erL5SL7GybyDtHUysp0oPT!hGTmQ5I~NL8BbBrF*IvVX}P8f7sc zI*zS0nT~ES21obHIq&42fZ9^Mu(D=Or}n@``G^}kC94*(!zvRn?woa-LWE$7f> zxRrw$Jr=9voTtepTrO9x$`x%~He=OgBY{ITvo5|KaRA@8P$qEP{}yK4By6!@DBHu; z2_gx|kQ+b$E2spHC2s>so+rtwEmtm-B_Un@%!=hQm z05lsx$eMJ$d@&?>tQRRkhkhLP$1_{7@Eo;AJ^2lx<7|ZcLqZNLa`7S7^W$f|Cwaw& z6LLG~RyfFp9yjGjdF#Qeth|&Z9Y(>Th!2F(WsjE==aXkLtW6K!T1O+o5PBMHx4$lz z&qg2d1E7FrIo9KXD1pnC@Wg6K`()- z*6Wv}5ukXh#q9E9VOFaN+x<$7o{YZvW~F3o=dQxtq}pv1B&Zo_bg|*N7cavU>9JlP|Aw9AjoW$11ExCN|n> z`juUc)^C3GXPL6I!Vr-*t%O_F_d)OE`+q#VF&B=_v@Ga+>9IPG_`Txh%_k97^5ynpS(g?%bA_t@5CLPu`XD= zb6NIg^vU<@b;b3nPr0#%%hkmj7>ysl8m-FbX37hWjt`yLv?7l9YquIbdHM1B#V|}Sx~E0zSCqbkR?K}*2H!t< z^D#!n^%D;1Zh&Qvr$oI^)^CQF928Ew+!i5*Y>HvIiZEV1dD$O~HP;w8TJ;9t+e6G= zv=7ah4!hm^obuif%^=J9%h8`b8lCk_C%w4%oV#jbJic)Mlr!n|n~%Rg>vITmzqrqx zKtkT8G+AYjo~)kyr}cbUx!I@br<}uIOPZBmP^`cE?)x{x!4(IUKsR?p4OzkP&99L3 z(J(Z#Ph*a)TQ_49urRFt%Ta&eP(zphd}QCC=Hl!6)eV(Q#DCum7GWd);*e`ClWUd<13AJ(oXKDu-*0ti)2?;y z8aB_qe%AkH{c?CRk2~?_hli~uRFi=Qxi&7M1i-^L{g?dM zC+-}!?sHRRhvO`I2=HM2JwJy@Pd{(8IGD5BkqIJw!V0i?m3CT;d|K=fEwF=ECjy(M zpUcQ*d=2VhJ>K$6O=q7THXDB1b<<%3`|1&!)U9s!!*FWM4J^09M;{IGB&QpYTr`(R+~>u1Bs{)lX*=+3DGqEz-qV_i+oW>iYa^ z+v<^i)LTBYA&p#O*&UW&oQy_izZ~VEc;^KZ>`kcw`}~Zrzz1f{9hDPG;d8{Vb*gbZ zy||4~Xobm)5LcYGIDfktl6`bEx?bce?sl1$?M{=JLVrXiH0^SYbr+e3IvW+|R%7y= zTTKGh**Uom$jyVq!2a8eiAcbcpB_+pT8FTUN@(-K;vt959>OcISAJqT;pFfpu Vjs4wpK(~MM=0|#bu<7w%{x1-0sn`Gj literal 0 HcmV?d00001 diff --git a/src/assets/images/login-bg.jpg b/src/assets/images/login-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..993b958e243926e4dd5b1a415c879965117a3419 GIT binary patch literal 32872 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ð^j-r@`P8j452yx>Y6XIGhmq$X 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 Vk3V|iuRnJ0#=E5TTkrnQ|1Z@Pvk(9P literal 0 HcmV?d00001 diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..feb87da242c618a8167f390e120875b117d8d03e GIT binary patch literal 5441 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 Xbp6I{tNFTXCQ1U+GSIA6w?_XT*IQZ1 literal 0 HcmV?d00001 diff --git a/src/components/AppLink/index.vue b/src/components/AppLink/index.vue new file mode 100644 index 0000000..a3afe25 --- /dev/null +++ b/src/components/AppLink/index.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..df9849d --- /dev/null +++ b/src/components/Breadcrumb/index.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/src/components/Dictionary/index.vue b/src/components/Dictionary/index.vue new file mode 100644 index 0000000..b2e01d0 --- /dev/null +++ b/src/components/Dictionary/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue new file mode 100644 index 0000000..e544db7 --- /dev/null +++ b/src/components/Hamburger/index.vue @@ -0,0 +1,39 @@ + + + + diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue new file mode 100644 index 0000000..2c52504 --- /dev/null +++ b/src/components/IconSelect/index.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue new file mode 100644 index 0000000..993af5d --- /dev/null +++ b/src/components/LangSelect/index.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue new file mode 100644 index 0000000..4065131 --- /dev/null +++ b/src/components/Pagination/index.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..a5aa790 --- /dev/null +++ b/src/components/SizeSelect/index.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..07b65e8 --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/Table/AnyTable.vue b/src/components/Table/AnyTable.vue new file mode 100644 index 0000000..545a163 --- /dev/null +++ b/src/components/Table/AnyTable.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/src/components/Table/TableBar.vue b/src/components/Table/TableBar.vue new file mode 100644 index 0000000..1d8d863 --- /dev/null +++ b/src/components/Table/TableBar.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/components/WangEditor/index.vue b/src/components/WangEditor/index.vue new file mode 100644 index 0000000..2f4c678 --- /dev/null +++ b/src/components/WangEditor/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/directive/index.ts b/src/directive/index.ts new file mode 100644 index 0000000..9c22eb6 --- /dev/null +++ b/src/directive/index.ts @@ -0,0 +1,9 @@ +import type { App } from "vue"; + +import { hasPerm } from "./permission"; + +// 全局注册 directive +export function setupDirective(app: App) { + // 使 v-hasPerm 在所有组件中都可用 + app.directive("hasPerm", hasPerm); +} diff --git a/src/directive/permission/index.ts b/src/directive/permission/index.ts new file mode 100644 index 0000000..2bd2c70 --- /dev/null +++ b/src/directive/permission/index.ts @@ -0,0 +1,55 @@ +import { useUserStoreHook } from "@/store/modules/user"; +import { Directive, DirectiveBinding } from "vue"; + +/** + * 按钮权限 + */ +export const hasPerm: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + // 「超级管理员」拥有所有的按钮权限 + const { roles, perms } = useUserStoreHook().user; + if (roles.includes("ROOT")) { + return true; + } + // 「其他角色」按钮权限校验 + const { value } = binding; + if (value) { + const requiredPerms = value; // DOM绑定需要的按钮权限标识 + + const hasPerm = perms?.some((perm) => { + return requiredPerms.includes(perm); + }); + + if (!hasPerm) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error( + "need perms! Like v-has-perm=\"['sys:user:add','sys:user:edit']\"" + ); + } + }, +}; + +/** + * 角色权限 + */ +export const hasRole: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + const { value } = binding; + + if (value) { + const requiredRoles = value; // DOM绑定需要的角色编码 + const { roles } = useUserStoreHook().user; + const hasRole = roles.some((perm) => { + return requiredRoles.includes(perm); + }); + + if (!hasRole) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error("need roles! Like v-has-role=\"['admin','test']\""); + } + }, +}; diff --git a/src/enums/LayoutEnum.ts b/src/enums/LayoutEnum.ts new file mode 100644 index 0000000..dd9b043 --- /dev/null +++ b/src/enums/LayoutEnum.ts @@ -0,0 +1,18 @@ +/** + * 菜单布局枚举 + */ +export enum LayoutEnum { + /** + * 左侧菜单布局 + */ + LEFT = "left", + /** + * 顶部菜单布局 + */ + TOP = "top", + + /** + * 混合菜单布局 + */ + MIX = "mix", +} diff --git a/src/enums/MenuTypeEnum.ts b/src/enums/MenuTypeEnum.ts new file mode 100644 index 0000000..38e92fc --- /dev/null +++ b/src/enums/MenuTypeEnum.ts @@ -0,0 +1,22 @@ +/** + * 菜单类型枚举 + */ +export enum MenuTypeEnum { + /** + * 目录 + */ + CATALOG = "CATALOG", + /** + * 菜单 + */ + MENU = "MENU", + + /** + * 按钮 + */ + BUTTON = "BUTTON", + /** + * 外链 + */ + EXTLINK = "EXTLINK", +} diff --git a/src/enums/ThemeEnum.ts b/src/enums/ThemeEnum.ts new file mode 100644 index 0000000..6102fa6 --- /dev/null +++ b/src/enums/ThemeEnum.ts @@ -0,0 +1,18 @@ +/** + * 主题枚举 + */ +export enum ThemeEnum { + /** + * 明亮主题 + */ + LIGHT = "light", + /** + * 暗黑主题 + */ + DARK = "dark", + + /** + * 系统自动 + */ + AUTO = "auto", +} diff --git a/src/lang/index.ts b/src/lang/index.ts new file mode 100644 index 0000000..dad4395 --- /dev/null +++ b/src/lang/index.ts @@ -0,0 +1,25 @@ +import { createI18n } from "vue-i18n"; +import { useAppStoreHook } from "@/store/modules/app"; +// 本地语言包 +import enLocale from "./package/en"; +import zhCnLocale from "./package/zh-cn"; + +const appStore = useAppStoreHook(); + +const messages = { + "zh-cn": { + ...zhCnLocale, + }, + en: { + ...enLocale, + }, +}; + +const i18n = createI18n({ + legacy: false, + locale: appStore.language, + messages: messages, + globalInjection: true, +}); + +export default i18n; diff --git a/src/lang/package/en.ts b/src/lang/package/en.ts new file mode 100644 index 0000000..e14790e --- /dev/null +++ b/src/lang/package/en.ts @@ -0,0 +1,19 @@ +export default { + // 路由国际化 + route: { + dashboard: "Dashboard", + document: "Document", + }, + // 登录页面国际化 + login: { + username: "Username", + password: "Password", + login: "Login", + captchaCode: "Verify Code", + }, + // 导航栏国际化 + navbar: { + dashboard: "Dashboard", + logout: "Logout", + }, +}; diff --git a/src/lang/package/zh-cn.ts b/src/lang/package/zh-cn.ts new file mode 100644 index 0000000..5a35f00 --- /dev/null +++ b/src/lang/package/zh-cn.ts @@ -0,0 +1,19 @@ +export default { + // 路由国际化 + route: { + dashboard: "工作台", + document: "项目文档", + }, + // 登录页面国际化 + login: { + username: "用户名", + password: "密码", + login: "登 录", + captchaCode: "验证码", + }, + // 导航栏国际化 + navbar: { + dashboard: "工作台", + logout: "注销", + }, +}; diff --git a/src/layout/components/AppMain/index.vue b/src/layout/components/AppMain/index.vue new file mode 100644 index 0000000..c8017b2 --- /dev/null +++ b/src/layout/components/AppMain/index.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/layout/components/NavBar/components/NavbarLeft.vue b/src/layout/components/NavBar/components/NavbarLeft.vue new file mode 100644 index 0000000..937391f --- /dev/null +++ b/src/layout/components/NavBar/components/NavbarLeft.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/layout/components/NavBar/components/NavbarRight.vue b/src/layout/components/NavBar/components/NavbarRight.vue new file mode 100644 index 0000000..363f20f --- /dev/null +++ b/src/layout/components/NavBar/components/NavbarRight.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/layout/components/NavBar/index.vue b/src/layout/components/NavBar/index.vue new file mode 100644 index 0000000..9fe18a2 --- /dev/null +++ b/src/layout/components/NavBar/index.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/layout/components/Settings/components/LayoutSelect.vue b/src/layout/components/Settings/components/LayoutSelect.vue new file mode 100644 index 0000000..89e9a91 --- /dev/null +++ b/src/layout/components/Settings/components/LayoutSelect.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/layout/components/Settings/components/ThemeColorPicker.vue b/src/layout/components/Settings/components/ThemeColorPicker.vue new file mode 100644 index 0000000..5a0d59c --- /dev/null +++ b/src/layout/components/Settings/components/ThemeColorPicker.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue new file mode 100644 index 0000000..0460bf4 --- /dev/null +++ b/src/layout/components/Settings/index.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarLogo.vue b/src/layout/components/Sidebar/components/SidebarLogo.vue new file mode 100644 index 0000000..b873563 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarLogo.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMenu.vue b/src/layout/components/Sidebar/components/SidebarMenu.vue new file mode 100644 index 0000000..5c5c6d3 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMenu.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMenuItem.vue b/src/layout/components/Sidebar/components/SidebarMenuItem.vue new file mode 100644 index 0000000..552fa17 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMenuItem.vue @@ -0,0 +1,191 @@ + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue b/src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue new file mode 100644 index 0000000..b9045d9 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMixTopMenu.vue b/src/layout/components/Sidebar/components/SidebarMixTopMenu.vue new file mode 100644 index 0000000..8a03e7d --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMixTopMenu.vue @@ -0,0 +1,83 @@ + + + + diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..8956f90 --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue new file mode 100644 index 0000000..a84aa74 --- /dev/null +++ b/src/layout/components/TagsView/index.vue @@ -0,0 +1,470 @@ + + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..bab1716 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..0c6c44e --- /dev/null +++ b/src/main.ts @@ -0,0 +1,29 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +import router from "@/router"; +import { setupStore } from "@/store"; +import { setupDirective } from "@/directive"; +import { setupElIcons, setupI18n, setupPermission } from "@/plugins"; + +// 本地SVG图标 +import "virtual:svg-icons-register"; + +// 样式 +import "element-plus/theme-chalk/dark/css-vars.css"; +import "@/styles/index.scss"; +import "@/styles/table.scss"; +import "uno.css"; +import "animate.css"; + +const app = createApp(App); +// 全局注册 自定义指令(directive) +setupDirective(app); +// 全局注册 状态管理(store) +setupStore(app); +// 全局注册Element-plus图标 +setupElIcons(app); +// 国际化 +setupI18n(app); +// 注册动态路由 +setupPermission(); +app.use(router).mount("#app"); diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts new file mode 100644 index 0000000..16915cc --- /dev/null +++ b/src/plugins/i18n.ts @@ -0,0 +1,7 @@ +// 国际化 +import i18n from "@/lang/index"; +import type { App } from "vue"; + +export function setupI18n(app: App) { + app.use(i18n); +} diff --git a/src/plugins/icons.ts b/src/plugins/icons.ts new file mode 100644 index 0000000..fa85ba1 --- /dev/null +++ b/src/plugins/icons.ts @@ -0,0 +1,9 @@ +import type { App } from "vue"; +import * as ElementPlusIconsVue from "@element-plus/icons-vue"; + +// 注册所有图标 +export function setupElIcons(app: App) { + for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component); + } +} diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000..b54ee18 --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,3 @@ +export * from "./icons"; +export * from "./i18n"; +export * from "./permission"; diff --git a/src/plugins/permission.ts b/src/plugins/permission.ts new file mode 100644 index 0000000..9fbce9f --- /dev/null +++ b/src/plugins/permission.ts @@ -0,0 +1,60 @@ +import router from "@/router"; +import { useUserStore } from "@/store/modules/user"; +import { usePermissionStore } from "@/store/modules/permission"; +import NProgress from "@/utils/nprogress"; + +export function setupPermission() { + // 白名单路由 + const whiteList = ["/login"]; + + router.beforeEach(async (to, from, next) => { + NProgress.start(); + const hasToken = localStorage.getItem("token"); + if (hasToken) { + if (to.path === "/login") { + // 如果已登录,跳转首页 + next({ path: "/" }); + NProgress.done(); + } else { + const userStore = useUserStore(); + const hasRoles = + userStore.user.roles && userStore.user.roles.length > 0; + if (hasRoles) { + // 未匹配到任何路由,跳转404 + if (to.matched.length === 0) { + from.name ? next({ name: from.name }) : next("/404"); + } else { + next(); + } + } else { + const permissionStore = usePermissionStore(); + try { + const { roles } = await userStore.getUserInfo(); + const accessRoutes = await permissionStore.generateRoutes(roles); + accessRoutes.forEach((route) => { + router.addRoute(route); + }); + next({ ...to, replace: true }); + } catch (error) { + // 移除 token 并跳转登录页 + await userStore.resetToken(); + next(`/login?redirect=${to.path}`); + NProgress.done(); + } + } + } + } else { + // 未登录可以访问白名单页面 + if (whiteList.indexOf(to.path) !== -1) { + next(); + } else { + next(`/login?redirect=${to.path}`); + NProgress.done(); + } + } + }); + + router.afterEach(() => { + NProgress.done(); + }); +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..4e80cd3 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,104 @@ +import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"; + +export const Layout = () => import("@/layout/index.vue"); + +// 静态路由 +export const constantRoutes: RouteRecordRaw[] = [ + { + path: "/redirect", + component: Layout, + meta: { hidden: true }, + children: [ + { + path: "/redirect/:path(.*)", + component: () => import("@/views/redirect/index.vue"), + }, + ], + }, + + { + path: "/login", + component: () => import("@/views/login/index.vue"), + meta: { hidden: true }, + }, + { + path: "/table", + component: () => import("@/views/table/index.vue"), + meta: { hidden: true }, + }, + + { + path: "/", + name: "/", + component: Layout, + redirect: "/dashboard", + children: [ + { + path: "dashboard", + component: () => import("@/views/dashboard/index.vue"), + name: "Dashboard", // 用于 keep-alive, 必须与SFC自动推导或者显示声明的组件name一致 + // https://cn.vuejs.org/guide/built-ins/keep-alive.html#include-exclude + meta: { + title: "dashboard", + icon: "homepage", + affix: true, + keepAlive: true, + alwaysShow: false, + }, + }, + { + path: "401", + component: () => import("@/views/error-page/401.vue"), + meta: { hidden: true }, + }, + { + path: "404", + component: () => import("@/views/error-page/404.vue"), + meta: { hidden: true }, + }, + { + path: "/resources/file_list", + name: "FileList", + component: () => import("@/views/resources/file-list/index.vue"), + meta: { hidden: true, keepAlive: true, title: "文件列表" }, + }, + { + path: "/resources/device_type_to_ver/:devTypeId", + name: "DeviceTypeToVer", + component: () => + import( + "@/views/resources/device-type/components/DeviceTypeToVer.vue" + ), + meta: { hidden: true, keepAlive: true, title: "设备类型详情" }, + }, + { + path: "/resources/device_type_version_edit/:devTypeId/:typeAndVerId", + name: "DeviceTypeVersionEdit", + component: () => + import( + "@/views/resources/device-type/components/DeviceTypeVersionEdit.vue" + ), + meta: { hidden: true, keepAlive: true, title: "设备类型软件编辑" }, + }, + ], + }, +]; + +/** + * 创建路由 + */ +const router = createRouter({ + history: createWebHashHistory(), + routes: constantRoutes as RouteRecordRaw[], + // 刷新时,滚动条位置还原 + scrollBehavior: () => ({ left: 0, top: 0 }), +}); + +/** + * 重置路由 + */ +export function resetRouter() { + router.replace({ path: "/login" }); +} + +export default router; diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..92bde20 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,19 @@ +const { pkg } = __APP_INFO__; + +const defaultSettings: AppSettings = { + title: pkg.name, + version: pkg.version, + showSettings: false, + tagsView: true, + fixedHeader: true, + sidebarLogo: true, + layout: "left", + theme: "light", + size: "default", + language: "zh-cn", + themeColor: "#00C3EE", + watermarkEnabled: true, + watermarkContent: pkg.name, +}; + +export default defaultSettings; diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..8dd6ea9 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,16 @@ +import type { App } from "vue"; +import { createPinia } from "pinia"; + +const store = createPinia(); + +// 全局注册 store +export function setupStore(app: App) { + app.use(store); +} + +export * from "./modules/app"; +export * from "./modules/permission"; +export * from "./modules/settings"; +export * from "./modules/tagsView"; +export * from "./modules/user"; +export { store }; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..4ca5ba9 --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,95 @@ +import defaultSettings from "@/settings"; + +// 导入 Element Plus 中英文语言包 +import zhCn from "element-plus/es/locale/lang/zh-cn"; +import en from "element-plus/es/locale/lang/en"; +import { store } from "@/store"; + +// setup +export const useAppStore = defineStore("app", () => { + // state + const device = useStorage("device", "desktop"); + const size = useStorage("size", defaultSettings.size); + const language = useStorage("language", defaultSettings.language); + + const sidebarStatus = useStorage("sidebarStatus", "closed"); + + const sidebar = reactive({ + opened: sidebarStatus.value !== "closed", + withoutAnimation: false, + }); + const activeTopMenuPath = useStorage("activeTopMenuPath", ""); + /** + * 根据语言标识读取对应的语言包 + */ + const locale = computed(() => { + if (language?.value == "en") { + return en; + } else { + return zhCn; + } + }); + + // actions + function toggleSidebar() { + sidebar.opened = !sidebar.opened; + if (sidebar.opened) { + sidebarStatus.value = "opened"; + } else { + sidebarStatus.value = "closed"; + } + } + + function closeSideBar() { + sidebar.opened = false; + sidebarStatus.value = "closed"; + } + + function openSideBar() { + sidebar.opened = true; + sidebarStatus.value = "opened"; + } + + function toggleDevice(val: string) { + device.value = val; + } + + function changeSize(val: string) { + size.value = val; + } + /** + * 切换语言 + * + * @param val + */ + function changeLanguage(val: string) { + language.value = val; + } + /** + * 混合模式顶部切换 + */ + function activeTopMenu(val: string) { + activeTopMenuPath.value = val; + } + return { + device, + sidebar, + language, + locale, + size, + activeTopMenu, + toggleDevice, + changeSize, + changeLanguage, + toggleSidebar, + closeSideBar, + openSideBar, + activeTopMenuPath, + }; +}); + +// 手动提供给 useStore() 函数 pinia 实例 +// https://pinia.vuejs.org/zh/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component +export function useAppStoreHook() { + return useAppStore(store); +} diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..175d07c --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,122 @@ +import { RouteRecordRaw } from "vue-router"; +import { constantRoutes } from "@/router"; +import { store } from "@/store"; +import { listRoutes } from "@/api/menu"; + +const modules = import.meta.glob("../../views/**/**.vue"); +const Layout = () => import("@/layout/index.vue"); + +/** + * Use meta.role to determine if the current user has permission + * + * @param roles 用户角色集合 + * @param route 路由 + * @returns + */ +const hasPermission = (roles: string[], route: RouteRecordRaw) => { + if (route.meta && route.meta.roles) { + // 角色【超级管理员】拥有所有权限,忽略校验 + if (roles.includes("ROOT")) { + return true; + } + return roles.some((role) => { + if (route.meta?.roles) { + return route.meta.roles.includes(role); + } + }); + } + return false; +}; + +/** + * 递归过滤有权限的异步(动态)路由 + * + * @param routes 接口返回的异步(动态)路由 + * @param roles 用户角色集合 + * @returns 返回用户有权限的异步(动态)路由 + */ +const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => { + const asyncRoutes: RouteRecordRaw[] = []; + + routes.forEach((route) => { + const tmpRoute = { ...route }; // ES6扩展运算符复制新对象 + if (!route.name) { + tmpRoute.name = route.path; + } + // 判断用户(角色)是否有该路由的访问权限 + if (hasPermission(roles, tmpRoute)) { + if (tmpRoute.component?.toString() == "Layout") { + tmpRoute.component = Layout; + } else { + const component = modules[`../../views/${tmpRoute.component}.vue`]; + if (component) { + tmpRoute.component = component; + } else { + tmpRoute.component = modules[`../../views/error-page/404.vue`]; + } + } + + if (tmpRoute.children) { + tmpRoute.children = filterAsyncRoutes(tmpRoute.children, roles); + } + + asyncRoutes.push(tmpRoute); + } + }); + + return asyncRoutes; +}; + +// setup +export const usePermissionStore = defineStore("permission", () => { + // state + const routes = ref([]); + + // actions + function setRoutes(newRoutes: RouteRecordRaw[]) { + routes.value = constantRoutes.concat(newRoutes); + } + /** + * 生成动态路由 + * + * @param roles 用户角色集合 + * @returns + */ + function generateRoutes(roles: string[]) { + return new Promise((resolve, reject) => { + // 接口获取所有路由 + listRoutes() + .then(({ data: asyncRoutes }) => { + // 根据角色获取有访问权限的路由 + const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles); + setRoutes(accessedRoutes); + resolve(accessedRoutes); + }) + .catch((error) => { + reject(error); + }); + }); + } + /** + * 获取与激活的顶部菜单项相关的混合模式左侧菜单集合 + */ + const mixLeftMenus = ref([]); + function setMixLeftMenus(topMenuPath: string) { + const matchedItem = routes.value.find((item) => item.path === topMenuPath); + if (matchedItem && matchedItem.children) { + mixLeftMenus.value = matchedItem.children; + } + } + return { + routes, + setRoutes, + generateRoutes, + mixLeftMenus, + setMixLeftMenus, + }; +}); + +// 非setup +export function usePermissionStoreHook() { + return usePermissionStore(store); +} diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts new file mode 100644 index 0000000..1a54daa --- /dev/null +++ b/src/store/modules/settings.ts @@ -0,0 +1,124 @@ +import defaultSettings from "@/settings"; +import { genMixColor } from "@/utils/color"; +import { setStyleProperty } from "@/utils"; +import { ThemeEnum } from "@/enums/ThemeEnum"; + +type SettingsValue = boolean | string; + +export const useSettingsStore = defineStore("setting", () => { + // 是否显示设置 + const settingsVisible = ref(false); + // 是否显示标签视图 + const tagsView = useStorage("tagsView", defaultSettings.tagsView); + // 是否显示侧边栏logo + const sidebarLogo = useStorage( + "sidebarLogo", + defaultSettings.sidebarLogo + ); + // 是否固定头部 + const fixedHeader = useStorage( + "fixedHeader", + defaultSettings.fixedHeader + ); + // 布局模式:left-左侧模式(默认) top-顶部模式 mix-混合模式 + const layout = useStorage("layout", defaultSettings.layout); + // 主题颜色 + const themeColor = useStorage( + "themeColor", + defaultSettings.themeColor + ); + // 主题:light-亮色(默认) dark-暗色 + const theme = useStorage("theme", defaultSettings.theme); + // 是否开启水印 + const watermarkEnabled = useStorage( + "watermarkEnabled", + defaultSettings.watermarkEnabled + ); + + watch( + [theme, themeColor], + ([newTheme, newThemeColor], [oldTheme, oldThemeColor]) => { + if (newTheme !== oldTheme) { + if (newTheme === ThemeEnum.DARK) { + document.documentElement.classList.add("dark"); + } else { + document.documentElement.classList.remove("dark"); + } + } + + if (newThemeColor !== oldThemeColor) { + const { DEFAULT, dark, light } = genMixColor(newThemeColor); + setStyleProperty(`--el-color-primary`, DEFAULT); + setStyleProperty(`--el-color-primary-dark-2`, dark[2]); + setStyleProperty(`--el-color-primary-light-3`, light[3]); + setStyleProperty(`--el-color-primary-light-5`, light[5]); + setStyleProperty(`--el-color-primary-light-7`, light[7]); + setStyleProperty(`--el-color-primary-light-8`, light[8]); + setStyleProperty(`--el-color-primary-light-9`, light[9]); + } + }, + { + immediate: true, // 立即执行,确保在侦听器创建时执行一次 + } + ); + + const settingsMap: Record> = { + fixedHeader, + tagsView, + sidebarLogo, + layout, + watermarkEnabled, + }; + + function changeSetting({ + key, + value, + }: { + key: string; + value: SettingsValue; + }) { + const setting = settingsMap[key]; + if (setting) { + setting.value = value; + } + } + + /** + * 切换主题 + */ + function changeTheme(val: string) { + theme.value = val; + } + + /** + * 切换主题颜色 + * + * @param color 主题颜色 + * + */ + function changeThemeColor(color: string) { + themeColor.value = color; + } + + /** + * 切换布局 + */ + function changeLayout(val: string) { + layout.value = val; + } + + return { + settingsVisible, + tagsView, + fixedHeader, + sidebarLogo, + layout, + themeColor, + theme, + watermarkEnabled, + changeSetting, + changeTheme, + changeThemeColor, + changeLayout, + }; +}); diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts new file mode 100644 index 0000000..9e66c10 --- /dev/null +++ b/src/store/modules/tagsView.ts @@ -0,0 +1,211 @@ +export const useTagsViewStore = defineStore("tagsView", () => { + const visitedViews = ref([]); + const cachedViews = ref([]); + + /** + * 添加已访问视图到已访问视图列表中 + */ + function addVisitedView(view: TagView) { + // 如果已经存在于已访问的视图列表中,则不再添加 + if (visitedViews.value.some((v) => v.path === view.path)) { + return; + } + // 如果视图是固定的(affix),则在已访问的视图列表的开头添加 + if (view.affix) { + visitedViews.value.unshift(view); + } else { + // 如果视图不是固定的,则在已访问的视图列表的末尾添加 + visitedViews.value.push(view); + } + } + + /** + * 添加缓存视图到缓存视图列表中 + */ + function addCachedView(view: TagView) { + const viewName = view.name; + // 如果缓存视图名称已经存在于缓存视图列表中,则不再添加 + if (cachedViews.value.includes(viewName)) { + return; + } + + // 如果视图需要缓存(keepAlive),则将其路由名称添加到缓存视图列表中 + if (view.keepAlive) { + cachedViews.value.push(viewName); + } + } + + /** + * 从已访问视图列表中删除指定的视图 + */ + function delVisitedView(view: TagView) { + return new Promise((resolve) => { + for (const [i, v] of visitedViews.value.entries()) { + // 找到与指定视图路径匹配的视图,在已访问视图列表中删除该视图 + if (v.path === view.path) { + visitedViews.value.splice(i, 1); + break; + } + } + resolve([...visitedViews.value]); + }); + } + + function delCachedView(view: TagView) { + const viewName = view.name; + return new Promise((resolve) => { + const index = cachedViews.value.indexOf(viewName); + index > -1 && cachedViews.value.splice(index, 1); + resolve([...cachedViews.value]); + }); + } + + function delOtherVisitedViews(view: TagView) { + return new Promise((resolve) => { + visitedViews.value = visitedViews.value.filter((v) => { + return v?.affix || v.path === view.path; + }); + resolve([...visitedViews.value]); + }); + } + + function delOtherCachedViews(view: TagView) { + const viewName = view.name as string; + return new Promise((resolve) => { + const index = cachedViews.value.indexOf(viewName); + if (index > -1) { + cachedViews.value = cachedViews.value.slice(index, index + 1); + } else { + // if index = -1, there is no cached tags + cachedViews.value = []; + } + resolve([...cachedViews.value]); + }); + } + + function updateVisitedView(view: TagView) { + for (let v of visitedViews.value) { + if (v.path === view.path) { + v = Object.assign(v, view); + break; + } + } + } + + function addView(view: TagView) { + addVisitedView(view); + addCachedView(view); + } + + function delView(view: TagView) { + return new Promise((resolve) => { + delVisitedView(view); + delCachedView(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value], + }); + }); + } + + function delOtherViews(view: TagView) { + return new Promise((resolve) => { + delOtherVisitedViews(view); + delOtherCachedViews(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value], + }); + }); + } + + function delLeftViews(view: TagView) { + return new Promise((resolve) => { + const currIndex = visitedViews.value.findIndex( + (v) => v.path === view.path + ); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + if (index >= currIndex || item?.affix) { + return true; + } + + const cacheIndex = cachedViews.value.indexOf(item.name); + if (cacheIndex > -1) { + cachedViews.value.splice(cacheIndex, 1); + } + return false; + }); + resolve({ + visitedViews: [...visitedViews.value], + }); + }); + } + function delRightViews(view: TagView) { + return new Promise((resolve) => { + const currIndex = visitedViews.value.findIndex( + (v) => v.path === view.path + ); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + if (index <= currIndex || item?.affix) { + return true; + } + }); + resolve({ + visitedViews: [...visitedViews.value], + }); + }); + } + + function delAllViews() { + return new Promise((resolve) => { + const affixTags = visitedViews.value.filter((tag) => tag?.affix); + visitedViews.value = affixTags; + cachedViews.value = []; + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value], + }); + }); + } + + function delAllVisitedViews() { + return new Promise((resolve) => { + const affixTags = visitedViews.value.filter((tag) => tag?.affix); + visitedViews.value = affixTags; + resolve([...visitedViews.value]); + }); + } + + function delAllCachedViews() { + return new Promise((resolve) => { + cachedViews.value = []; + resolve([...cachedViews.value]); + }); + } + + return { + visitedViews, + cachedViews, + addVisitedView, + addCachedView, + delVisitedView, + delCachedView, + delOtherVisitedViews, + delOtherCachedViews, + updateVisitedView, + addView, + delView, + delOtherViews, + delLeftViews, + delRightViews, + delAllViews, + delAllVisitedViews, + delAllCachedViews, + }; +}); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000..e6637dd --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,94 @@ +import { loginApi, logoutApi } from "@/api/auth"; +import { getUserInfoApi } from "@/api/user"; +import { resetRouter } from "@/router"; +import { store } from "@/store"; + +import { LoginData } from "@/api/auth/types"; +import { UserInfo } from "@/api/user/types"; + +export const useUserStore = defineStore("user", () => { + const user = ref({ + roles: [], + perms: [], + }); + + /** + * 登录 + * + * @param {LoginData} + * @returns + */ + function login(loginData: LoginData) { + return new Promise((resolve, reject) => { + loginApi(loginData) + .then((response) => { + const { tokenType, accessToken } = response.data; + localStorage.setItem("token", tokenType + " " + accessToken); // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + } + + // 获取信息(用户昵称、头像、角色集合、权限集合) + function getUserInfo() { + return new Promise((resolve, reject) => { + getUserInfoApi() + .then(({ data }) => { + if (!data) { + reject("Verification failed, please Login again."); + return; + } + if (!data.roles || data.roles.length <= 0) { + reject("getUserInfo: roles must be a non-null array!"); + return; + } + Object.assign(user.value, { ...data }); + resolve(data); + }) + .catch((error) => { + reject(error); + }); + }); + } + + // user logout + function logout() { + return new Promise((resolve, reject) => { + logoutApi() + .then(() => { + localStorage.setItem("token", ""); + location.reload(); // 清空路由 + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + } + + // remove token + function resetToken() { + console.log("resetToken"); + return new Promise((resolve) => { + localStorage.setItem("token", ""); + resetRouter(); + resolve(); + }); + } + + return { + user, + login, + getUserInfo, + logout, + resetToken, + }; +}); + +// 非setup +export function useUserStoreHook() { + return useUserStore(store); +} diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..38db443 --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,71 @@ +@use "./reset"; + +.app-container { + padding: 10px; + border-radius: 8px; +} + +.search-container { + padding: 18px 0 0 10px; + margin-bottom: 10px; + background-color: var(--el-bg-color-overlay); + border: 1px solid var(--el-border-color-light); + border-radius: 8px; + //box-shadow: var(--el-box-shadow-light); +} + +.table-container > .el-card__header { + padding: calc(var(--el-card-padding) - 8px) var(--el-card-padding); +} +.table-container { + border-radius: 8px !important; +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32 160 255); + } +} + +.any-table { + background-color: #fff; + overflow: hidden; + border-radius: 10px; + border-top: 1px solid var(--el-border-color-light); + border-left: 1px solid var(--el-border-color-light); + border-right: 1px solid var(--el-border-color-light); +} + +.com-dialog { + .el-dialog { + margin: 0 !important; + &__header { + height: 40px; + padding: 0; + margin-right: 0 !important; + border-bottom: 1px solid var(--el-border-color); + } + &__body { + padding: 15px !important; + } + &__footer { + border-top: 1px solid var(--el-border-color); + } + &__headerbtn { + top: 0; + } + } +} + +.table-head-parent { + display: flex; + justify-content: space-between; +} +.head-parent-right { + display: flex; + justify-content: flex-end; +} diff --git a/src/styles/reset.scss b/src/styles/reset.scss new file mode 100644 index 0000000..a20f04a --- /dev/null +++ b/src/styles/reset.scss @@ -0,0 +1,76 @@ +*, +::before, +::after { + box-sizing: border-box; + border-color: currentcolor; + border-style: solid; + border-width: 0; +} + +#app { + width: 100%; + height: 100%; +} + +html { + box-sizing: border-box; + width: 100%; + height: 100%; + line-height: 1.5; + tab-size: 4; + text-size-adjust: 100%; +} + +body { + width: 100%; + height: 100%; + margin: 0; + font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", + "Microsoft YaHei", "微软雅黑", Arial, sans-serif; + line-height: inherit; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizelegibility; +} + +a { + color: inherit; + text-decoration: inherit; +} + +img, +svg { + display: inline-block; +} + +svg { + // 因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果 + vertical-align: -0.15em; +} + +ul, +li { + padding: 0; + margin: 0; + list-style: none; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +a, +a:focus, +a:hover { + color: inherit; + text-decoration: none; + cursor: pointer; +} + +a:focus, +a:active, +div:focus { + outline: none; +} diff --git a/src/styles/table.scss b/src/styles/table.scss new file mode 100644 index 0000000..f065e3d --- /dev/null +++ b/src/styles/table.scss @@ -0,0 +1,48 @@ +.any-table { + .el-table--enable-row-transition .el-table__body td.el-table__cell { + transition: none; + } + //hover 背景色 + .el-table--enable-row-hover .el-table__body tr:hover > td { + background-color: #fafafa !important; + } + + .el-table { + thead th:first-of-type { + padding-left: 20px; + } + + thead th:last-of-type { + padding-right: 20px; + } + + td:first-of-type { + padding-left: 20px; + } + + td:last-of-type { + padding-right: 20px; + } + + thead { + tr { + th { + background: #fff; + font-weight: 500; + } + } + } + + tr { + height: 55px !important; + } + + th { + color: #76838f !important; + } + + td { + color: #76838f !important; + } + } +} diff --git a/src/styles/variables.module.scss b/src/styles/variables.module.scss new file mode 100644 index 0000000..70aa10b --- /dev/null +++ b/src/styles/variables.module.scss @@ -0,0 +1,10 @@ +/* stylelint-disable property-no-unknown */ +:export { + sidebar-width: $sidebar-width; + navbar-height: $navbar-height; + menu-background: $menu-background; + menu-text: $menu-text; + menu-active-text: $menu-active-text; + menu-hover: $menu-hover; +} +/* stylelint-enable property-no-unknown */ diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..ca0514c --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,29 @@ +/** 全局SCSS变量 */ + +:root { + --menu-background: var(--el-bg-color-page); + --menu-text: #68758e; + --menu-active-text: var(--el-menu-active-color); + --menu-hover: #263445; + --sidebar-logo-background: #fff; +} + +/** 暗黑主题 */ +html.dark { + --menu-background: var(--el-bg-color-overlay); + --menu-text: #fff; + --menu-active-text: var(--el-menu-active-color); + --menu-hover: rgb(0 0 0 / 20%); + --sidebar-logo-background: rgb(0 0 0 / 20%); +} + +$menu-background: var(--menu-background); // 菜单背景色 +$menu-text: var(--menu-text); // 菜单文字颜色 +$menu-active-text: var(--menu-active-text); // 菜单激活文字颜色 +$menu-hover: var(--menu-hover); // 菜单悬停背景色 +$sidebar-logo-background: var(--el-bg-color-page); // 侧边栏 Logo 背景色 + +$sidebar-width: 210px; // 侧边栏宽度 +$sidebar-width-collapsed: 54px; // 侧边栏收缩宽度 +$navbar-height: 50px; // 导航栏高度 +$tags-view-height: 34px; // TagsView 高度 diff --git a/src/typings/auto-imports.d.ts b/src/typings/auto-imports.d.ts new file mode 100644 index 0000000..21e11af --- /dev/null +++ b/src/typings/auto-imports.d.ts @@ -0,0 +1,1783 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const EffectScope: (typeof import("vue"))["EffectScope"]; + const ElForm: (typeof import("element-plus/es"))["ElForm"]; + const ElMessage: (typeof import("element-plus/es"))["ElMessage"]; + const ElMessageBox: (typeof import("element-plus/es"))["ElMessageBox"]; + const ElTree: (typeof import("element-plus/es"))["ElTree"]; + const acceptHMRUpdate: (typeof import("pinia"))["acceptHMRUpdate"]; + const asyncComputed: (typeof import("@vueuse/core"))["asyncComputed"]; + const autoResetRef: (typeof import("@vueuse/core"))["autoResetRef"]; + const computed: (typeof import("vue"))["computed"]; + const computedAsync: (typeof import("@vueuse/core"))["computedAsync"]; + const computedEager: (typeof import("@vueuse/core"))["computedEager"]; + const computedInject: (typeof import("@vueuse/core"))["computedInject"]; + const computedWithControl: (typeof import("@vueuse/core"))["computedWithControl"]; + const controlledComputed: (typeof import("@vueuse/core"))["controlledComputed"]; + const controlledRef: (typeof import("@vueuse/core"))["controlledRef"]; + const createApp: (typeof import("vue"))["createApp"]; + const createEventHook: (typeof import("@vueuse/core"))["createEventHook"]; + const createGlobalState: (typeof import("@vueuse/core"))["createGlobalState"]; + const createInjectionState: (typeof import("@vueuse/core"))["createInjectionState"]; + const createPinia: (typeof import("pinia"))["createPinia"]; + const createReactiveFn: (typeof import("@vueuse/core"))["createReactiveFn"]; + const createReusableTemplate: (typeof import("@vueuse/core"))["createReusableTemplate"]; + const createSharedComposable: (typeof import("@vueuse/core"))["createSharedComposable"]; + const createTemplatePromise: (typeof import("@vueuse/core"))["createTemplatePromise"]; + const createUnrefFn: (typeof import("@vueuse/core"))["createUnrefFn"]; + const customRef: (typeof import("vue"))["customRef"]; + const debouncedRef: (typeof import("@vueuse/core"))["debouncedRef"]; + const debouncedWatch: (typeof import("@vueuse/core"))["debouncedWatch"]; + const defineAsyncComponent: (typeof import("vue"))["defineAsyncComponent"]; + const defineComponent: (typeof import("vue"))["defineComponent"]; + const defineStore: (typeof import("pinia"))["defineStore"]; + const eagerComputed: (typeof import("@vueuse/core"))["eagerComputed"]; + const effectScope: (typeof import("vue"))["effectScope"]; + const extendRef: (typeof import("@vueuse/core"))["extendRef"]; + const getActivePinia: (typeof import("pinia"))["getActivePinia"]; + const getCurrentInstance: (typeof import("vue"))["getCurrentInstance"]; + const getCurrentScope: (typeof import("vue"))["getCurrentScope"]; + const h: (typeof import("vue"))["h"]; + const ignorableWatch: (typeof import("@vueuse/core"))["ignorableWatch"]; + const inject: (typeof import("vue"))["inject"]; + const injectLocal: (typeof import("@vueuse/core"))["injectLocal"]; + const isDefined: (typeof import("@vueuse/core"))["isDefined"]; + const isProxy: (typeof import("vue"))["isProxy"]; + const isReactive: (typeof import("vue"))["isReactive"]; + const isReadonly: (typeof import("vue"))["isReadonly"]; + const isRef: (typeof import("vue"))["isRef"]; + const makeDestructurable: (typeof import("@vueuse/core"))["makeDestructurable"]; + const mapActions: (typeof import("pinia"))["mapActions"]; + const mapGetters: (typeof import("pinia"))["mapGetters"]; + const mapState: (typeof import("pinia"))["mapState"]; + const mapStores: (typeof import("pinia"))["mapStores"]; + const mapWritableState: (typeof import("pinia"))["mapWritableState"]; + const markRaw: (typeof import("vue"))["markRaw"]; + const nextTick: (typeof import("vue"))["nextTick"]; + const onActivated: (typeof import("vue"))["onActivated"]; + const onBeforeMount: (typeof import("vue"))["onBeforeMount"]; + const onBeforeRouteLeave: (typeof import("vue-router"))["onBeforeRouteLeave"]; + const onBeforeRouteUpdate: (typeof import("vue-router"))["onBeforeRouteUpdate"]; + const onBeforeUnmount: (typeof import("vue"))["onBeforeUnmount"]; + const onBeforeUpdate: (typeof import("vue"))["onBeforeUpdate"]; + const onClickOutside: (typeof import("@vueuse/core"))["onClickOutside"]; + const onDeactivated: (typeof import("vue"))["onDeactivated"]; + const onErrorCaptured: (typeof import("vue"))["onErrorCaptured"]; + const onKeyStroke: (typeof import("@vueuse/core"))["onKeyStroke"]; + const onLongPress: (typeof import("@vueuse/core"))["onLongPress"]; + const onMounted: (typeof import("vue"))["onMounted"]; + const onRenderTracked: (typeof import("vue"))["onRenderTracked"]; + const onRenderTriggered: (typeof import("vue"))["onRenderTriggered"]; + const onScopeDispose: (typeof import("vue"))["onScopeDispose"]; + const onServerPrefetch: (typeof import("vue"))["onServerPrefetch"]; + const onStartTyping: (typeof import("@vueuse/core"))["onStartTyping"]; + const onUnmounted: (typeof import("vue"))["onUnmounted"]; + const onUpdated: (typeof import("vue"))["onUpdated"]; + const pausableWatch: (typeof import("@vueuse/core"))["pausableWatch"]; + const provide: (typeof import("vue"))["provide"]; + const provideLocal: (typeof import("@vueuse/core"))["provideLocal"]; + const reactify: (typeof import("@vueuse/core"))["reactify"]; + const reactifyObject: (typeof import("@vueuse/core"))["reactifyObject"]; + const reactive: (typeof import("vue"))["reactive"]; + const reactiveComputed: (typeof import("@vueuse/core"))["reactiveComputed"]; + const reactiveOmit: (typeof import("@vueuse/core"))["reactiveOmit"]; + const reactivePick: (typeof import("@vueuse/core"))["reactivePick"]; + const readonly: (typeof import("vue"))["readonly"]; + const ref: (typeof import("vue"))["ref"]; + const refAutoReset: (typeof import("@vueuse/core"))["refAutoReset"]; + const refDebounced: (typeof import("@vueuse/core"))["refDebounced"]; + const refDefault: (typeof import("@vueuse/core"))["refDefault"]; + const refThrottled: (typeof import("@vueuse/core"))["refThrottled"]; + const refWithControl: (typeof import("@vueuse/core"))["refWithControl"]; + const resolveComponent: (typeof import("vue"))["resolveComponent"]; + const resolveRef: (typeof import("@vueuse/core"))["resolveRef"]; + const resolveUnref: (typeof import("@vueuse/core"))["resolveUnref"]; + const setActivePinia: (typeof import("pinia"))["setActivePinia"]; + const setMapStoreSuffix: (typeof import("pinia"))["setMapStoreSuffix"]; + const shallowReactive: (typeof import("vue"))["shallowReactive"]; + const shallowReadonly: (typeof import("vue"))["shallowReadonly"]; + const shallowRef: (typeof import("vue"))["shallowRef"]; + const storeToRefs: (typeof import("pinia"))["storeToRefs"]; + const syncRef: (typeof import("@vueuse/core"))["syncRef"]; + const syncRefs: (typeof import("@vueuse/core"))["syncRefs"]; + const templateRef: (typeof import("@vueuse/core"))["templateRef"]; + const throttledRef: (typeof import("@vueuse/core"))["throttledRef"]; + const throttledWatch: (typeof import("@vueuse/core"))["throttledWatch"]; + const toRaw: (typeof import("vue"))["toRaw"]; + const toReactive: (typeof import("@vueuse/core"))["toReactive"]; + const toRef: (typeof import("vue"))["toRef"]; + const toRefs: (typeof import("vue"))["toRefs"]; + const toValue: (typeof import("vue"))["toValue"]; + const triggerRef: (typeof import("vue"))["triggerRef"]; + const tryOnBeforeMount: (typeof import("@vueuse/core"))["tryOnBeforeMount"]; + const tryOnBeforeUnmount: (typeof import("@vueuse/core"))["tryOnBeforeUnmount"]; + const tryOnMounted: (typeof import("@vueuse/core"))["tryOnMounted"]; + const tryOnScopeDispose: (typeof import("@vueuse/core"))["tryOnScopeDispose"]; + const tryOnUnmounted: (typeof import("@vueuse/core"))["tryOnUnmounted"]; + const unref: (typeof import("vue"))["unref"]; + const unrefElement: (typeof import("@vueuse/core"))["unrefElement"]; + const until: (typeof import("@vueuse/core"))["until"]; + const useActiveElement: (typeof import("@vueuse/core"))["useActiveElement"]; + const useAnimate: (typeof import("@vueuse/core"))["useAnimate"]; + const useArrayDifference: (typeof import("@vueuse/core"))["useArrayDifference"]; + const useArrayEvery: (typeof import("@vueuse/core"))["useArrayEvery"]; + const useArrayFilter: (typeof import("@vueuse/core"))["useArrayFilter"]; + const useArrayFind: (typeof import("@vueuse/core"))["useArrayFind"]; + const useArrayFindIndex: (typeof import("@vueuse/core"))["useArrayFindIndex"]; + const useArrayFindLast: (typeof import("@vueuse/core"))["useArrayFindLast"]; + const useArrayIncludes: (typeof import("@vueuse/core"))["useArrayIncludes"]; + const useArrayJoin: (typeof import("@vueuse/core"))["useArrayJoin"]; + const useArrayMap: (typeof import("@vueuse/core"))["useArrayMap"]; + const useArrayReduce: (typeof import("@vueuse/core"))["useArrayReduce"]; + const useArraySome: (typeof import("@vueuse/core"))["useArraySome"]; + const useArrayUnique: (typeof import("@vueuse/core"))["useArrayUnique"]; + const useAsyncQueue: (typeof import("@vueuse/core"))["useAsyncQueue"]; + const useAsyncState: (typeof import("@vueuse/core"))["useAsyncState"]; + const useAttrs: (typeof import("vue"))["useAttrs"]; + const useBase64: (typeof import("@vueuse/core"))["useBase64"]; + const useBattery: (typeof import("@vueuse/core"))["useBattery"]; + const useBluetooth: (typeof import("@vueuse/core"))["useBluetooth"]; + const useBreakpoints: (typeof import("@vueuse/core"))["useBreakpoints"]; + const useBroadcastChannel: (typeof import("@vueuse/core"))["useBroadcastChannel"]; + const useBrowserLocation: (typeof import("@vueuse/core"))["useBrowserLocation"]; + const useCached: (typeof import("@vueuse/core"))["useCached"]; + const useClipboard: (typeof import("@vueuse/core"))["useClipboard"]; + const useClipboardItems: (typeof import("@vueuse/core"))["useClipboardItems"]; + const useCloned: (typeof import("@vueuse/core"))["useCloned"]; + const useColorMode: (typeof import("@vueuse/core"))["useColorMode"]; + const useConfirmDialog: (typeof import("@vueuse/core"))["useConfirmDialog"]; + const useCounter: (typeof import("@vueuse/core"))["useCounter"]; + const useCssModule: (typeof import("vue"))["useCssModule"]; + const useCssVar: (typeof import("@vueuse/core"))["useCssVar"]; + const useCssVars: (typeof import("vue"))["useCssVars"]; + const useCurrentElement: (typeof import("@vueuse/core"))["useCurrentElement"]; + const useCycleList: (typeof import("@vueuse/core"))["useCycleList"]; + const useDark: (typeof import("@vueuse/core"))["useDark"]; + const useDateFormat: (typeof import("@vueuse/core"))["useDateFormat"]; + const useDebounce: (typeof import("@vueuse/core"))["useDebounce"]; + const useDebounceFn: (typeof import("@vueuse/core"))["useDebounceFn"]; + const useDebouncedRefHistory: (typeof import("@vueuse/core"))["useDebouncedRefHistory"]; + const useDeviceMotion: (typeof import("@vueuse/core"))["useDeviceMotion"]; + const useDeviceOrientation: (typeof import("@vueuse/core"))["useDeviceOrientation"]; + const useDevicePixelRatio: (typeof import("@vueuse/core"))["useDevicePixelRatio"]; + const useDevicesList: (typeof import("@vueuse/core"))["useDevicesList"]; + const useDisplayMedia: (typeof import("@vueuse/core"))["useDisplayMedia"]; + const useDocumentVisibility: (typeof import("@vueuse/core"))["useDocumentVisibility"]; + const useDraggable: (typeof import("@vueuse/core"))["useDraggable"]; + const useDropZone: (typeof import("@vueuse/core"))["useDropZone"]; + const useElementBounding: (typeof import("@vueuse/core"))["useElementBounding"]; + const useElementByPoint: (typeof import("@vueuse/core"))["useElementByPoint"]; + const useElementHover: (typeof import("@vueuse/core"))["useElementHover"]; + const useElementSize: (typeof import("@vueuse/core"))["useElementSize"]; + const useElementVisibility: (typeof import("@vueuse/core"))["useElementVisibility"]; + const useEventBus: (typeof import("@vueuse/core"))["useEventBus"]; + const useEventListener: (typeof import("@vueuse/core"))["useEventListener"]; + const useEventSource: (typeof import("@vueuse/core"))["useEventSource"]; + const useEyeDropper: (typeof import("@vueuse/core"))["useEyeDropper"]; + const useFavicon: (typeof import("@vueuse/core"))["useFavicon"]; + const useFetch: (typeof import("@vueuse/core"))["useFetch"]; + const useFileDialog: (typeof import("@vueuse/core"))["useFileDialog"]; + const useFileSystemAccess: (typeof import("@vueuse/core"))["useFileSystemAccess"]; + const useFocus: (typeof import("@vueuse/core"))["useFocus"]; + const useFocusWithin: (typeof import("@vueuse/core"))["useFocusWithin"]; + const useFps: (typeof import("@vueuse/core"))["useFps"]; + const useFullscreen: (typeof import("@vueuse/core"))["useFullscreen"]; + const useGamepad: (typeof import("@vueuse/core"))["useGamepad"]; + const useGeolocation: (typeof import("@vueuse/core"))["useGeolocation"]; + const useI18n: (typeof import("vue-i18n"))["useI18n"]; + const useIdle: (typeof import("@vueuse/core"))["useIdle"]; + const useImage: (typeof import("@vueuse/core"))["useImage"]; + const useInfiniteScroll: (typeof import("@vueuse/core"))["useInfiniteScroll"]; + const useIntersectionObserver: (typeof import("@vueuse/core"))["useIntersectionObserver"]; + const useInterval: (typeof import("@vueuse/core"))["useInterval"]; + const useIntervalFn: (typeof import("@vueuse/core"))["useIntervalFn"]; + const useKeyModifier: (typeof import("@vueuse/core"))["useKeyModifier"]; + const useLastChanged: (typeof import("@vueuse/core"))["useLastChanged"]; + const useLink: (typeof import("vue-router"))["useLink"]; + const useLocalStorage: (typeof import("@vueuse/core"))["useLocalStorage"]; + const useMagicKeys: (typeof import("@vueuse/core"))["useMagicKeys"]; + const useManualRefHistory: (typeof import("@vueuse/core"))["useManualRefHistory"]; + const useMediaControls: (typeof import("@vueuse/core"))["useMediaControls"]; + const useMediaQuery: (typeof import("@vueuse/core"))["useMediaQuery"]; + const useMemoize: (typeof import("@vueuse/core"))["useMemoize"]; + const useMemory: (typeof import("@vueuse/core"))["useMemory"]; + const useMounted: (typeof import("@vueuse/core"))["useMounted"]; + const useMouse: (typeof import("@vueuse/core"))["useMouse"]; + const useMouseInElement: (typeof import("@vueuse/core"))["useMouseInElement"]; + const useMousePressed: (typeof import("@vueuse/core"))["useMousePressed"]; + const useMutationObserver: (typeof import("@vueuse/core"))["useMutationObserver"]; + const useNavigatorLanguage: (typeof import("@vueuse/core"))["useNavigatorLanguage"]; + const useNetwork: (typeof import("@vueuse/core"))["useNetwork"]; + const useNow: (typeof import("@vueuse/core"))["useNow"]; + const useObjectUrl: (typeof import("@vueuse/core"))["useObjectUrl"]; + const useOffsetPagination: (typeof import("@vueuse/core"))["useOffsetPagination"]; + const useOnline: (typeof import("@vueuse/core"))["useOnline"]; + const usePageLeave: (typeof import("@vueuse/core"))["usePageLeave"]; + const useParallax: (typeof import("@vueuse/core"))["useParallax"]; + const useParentElement: (typeof import("@vueuse/core"))["useParentElement"]; + const usePerformanceObserver: (typeof import("@vueuse/core"))["usePerformanceObserver"]; + const usePermission: (typeof import("@vueuse/core"))["usePermission"]; + const usePointer: (typeof import("@vueuse/core"))["usePointer"]; + const usePointerLock: (typeof import("@vueuse/core"))["usePointerLock"]; + const usePointerSwipe: (typeof import("@vueuse/core"))["usePointerSwipe"]; + const usePreferredColorScheme: (typeof import("@vueuse/core"))["usePreferredColorScheme"]; + const usePreferredContrast: (typeof import("@vueuse/core"))["usePreferredContrast"]; + const usePreferredDark: (typeof import("@vueuse/core"))["usePreferredDark"]; + const usePreferredLanguages: (typeof import("@vueuse/core"))["usePreferredLanguages"]; + const usePreferredReducedMotion: (typeof import("@vueuse/core"))["usePreferredReducedMotion"]; + const usePrevious: (typeof import("@vueuse/core"))["usePrevious"]; + const useRafFn: (typeof import("@vueuse/core"))["useRafFn"]; + const useRefHistory: (typeof import("@vueuse/core"))["useRefHistory"]; + const useResizeObserver: (typeof import("@vueuse/core"))["useResizeObserver"]; + const useRoute: (typeof import("vue-router"))["useRoute"]; + const useRouter: (typeof import("vue-router"))["useRouter"]; + const useScreenOrientation: (typeof import("@vueuse/core"))["useScreenOrientation"]; + const useScreenSafeArea: (typeof import("@vueuse/core"))["useScreenSafeArea"]; + const useScriptTag: (typeof import("@vueuse/core"))["useScriptTag"]; + const useScroll: (typeof import("@vueuse/core"))["useScroll"]; + const useScrollLock: (typeof import("@vueuse/core"))["useScrollLock"]; + const useSessionStorage: (typeof import("@vueuse/core"))["useSessionStorage"]; + const useShare: (typeof import("@vueuse/core"))["useShare"]; + const useSlots: (typeof import("vue"))["useSlots"]; + const useSorted: (typeof import("@vueuse/core"))["useSorted"]; + const useSpeechRecognition: (typeof import("@vueuse/core"))["useSpeechRecognition"]; + const useSpeechSynthesis: (typeof import("@vueuse/core"))["useSpeechSynthesis"]; + const useStepper: (typeof import("@vueuse/core"))["useStepper"]; + const useStorage: (typeof import("@vueuse/core"))["useStorage"]; + const useStorageAsync: (typeof import("@vueuse/core"))["useStorageAsync"]; + const useStyleTag: (typeof import("@vueuse/core"))["useStyleTag"]; + const useSupported: (typeof import("@vueuse/core"))["useSupported"]; + const useSwipe: (typeof import("@vueuse/core"))["useSwipe"]; + const useTemplateRefsList: (typeof import("@vueuse/core"))["useTemplateRefsList"]; + const useTextDirection: (typeof import("@vueuse/core"))["useTextDirection"]; + const useTextSelection: (typeof import("@vueuse/core"))["useTextSelection"]; + const useTextareaAutosize: (typeof import("@vueuse/core"))["useTextareaAutosize"]; + const useThrottle: (typeof import("@vueuse/core"))["useThrottle"]; + const useThrottleFn: (typeof import("@vueuse/core"))["useThrottleFn"]; + const useThrottledRefHistory: (typeof import("@vueuse/core"))["useThrottledRefHistory"]; + const useTimeAgo: (typeof import("@vueuse/core"))["useTimeAgo"]; + const useTimeout: (typeof import("@vueuse/core"))["useTimeout"]; + const useTimeoutFn: (typeof import("@vueuse/core"))["useTimeoutFn"]; + const useTimeoutPoll: (typeof import("@vueuse/core"))["useTimeoutPoll"]; + const useTimestamp: (typeof import("@vueuse/core"))["useTimestamp"]; + const useTitle: (typeof import("@vueuse/core"))["useTitle"]; + const useToNumber: (typeof import("@vueuse/core"))["useToNumber"]; + const useToString: (typeof import("@vueuse/core"))["useToString"]; + const useToggle: (typeof import("@vueuse/core"))["useToggle"]; + const useTransition: (typeof import("@vueuse/core"))["useTransition"]; + const useUrlSearchParams: (typeof import("@vueuse/core"))["useUrlSearchParams"]; + const useUserMedia: (typeof import("@vueuse/core"))["useUserMedia"]; + const useVModel: (typeof import("@vueuse/core"))["useVModel"]; + const useVModels: (typeof import("@vueuse/core"))["useVModels"]; + const useVibrate: (typeof import("@vueuse/core"))["useVibrate"]; + const useVirtualList: (typeof import("@vueuse/core"))["useVirtualList"]; + const useWakeLock: (typeof import("@vueuse/core"))["useWakeLock"]; + const useWebNotification: (typeof import("@vueuse/core"))["useWebNotification"]; + const useWebSocket: (typeof import("@vueuse/core"))["useWebSocket"]; + const useWebWorker: (typeof import("@vueuse/core"))["useWebWorker"]; + const useWebWorkerFn: (typeof import("@vueuse/core"))["useWebWorkerFn"]; + const useWindowFocus: (typeof import("@vueuse/core"))["useWindowFocus"]; + const useWindowScroll: (typeof import("@vueuse/core"))["useWindowScroll"]; + const useWindowSize: (typeof import("@vueuse/core"))["useWindowSize"]; + const watch: (typeof import("vue"))["watch"]; + const watchArray: (typeof import("@vueuse/core"))["watchArray"]; + const watchAtMost: (typeof import("@vueuse/core"))["watchAtMost"]; + const watchDebounced: (typeof import("@vueuse/core"))["watchDebounced"]; + const watchDeep: (typeof import("@vueuse/core"))["watchDeep"]; + const watchEffect: (typeof import("vue"))["watchEffect"]; + const watchIgnorable: (typeof import("@vueuse/core"))["watchIgnorable"]; + const watchImmediate: (typeof import("@vueuse/core"))["watchImmediate"]; + const watchOnce: (typeof import("@vueuse/core"))["watchOnce"]; + const watchPausable: (typeof import("@vueuse/core"))["watchPausable"]; + const watchPostEffect: (typeof import("vue"))["watchPostEffect"]; + const watchSyncEffect: (typeof import("vue"))["watchSyncEffect"]; + const watchThrottled: (typeof import("@vueuse/core"))["watchThrottled"]; + const watchTriggerable: (typeof import("@vueuse/core"))["watchTriggerable"]; + const watchWithFilter: (typeof import("@vueuse/core"))["watchWithFilter"]; + const whenever: (typeof import("@vueuse/core"))["whenever"]; +} +// for type re-export +declare global { + // @ts-ignore + export type { + Component, + ComponentPublicInstance, + ComputedRef, + ExtractDefaultPropTypes, + ExtractPropTypes, + ExtractPublicPropTypes, + InjectionKey, + PropType, + Ref, + VNode, + WritableComputedRef, + } from "vue"; + import("vue"); +} +// for vue template auto import +import { UnwrapRef } from "vue"; +declare module "vue" { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef<(typeof import("vue"))["EffectScope"]>; + readonly ElForm: UnwrapRef<(typeof import("element-plus/es"))["ElForm"]>; + readonly ElMessage: UnwrapRef< + (typeof import("element-plus/es"))["ElMessage"] + >; + readonly ElMessageBox: UnwrapRef< + (typeof import("element-plus/es"))["ElMessageBox"] + >; + readonly ElTree: UnwrapRef<(typeof import("element-plus/es"))["ElTree"]>; + readonly acceptHMRUpdate: UnwrapRef< + (typeof import("pinia"))["acceptHMRUpdate"] + >; + readonly asyncComputed: UnwrapRef< + (typeof import("@vueuse/core"))["asyncComputed"] + >; + readonly autoResetRef: UnwrapRef< + (typeof import("@vueuse/core"))["autoResetRef"] + >; + readonly computed: UnwrapRef<(typeof import("vue"))["computed"]>; + readonly computedAsync: UnwrapRef< + (typeof import("@vueuse/core"))["computedAsync"] + >; + readonly computedEager: UnwrapRef< + (typeof import("@vueuse/core"))["computedEager"] + >; + readonly computedInject: UnwrapRef< + (typeof import("@vueuse/core"))["computedInject"] + >; + readonly computedWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["computedWithControl"] + >; + readonly controlledComputed: UnwrapRef< + (typeof import("@vueuse/core"))["controlledComputed"] + >; + readonly controlledRef: UnwrapRef< + (typeof import("@vueuse/core"))["controlledRef"] + >; + readonly createApp: UnwrapRef<(typeof import("vue"))["createApp"]>; + readonly createEventHook: UnwrapRef< + (typeof import("@vueuse/core"))["createEventHook"] + >; + readonly createGlobalState: UnwrapRef< + (typeof import("@vueuse/core"))["createGlobalState"] + >; + readonly createInjectionState: UnwrapRef< + (typeof import("@vueuse/core"))["createInjectionState"] + >; + readonly createPinia: UnwrapRef<(typeof import("pinia"))["createPinia"]>; + readonly createReactiveFn: UnwrapRef< + (typeof import("@vueuse/core"))["createReactiveFn"] + >; + readonly createReusableTemplate: UnwrapRef< + (typeof import("@vueuse/core"))["createReusableTemplate"] + >; + readonly createSharedComposable: UnwrapRef< + (typeof import("@vueuse/core"))["createSharedComposable"] + >; + readonly createTemplatePromise: UnwrapRef< + (typeof import("@vueuse/core"))["createTemplatePromise"] + >; + readonly createUnrefFn: UnwrapRef< + (typeof import("@vueuse/core"))["createUnrefFn"] + >; + readonly customRef: UnwrapRef<(typeof import("vue"))["customRef"]>; + readonly debouncedRef: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedRef"] + >; + readonly debouncedWatch: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedWatch"] + >; + readonly defineAsyncComponent: UnwrapRef< + (typeof import("vue"))["defineAsyncComponent"] + >; + readonly defineComponent: UnwrapRef< + (typeof import("vue"))["defineComponent"] + >; + readonly defineStore: UnwrapRef<(typeof import("pinia"))["defineStore"]>; + readonly eagerComputed: UnwrapRef< + (typeof import("@vueuse/core"))["eagerComputed"] + >; + readonly effectScope: UnwrapRef<(typeof import("vue"))["effectScope"]>; + readonly extendRef: UnwrapRef<(typeof import("@vueuse/core"))["extendRef"]>; + readonly getActivePinia: UnwrapRef< + (typeof import("pinia"))["getActivePinia"] + >; + readonly getCurrentInstance: UnwrapRef< + (typeof import("vue"))["getCurrentInstance"] + >; + readonly getCurrentScope: UnwrapRef< + (typeof import("vue"))["getCurrentScope"] + >; + readonly h: UnwrapRef<(typeof import("vue"))["h"]>; + readonly ignorableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["ignorableWatch"] + >; + readonly inject: UnwrapRef<(typeof import("vue"))["inject"]>; + readonly injectLocal: UnwrapRef< + (typeof import("@vueuse/core"))["injectLocal"] + >; + readonly isDefined: UnwrapRef<(typeof import("@vueuse/core"))["isDefined"]>; + readonly isProxy: UnwrapRef<(typeof import("vue"))["isProxy"]>; + readonly isReactive: UnwrapRef<(typeof import("vue"))["isReactive"]>; + readonly isReadonly: UnwrapRef<(typeof import("vue"))["isReadonly"]>; + readonly isRef: UnwrapRef<(typeof import("vue"))["isRef"]>; + readonly makeDestructurable: UnwrapRef< + (typeof import("@vueuse/core"))["makeDestructurable"] + >; + readonly mapActions: UnwrapRef<(typeof import("pinia"))["mapActions"]>; + readonly mapGetters: UnwrapRef<(typeof import("pinia"))["mapGetters"]>; + readonly mapState: UnwrapRef<(typeof import("pinia"))["mapState"]>; + readonly mapStores: UnwrapRef<(typeof import("pinia"))["mapStores"]>; + readonly mapWritableState: UnwrapRef< + (typeof import("pinia"))["mapWritableState"] + >; + readonly markRaw: UnwrapRef<(typeof import("vue"))["markRaw"]>; + readonly nextTick: UnwrapRef<(typeof import("vue"))["nextTick"]>; + readonly onActivated: UnwrapRef<(typeof import("vue"))["onActivated"]>; + readonly onBeforeMount: UnwrapRef<(typeof import("vue"))["onBeforeMount"]>; + readonly onBeforeRouteLeave: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteLeave"] + >; + readonly onBeforeRouteUpdate: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteUpdate"] + >; + readonly onBeforeUnmount: UnwrapRef< + (typeof import("vue"))["onBeforeUnmount"] + >; + readonly onBeforeUpdate: UnwrapRef< + (typeof import("vue"))["onBeforeUpdate"] + >; + readonly onClickOutside: UnwrapRef< + (typeof import("@vueuse/core"))["onClickOutside"] + >; + readonly onDeactivated: UnwrapRef<(typeof import("vue"))["onDeactivated"]>; + readonly onErrorCaptured: UnwrapRef< + (typeof import("vue"))["onErrorCaptured"] + >; + readonly onKeyStroke: UnwrapRef< + (typeof import("@vueuse/core"))["onKeyStroke"] + >; + readonly onLongPress: UnwrapRef< + (typeof import("@vueuse/core"))["onLongPress"] + >; + readonly onMounted: UnwrapRef<(typeof import("vue"))["onMounted"]>; + readonly onRenderTracked: UnwrapRef< + (typeof import("vue"))["onRenderTracked"] + >; + readonly onRenderTriggered: UnwrapRef< + (typeof import("vue"))["onRenderTriggered"] + >; + readonly onScopeDispose: UnwrapRef< + (typeof import("vue"))["onScopeDispose"] + >; + readonly onServerPrefetch: UnwrapRef< + (typeof import("vue"))["onServerPrefetch"] + >; + readonly onStartTyping: UnwrapRef< + (typeof import("@vueuse/core"))["onStartTyping"] + >; + readonly onUnmounted: UnwrapRef<(typeof import("vue"))["onUnmounted"]>; + readonly onUpdated: UnwrapRef<(typeof import("vue"))["onUpdated"]>; + readonly pausableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["pausableWatch"] + >; + readonly provide: UnwrapRef<(typeof import("vue"))["provide"]>; + readonly provideLocal: UnwrapRef< + (typeof import("@vueuse/core"))["provideLocal"] + >; + readonly reactify: UnwrapRef<(typeof import("@vueuse/core"))["reactify"]>; + readonly reactifyObject: UnwrapRef< + (typeof import("@vueuse/core"))["reactifyObject"] + >; + readonly reactive: UnwrapRef<(typeof import("vue"))["reactive"]>; + readonly reactiveComputed: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveComputed"] + >; + readonly reactiveOmit: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveOmit"] + >; + readonly reactivePick: UnwrapRef< + (typeof import("@vueuse/core"))["reactivePick"] + >; + readonly readonly: UnwrapRef<(typeof import("vue"))["readonly"]>; + readonly ref: UnwrapRef<(typeof import("vue"))["ref"]>; + readonly refAutoReset: UnwrapRef< + (typeof import("@vueuse/core"))["refAutoReset"] + >; + readonly refDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["refDebounced"] + >; + readonly refDefault: UnwrapRef< + (typeof import("@vueuse/core"))["refDefault"] + >; + readonly refThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["refThrottled"] + >; + readonly refWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["refWithControl"] + >; + readonly resolveComponent: UnwrapRef< + (typeof import("vue"))["resolveComponent"] + >; + readonly resolveRef: UnwrapRef< + (typeof import("@vueuse/core"))["resolveRef"] + >; + readonly resolveUnref: UnwrapRef< + (typeof import("@vueuse/core"))["resolveUnref"] + >; + readonly setActivePinia: UnwrapRef< + (typeof import("pinia"))["setActivePinia"] + >; + readonly setMapStoreSuffix: UnwrapRef< + (typeof import("pinia"))["setMapStoreSuffix"] + >; + readonly shallowReactive: UnwrapRef< + (typeof import("vue"))["shallowReactive"] + >; + readonly shallowReadonly: UnwrapRef< + (typeof import("vue"))["shallowReadonly"] + >; + readonly shallowRef: UnwrapRef<(typeof import("vue"))["shallowRef"]>; + readonly storeToRefs: UnwrapRef<(typeof import("pinia"))["storeToRefs"]>; + readonly syncRef: UnwrapRef<(typeof import("@vueuse/core"))["syncRef"]>; + readonly syncRefs: UnwrapRef<(typeof import("@vueuse/core"))["syncRefs"]>; + readonly templateRef: UnwrapRef< + (typeof import("@vueuse/core"))["templateRef"] + >; + readonly throttledRef: UnwrapRef< + (typeof import("@vueuse/core"))["throttledRef"] + >; + readonly throttledWatch: UnwrapRef< + (typeof import("@vueuse/core"))["throttledWatch"] + >; + readonly toRaw: UnwrapRef<(typeof import("vue"))["toRaw"]>; + readonly toReactive: UnwrapRef< + (typeof import("@vueuse/core"))["toReactive"] + >; + readonly toRef: UnwrapRef<(typeof import("vue"))["toRef"]>; + readonly toRefs: UnwrapRef<(typeof import("vue"))["toRefs"]>; + readonly toValue: UnwrapRef<(typeof import("vue"))["toValue"]>; + readonly triggerRef: UnwrapRef<(typeof import("vue"))["triggerRef"]>; + readonly tryOnBeforeMount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeMount"] + >; + readonly tryOnBeforeUnmount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeUnmount"] + >; + readonly tryOnMounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnMounted"] + >; + readonly tryOnScopeDispose: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnScopeDispose"] + >; + readonly tryOnUnmounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnUnmounted"] + >; + readonly unref: UnwrapRef<(typeof import("vue"))["unref"]>; + readonly unrefElement: UnwrapRef< + (typeof import("@vueuse/core"))["unrefElement"] + >; + readonly until: UnwrapRef<(typeof import("@vueuse/core"))["until"]>; + readonly useActiveElement: UnwrapRef< + (typeof import("@vueuse/core"))["useActiveElement"] + >; + readonly useAnimate: UnwrapRef< + (typeof import("@vueuse/core"))["useAnimate"] + >; + readonly useArrayDifference: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayDifference"] + >; + readonly useArrayEvery: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayEvery"] + >; + readonly useArrayFilter: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFilter"] + >; + readonly useArrayFind: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFind"] + >; + readonly useArrayFindIndex: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindIndex"] + >; + readonly useArrayFindLast: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindLast"] + >; + readonly useArrayIncludes: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayIncludes"] + >; + readonly useArrayJoin: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayJoin"] + >; + readonly useArrayMap: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayMap"] + >; + readonly useArrayReduce: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayReduce"] + >; + readonly useArraySome: UnwrapRef< + (typeof import("@vueuse/core"))["useArraySome"] + >; + readonly useArrayUnique: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayUnique"] + >; + readonly useAsyncQueue: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncQueue"] + >; + readonly useAsyncState: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncState"] + >; + readonly useAttrs: UnwrapRef<(typeof import("vue"))["useAttrs"]>; + readonly useBase64: UnwrapRef<(typeof import("@vueuse/core"))["useBase64"]>; + readonly useBattery: UnwrapRef< + (typeof import("@vueuse/core"))["useBattery"] + >; + readonly useBluetooth: UnwrapRef< + (typeof import("@vueuse/core"))["useBluetooth"] + >; + readonly useBreakpoints: UnwrapRef< + (typeof import("@vueuse/core"))["useBreakpoints"] + >; + readonly useBroadcastChannel: UnwrapRef< + (typeof import("@vueuse/core"))["useBroadcastChannel"] + >; + readonly useBrowserLocation: UnwrapRef< + (typeof import("@vueuse/core"))["useBrowserLocation"] + >; + readonly useCached: UnwrapRef<(typeof import("@vueuse/core"))["useCached"]>; + readonly useClipboard: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboard"] + >; + readonly useClipboardItems: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboardItems"] + >; + readonly useCloned: UnwrapRef<(typeof import("@vueuse/core"))["useCloned"]>; + readonly useColorMode: UnwrapRef< + (typeof import("@vueuse/core"))["useColorMode"] + >; + readonly useConfirmDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useConfirmDialog"] + >; + readonly useCounter: UnwrapRef< + (typeof import("@vueuse/core"))["useCounter"] + >; + readonly useCssModule: UnwrapRef<(typeof import("vue"))["useCssModule"]>; + readonly useCssVar: UnwrapRef<(typeof import("@vueuse/core"))["useCssVar"]>; + readonly useCssVars: UnwrapRef<(typeof import("vue"))["useCssVars"]>; + readonly useCurrentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useCurrentElement"] + >; + readonly useCycleList: UnwrapRef< + (typeof import("@vueuse/core"))["useCycleList"] + >; + readonly useDark: UnwrapRef<(typeof import("@vueuse/core"))["useDark"]>; + readonly useDateFormat: UnwrapRef< + (typeof import("@vueuse/core"))["useDateFormat"] + >; + readonly useDebounce: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounce"] + >; + readonly useDebounceFn: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounceFn"] + >; + readonly useDebouncedRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useDebouncedRefHistory"] + >; + readonly useDeviceMotion: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceMotion"] + >; + readonly useDeviceOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceOrientation"] + >; + readonly useDevicePixelRatio: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicePixelRatio"] + >; + readonly useDevicesList: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicesList"] + >; + readonly useDisplayMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useDisplayMedia"] + >; + readonly useDocumentVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useDocumentVisibility"] + >; + readonly useDraggable: UnwrapRef< + (typeof import("@vueuse/core"))["useDraggable"] + >; + readonly useDropZone: UnwrapRef< + (typeof import("@vueuse/core"))["useDropZone"] + >; + readonly useElementBounding: UnwrapRef< + (typeof import("@vueuse/core"))["useElementBounding"] + >; + readonly useElementByPoint: UnwrapRef< + (typeof import("@vueuse/core"))["useElementByPoint"] + >; + readonly useElementHover: UnwrapRef< + (typeof import("@vueuse/core"))["useElementHover"] + >; + readonly useElementSize: UnwrapRef< + (typeof import("@vueuse/core"))["useElementSize"] + >; + readonly useElementVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useElementVisibility"] + >; + readonly useEventBus: UnwrapRef< + (typeof import("@vueuse/core"))["useEventBus"] + >; + readonly useEventListener: UnwrapRef< + (typeof import("@vueuse/core"))["useEventListener"] + >; + readonly useEventSource: UnwrapRef< + (typeof import("@vueuse/core"))["useEventSource"] + >; + readonly useEyeDropper: UnwrapRef< + (typeof import("@vueuse/core"))["useEyeDropper"] + >; + readonly useFavicon: UnwrapRef< + (typeof import("@vueuse/core"))["useFavicon"] + >; + readonly useFetch: UnwrapRef<(typeof import("@vueuse/core"))["useFetch"]>; + readonly useFileDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useFileDialog"] + >; + readonly useFileSystemAccess: UnwrapRef< + (typeof import("@vueuse/core"))["useFileSystemAccess"] + >; + readonly useFocus: UnwrapRef<(typeof import("@vueuse/core"))["useFocus"]>; + readonly useFocusWithin: UnwrapRef< + (typeof import("@vueuse/core"))["useFocusWithin"] + >; + readonly useFps: UnwrapRef<(typeof import("@vueuse/core"))["useFps"]>; + readonly useFullscreen: UnwrapRef< + (typeof import("@vueuse/core"))["useFullscreen"] + >; + readonly useGamepad: UnwrapRef< + (typeof import("@vueuse/core"))["useGamepad"] + >; + readonly useGeolocation: UnwrapRef< + (typeof import("@vueuse/core"))["useGeolocation"] + >; + readonly useI18n: UnwrapRef<(typeof import("vue-i18n"))["useI18n"]>; + readonly useIdle: UnwrapRef<(typeof import("@vueuse/core"))["useIdle"]>; + readonly useImage: UnwrapRef<(typeof import("@vueuse/core"))["useImage"]>; + readonly useInfiniteScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useInfiniteScroll"] + >; + readonly useIntersectionObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useIntersectionObserver"] + >; + readonly useInterval: UnwrapRef< + (typeof import("@vueuse/core"))["useInterval"] + >; + readonly useIntervalFn: UnwrapRef< + (typeof import("@vueuse/core"))["useIntervalFn"] + >; + readonly useKeyModifier: UnwrapRef< + (typeof import("@vueuse/core"))["useKeyModifier"] + >; + readonly useLastChanged: UnwrapRef< + (typeof import("@vueuse/core"))["useLastChanged"] + >; + readonly useLink: UnwrapRef<(typeof import("vue-router"))["useLink"]>; + readonly useLocalStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useLocalStorage"] + >; + readonly useMagicKeys: UnwrapRef< + (typeof import("@vueuse/core"))["useMagicKeys"] + >; + readonly useManualRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useManualRefHistory"] + >; + readonly useMediaControls: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaControls"] + >; + readonly useMediaQuery: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaQuery"] + >; + readonly useMemoize: UnwrapRef< + (typeof import("@vueuse/core"))["useMemoize"] + >; + readonly useMemory: UnwrapRef<(typeof import("@vueuse/core"))["useMemory"]>; + readonly useMounted: UnwrapRef< + (typeof import("@vueuse/core"))["useMounted"] + >; + readonly useMouse: UnwrapRef<(typeof import("@vueuse/core"))["useMouse"]>; + readonly useMouseInElement: UnwrapRef< + (typeof import("@vueuse/core"))["useMouseInElement"] + >; + readonly useMousePressed: UnwrapRef< + (typeof import("@vueuse/core"))["useMousePressed"] + >; + readonly useMutationObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useMutationObserver"] + >; + readonly useNavigatorLanguage: UnwrapRef< + (typeof import("@vueuse/core"))["useNavigatorLanguage"] + >; + readonly useNetwork: UnwrapRef< + (typeof import("@vueuse/core"))["useNetwork"] + >; + readonly useNow: UnwrapRef<(typeof import("@vueuse/core"))["useNow"]>; + readonly useObjectUrl: UnwrapRef< + (typeof import("@vueuse/core"))["useObjectUrl"] + >; + readonly useOffsetPagination: UnwrapRef< + (typeof import("@vueuse/core"))["useOffsetPagination"] + >; + readonly useOnline: UnwrapRef<(typeof import("@vueuse/core"))["useOnline"]>; + readonly usePageLeave: UnwrapRef< + (typeof import("@vueuse/core"))["usePageLeave"] + >; + readonly useParallax: UnwrapRef< + (typeof import("@vueuse/core"))["useParallax"] + >; + readonly useParentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useParentElement"] + >; + readonly usePerformanceObserver: UnwrapRef< + (typeof import("@vueuse/core"))["usePerformanceObserver"] + >; + readonly usePermission: UnwrapRef< + (typeof import("@vueuse/core"))["usePermission"] + >; + readonly usePointer: UnwrapRef< + (typeof import("@vueuse/core"))["usePointer"] + >; + readonly usePointerLock: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerLock"] + >; + readonly usePointerSwipe: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerSwipe"] + >; + readonly usePreferredColorScheme: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredColorScheme"] + >; + readonly usePreferredContrast: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredContrast"] + >; + readonly usePreferredDark: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredDark"] + >; + readonly usePreferredLanguages: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredLanguages"] + >; + readonly usePreferredReducedMotion: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredReducedMotion"] + >; + readonly usePrevious: UnwrapRef< + (typeof import("@vueuse/core"))["usePrevious"] + >; + readonly useRafFn: UnwrapRef<(typeof import("@vueuse/core"))["useRafFn"]>; + readonly useRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useRefHistory"] + >; + readonly useResizeObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useResizeObserver"] + >; + readonly useRoute: UnwrapRef<(typeof import("vue-router"))["useRoute"]>; + readonly useRouter: UnwrapRef<(typeof import("vue-router"))["useRouter"]>; + readonly useScreenOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenOrientation"] + >; + readonly useScreenSafeArea: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenSafeArea"] + >; + readonly useScriptTag: UnwrapRef< + (typeof import("@vueuse/core"))["useScriptTag"] + >; + readonly useScroll: UnwrapRef<(typeof import("@vueuse/core"))["useScroll"]>; + readonly useScrollLock: UnwrapRef< + (typeof import("@vueuse/core"))["useScrollLock"] + >; + readonly useSessionStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useSessionStorage"] + >; + readonly useShare: UnwrapRef<(typeof import("@vueuse/core"))["useShare"]>; + readonly useSlots: UnwrapRef<(typeof import("vue"))["useSlots"]>; + readonly useSorted: UnwrapRef<(typeof import("@vueuse/core"))["useSorted"]>; + readonly useSpeechRecognition: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechRecognition"] + >; + readonly useSpeechSynthesis: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechSynthesis"] + >; + readonly useStepper: UnwrapRef< + (typeof import("@vueuse/core"))["useStepper"] + >; + readonly useStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useStorage"] + >; + readonly useStorageAsync: UnwrapRef< + (typeof import("@vueuse/core"))["useStorageAsync"] + >; + readonly useStyleTag: UnwrapRef< + (typeof import("@vueuse/core"))["useStyleTag"] + >; + readonly useSupported: UnwrapRef< + (typeof import("@vueuse/core"))["useSupported"] + >; + readonly useSwipe: UnwrapRef<(typeof import("@vueuse/core"))["useSwipe"]>; + readonly useTemplateRefsList: UnwrapRef< + (typeof import("@vueuse/core"))["useTemplateRefsList"] + >; + readonly useTextDirection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextDirection"] + >; + readonly useTextSelection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextSelection"] + >; + readonly useTextareaAutosize: UnwrapRef< + (typeof import("@vueuse/core"))["useTextareaAutosize"] + >; + readonly useThrottle: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottle"] + >; + readonly useThrottleFn: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottleFn"] + >; + readonly useThrottledRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottledRefHistory"] + >; + readonly useTimeAgo: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeAgo"] + >; + readonly useTimeout: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeout"] + >; + readonly useTimeoutFn: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutFn"] + >; + readonly useTimeoutPoll: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutPoll"] + >; + readonly useTimestamp: UnwrapRef< + (typeof import("@vueuse/core"))["useTimestamp"] + >; + readonly useTitle: UnwrapRef<(typeof import("@vueuse/core"))["useTitle"]>; + readonly useToNumber: UnwrapRef< + (typeof import("@vueuse/core"))["useToNumber"] + >; + readonly useToString: UnwrapRef< + (typeof import("@vueuse/core"))["useToString"] + >; + readonly useToggle: UnwrapRef<(typeof import("@vueuse/core"))["useToggle"]>; + readonly useTransition: UnwrapRef< + (typeof import("@vueuse/core"))["useTransition"] + >; + readonly useUrlSearchParams: UnwrapRef< + (typeof import("@vueuse/core"))["useUrlSearchParams"] + >; + readonly useUserMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useUserMedia"] + >; + readonly useVModel: UnwrapRef<(typeof import("@vueuse/core"))["useVModel"]>; + readonly useVModels: UnwrapRef< + (typeof import("@vueuse/core"))["useVModels"] + >; + readonly useVibrate: UnwrapRef< + (typeof import("@vueuse/core"))["useVibrate"] + >; + readonly useVirtualList: UnwrapRef< + (typeof import("@vueuse/core"))["useVirtualList"] + >; + readonly useWakeLock: UnwrapRef< + (typeof import("@vueuse/core"))["useWakeLock"] + >; + readonly useWebNotification: UnwrapRef< + (typeof import("@vueuse/core"))["useWebNotification"] + >; + readonly useWebSocket: UnwrapRef< + (typeof import("@vueuse/core"))["useWebSocket"] + >; + readonly useWebWorker: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorker"] + >; + readonly useWebWorkerFn: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorkerFn"] + >; + readonly useWindowFocus: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowFocus"] + >; + readonly useWindowScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowScroll"] + >; + readonly useWindowSize: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowSize"] + >; + readonly watch: UnwrapRef<(typeof import("vue"))["watch"]>; + readonly watchArray: UnwrapRef< + (typeof import("@vueuse/core"))["watchArray"] + >; + readonly watchAtMost: UnwrapRef< + (typeof import("@vueuse/core"))["watchAtMost"] + >; + readonly watchDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["watchDebounced"] + >; + readonly watchDeep: UnwrapRef<(typeof import("@vueuse/core"))["watchDeep"]>; + readonly watchEffect: UnwrapRef<(typeof import("vue"))["watchEffect"]>; + readonly watchIgnorable: UnwrapRef< + (typeof import("@vueuse/core"))["watchIgnorable"] + >; + readonly watchImmediate: UnwrapRef< + (typeof import("@vueuse/core"))["watchImmediate"] + >; + readonly watchOnce: UnwrapRef<(typeof import("@vueuse/core"))["watchOnce"]>; + readonly watchPausable: UnwrapRef< + (typeof import("@vueuse/core"))["watchPausable"] + >; + readonly watchPostEffect: UnwrapRef< + (typeof import("vue"))["watchPostEffect"] + >; + readonly watchSyncEffect: UnwrapRef< + (typeof import("vue"))["watchSyncEffect"] + >; + readonly watchThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["watchThrottled"] + >; + readonly watchTriggerable: UnwrapRef< + (typeof import("@vueuse/core"))["watchTriggerable"] + >; + readonly watchWithFilter: UnwrapRef< + (typeof import("@vueuse/core"))["watchWithFilter"] + >; + readonly whenever: UnwrapRef<(typeof import("@vueuse/core"))["whenever"]>; + } +} +declare module "@vue/runtime-core" { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef<(typeof import("vue"))["EffectScope"]>; + readonly ElForm: UnwrapRef<(typeof import("element-plus/es"))["ElForm"]>; + readonly ElMessage: UnwrapRef< + (typeof import("element-plus/es"))["ElMessage"] + >; + readonly ElMessageBox: UnwrapRef< + (typeof import("element-plus/es"))["ElMessageBox"] + >; + readonly ElTree: UnwrapRef<(typeof import("element-plus/es"))["ElTree"]>; + readonly acceptHMRUpdate: UnwrapRef< + (typeof import("pinia"))["acceptHMRUpdate"] + >; + readonly asyncComputed: UnwrapRef< + (typeof import("@vueuse/core"))["asyncComputed"] + >; + readonly autoResetRef: UnwrapRef< + (typeof import("@vueuse/core"))["autoResetRef"] + >; + readonly computed: UnwrapRef<(typeof import("vue"))["computed"]>; + readonly computedAsync: UnwrapRef< + (typeof import("@vueuse/core"))["computedAsync"] + >; + readonly computedEager: UnwrapRef< + (typeof import("@vueuse/core"))["computedEager"] + >; + readonly computedInject: UnwrapRef< + (typeof import("@vueuse/core"))["computedInject"] + >; + readonly computedWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["computedWithControl"] + >; + readonly controlledComputed: UnwrapRef< + (typeof import("@vueuse/core"))["controlledComputed"] + >; + readonly controlledRef: UnwrapRef< + (typeof import("@vueuse/core"))["controlledRef"] + >; + readonly createApp: UnwrapRef<(typeof import("vue"))["createApp"]>; + readonly createEventHook: UnwrapRef< + (typeof import("@vueuse/core"))["createEventHook"] + >; + readonly createGlobalState: UnwrapRef< + (typeof import("@vueuse/core"))["createGlobalState"] + >; + readonly createInjectionState: UnwrapRef< + (typeof import("@vueuse/core"))["createInjectionState"] + >; + readonly createPinia: UnwrapRef<(typeof import("pinia"))["createPinia"]>; + readonly createReactiveFn: UnwrapRef< + (typeof import("@vueuse/core"))["createReactiveFn"] + >; + readonly createReusableTemplate: UnwrapRef< + (typeof import("@vueuse/core"))["createReusableTemplate"] + >; + readonly createSharedComposable: UnwrapRef< + (typeof import("@vueuse/core"))["createSharedComposable"] + >; + readonly createTemplatePromise: UnwrapRef< + (typeof import("@vueuse/core"))["createTemplatePromise"] + >; + readonly createUnrefFn: UnwrapRef< + (typeof import("@vueuse/core"))["createUnrefFn"] + >; + readonly customRef: UnwrapRef<(typeof import("vue"))["customRef"]>; + readonly debouncedRef: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedRef"] + >; + readonly debouncedWatch: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedWatch"] + >; + readonly defineAsyncComponent: UnwrapRef< + (typeof import("vue"))["defineAsyncComponent"] + >; + readonly defineComponent: UnwrapRef< + (typeof import("vue"))["defineComponent"] + >; + readonly defineStore: UnwrapRef<(typeof import("pinia"))["defineStore"]>; + readonly eagerComputed: UnwrapRef< + (typeof import("@vueuse/core"))["eagerComputed"] + >; + readonly effectScope: UnwrapRef<(typeof import("vue"))["effectScope"]>; + readonly extendRef: UnwrapRef<(typeof import("@vueuse/core"))["extendRef"]>; + readonly getActivePinia: UnwrapRef< + (typeof import("pinia"))["getActivePinia"] + >; + readonly getCurrentInstance: UnwrapRef< + (typeof import("vue"))["getCurrentInstance"] + >; + readonly getCurrentScope: UnwrapRef< + (typeof import("vue"))["getCurrentScope"] + >; + readonly h: UnwrapRef<(typeof import("vue"))["h"]>; + readonly ignorableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["ignorableWatch"] + >; + readonly inject: UnwrapRef<(typeof import("vue"))["inject"]>; + readonly injectLocal: UnwrapRef< + (typeof import("@vueuse/core"))["injectLocal"] + >; + readonly isDefined: UnwrapRef<(typeof import("@vueuse/core"))["isDefined"]>; + readonly isProxy: UnwrapRef<(typeof import("vue"))["isProxy"]>; + readonly isReactive: UnwrapRef<(typeof import("vue"))["isReactive"]>; + readonly isReadonly: UnwrapRef<(typeof import("vue"))["isReadonly"]>; + readonly isRef: UnwrapRef<(typeof import("vue"))["isRef"]>; + readonly makeDestructurable: UnwrapRef< + (typeof import("@vueuse/core"))["makeDestructurable"] + >; + readonly mapActions: UnwrapRef<(typeof import("pinia"))["mapActions"]>; + readonly mapGetters: UnwrapRef<(typeof import("pinia"))["mapGetters"]>; + readonly mapState: UnwrapRef<(typeof import("pinia"))["mapState"]>; + readonly mapStores: UnwrapRef<(typeof import("pinia"))["mapStores"]>; + readonly mapWritableState: UnwrapRef< + (typeof import("pinia"))["mapWritableState"] + >; + readonly markRaw: UnwrapRef<(typeof import("vue"))["markRaw"]>; + readonly nextTick: UnwrapRef<(typeof import("vue"))["nextTick"]>; + readonly onActivated: UnwrapRef<(typeof import("vue"))["onActivated"]>; + readonly onBeforeMount: UnwrapRef<(typeof import("vue"))["onBeforeMount"]>; + readonly onBeforeRouteLeave: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteLeave"] + >; + readonly onBeforeRouteUpdate: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteUpdate"] + >; + readonly onBeforeUnmount: UnwrapRef< + (typeof import("vue"))["onBeforeUnmount"] + >; + readonly onBeforeUpdate: UnwrapRef< + (typeof import("vue"))["onBeforeUpdate"] + >; + readonly onClickOutside: UnwrapRef< + (typeof import("@vueuse/core"))["onClickOutside"] + >; + readonly onDeactivated: UnwrapRef<(typeof import("vue"))["onDeactivated"]>; + readonly onErrorCaptured: UnwrapRef< + (typeof import("vue"))["onErrorCaptured"] + >; + readonly onKeyStroke: UnwrapRef< + (typeof import("@vueuse/core"))["onKeyStroke"] + >; + readonly onLongPress: UnwrapRef< + (typeof import("@vueuse/core"))["onLongPress"] + >; + readonly onMounted: UnwrapRef<(typeof import("vue"))["onMounted"]>; + readonly onRenderTracked: UnwrapRef< + (typeof import("vue"))["onRenderTracked"] + >; + readonly onRenderTriggered: UnwrapRef< + (typeof import("vue"))["onRenderTriggered"] + >; + readonly onScopeDispose: UnwrapRef< + (typeof import("vue"))["onScopeDispose"] + >; + readonly onServerPrefetch: UnwrapRef< + (typeof import("vue"))["onServerPrefetch"] + >; + readonly onStartTyping: UnwrapRef< + (typeof import("@vueuse/core"))["onStartTyping"] + >; + readonly onUnmounted: UnwrapRef<(typeof import("vue"))["onUnmounted"]>; + readonly onUpdated: UnwrapRef<(typeof import("vue"))["onUpdated"]>; + readonly pausableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["pausableWatch"] + >; + readonly provide: UnwrapRef<(typeof import("vue"))["provide"]>; + readonly provideLocal: UnwrapRef< + (typeof import("@vueuse/core"))["provideLocal"] + >; + readonly reactify: UnwrapRef<(typeof import("@vueuse/core"))["reactify"]>; + readonly reactifyObject: UnwrapRef< + (typeof import("@vueuse/core"))["reactifyObject"] + >; + readonly reactive: UnwrapRef<(typeof import("vue"))["reactive"]>; + readonly reactiveComputed: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveComputed"] + >; + readonly reactiveOmit: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveOmit"] + >; + readonly reactivePick: UnwrapRef< + (typeof import("@vueuse/core"))["reactivePick"] + >; + readonly readonly: UnwrapRef<(typeof import("vue"))["readonly"]>; + readonly ref: UnwrapRef<(typeof import("vue"))["ref"]>; + readonly refAutoReset: UnwrapRef< + (typeof import("@vueuse/core"))["refAutoReset"] + >; + readonly refDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["refDebounced"] + >; + readonly refDefault: UnwrapRef< + (typeof import("@vueuse/core"))["refDefault"] + >; + readonly refThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["refThrottled"] + >; + readonly refWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["refWithControl"] + >; + readonly resolveComponent: UnwrapRef< + (typeof import("vue"))["resolveComponent"] + >; + readonly resolveRef: UnwrapRef< + (typeof import("@vueuse/core"))["resolveRef"] + >; + readonly resolveUnref: UnwrapRef< + (typeof import("@vueuse/core"))["resolveUnref"] + >; + readonly setActivePinia: UnwrapRef< + (typeof import("pinia"))["setActivePinia"] + >; + readonly setMapStoreSuffix: UnwrapRef< + (typeof import("pinia"))["setMapStoreSuffix"] + >; + readonly shallowReactive: UnwrapRef< + (typeof import("vue"))["shallowReactive"] + >; + readonly shallowReadonly: UnwrapRef< + (typeof import("vue"))["shallowReadonly"] + >; + readonly shallowRef: UnwrapRef<(typeof import("vue"))["shallowRef"]>; + readonly storeToRefs: UnwrapRef<(typeof import("pinia"))["storeToRefs"]>; + readonly syncRef: UnwrapRef<(typeof import("@vueuse/core"))["syncRef"]>; + readonly syncRefs: UnwrapRef<(typeof import("@vueuse/core"))["syncRefs"]>; + readonly templateRef: UnwrapRef< + (typeof import("@vueuse/core"))["templateRef"] + >; + readonly throttledRef: UnwrapRef< + (typeof import("@vueuse/core"))["throttledRef"] + >; + readonly throttledWatch: UnwrapRef< + (typeof import("@vueuse/core"))["throttledWatch"] + >; + readonly toRaw: UnwrapRef<(typeof import("vue"))["toRaw"]>; + readonly toReactive: UnwrapRef< + (typeof import("@vueuse/core"))["toReactive"] + >; + readonly toRef: UnwrapRef<(typeof import("vue"))["toRef"]>; + readonly toRefs: UnwrapRef<(typeof import("vue"))["toRefs"]>; + readonly toValue: UnwrapRef<(typeof import("vue"))["toValue"]>; + readonly triggerRef: UnwrapRef<(typeof import("vue"))["triggerRef"]>; + readonly tryOnBeforeMount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeMount"] + >; + readonly tryOnBeforeUnmount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeUnmount"] + >; + readonly tryOnMounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnMounted"] + >; + readonly tryOnScopeDispose: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnScopeDispose"] + >; + readonly tryOnUnmounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnUnmounted"] + >; + readonly unref: UnwrapRef<(typeof import("vue"))["unref"]>; + readonly unrefElement: UnwrapRef< + (typeof import("@vueuse/core"))["unrefElement"] + >; + readonly until: UnwrapRef<(typeof import("@vueuse/core"))["until"]>; + readonly useActiveElement: UnwrapRef< + (typeof import("@vueuse/core"))["useActiveElement"] + >; + readonly useAnimate: UnwrapRef< + (typeof import("@vueuse/core"))["useAnimate"] + >; + readonly useArrayDifference: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayDifference"] + >; + readonly useArrayEvery: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayEvery"] + >; + readonly useArrayFilter: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFilter"] + >; + readonly useArrayFind: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFind"] + >; + readonly useArrayFindIndex: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindIndex"] + >; + readonly useArrayFindLast: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindLast"] + >; + readonly useArrayIncludes: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayIncludes"] + >; + readonly useArrayJoin: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayJoin"] + >; + readonly useArrayMap: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayMap"] + >; + readonly useArrayReduce: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayReduce"] + >; + readonly useArraySome: UnwrapRef< + (typeof import("@vueuse/core"))["useArraySome"] + >; + readonly useArrayUnique: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayUnique"] + >; + readonly useAsyncQueue: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncQueue"] + >; + readonly useAsyncState: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncState"] + >; + readonly useAttrs: UnwrapRef<(typeof import("vue"))["useAttrs"]>; + readonly useBase64: UnwrapRef<(typeof import("@vueuse/core"))["useBase64"]>; + readonly useBattery: UnwrapRef< + (typeof import("@vueuse/core"))["useBattery"] + >; + readonly useBluetooth: UnwrapRef< + (typeof import("@vueuse/core"))["useBluetooth"] + >; + readonly useBreakpoints: UnwrapRef< + (typeof import("@vueuse/core"))["useBreakpoints"] + >; + readonly useBroadcastChannel: UnwrapRef< + (typeof import("@vueuse/core"))["useBroadcastChannel"] + >; + readonly useBrowserLocation: UnwrapRef< + (typeof import("@vueuse/core"))["useBrowserLocation"] + >; + readonly useCached: UnwrapRef<(typeof import("@vueuse/core"))["useCached"]>; + readonly useClipboard: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboard"] + >; + readonly useClipboardItems: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboardItems"] + >; + readonly useCloned: UnwrapRef<(typeof import("@vueuse/core"))["useCloned"]>; + readonly useColorMode: UnwrapRef< + (typeof import("@vueuse/core"))["useColorMode"] + >; + readonly useConfirmDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useConfirmDialog"] + >; + readonly useCounter: UnwrapRef< + (typeof import("@vueuse/core"))["useCounter"] + >; + readonly useCssModule: UnwrapRef<(typeof import("vue"))["useCssModule"]>; + readonly useCssVar: UnwrapRef<(typeof import("@vueuse/core"))["useCssVar"]>; + readonly useCssVars: UnwrapRef<(typeof import("vue"))["useCssVars"]>; + readonly useCurrentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useCurrentElement"] + >; + readonly useCycleList: UnwrapRef< + (typeof import("@vueuse/core"))["useCycleList"] + >; + readonly useDark: UnwrapRef<(typeof import("@vueuse/core"))["useDark"]>; + readonly useDateFormat: UnwrapRef< + (typeof import("@vueuse/core"))["useDateFormat"] + >; + readonly useDebounce: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounce"] + >; + readonly useDebounceFn: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounceFn"] + >; + readonly useDebouncedRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useDebouncedRefHistory"] + >; + readonly useDeviceMotion: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceMotion"] + >; + readonly useDeviceOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceOrientation"] + >; + readonly useDevicePixelRatio: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicePixelRatio"] + >; + readonly useDevicesList: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicesList"] + >; + readonly useDisplayMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useDisplayMedia"] + >; + readonly useDocumentVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useDocumentVisibility"] + >; + readonly useDraggable: UnwrapRef< + (typeof import("@vueuse/core"))["useDraggable"] + >; + readonly useDropZone: UnwrapRef< + (typeof import("@vueuse/core"))["useDropZone"] + >; + readonly useElementBounding: UnwrapRef< + (typeof import("@vueuse/core"))["useElementBounding"] + >; + readonly useElementByPoint: UnwrapRef< + (typeof import("@vueuse/core"))["useElementByPoint"] + >; + readonly useElementHover: UnwrapRef< + (typeof import("@vueuse/core"))["useElementHover"] + >; + readonly useElementSize: UnwrapRef< + (typeof import("@vueuse/core"))["useElementSize"] + >; + readonly useElementVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useElementVisibility"] + >; + readonly useEventBus: UnwrapRef< + (typeof import("@vueuse/core"))["useEventBus"] + >; + readonly useEventListener: UnwrapRef< + (typeof import("@vueuse/core"))["useEventListener"] + >; + readonly useEventSource: UnwrapRef< + (typeof import("@vueuse/core"))["useEventSource"] + >; + readonly useEyeDropper: UnwrapRef< + (typeof import("@vueuse/core"))["useEyeDropper"] + >; + readonly useFavicon: UnwrapRef< + (typeof import("@vueuse/core"))["useFavicon"] + >; + readonly useFetch: UnwrapRef<(typeof import("@vueuse/core"))["useFetch"]>; + readonly useFileDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useFileDialog"] + >; + readonly useFileSystemAccess: UnwrapRef< + (typeof import("@vueuse/core"))["useFileSystemAccess"] + >; + readonly useFocus: UnwrapRef<(typeof import("@vueuse/core"))["useFocus"]>; + readonly useFocusWithin: UnwrapRef< + (typeof import("@vueuse/core"))["useFocusWithin"] + >; + readonly useFps: UnwrapRef<(typeof import("@vueuse/core"))["useFps"]>; + readonly useFullscreen: UnwrapRef< + (typeof import("@vueuse/core"))["useFullscreen"] + >; + readonly useGamepad: UnwrapRef< + (typeof import("@vueuse/core"))["useGamepad"] + >; + readonly useGeolocation: UnwrapRef< + (typeof import("@vueuse/core"))["useGeolocation"] + >; + readonly useI18n: UnwrapRef<(typeof import("vue-i18n"))["useI18n"]>; + readonly useIdle: UnwrapRef<(typeof import("@vueuse/core"))["useIdle"]>; + readonly useImage: UnwrapRef<(typeof import("@vueuse/core"))["useImage"]>; + readonly useInfiniteScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useInfiniteScroll"] + >; + readonly useIntersectionObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useIntersectionObserver"] + >; + readonly useInterval: UnwrapRef< + (typeof import("@vueuse/core"))["useInterval"] + >; + readonly useIntervalFn: UnwrapRef< + (typeof import("@vueuse/core"))["useIntervalFn"] + >; + readonly useKeyModifier: UnwrapRef< + (typeof import("@vueuse/core"))["useKeyModifier"] + >; + readonly useLastChanged: UnwrapRef< + (typeof import("@vueuse/core"))["useLastChanged"] + >; + readonly useLink: UnwrapRef<(typeof import("vue-router"))["useLink"]>; + readonly useLocalStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useLocalStorage"] + >; + readonly useMagicKeys: UnwrapRef< + (typeof import("@vueuse/core"))["useMagicKeys"] + >; + readonly useManualRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useManualRefHistory"] + >; + readonly useMediaControls: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaControls"] + >; + readonly useMediaQuery: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaQuery"] + >; + readonly useMemoize: UnwrapRef< + (typeof import("@vueuse/core"))["useMemoize"] + >; + readonly useMemory: UnwrapRef<(typeof import("@vueuse/core"))["useMemory"]>; + readonly useMounted: UnwrapRef< + (typeof import("@vueuse/core"))["useMounted"] + >; + readonly useMouse: UnwrapRef<(typeof import("@vueuse/core"))["useMouse"]>; + readonly useMouseInElement: UnwrapRef< + (typeof import("@vueuse/core"))["useMouseInElement"] + >; + readonly useMousePressed: UnwrapRef< + (typeof import("@vueuse/core"))["useMousePressed"] + >; + readonly useMutationObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useMutationObserver"] + >; + readonly useNavigatorLanguage: UnwrapRef< + (typeof import("@vueuse/core"))["useNavigatorLanguage"] + >; + readonly useNetwork: UnwrapRef< + (typeof import("@vueuse/core"))["useNetwork"] + >; + readonly useNow: UnwrapRef<(typeof import("@vueuse/core"))["useNow"]>; + readonly useObjectUrl: UnwrapRef< + (typeof import("@vueuse/core"))["useObjectUrl"] + >; + readonly useOffsetPagination: UnwrapRef< + (typeof import("@vueuse/core"))["useOffsetPagination"] + >; + readonly useOnline: UnwrapRef<(typeof import("@vueuse/core"))["useOnline"]>; + readonly usePageLeave: UnwrapRef< + (typeof import("@vueuse/core"))["usePageLeave"] + >; + readonly useParallax: UnwrapRef< + (typeof import("@vueuse/core"))["useParallax"] + >; + readonly useParentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useParentElement"] + >; + readonly usePerformanceObserver: UnwrapRef< + (typeof import("@vueuse/core"))["usePerformanceObserver"] + >; + readonly usePermission: UnwrapRef< + (typeof import("@vueuse/core"))["usePermission"] + >; + readonly usePointer: UnwrapRef< + (typeof import("@vueuse/core"))["usePointer"] + >; + readonly usePointerLock: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerLock"] + >; + readonly usePointerSwipe: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerSwipe"] + >; + readonly usePreferredColorScheme: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredColorScheme"] + >; + readonly usePreferredContrast: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredContrast"] + >; + readonly usePreferredDark: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredDark"] + >; + readonly usePreferredLanguages: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredLanguages"] + >; + readonly usePreferredReducedMotion: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredReducedMotion"] + >; + readonly usePrevious: UnwrapRef< + (typeof import("@vueuse/core"))["usePrevious"] + >; + readonly useRafFn: UnwrapRef<(typeof import("@vueuse/core"))["useRafFn"]>; + readonly useRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useRefHistory"] + >; + readonly useResizeObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useResizeObserver"] + >; + readonly useRoute: UnwrapRef<(typeof import("vue-router"))["useRoute"]>; + readonly useRouter: UnwrapRef<(typeof import("vue-router"))["useRouter"]>; + readonly useScreenOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenOrientation"] + >; + readonly useScreenSafeArea: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenSafeArea"] + >; + readonly useScriptTag: UnwrapRef< + (typeof import("@vueuse/core"))["useScriptTag"] + >; + readonly useScroll: UnwrapRef<(typeof import("@vueuse/core"))["useScroll"]>; + readonly useScrollLock: UnwrapRef< + (typeof import("@vueuse/core"))["useScrollLock"] + >; + readonly useSessionStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useSessionStorage"] + >; + readonly useShare: UnwrapRef<(typeof import("@vueuse/core"))["useShare"]>; + readonly useSlots: UnwrapRef<(typeof import("vue"))["useSlots"]>; + readonly useSorted: UnwrapRef<(typeof import("@vueuse/core"))["useSorted"]>; + readonly useSpeechRecognition: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechRecognition"] + >; + readonly useSpeechSynthesis: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechSynthesis"] + >; + readonly useStepper: UnwrapRef< + (typeof import("@vueuse/core"))["useStepper"] + >; + readonly useStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useStorage"] + >; + readonly useStorageAsync: UnwrapRef< + (typeof import("@vueuse/core"))["useStorageAsync"] + >; + readonly useStyleTag: UnwrapRef< + (typeof import("@vueuse/core"))["useStyleTag"] + >; + readonly useSupported: UnwrapRef< + (typeof import("@vueuse/core"))["useSupported"] + >; + readonly useSwipe: UnwrapRef<(typeof import("@vueuse/core"))["useSwipe"]>; + readonly useTemplateRefsList: UnwrapRef< + (typeof import("@vueuse/core"))["useTemplateRefsList"] + >; + readonly useTextDirection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextDirection"] + >; + readonly useTextSelection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextSelection"] + >; + readonly useTextareaAutosize: UnwrapRef< + (typeof import("@vueuse/core"))["useTextareaAutosize"] + >; + readonly useThrottle: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottle"] + >; + readonly useThrottleFn: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottleFn"] + >; + readonly useThrottledRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottledRefHistory"] + >; + readonly useTimeAgo: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeAgo"] + >; + readonly useTimeout: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeout"] + >; + readonly useTimeoutFn: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutFn"] + >; + readonly useTimeoutPoll: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutPoll"] + >; + readonly useTimestamp: UnwrapRef< + (typeof import("@vueuse/core"))["useTimestamp"] + >; + readonly useTitle: UnwrapRef<(typeof import("@vueuse/core"))["useTitle"]>; + readonly useToNumber: UnwrapRef< + (typeof import("@vueuse/core"))["useToNumber"] + >; + readonly useToString: UnwrapRef< + (typeof import("@vueuse/core"))["useToString"] + >; + readonly useToggle: UnwrapRef<(typeof import("@vueuse/core"))["useToggle"]>; + readonly useTransition: UnwrapRef< + (typeof import("@vueuse/core"))["useTransition"] + >; + readonly useUrlSearchParams: UnwrapRef< + (typeof import("@vueuse/core"))["useUrlSearchParams"] + >; + readonly useUserMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useUserMedia"] + >; + readonly useVModel: UnwrapRef<(typeof import("@vueuse/core"))["useVModel"]>; + readonly useVModels: UnwrapRef< + (typeof import("@vueuse/core"))["useVModels"] + >; + readonly useVibrate: UnwrapRef< + (typeof import("@vueuse/core"))["useVibrate"] + >; + readonly useVirtualList: UnwrapRef< + (typeof import("@vueuse/core"))["useVirtualList"] + >; + readonly useWakeLock: UnwrapRef< + (typeof import("@vueuse/core"))["useWakeLock"] + >; + readonly useWebNotification: UnwrapRef< + (typeof import("@vueuse/core"))["useWebNotification"] + >; + readonly useWebSocket: UnwrapRef< + (typeof import("@vueuse/core"))["useWebSocket"] + >; + readonly useWebWorker: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorker"] + >; + readonly useWebWorkerFn: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorkerFn"] + >; + readonly useWindowFocus: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowFocus"] + >; + readonly useWindowScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowScroll"] + >; + readonly useWindowSize: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowSize"] + >; + readonly watch: UnwrapRef<(typeof import("vue"))["watch"]>; + readonly watchArray: UnwrapRef< + (typeof import("@vueuse/core"))["watchArray"] + >; + readonly watchAtMost: UnwrapRef< + (typeof import("@vueuse/core"))["watchAtMost"] + >; + readonly watchDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["watchDebounced"] + >; + readonly watchDeep: UnwrapRef<(typeof import("@vueuse/core"))["watchDeep"]>; + readonly watchEffect: UnwrapRef<(typeof import("vue"))["watchEffect"]>; + readonly watchIgnorable: UnwrapRef< + (typeof import("@vueuse/core"))["watchIgnorable"] + >; + readonly watchImmediate: UnwrapRef< + (typeof import("@vueuse/core"))["watchImmediate"] + >; + readonly watchOnce: UnwrapRef<(typeof import("@vueuse/core"))["watchOnce"]>; + readonly watchPausable: UnwrapRef< + (typeof import("@vueuse/core"))["watchPausable"] + >; + readonly watchPostEffect: UnwrapRef< + (typeof import("vue"))["watchPostEffect"] + >; + readonly watchSyncEffect: UnwrapRef< + (typeof import("vue"))["watchSyncEffect"] + >; + readonly watchThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["watchThrottled"] + >; + readonly watchTriggerable: UnwrapRef< + (typeof import("@vueuse/core"))["watchTriggerable"] + >; + readonly watchWithFilter: UnwrapRef< + (typeof import("@vueuse/core"))["watchWithFilter"] + >; + readonly whenever: UnwrapRef<(typeof import("@vueuse/core"))["whenever"]>; + } +} diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts new file mode 100644 index 0000000..7827c3c --- /dev/null +++ b/src/typings/components.d.ts @@ -0,0 +1,115 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module "vue" { + export interface GlobalComponents { + AppLink: (typeof import("./../components/AppLink/index.vue"))["default"]; + AppMain: (typeof import("./../layout/components/AppMain/index.vue"))["default"]; + BarChart: (typeof import("./../views/dashboard/components/BarChart.vue"))["default"]; + Breadcrumb: (typeof import("./../components/Breadcrumb/index.vue"))["default"]; + DeptTree: (typeof import("./../views/system/user/components/dept-tree.vue"))["default"]; + Dictionary: (typeof import("./../components/Dictionary/index.vue"))["default"]; + DictItem: (typeof import("./../views/system/dict/components/dict-item.vue"))["default"]; + ElAlert: (typeof import("element-plus/es"))["ElAlert"]; + ElBreadcrumb: (typeof import("element-plus/es"))["ElBreadcrumb"]; + ElBreadcrumbItem: (typeof import("element-plus/es"))["ElBreadcrumbItem"]; + ElButton: (typeof import("element-plus/es"))["ElButton"]; + ElCard: (typeof import("element-plus/es"))["ElCard"]; + ElCol: (typeof import("element-plus/es"))["ElCol"]; + ElColorPicker: (typeof import("element-plus/es"))["ElColorPicker"]; + ElConfigProvider: (typeof import("element-plus/es"))["ElConfigProvider"]; + ElDatePicker: (typeof import("element-plus/es"))["ElDatePicker"]; + ElDialog: (typeof import("element-plus/es"))["ElDialog"]; + ElDivider: (typeof import("element-plus/es"))["ElDivider"]; + ElDrawer: (typeof import("element-plus/es"))["ElDrawer"]; + ElDropdown: (typeof import("element-plus/es"))["ElDropdown"]; + ElDropdownItem: (typeof import("element-plus/es"))["ElDropdownItem"]; + ElDropdownMenu: (typeof import("element-plus/es"))["ElDropdownMenu"]; + ElForm: (typeof import("element-plus/es"))["ElForm"]; + ElFormItem: (typeof import("element-plus/es"))["ElFormItem"]; + ElIcon: (typeof import("element-plus/es"))["ElIcon"]; + ElImage: (typeof import("element-plus/es"))["ElImage"]; + ElInput: (typeof import("element-plus/es"))["ElInput"]; + ElInputNumber: (typeof import("element-plus/es"))["ElInputNumber"]; + ElLink: (typeof import("element-plus/es"))["ElLink"]; + ElMenu: (typeof import("element-plus/es"))["ElMenu"]; + ElMenuItem: (typeof import("element-plus/es"))["ElMenuItem"]; + ElOption: (typeof import("element-plus/es"))["ElOption"]; + ElPagination: (typeof import("element-plus/es"))["ElPagination"]; + ElPopover: (typeof import("element-plus/es"))["ElPopover"]; + ElRadio: (typeof import("element-plus/es"))["ElRadio"]; + ElRadioGroup: (typeof import("element-plus/es"))["ElRadioGroup"]; + ElRow: (typeof import("element-plus/es"))["ElRow"]; + ElScrollbar: (typeof import("element-plus/es"))["ElScrollbar"]; + ElSelect: (typeof import("element-plus/es"))["ElSelect"]; + ElStatistic: (typeof import("element-plus/es"))["ElStatistic"]; + ElSubMenu: (typeof import("element-plus/es"))["ElSubMenu"]; + ElSwitch: (typeof import("element-plus/es"))["ElSwitch"]; + ElTable: (typeof import("element-plus/es"))["ElTable"]; + ElTableColumn: (typeof import("element-plus/es"))["ElTableColumn"]; + ElTabPane: (typeof import("element-plus/es"))["ElTabPane"]; + ElTabs: (typeof import("element-plus/es"))["ElTabs"]; + ElTag: (typeof import("element-plus/es"))["ElTag"]; + ElText: (typeof import("element-plus/es"))["ElText"]; + ElTooltip: (typeof import("element-plus/es"))["ElTooltip"]; + ElTree: (typeof import("element-plus/es"))["ElTree"]; + ElTreeSelect: (typeof import("element-plus/es"))["ElTreeSelect"]; + ElUpload: (typeof import("element-plus/es"))["ElUpload"]; + ElWatermark: (typeof import("element-plus/es"))["ElWatermark"]; + FunnelChart: (typeof import("./../views/dashboard/components/FunnelChart.vue"))["default"]; + GithubCorner: (typeof import("./../components/GithubCorner/index.vue"))["default"]; + Hamburger: (typeof import("./../components/Hamburger/index.vue"))["default"]; + IconSelect: (typeof import("./../components/IconSelect/index.vue"))["default"]; + IEpCaretBottom: (typeof import("~icons/ep/caret-bottom"))["default"]; + IEpCaretTop: (typeof import("~icons/ep/caret-top"))["default"]; + IEpClose: (typeof import("~icons/ep/close"))["default"]; + IEpCollection: (typeof import("~icons/ep/collection"))["default"]; + IEpDelete: (typeof import("~icons/ep/delete"))["default"]; + IEpDownload: (typeof import("~icons/ep/download"))["default"]; + IEpEdit: (typeof import("~icons/ep/edit"))["default"]; + IEpPlus: (typeof import("~icons/ep/plus"))["default"]; + IEpPosition: (typeof import("~icons/ep/position"))["default"]; + IEpQuestionFilled: (typeof import("~icons/ep/question-filled"))["default"]; + IEpRefresh: (typeof import("~icons/ep/refresh"))["default"]; + IEpRefreshLeft: (typeof import("~icons/ep/refresh-left"))["default"]; + IEpSearch: (typeof import("~icons/ep/search"))["default"]; + IEpSetting: (typeof import("~icons/ep/setting"))["default"]; + IEpTop: (typeof import("~icons/ep/top"))["default"]; + IEpUploadFilled: (typeof import("~icons/ep/upload-filled"))["default"]; + LangSelect: (typeof import("./../components/LangSelect/index.vue"))["default"]; + LayoutSelect: (typeof import("./../layout/components/Settings/components/LayoutSelect.vue"))["default"]; + MultiUpload: (typeof import("./../components/Upload/MultiUpload.vue"))["default"]; + NavBar: (typeof import("./../layout/components/NavBar/index.vue"))["default"]; + NavbarLeft: (typeof import("./../layout/components/NavBar/components/NavbarLeft.vue"))["default"]; + NavbarRight: (typeof import("./../layout/components/NavBar/components/NavbarRight.vue"))["default"]; + Pagination: (typeof import("./../components/Pagination/index.vue"))["default"]; + PieChart: (typeof import("./../views/dashboard/components/PieChart.vue"))["default"]; + RadarChart: (typeof import("./../views/dashboard/components/RadarChart.vue"))["default"]; + RightPanel: (typeof import("./../components/RightPanel/index.vue"))["default"]; + RouterLink: (typeof import("vue-router"))["RouterLink"]; + RouterView: (typeof import("vue-router"))["RouterView"]; + Settings: (typeof import("./../layout/components/Settings/index.vue"))["default"]; + Sidebar: (typeof import("./../layout/components/Sidebar/index.vue"))["default"]; + SidebarLogo: (typeof import("./../layout/components/Sidebar/components/SidebarLogo.vue"))["default"]; + SidebarMenu: (typeof import("./../layout/components/Sidebar/components/SidebarMenu.vue"))["default"]; + SidebarMenuItem: (typeof import("./../layout/components/Sidebar/components/SidebarMenuItem.vue"))["default"]; + SidebarMenuItemTitle: (typeof import("./../layout/components/Sidebar/components/SidebarMenuItemTitle.vue"))["default"]; + SidebarMixTopMenu: (typeof import("./../layout/components/Sidebar/components/SidebarMixTopMenu.vue"))["default"]; + SingleUpload: (typeof import("./../components/Upload/SingleUpload.vue"))["default"]; + SizeSelect: (typeof import("./../components/SizeSelect/index.vue"))["default"]; + SvgIcon: (typeof import("./../components/SvgIcon/index.vue"))["default"]; + TagsView: (typeof import("./../layout/components/TagsView/index.vue"))["default"]; + ThemeColorPicker: (typeof import("./../layout/components/Settings/components/ThemeColorPicker.vue"))["default"]; + WangEditor: (typeof import("./../components/WangEditor/index.vue"))["default"]; + TableBar: (typeof import("./../components/Table/TableBar.vue"))["default"]; + AnyTable: (typeof import("./../components/Table/AnyTable.vue"))["default"]; + + } + export interface ComponentCustomProperties { + vLoading: (typeof import("element-plus/es"))["ElLoadingDirective"]; + } +} diff --git a/src/typings/env.d.ts b/src/typings/env.d.ts new file mode 100644 index 0000000..f8a60fb --- /dev/null +++ b/src/typings/env.d.ts @@ -0,0 +1,36 @@ +/// + +declare module "*.vue" { + import { DefineComponent } from "vue"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} + +interface ImportMetaEnv { + /** 应用端口 */ + VITE_APP_PORT: string; + /** API 基础路径 */ + VITE_APP_BASE_API: string; + VITE_APP_API_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +/** + * 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 + */ +declare const __APP_INFO__: { + pkg: { + name: string; + version: string; + engines: { + node: string; + }; + dependencies: Record; + devDependencies: Record; + }; + buildTimestamp: number; +}; diff --git a/src/typings/global.d.ts b/src/typings/global.d.ts new file mode 100644 index 0000000..9889628 --- /dev/null +++ b/src/typings/global.d.ts @@ -0,0 +1,96 @@ +declare global { + /** + * 分页查询参数 + */ + interface PageQuery { + pageNum: number; + pageSize: number; + } + + /** + * 分页响应对象 + */ + interface PageResult { + /** 数据列表 */ + list: T; + /** 总数 */ + total: number; + } + + /** + * 页签对象 + */ + interface TagView { + /** 页签名称 */ + name: string; + /** 页签标题 */ + title: string; + /** 页签路由路径 */ + path: string; + /** 页签路由完整路径 */ + fullPath: string; + /** 页签图标 */ + icon?: string; + /** 是否固定页签 */ + affix?: boolean; + /** 是否开启缓存 */ + keepAlive?: boolean; + /** 路由查询参数 */ + query?: any; + } + + /** + * 系统设置 + */ + interface AppSettings { + /** 系统标题 */ + title: string; + /** 系统版本 */ + version: string; + /** 是否显示设置 */ + showSettings: boolean; + /** 是否固定头部 */ + fixedHeader: boolean; + /** 是否显示多标签导航 */ + tagsView: boolean; + /** 是否显示侧边栏Logo */ + sidebarLogo: boolean; + /** 导航栏布局(left|top|mix) */ + layout: string; + /** 主题颜色 */ + themeColor: string; + /** 主题模式(dark|light) */ + theme: string; + /** 布局大小(default |large |small) */ + size: string; + /** 语言( zh-cn| en) */ + language: string; + /** 是否开启水印 */ + watermarkEnabled: boolean; + /** 水印内容 */ + watermarkContent: string; + } + + /** + * 组件数据源 + */ + interface OptionType { + /** 值 */ + value: string | number; + /** 文本 */ + label: string; + /** 子列表 */ + children?: OptionType[]; + } + + /** + * 表格列 + */ + interface TableColumns { + /** 列名称 */ + name?: string; + /** 是否显示 */ + show?: boolean; + } +} +export {}; diff --git a/src/typings/router.d.ts b/src/typings/router.d.ts new file mode 100644 index 0000000..99e187b --- /dev/null +++ b/src/typings/router.d.ts @@ -0,0 +1,22 @@ +import "vue-router"; + +declare module "vue-router" { + // https://router.vuejs.org/zh/guide/advanced/meta.html#typescript + // 可以通过扩展 RouteMeta 接口来输入 meta 字段 + interface RouteMeta { + /** 菜单名称 */ + title?: string; + /** 菜单图标 */ + icon?: string; + /** 菜单是否隐藏 */ + hidden?: boolean; + /** 是否固定页签 */ + affix?: boolean; + /** 是否缓存页面 */ + keepAlive?: boolean; + /** 是否在面包屑上隐藏 */ + breadcrumb?: boolean; + /** 拥有菜单权限的角色编码集合 */ + roles?: string[]; + } +} diff --git a/src/typings/shims-vue.d.ts b/src/typings/shims-vue.d.ts new file mode 100644 index 0000000..abbc931 --- /dev/null +++ b/src/typings/shims-vue.d.ts @@ -0,0 +1 @@ +declare module "xlsx/xlsx.mjs"; diff --git a/src/utils/color.ts b/src/utils/color.ts new file mode 100644 index 0000000..2503584 --- /dev/null +++ b/src/utils/color.ts @@ -0,0 +1,287 @@ +/** + * 颜色生成 + */ +type RGB = { + r: number; + g: number; + b: number; +}; +type HSL = { + h: number; + s: number; + l: number; +}; +type HEX = + | "0" + | "1" + | "2" + | "3" + | "4" + | "5" + | "6" + | "7" + | "8" + | "9" + | "A" + | "B" + | "C" + | "D" + | "E" + | "F"; + +const RGBUnit = 255; +const HEX_MAP: Record = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, +}; +const rgbWhite = { + r: 255, + g: 255, + b: 255, +}; +const rgbBlack = { + r: 0, + g: 0, + b: 0, +}; + +/** + * RGB颜色转HSL颜色值 + * @param r 红色值 + * @param g 绿色值 + * @param b 蓝色值 + * @returns { h: [0, 360]; s: [0, 1]; l: [0, 1] } + */ +function rgbToHsl(rgb: RGB): HSL { + let { r, g, b } = rgb; + const hsl = { + h: 0, + s: 0, + l: 0, + }; + + // 计算rgb基数 ∈ [0, 1] + r /= RGBUnit; + g /= RGBUnit; + b /= RGBUnit; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + + // 计算h + if (max === min) { + hsl.h = 0; + } else if (max === r) { + hsl.h = 60 * ((g - b) / (max - min)) + (g >= b ? 0 : 360); + } else if (max === g) { + hsl.h = 60 * ((b - r) / (max - min)) + 120; + } else { + hsl.h = 60 * ((r - g) / (max - min)) + 240; + } + hsl.h = hsl.h > 360 ? hsl.h - 360 : hsl.h; + + // 计算l + hsl.l = (max + min) / 2; + + // 计算s + if (hsl.l === 0 || max === min) { + // 灰/白/黑 + hsl.s = 0; + } else if (hsl.l > 0 && hsl.l <= 0.5) { + hsl.s = (max - min) / (max + min); + } else { + hsl.s = (max - min) / (2 - (max + min)); + } + + return hsl; +} + +/** + * hsl -> rgb + * @param h [0, 360] + * @param s [0, 1] + * @param l [0, 1] + * @returns RGB + */ +function hslToRgb(hsl: HSL): RGB { + const { h, s, l } = hsl; + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + const hUnit = h / 360; // 色相转换为 [0, 1] + + const Cr = fillCircleVal(hUnit + 1 / 3); + const Cg = fillCircleVal(hUnit); + const Cb = fillCircleVal(hUnit - 1 / 3); + + // 保持 [0, 1] 环状取值 + function fillCircleVal(val: number): number { + return val < 0 ? val + 1 : val > 1 ? val - 1 : val; + } + + function computedRgb(val: number): number { + let colorVal: number; + if (val < 1 / 6) { + colorVal = p + (q - p) * 6 * val; + } else if (val >= 1 / 6 && val < 1 / 2) { + colorVal = q; + } else if (val >= 1 / 2 && val < 2 / 3) { + colorVal = p + (q - p) * 6 * (2 / 3 - val); + } else { + colorVal = p; + } + return colorVal * 255; + } + + return { + r: Number(computedRgb(Cr).toFixed(0)), + g: Number(computedRgb(Cg).toFixed(0)), + b: Number(computedRgb(Cb).toFixed(0)), + }; +} + +/** + * 16进制颜色转换RGB + * @param color #rrggbb + * @returns RGB + */ +function hexToRGB(hex: string): RGB { + hex = hex.toUpperCase(); + const hexRegExp = /^#([0-9A-F]{6})$/; + if (!hexRegExp.test(hex)) { + throw new Error("请传入合法的16进制颜色值,eg: #FF0000"); + } + + const hexValArr = (hexRegExp.exec(hex)?.[1] || "000000").split( + "" + ) as Array; + + return { + r: HEX_MAP[hexValArr[0]] * 16 + HEX_MAP[hexValArr[1]], + g: HEX_MAP[hexValArr[2]] * 16 + HEX_MAP[hexValArr[3]], + b: HEX_MAP[hexValArr[4]] * 16 + HEX_MAP[hexValArr[5]], + }; +} + +/** + * rgb 转 16进制 + * @param rgb RGB + * @returns #HEX{6} + */ +function rgbToHex(rgb: RGB): string { + const HEX_MAP_REVERSE: Record = {}; + for (const key in HEX_MAP) { + HEX_MAP_REVERSE[HEX_MAP[key as HEX]] = key as HEX; + } + function getRemainderAndQuotient(val: number): string { + val = Math.round(val); + return `${HEX_MAP_REVERSE[Math.floor(val / 16)]}${ + HEX_MAP_REVERSE[val % 16] + }`; + } + + return `#${getRemainderAndQuotient(rgb.r)}${getRemainderAndQuotient( + rgb.g + )}${getRemainderAndQuotient(rgb.b)}`; +} + +// hsl 转 16进制 +function hslToHex(hsl: HSL): string { + return rgbToHex(hslToRgb(hsl)); +} + +// 16进制 转 hsl +function hexToHsl(hex: string): HSL { + return rgbToHsl(hexToRGB(hex)); +} + +// 生成混合色(混黑 + 混白) +function genMixColor(base: string | RGB | HSL): { + DEFAULT: string; + dark: { + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + 6: string; + 7: string; + 8: string; + 9: string; + }; + light: { + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + 6: string; + 7: string; + 8: string; + 9: string; + }; +} { + // 基准色统一转换为RGB + if (typeof base === "string") { + base = hexToRGB(base); + } else if ("h" in base) { + base = hslToRgb(base); + } + + // 混合色 + function mix(color: RGB, mixColor: RGB, weight: number): RGB { + return { + r: color.r * (1 - weight) + mixColor.r * weight, + g: color.g * (1 - weight) + mixColor.g * weight, + b: color.b * (1 - weight) + mixColor.b * weight, + }; + } + + return { + DEFAULT: rgbToHex(base), + dark: { + 1: rgbToHex(mix(base, rgbBlack, 0.1)), + 2: rgbToHex(mix(base, rgbBlack, 0.2)), + 3: rgbToHex(mix(base, rgbBlack, 0.3)), + 4: rgbToHex(mix(base, rgbBlack, 0.4)), + 5: rgbToHex(mix(base, rgbBlack, 0.5)), + 6: rgbToHex(mix(base, rgbBlack, 0.6)), + 7: rgbToHex(mix(base, rgbBlack, 0.7)), + 8: rgbToHex(mix(base, rgbBlack, 0.78)), + 9: rgbToHex(mix(base, rgbBlack, 0.85)), + }, + light: { + 1: rgbToHex(mix(base, rgbWhite, 0.1)), + 2: rgbToHex(mix(base, rgbWhite, 0.2)), + 3: rgbToHex(mix(base, rgbWhite, 0.3)), + 4: rgbToHex(mix(base, rgbWhite, 0.4)), + 5: rgbToHex(mix(base, rgbWhite, 0.5)), + 6: rgbToHex(mix(base, rgbWhite, 0.6)), + 7: rgbToHex(mix(base, rgbWhite, 0.7)), + 8: rgbToHex(mix(base, rgbWhite, 0.78)), + 9: rgbToHex(mix(base, rgbWhite, 0.85)), + }, + }; +} + +export { + genMixColor, + rgbToHsl, + rgbToHex, + hslToRgb, + hslToHex, + hexToRGB, + hexToHsl, +}; diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts new file mode 100644 index 0000000..17ed904 --- /dev/null +++ b/src/utils/i18n.ts @@ -0,0 +1,12 @@ +// translate router.meta.title, be used in breadcrumb sidebar tagsview +import i18n from "@/lang/index"; + +export function translateRouteTitle(title: any) { + // 判断是否存在国际化配置,如果没有原生返回 + const hasKey = i18n.global.te("route." + title); + if (hasKey) { + const translatedTitle = i18n.global.t("route." + title); + return translatedTitle; + } + return title; +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..f8fd449 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,80 @@ +import { AxiosResponse } from "axios"; + +/** + * Check if an element has a class + * @param {HTMLElement} ele + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele: HTMLElement, cls: string) { + return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); +} + +/** + * Add class to element + * @param {HTMLElement} ele + * @param {string} cls + */ +export function addClass(ele: HTMLElement, cls: string) { + if (!hasClass(ele, cls)) ele.className += " " + cls; +} + +/** + * Remove class from element + * @param {HTMLElement} ele + * @param {string} cls + */ +export function removeClass(ele: HTMLElement, cls: string) { + if (hasClass(ele, cls)) { + const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); + ele.className = ele.className.replace(reg, " "); + } +} + +/** + * 判断是否是外部链接 + * + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path: string) { + const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path); + return isExternal; +} + +/** + * 设置Style属性 + * + * @param propName + * @param value + */ +export function setStyleProperty(propName: string, value: string) { + document.documentElement.style.setProperty(propName, value); +} + +export function downloadHook(res: AxiosResponse) { + const blob = new Blob([res.data]); + const contentDisposition = res.headers["content-disposition"]; + const pattern = new RegExp("filename=([^;]+\\.[^.;]+);*"); + const result = pattern.exec(contentDisposition); + // 使用decodeURI对名字进行解码 + let fileName = ""; + if (result) { + fileName = decodeURI(result[1]); + console.log(fileName); + } + const downloadElement = document.createElement("a"); + // 创建下载的链接 + const href = window.URL.createObjectURL(blob); + downloadElement.style.display = "none"; + downloadElement.href = href; + // 下载后文件名 + downloadElement.download = fileName; + document.body.appendChild(downloadElement); + // 点击下载 + downloadElement.click(); + // 下载完成移除元素 + document.body.removeChild(downloadElement); + // 释放掉blob对象 + window.URL.revokeObjectURL(href); +} diff --git a/src/utils/nprogress.ts b/src/utils/nprogress.ts new file mode 100644 index 0000000..c1d5f23 --- /dev/null +++ b/src/utils/nprogress.ts @@ -0,0 +1,18 @@ +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; + +// 进度条 +NProgress.configure({ + // 动画方式 + easing: "ease", + // 递增进度条的速度 + speed: 500, + // 是否显示加载ico + showSpinner: false, + // 自动递增间隔 + trickleSpeed: 200, + // 初始化时的最小百分比 + minimum: 0.3, +}); + +export default NProgress; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..fe1c6b8 --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,66 @@ +import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios"; +import { useUserStoreHook } from "@/store/modules/user"; + +// 创建 axios 实例 +const service = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API, + timeout: 50000, + headers: { "Content-Type": "application/json;charset=utf-8" }, +}); + +// 请求拦截器 +service.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + const accessToken = localStorage.getItem("token"); + if (accessToken) { + config.headers.Authorization = accessToken; + } + return config; + }, + (error: any) => { + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response: AxiosResponse) => { + const { code, msg } = response.data; + if (code === "00000") { + return response.data; + } + // 响应数据为二进制流处理(Excel导出) + if (response.data instanceof ArrayBuffer) { + return response; + } + if (response.data instanceof Blob) { + return response; + } + ElMessage.error(msg || "系统出错"); + return Promise.reject(new Error(msg || "Error")); + }, + (error: any) => { + if (error.response.data) { + const { code, msg } = error.response.data; + // token 过期,重新登录 + if (code === "A0230") { + ElMessageBox.confirm("当前页面已失效,请重新登录", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }).then(() => { + const userStore = useUserStoreHook(); + userStore.resetToken().then(() => { + location.reload(); + }); + }); + } else { + ElMessage.error(msg || "系统出错"); + } + } + return Promise.reject(error.message); + } +); + +// 导出 axios 实例 +export default service; diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue new file mode 100644 index 0000000..3e82a35 --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/views/error-page/401.vue b/src/views/error-page/401.vue new file mode 100644 index 0000000..79b11aa --- /dev/null +++ b/src/views/error-page/401.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/views/error-page/404.vue b/src/views/error-page/404.vue new file mode 100644 index 0000000..4e68995 --- /dev/null +++ b/src/views/error-page/404.vue @@ -0,0 +1,276 @@ + + + + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..7550599 --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue new file mode 100644 index 0000000..4215bf6 --- /dev/null +++ b/src/views/redirect/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/views/resources/device-type/components/DeviceTypeToVer.vue b/src/views/resources/device-type/components/DeviceTypeToVer.vue new file mode 100644 index 0000000..9fc4773 --- /dev/null +++ b/src/views/resources/device-type/components/DeviceTypeToVer.vue @@ -0,0 +1,347 @@ + + + + + + diff --git a/src/views/resources/device-type/components/DeviceTypeVersionEdit.vue b/src/views/resources/device-type/components/DeviceTypeVersionEdit.vue new file mode 100644 index 0000000..d30c95b --- /dev/null +++ b/src/views/resources/device-type/components/DeviceTypeVersionEdit.vue @@ -0,0 +1,531 @@ + + + + + + diff --git a/src/views/resources/device-type/index.vue b/src/views/resources/device-type/index.vue new file mode 100644 index 0000000..920ab43 --- /dev/null +++ b/src/views/resources/device-type/index.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/views/resources/file-list/components/FolderTree.vue b/src/views/resources/file-list/components/FolderTree.vue new file mode 100644 index 0000000..a804df7 --- /dev/null +++ b/src/views/resources/file-list/components/FolderTree.vue @@ -0,0 +1,92 @@ + + + + + + diff --git a/src/views/resources/file-list/index.vue b/src/views/resources/file-list/index.vue new file mode 100644 index 0000000..759fce5 --- /dev/null +++ b/src/views/resources/file-list/index.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/views/resources/file-server/components/FileServerForm.vue b/src/views/resources/file-server/components/FileServerForm.vue new file mode 100644 index 0000000..74605f5 --- /dev/null +++ b/src/views/resources/file-server/components/FileServerForm.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/resources/file-server/index.vue b/src/views/resources/file-server/index.vue new file mode 100644 index 0000000..2cdd9e7 --- /dev/null +++ b/src/views/resources/file-server/index.vue @@ -0,0 +1,108 @@ + + + + + + diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue new file mode 100644 index 0000000..78f329d --- /dev/null +++ b/src/views/system/dept/index.vue @@ -0,0 +1,335 @@ + + + + + diff --git a/src/views/system/dict/components/dict-item.vue b/src/views/system/dict/components/dict-item.vue new file mode 100644 index 0000000..59c03c2 --- /dev/null +++ b/src/views/system/dict/components/dict-item.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue new file mode 100644 index 0000000..00bf327 --- /dev/null +++ b/src/views/system/dict/index.vue @@ -0,0 +1,349 @@ + + + + + diff --git a/src/views/system/domain/components/DomainForm.vue b/src/views/system/domain/components/DomainForm.vue new file mode 100644 index 0000000..f98f4ff --- /dev/null +++ b/src/views/system/domain/components/DomainForm.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/system/domain/index.vue b/src/views/system/domain/index.vue new file mode 100644 index 0000000..b6089d2 --- /dev/null +++ b/src/views/system/domain/index.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue new file mode 100644 index 0000000..48fd933 --- /dev/null +++ b/src/views/system/menu/index.vue @@ -0,0 +1,524 @@ + + + + diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue new file mode 100644 index 0000000..6780e8b --- /dev/null +++ b/src/views/system/role/index.vue @@ -0,0 +1,418 @@ + + + + diff --git a/src/views/system/user/components/dept-tree.vue b/src/views/system/user/components/dept-tree.vue new file mode 100644 index 0000000..6394b32 --- /dev/null +++ b/src/views/system/user/components/dept-tree.vue @@ -0,0 +1,69 @@ + + + + diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue new file mode 100644 index 0000000..03b5846 --- /dev/null +++ b/src/views/system/user/index.vue @@ -0,0 +1,727 @@ + + + + + diff --git a/src/views/table/index.vue b/src/views/table/index.vue new file mode 100644 index 0000000..feb396e --- /dev/null +++ b/src/views/table/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6d1e993 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "noLib": false, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "baseUrl": ".", + "allowJs": true, + "paths": { + "@/*": ["src/*"] + }, + "types": ["vite/client", "unplugin-icons/types/vue", "element-plus/global"], + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "allowSyntheticDefaultImports": true /* 允许默认导入 */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + "jsx": "preserve", + "jsxFactory": "h", + "jsxFragmentFactory": "Fragment" + }, + "include": [ + "src/**/*.ts", + "src/**/*.vue", + "src/typings/**/*.d.ts", + "mock/**/*.ts", + "vite.config.ts" + ], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..b952fe4 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,43 @@ +// uno.config.ts +import { + defineConfig, + presetAttributify, + presetIcons, + presetTypography, + presetUno, + presetWebFonts, + transformerDirectives, + transformerVariantGroup, +} from "unocss"; + +export default defineConfig({ + shortcuts: { + "flex-center": "flex justify-center items-center", + "flex-x-center": "flex justify-center", + "flex-y-center": "flex items-center", + "wh-full": "w-full h-full", + "flex-x-between": "flex items-center justify-between", + "flex-x-end": "flex items-center justify-end", + "absolute-lt": "absolute left-0 top-0", + "absolute-rt": "absolute right-0 top-0 ", + "fixed-lt": "fixed left-0 top-0", + }, + theme: { + colors: { + primary: "var(--el-color-primary)", + primary_dark: "var(--el-color-primary-light-5)", + }, + }, + presets: [ + presetUno(), + presetAttributify(), + presetIcons(), + presetTypography(), + presetWebFonts({ + fonts: { + // ... + }, + }), + ], + transformers: [transformerDirectives(), transformerVariantGroup()], +}); diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..69f7ea2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,237 @@ +import vue from "@vitejs/plugin-vue"; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import { UserConfig, ConfigEnv, loadEnv, defineConfig } from "vite"; + +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; +import Icons from "unplugin-icons/vite"; +import IconsResolver from "unplugin-icons/resolver"; + +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; +import mockDevServerPlugin from "vite-plugin-mock-dev-server"; + +import UnoCSS from "unocss/vite"; +import { resolve } from "path"; +import { + name, + version, + engines, + dependencies, + devDependencies, +} from "./package.json"; + +/** 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 */ +const __APP_INFO__ = { + pkg: { name, version, engines, dependencies, devDependencies }, + buildTimestamp: Date.now(), +}; + +const pathSrc = resolve(__dirname, "src"); +// https://cn.vitejs.dev/config +export default defineConfig(({ mode }: ConfigEnv): UserConfig => { + const env = loadEnv(mode, process.cwd()); + return { + resolve: { + alias: { + "@": pathSrc, + }, + }, + css: { + // CSS 预处理器 + preprocessorOptions: { + // 定义全局 SCSS 变量 + scss: { + javascriptEnabled: true, + additionalData: ` + @use "@/styles/variables.scss" as *; + `, + }, + }, + }, + server: { + // 允许IP访问 + host: "0.0.0.0", + // 应用端口 (默认:3000) + port: Number(env.VITE_APP_PORT), + // 运行是否自动打开浏览器 + open: true, + proxy: { + /** + * 代理前缀为 /dev-api 的请求 + */ + [env.VITE_APP_BASE_API]: { + changeOrigin: true, + // 接口地址 + target: env.VITE_APP_API_URL, + rewrite: (path) => + path.replace(new RegExp("^" + env.VITE_APP_BASE_API), ""), + }, + }, + }, + plugins: [ + vue(), + // jsx、tsx语法支持 + vueJsx(), + // MOCK 服务 + env.VITE_MOCK_DEV_SERVER === "true" ? mockDevServerPlugin() : null, + UnoCSS({ + hmrTopLevelAwait: false, + }), + // 自动导入参考: https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts + AutoImport({ + // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 + imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"], + // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) + resolvers: [ElementPlusResolver(), IconsResolver({})], + eslintrc: { + enabled: false, + filepath: "./.eslintrc-auto-import.json", + globalsPropValue: true, + }, + vueTemplate: true, + // 配置文件生成位置(false:关闭自动生成) + dts: false, + // dts: "src/typings/auto-imports.d.ts", + }), + + Components({ + resolvers: [ + // 自动导入 Element Plus 组件 + ElementPlusResolver(), + // 自动注册图标组件 + IconsResolver({ enabledCollections: ["ep"] }), + ], + // 指定自定义组件位置(默认:src/components) + dirs: ["src/components", "src/**/components"], + // 配置文件位置 (false:关闭自动生成) + dts: false, + // dts: "src/typings/components.d.ts", + }), + + Icons({ + autoInstall: true, + }), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [resolve(pathSrc, "assets/icons")], + // 指定symbolId格式 + symbolId: "icon-[dir]-[name]", + }), + ], + // 预加载项目必需的组件 + optimizeDeps: { + include: [ + "vue", + "vue-router", + "pinia", + "axios", + "@vueuse/core", + "sortablejs", + "path-to-regexp", + "echarts", + "@wangeditor/editor", + "@wangeditor/editor-for-vue", + "vue-i18n", + "path-browserify", + "element-plus/es/components/form/style/css", + "element-plus/es/components/form-item/style/css", + "element-plus/es/components/button/style/css", + "element-plus/es/components/input/style/css", + "element-plus/es/components/input-number/style/css", + "element-plus/es/components/switch/style/css", + "element-plus/es/components/upload/style/css", + "element-plus/es/components/menu/style/css", + "element-plus/es/components/col/style/css", + "element-plus/es/components/icon/style/css", + "element-plus/es/components/row/style/css", + "element-plus/es/components/tag/style/css", + "element-plus/es/components/dialog/style/css", + "element-plus/es/components/loading/style/css", + "element-plus/es/components/radio/style/css", + "element-plus/es/components/radio-group/style/css", + "element-plus/es/components/popover/style/css", + "element-plus/es/components/scrollbar/style/css", + "element-plus/es/components/tooltip/style/css", + "element-plus/es/components/dropdown/style/css", + "element-plus/es/components/dropdown-menu/style/css", + "element-plus/es/components/dropdown-item/style/css", + "element-plus/es/components/sub-menu/style/css", + "element-plus/es/components/menu-item/style/css", + "element-plus/es/components/divider/style/css", + "element-plus/es/components/card/style/css", + "element-plus/es/components/link/style/css", + "element-plus/es/components/breadcrumb/style/css", + "element-plus/es/components/breadcrumb-item/style/css", + "element-plus/es/components/table/style/css", + "element-plus/es/components/tree-select/style/css", + "element-plus/es/components/table-column/style/css", + "element-plus/es/components/select/style/css", + "element-plus/es/components/option/style/css", + "element-plus/es/components/pagination/style/css", + "element-plus/es/components/tree/style/css", + "element-plus/es/components/alert/style/css", + "element-plus/es/components/radio-button/style/css", + "element-plus/es/components/checkbox-group/style/css", + "element-plus/es/components/checkbox/style/css", + "element-plus/es/components/tabs/style/css", + "element-plus/es/components/tab-pane/style/css", + "element-plus/es/components/rate/style/css", + "element-plus/es/components/date-picker/style/css", + "element-plus/es/components/notification/style/css", + "element-plus/es/components/image/style/css", + "element-plus/es/components/statistic/style/css", + "element-plus/es/components/watermark/style/css", + "element-plus/es/components/config-provider/style/css", + "element-plus/es/components/text/style/css", + "element-plus/es/components/drawer/style/css", + "element-plus/es/components/color-picker/style/css", + ], + }, + // 构建配置 + build: { + chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告 + minify: "terser", // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效 + terserOptions: { + compress: { + keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题 + drop_console: true, // 生产环境去除 console + drop_debugger: true, // 生产环境去除 debugger + }, + format: { + comments: false, // 删除注释 + }, + }, + rollupOptions: { + output: { + // manualChunks: { + // "vue-i18n": ["vue-i18n"], + // }, + // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值 + entryFileNames: "js/[name].[hash].js", + // 用于命名代码拆分时创建的共享块的输出命名 + chunkFileNames: "js/[name].[hash].js", + // 用于输出静态资源的命名,[ext]表示文件扩展名 + assetFileNames: (assetInfo: any) => { + const info = assetInfo.name.split("."); + let extType = info[info.length - 1]; + // console.log('文件信息', assetInfo.name) + if ( + /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name) + ) { + extType = "media"; + } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) { + extType = "img"; + } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) { + extType = "fonts"; + } + return `${extType}/[name].[hash].[ext]`; + }, + }, + }, + }, + define: { + __APP_INFO__: JSON.stringify(__APP_INFO__), + }, + }; +});