From d59b7a71eea0b7366eac4c61b84c1e338600d04a Mon Sep 17 00:00:00 2001
From: suzhiwei2000 <83455164+suzhiwei2000@users.noreply.github.com>
Date: Tue, 10 Jan 2023 22:51:27 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env | 18 +
.env.development | 5 +
.env.production | 5 +
.env.test | 5 +
.gitignore | 24 +
.hintrc | 8 +
.vscode/extensions.json | 3 +
README.md | 9 +
auto-imports.d.ts | 5 +
components.d.ts | 72 +
index.html | 102 +
package.json | 55 +
public/vite.svg | 1 +
src/App.vue | 33 +
src/api/config/servicePort.ts | 3 +
src/api/helper/axiosCancel.ts | 65 +
src/api/helper/checkStatus.ts | 43 +
src/api/index.ts | 108 +
src/api/interface/index.ts | 93 +
src/api/modules/login.ts | 39 +
src/api/modules/upload.ts | 16 +
src/api/modules/user.ts | 66 +
src/assets/fonts/DIN.otf | Bin 0 -> 27828 bytes
src/assets/fonts/MetroDF.ttf | Bin 0 -> 106934 bytes
src/assets/fonts/YouSheBiaoTiHei.ttf | Bin 0 -> 1414784 bytes
src/assets/fonts/font.scss | 12 +
src/assets/iconfont/iconfont.scss | 38 +
src/assets/iconfont/iconfont.ttf | Bin 0 -> 4128 bytes
src/assets/icons/xianxingdaoyu.svg | 1 +
src/assets/icons/xianxingdiqiu.svg | 1 +
src/assets/icons/xianxingditu.svg | 1 +
src/assets/icons/xianxingfanchuan.svg | 1 +
src/assets/icons/xianxingfeiji.svg | 1 +
src/assets/icons/xianxinglvhangriji.svg | 1 +
src/assets/icons/xianxingtianqiyubao.svg | 1 +
src/assets/icons/xianxingxiangjipaizhao.svg | 1 +
src/assets/icons/xianxingxiarilengyin.svg | 1 +
src/assets/icons/xianxingyoulun.svg | 1 +
src/assets/icons/xianxingzijiayou.svg | 1 +
src/assets/images/403.png | Bin 0 -> 12713 bytes
src/assets/images/404.png | Bin 0 -> 7788 bytes
src/assets/images/500.png | Bin 0 -> 8069 bytes
src/assets/images/avatar.gif | Bin 0 -> 6334 bytes
src/assets/images/enlarge_black.svg | 3 +
src/assets/images/enlarge_white.svg | 3 +
src/assets/images/login_bg.svg | 33 +
src/assets/images/login_left.png | Bin 0 -> 100116 bytes
src/assets/images/login_left.svg | 123 +
src/assets/images/login_left0.png | Bin 0 -> 35966 bytes
src/assets/images/login_left1.png | Bin 0 -> 42169 bytes
src/assets/images/login_left2.png | Bin 0 -> 31959 bytes
src/assets/images/login_left3.png | Bin 0 -> 111980 bytes
src/assets/images/login_left4.png | Bin 0 -> 153248 bytes
src/assets/images/login_left5.png | Bin 0 -> 282032 bytes
src/assets/images/logo.svg | 1 +
src/assets/images/msg01.png | Bin 0 -> 6527 bytes
src/assets/images/msg02.png | Bin 0 -> 6550 bytes
src/assets/images/msg03.png | Bin 0 -> 6484 bytes
src/assets/images/msg04.png | Bin 0 -> 6774 bytes
src/assets/images/msg05.png | Bin 0 -> 6099 bytes
src/assets/images/notData.png | Bin 0 -> 1168 bytes
src/assets/images/welcome.png | Bin 0 -> 75638 bytes
src/assets/json/authButtons.json | 8 +
src/assets/json/dynamicRouter.json | 986 +++++
src/assets/json/menuList.json | 138 +
src/components/ErrorMessage/403.vue | 20 +
src/components/ErrorMessage/404.vue | 20 +
src/components/ErrorMessage/500.vue | 20 +
src/components/ErrorMessage/index.scss | 32 +
src/components/Grid/components/GridItem.vue | 68 +
src/components/Grid/index.vue | 165 +
src/components/Grid/interface/index.ts | 6 +
src/components/ImportExcel/index.scss | 3 +
src/components/ImportExcel/index.vue | 136 +
src/components/Loading/index.scss | 65 +
src/components/Loading/index.vue | 11 +
.../ProTable/components/ColSetting.vue | 45 +
.../ProTable/components/Pagination.vue | 29 +
.../ProTable/components/TableColumn.vue | 57 +
src/components/ProTable/index.md | 84 +
src/components/ProTable/index.vue | 252 ++
src/components/ProTable/interface/index.ts | 48 +
.../SearchForm/components/SearchFormItem.vue | 86 +
src/components/SearchForm/index.vue | 85 +
src/components/SelectFilter/index.scss | 63 +
src/components/SelectFilter/index.vue | 102 +
src/components/SelectIcon/index.scss | 38 +
src/components/SelectIcon/index.vue | 87 +
src/components/SvgIcon/index.vue | 22 +
src/components/SwitchDark/index.vue | 19 +
src/components/TreeFilter/index.scss | 38 +
src/components/TreeFilter/index.vue | 115 +
src/components/Upload/Img.vue | 310 ++
src/components/Upload/Imgs.vue | 305 ++
src/components/WangEditor/index.scss | 25 +
src/components/WangEditor/index.vue | 149 +
src/config/config.ts | 16 +
src/config/nprogress.ts | 11 +
src/config/piniaPersist.ts | 19 +
src/config/serviceLoading.ts | 35 +
src/directives/index.ts | 30 +
src/directives/modules/auth.ts | 22 +
src/directives/modules/copy.ts | 38 +
src/directives/modules/debounce.ts | 31 +
src/directives/modules/draggable.ts | 49 +
src/directives/modules/longpress.ts | 49 +
src/directives/modules/throttle.ts | 41 +
src/directives/modules/waterMarker.ts | 36 +
src/enums/httpEnum.ts | 36 +
src/env.d.ts | 8 +
src/hooks/interface/index.ts | 27 +
src/hooks/useAuthButtons.ts | 23 +
src/hooks/useDownload.ts | 49 +
src/hooks/useEcharts.ts | 31 +
src/hooks/useHandleData.ts | 34 +
src/hooks/useOnline.ts | 27 +
src/hooks/useSelection.ts | 44 +
src/hooks/useTable.ts | 157 +
src/hooks/useTheme.ts | 70 +
src/hooks/useTime.ts | 38 +
src/languages/index.ts | 15 +
src/languages/modules/en.ts | 28 +
src/languages/modules/zh.ts | 28 +
src/layouts/LayoutClassic/index.scss | 72 +
src/layouts/LayoutClassic/index.vue | 94 +
src/layouts/LayoutColumns/index.scss | 105 +
src/layouts/LayoutColumns/index.vue | 124 +
src/layouts/LayoutTransverse/index.scss | 52 +
src/layouts/LayoutTransverse/index.vue | 109 +
src/layouts/LayoutVertical/index.scss | 55 +
src/layouts/LayoutVertical/index.vue | 80 +
src/layouts/components/Footer/index.scss | 11 +
src/layouts/components/Footer/index.vue | 9 +
src/layouts/components/Header/ToolBarLeft.vue | 26 +
.../components/Header/ToolBarRight.vue | 44 +
.../Header/components/AssemblySize.vue | 33 +
.../components/Header/components/Avatar.vue | 80 +
.../Header/components/Breadcrumb.vue | 91 +
.../Header/components/CollapseIcon.vue | 25 +
.../Header/components/Fullscreen.vue | 10 +
.../Header/components/InfoDialog.vue | 23 +
.../components/Header/components/Language.vue | 32 +
.../components/Header/components/Message.vue | 110 +
.../Header/components/PasswordDialog.vue | 23 +
.../Header/components/SearchMenu.vue | 119 +
.../Header/components/ThemeSetting.vue | 12 +
.../components/Main/components/Maximize.vue | 53 +
src/layouts/components/Main/index.scss | 13 +
src/layouts/components/Main/index.vue | 53 +
src/layouts/components/Menu/SubMenu.vue | 33 +
.../components/Tabs/components/MoreButton.vue | 85 +
src/layouts/components/Tabs/index.scss | 40 +
src/layouts/components/Tabs/index.vue | 113 +
src/layouts/components/ThemeDrawer/index.scss | 125 +
src/layouts/components/ThemeDrawer/index.vue | 163 +
src/layouts/index.vue | 31 +
src/layouts/indexAsync.vue | 35 +
src/main.ts | 45 +
src/routers/index.ts | 96 +
src/routers/modules/dynamicRouter.ts | 57 +
src/routers/modules/staticRouter.ts | 67 +
src/stores/index.ts | 79 +
src/stores/interface/index.ts | 52 +
src/stores/modules/auth.ts | 46 +
src/stores/modules/keepAlive.ts | 25 +
src/stores/modules/tabs.ts | 51 +
src/styles/common.scss | 122 +
src/styles/element.scss | 246 ++
src/styles/reset.scss | 142 +
src/styles/theme/element-dark.scss | 103 +
src/styles/var.scss | 2 +
src/typings/global.d.ts | 35 +
src/typings/plugins.d.ts | 4 +
src/typings/window.d.ts | 9 +
src/utils/echarts/index.ts | 53 +
src/utils/eleValidate.ts | 14 +
src/utils/errorHandler.ts | 27 +
src/utils/getEnv.ts | 73 +
src/utils/is/index.ts | 118 +
src/utils/mittBus.ts | 5 +
src/utils/serviceDict.ts | 17 +
src/utils/svg.ts | 13 +
src/utils/theme/tool.ts | 59 +
src/utils/util.ts | 310 ++
src/views/home/index.scss | 11 +
src/views/home/index.vue | 11 +
src/views/login/components/LoginForm.vue | 105 +
src/views/login/index.scss | 71 +
src/views/login/index.vue | 26 +
src/views/proTable/complexProTable/index.vue | 187 +
src/views/proTable/components/UserDrawer.vue | 112 +
src/views/proTable/document/index.vue | 10 +
src/views/proTable/useProTable/detail.vue | 12 +
src/views/proTable/useProTable/index.vue | 250 ++
src/views/proTable/useSelectFilter/index.vue | 193 +
src/views/proTable/useTreeFilter/detail.vue | 12 +
src/views/proTable/useTreeFilter/index.vue | 159 +
tsconfig.node.json | 38 +
vite.config.ts | 136 +
yarn.lock | 3681 +++++++++++++++++
200 files changed, 14598 insertions(+)
create mode 100644 .env
create mode 100644 .env.development
create mode 100644 .env.production
create mode 100644 .env.test
create mode 100644 .gitignore
create mode 100644 .hintrc
create mode 100644 .vscode/extensions.json
create mode 100644 README.md
create mode 100644 auto-imports.d.ts
create mode 100644 components.d.ts
create mode 100644 index.html
create mode 100644 package.json
create mode 100644 public/vite.svg
create mode 100644 src/App.vue
create mode 100644 src/api/config/servicePort.ts
create mode 100644 src/api/helper/axiosCancel.ts
create mode 100644 src/api/helper/checkStatus.ts
create mode 100644 src/api/index.ts
create mode 100644 src/api/interface/index.ts
create mode 100644 src/api/modules/login.ts
create mode 100644 src/api/modules/upload.ts
create mode 100644 src/api/modules/user.ts
create mode 100644 src/assets/fonts/DIN.otf
create mode 100644 src/assets/fonts/MetroDF.ttf
create mode 100644 src/assets/fonts/YouSheBiaoTiHei.ttf
create mode 100644 src/assets/fonts/font.scss
create mode 100644 src/assets/iconfont/iconfont.scss
create mode 100644 src/assets/iconfont/iconfont.ttf
create mode 100644 src/assets/icons/xianxingdaoyu.svg
create mode 100644 src/assets/icons/xianxingdiqiu.svg
create mode 100644 src/assets/icons/xianxingditu.svg
create mode 100644 src/assets/icons/xianxingfanchuan.svg
create mode 100644 src/assets/icons/xianxingfeiji.svg
create mode 100644 src/assets/icons/xianxinglvhangriji.svg
create mode 100644 src/assets/icons/xianxingtianqiyubao.svg
create mode 100644 src/assets/icons/xianxingxiangjipaizhao.svg
create mode 100644 src/assets/icons/xianxingxiarilengyin.svg
create mode 100644 src/assets/icons/xianxingyoulun.svg
create mode 100644 src/assets/icons/xianxingzijiayou.svg
create mode 100644 src/assets/images/403.png
create mode 100644 src/assets/images/404.png
create mode 100644 src/assets/images/500.png
create mode 100644 src/assets/images/avatar.gif
create mode 100644 src/assets/images/enlarge_black.svg
create mode 100644 src/assets/images/enlarge_white.svg
create mode 100644 src/assets/images/login_bg.svg
create mode 100644 src/assets/images/login_left.png
create mode 100644 src/assets/images/login_left.svg
create mode 100644 src/assets/images/login_left0.png
create mode 100644 src/assets/images/login_left1.png
create mode 100644 src/assets/images/login_left2.png
create mode 100644 src/assets/images/login_left3.png
create mode 100644 src/assets/images/login_left4.png
create mode 100644 src/assets/images/login_left5.png
create mode 100644 src/assets/images/logo.svg
create mode 100644 src/assets/images/msg01.png
create mode 100644 src/assets/images/msg02.png
create mode 100644 src/assets/images/msg03.png
create mode 100644 src/assets/images/msg04.png
create mode 100644 src/assets/images/msg05.png
create mode 100644 src/assets/images/notData.png
create mode 100644 src/assets/images/welcome.png
create mode 100644 src/assets/json/authButtons.json
create mode 100644 src/assets/json/dynamicRouter.json
create mode 100644 src/assets/json/menuList.json
create mode 100644 src/components/ErrorMessage/403.vue
create mode 100644 src/components/ErrorMessage/404.vue
create mode 100644 src/components/ErrorMessage/500.vue
create mode 100644 src/components/ErrorMessage/index.scss
create mode 100644 src/components/Grid/components/GridItem.vue
create mode 100644 src/components/Grid/index.vue
create mode 100644 src/components/Grid/interface/index.ts
create mode 100644 src/components/ImportExcel/index.scss
create mode 100644 src/components/ImportExcel/index.vue
create mode 100644 src/components/Loading/index.scss
create mode 100644 src/components/Loading/index.vue
create mode 100644 src/components/ProTable/components/ColSetting.vue
create mode 100644 src/components/ProTable/components/Pagination.vue
create mode 100644 src/components/ProTable/components/TableColumn.vue
create mode 100644 src/components/ProTable/index.md
create mode 100644 src/components/ProTable/index.vue
create mode 100644 src/components/ProTable/interface/index.ts
create mode 100644 src/components/SearchForm/components/SearchFormItem.vue
create mode 100644 src/components/SearchForm/index.vue
create mode 100644 src/components/SelectFilter/index.scss
create mode 100644 src/components/SelectFilter/index.vue
create mode 100644 src/components/SelectIcon/index.scss
create mode 100644 src/components/SelectIcon/index.vue
create mode 100644 src/components/SvgIcon/index.vue
create mode 100644 src/components/SwitchDark/index.vue
create mode 100644 src/components/TreeFilter/index.scss
create mode 100644 src/components/TreeFilter/index.vue
create mode 100644 src/components/Upload/Img.vue
create mode 100644 src/components/Upload/Imgs.vue
create mode 100644 src/components/WangEditor/index.scss
create mode 100644 src/components/WangEditor/index.vue
create mode 100644 src/config/config.ts
create mode 100644 src/config/nprogress.ts
create mode 100644 src/config/piniaPersist.ts
create mode 100644 src/config/serviceLoading.ts
create mode 100644 src/directives/index.ts
create mode 100644 src/directives/modules/auth.ts
create mode 100644 src/directives/modules/copy.ts
create mode 100644 src/directives/modules/debounce.ts
create mode 100644 src/directives/modules/draggable.ts
create mode 100644 src/directives/modules/longpress.ts
create mode 100644 src/directives/modules/throttle.ts
create mode 100644 src/directives/modules/waterMarker.ts
create mode 100644 src/enums/httpEnum.ts
create mode 100644 src/env.d.ts
create mode 100644 src/hooks/interface/index.ts
create mode 100644 src/hooks/useAuthButtons.ts
create mode 100644 src/hooks/useDownload.ts
create mode 100644 src/hooks/useEcharts.ts
create mode 100644 src/hooks/useHandleData.ts
create mode 100644 src/hooks/useOnline.ts
create mode 100644 src/hooks/useSelection.ts
create mode 100644 src/hooks/useTable.ts
create mode 100644 src/hooks/useTheme.ts
create mode 100644 src/hooks/useTime.ts
create mode 100644 src/languages/index.ts
create mode 100644 src/languages/modules/en.ts
create mode 100644 src/languages/modules/zh.ts
create mode 100644 src/layouts/LayoutClassic/index.scss
create mode 100644 src/layouts/LayoutClassic/index.vue
create mode 100644 src/layouts/LayoutColumns/index.scss
create mode 100644 src/layouts/LayoutColumns/index.vue
create mode 100644 src/layouts/LayoutTransverse/index.scss
create mode 100644 src/layouts/LayoutTransverse/index.vue
create mode 100644 src/layouts/LayoutVertical/index.scss
create mode 100644 src/layouts/LayoutVertical/index.vue
create mode 100644 src/layouts/components/Footer/index.scss
create mode 100644 src/layouts/components/Footer/index.vue
create mode 100644 src/layouts/components/Header/ToolBarLeft.vue
create mode 100644 src/layouts/components/Header/ToolBarRight.vue
create mode 100644 src/layouts/components/Header/components/AssemblySize.vue
create mode 100644 src/layouts/components/Header/components/Avatar.vue
create mode 100644 src/layouts/components/Header/components/Breadcrumb.vue
create mode 100644 src/layouts/components/Header/components/CollapseIcon.vue
create mode 100644 src/layouts/components/Header/components/Fullscreen.vue
create mode 100644 src/layouts/components/Header/components/InfoDialog.vue
create mode 100644 src/layouts/components/Header/components/Language.vue
create mode 100644 src/layouts/components/Header/components/Message.vue
create mode 100644 src/layouts/components/Header/components/PasswordDialog.vue
create mode 100644 src/layouts/components/Header/components/SearchMenu.vue
create mode 100644 src/layouts/components/Header/components/ThemeSetting.vue
create mode 100644 src/layouts/components/Main/components/Maximize.vue
create mode 100644 src/layouts/components/Main/index.scss
create mode 100644 src/layouts/components/Main/index.vue
create mode 100644 src/layouts/components/Menu/SubMenu.vue
create mode 100644 src/layouts/components/Tabs/components/MoreButton.vue
create mode 100644 src/layouts/components/Tabs/index.scss
create mode 100644 src/layouts/components/Tabs/index.vue
create mode 100644 src/layouts/components/ThemeDrawer/index.scss
create mode 100644 src/layouts/components/ThemeDrawer/index.vue
create mode 100644 src/layouts/index.vue
create mode 100644 src/layouts/indexAsync.vue
create mode 100644 src/main.ts
create mode 100644 src/routers/index.ts
create mode 100644 src/routers/modules/dynamicRouter.ts
create mode 100644 src/routers/modules/staticRouter.ts
create mode 100644 src/stores/index.ts
create mode 100644 src/stores/interface/index.ts
create mode 100644 src/stores/modules/auth.ts
create mode 100644 src/stores/modules/keepAlive.ts
create mode 100644 src/stores/modules/tabs.ts
create mode 100644 src/styles/common.scss
create mode 100644 src/styles/element.scss
create mode 100644 src/styles/reset.scss
create mode 100644 src/styles/theme/element-dark.scss
create mode 100644 src/styles/var.scss
create mode 100644 src/typings/global.d.ts
create mode 100644 src/typings/plugins.d.ts
create mode 100644 src/typings/window.d.ts
create mode 100644 src/utils/echarts/index.ts
create mode 100644 src/utils/eleValidate.ts
create mode 100644 src/utils/errorHandler.ts
create mode 100644 src/utils/getEnv.ts
create mode 100644 src/utils/is/index.ts
create mode 100644 src/utils/mittBus.ts
create mode 100644 src/utils/serviceDict.ts
create mode 100644 src/utils/svg.ts
create mode 100644 src/utils/theme/tool.ts
create mode 100644 src/utils/util.ts
create mode 100644 src/views/home/index.scss
create mode 100644 src/views/home/index.vue
create mode 100644 src/views/login/components/LoginForm.vue
create mode 100644 src/views/login/index.scss
create mode 100644 src/views/login/index.vue
create mode 100644 src/views/proTable/complexProTable/index.vue
create mode 100644 src/views/proTable/components/UserDrawer.vue
create mode 100644 src/views/proTable/document/index.vue
create mode 100644 src/views/proTable/useProTable/detail.vue
create mode 100644 src/views/proTable/useProTable/index.vue
create mode 100644 src/views/proTable/useSelectFilter/index.vue
create mode 100644 src/views/proTable/useTreeFilter/detail.vue
create mode 100644 src/views/proTable/useTreeFilter/index.vue
create mode 100644 tsconfig.node.json
create mode 100644 vite.config.ts
create mode 100644 yarn.lock
diff --git a/.env b/.env
new file mode 100644
index 0000000..37b2e89
--- /dev/null
+++ b/.env
@@ -0,0 +1,18 @@
+# title
+VITE_GLOB_APP_TITLE = 'susu-system'
+
+# port
+VITE_PORT = 3301
+
+# open 运行 npm run dev 时自动打开浏览器
+VITE_OPEN = true
+
+# 是否生成包分析文件
+VITE_REPORT = false
+
+# 是否开启gzip压缩
+VITE_BUILD_GZIP = false
+
+# 是否删除生产环境 console
+VITE_DROP_CONSOLE = true
+
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..6713236
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,5 @@
+# 本地环境
+NODE_ENV = 'development'
+
+# 本地环境接口地址
+VITE_API_URL = '/api'
\ No newline at end of file
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..4d4d84a
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,5 @@
+# 线上环境
+NODE_ENV = "production"
+
+# 线上环境接口地址(easymock)
+VITE_API_URL = "https://mock.mengxuegu.com/mock/629d727e6163854a32e8307e"
diff --git a/.env.test b/.env.test
new file mode 100644
index 0000000..f30f48e
--- /dev/null
+++ b/.env.test
@@ -0,0 +1,5 @@
+# 测试环境
+NODE_ENV = "test"
+
+# 测试环境接口地址(easymock)
+VITE_API_URL = "https://mock.mengxuegu.com/mock/629d727e6163854a32e8307e"
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.hintrc b/.hintrc
new file mode 100644
index 0000000..1f14328
--- /dev/null
+++ b/.hintrc
@@ -0,0 +1,8 @@
+{
+ "extends": [
+ "development"
+ ],
+ "hints": {
+ "typescript-config/consistent-casing": "off"
+ }
+}
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..c0a6e5a
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c1a726b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# Vue 3 + TypeScript + Vite
+
+yarn dev
+
+# dependencies 安装的依赖
+
+axios echarts element-plus nprogress pinia pinia-plugin-persistedstate vue-i18n vue-router
+
+# devDependencies 安装的依赖
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
new file mode 100644
index 0000000..08908ed
--- /dev/null
+++ b/auto-imports.d.ts
@@ -0,0 +1,5 @@
+// Generated by 'unplugin-auto-import'
+export {}
+declare global {
+
+}
diff --git a/components.d.ts b/components.d.ts
new file mode 100644
index 0000000..34b542f
--- /dev/null
+++ b/components.d.ts
@@ -0,0 +1,72 @@
+// generated by unplugin-vue-components
+// We suggest you to commit this file into source control
+// Read more: https://github.com/vuejs/core/pull/3399
+import '@vue/runtime-core'
+
+export {}
+
+declare module '@vue/runtime-core' {
+ export interface GlobalComponents {
+ 403: typeof import('./src/components/ErrorMessage/403.vue')['default']
+ 404: typeof import('./src/components/ErrorMessage/404.vue')['default']
+ 500: typeof import('./src/components/ErrorMessage/500.vue')['default']
+ ColSetting: typeof import('./src/components/ProTable/components/ColSetting.vue')['default']
+ ElAside: typeof import('element-plus/es')['ElAside']
+ ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete']
+ ElBadge: typeof import('element-plus/es')['ElBadge']
+ ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
+ ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
+ ElButton: typeof import('element-plus/es')['ElButton']
+ ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
+ ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+ ElContainer: typeof import('element-plus/es')['ElContainer']
+ 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']
+ ElFooter: typeof import('element-plus/es')['ElFooter']
+ ElForm: typeof import('element-plus/es')['ElForm']
+ ElFormItem: typeof import('element-plus/es')['ElFormItem']
+ ElHeader: typeof import('element-plus/es')['ElHeader']
+ ElIcon: typeof import('element-plus/es')['ElIcon']
+ ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
+ ElInput: typeof import('element-plus/es')['ElInput']
+ ElMain: typeof import('element-plus/es')['ElMain']
+ 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']
+ ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+ ElSelect: typeof import('element-plus/es')['ElSelect']
+ 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']
+ ElTooltip: typeof import('element-plus/es')['ElTooltip']
+ ElUpload: typeof import('element-plus/es')['ElUpload']
+ Grid: typeof import('./src/components/Grid/index.vue')['default']
+ GridItem: typeof import('./src/components/Grid/components/GridItem.vue')['default']
+ Img: typeof import('./src/components/Upload/Img.vue')['default']
+ Imgs: typeof import('./src/components/Upload/Imgs.vue')['default']
+ ImportExcel: typeof import('./src/components/ImportExcel/index.vue')['default']
+ Loading: typeof import('./src/components/Loading/index.vue')['default']
+ Pagination: typeof import('./src/components/ProTable/components/Pagination.vue')['default']
+ ProTable: typeof import('./src/components/ProTable/index.vue')['default']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ SearchForm: typeof import('./src/components/SearchForm/index.vue')['default']
+ SearchFormItem: typeof import('./src/components/SearchForm/components/SearchFormItem.vue')['default']
+ SelectFilter: typeof import('./src/components/SelectFilter/index.vue')['default']
+ SelectIcon: typeof import('./src/components/SelectIcon/index.vue')['default']
+ SvgIcon: typeof import('./src/components/SvgIcon/index.vue')['default']
+ SwitchDark: typeof import('./src/components/SwitchDark/index.vue')['default']
+ TableColumn: typeof import('./src/components/ProTable/components/TableColumn.vue')['default']
+ TreeFilter: typeof import('./src/components/TreeFilter/index.vue')['default']
+ WangEditor: typeof import('./src/components/WangEditor/index.vue')['default']
+ }
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..408b03c
--- /dev/null
+++ b/index.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+ Vite + Vue + TS
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d794991
--- /dev/null
+++ b/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "vue3ts-template",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vue-tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.0.10",
+ "@vueuse/core": "^8.0.1",
+ "@wangeditor/editor": "^5.1.12",
+ "@wangeditor/editor-for-vue": "^5.1.12",
+ "axios": "^1.2.1",
+ "echarts": "^5.3.0",
+ "echarts-liquidfill": "^3.1.0",
+ "element-plus": "^2.2.27",
+ "js-md5": "^0.7.3",
+ "mitt": "^3.0.0",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.0.28",
+ "pinia-plugin-persistedstate": "^3.0.1",
+ "print-js": "^1.6.0",
+ "qs": "^6.11.0",
+ "sortablejs": "^1.15.0",
+ "vue": "^3.2.45",
+ "vue-i18n": "^9.1.9",
+ "vue-router": "^4.1.6",
+ "vue3-seamless-scroll": "^1.2.0",
+ "vuedraggable": "^4.1.0"
+ },
+ "devDependencies": {
+ "@types/node": "^17.0.31",
+ "@types/sortablejs": "^1.15.0",
+ "@vitejs/plugin-vue": "^4.0.0",
+ "@vitejs/plugin-vue-jsx": "^1.3.10",
+ "autoprefixer": "^10.4.7",
+ "postcss": "^8.4.14",
+ "postcss-html": "^1.4.1",
+ "rollup-plugin-visualizer": "^5.5.4",
+ "sass": "^1.49.7",
+ "typescript": "^4.5.4",
+ "unplugin-auto-import": "^0.12.1",
+ "unplugin-vue-components": "^0.22.12",
+ "vite": "^4.0.4",
+ "vite-plugin-cdn-import": "^0.3.5",
+ "vite-plugin-compression": "^0.5.1",
+ "vite-plugin-html": "^3.2.0",
+ "vite-plugin-svg-icons": "^2.0.1",
+ "vite-plugin-vue-setup-extend": "^0.4.0",
+ "vue-tsc": "^1.0.22"
+ }
+}
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..b8f0b06
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
diff --git a/src/api/config/servicePort.ts b/src/api/config/servicePort.ts
new file mode 100644
index 0000000..861956b
--- /dev/null
+++ b/src/api/config/servicePort.ts
@@ -0,0 +1,3 @@
+// * 后端微服务端口名
+export const PORT1 = "/geeker";
+export const PORT2 = "/hooks";
diff --git a/src/api/helper/axiosCancel.ts b/src/api/helper/axiosCancel.ts
new file mode 100644
index 0000000..c871edf
--- /dev/null
+++ b/src/api/helper/axiosCancel.ts
@@ -0,0 +1,65 @@
+// ? 暂时没使用取消请求,目前全局 loading 已经能控制重复请求了
+import axios, { AxiosRequestConfig, Canceler } from "axios"; //AxiosRequestConfig axios 配置
+import { isFunction } from "@/utils/is/index";
+import qs from "qs"; //获取url上的参数
+
+// * 声明一个 Map 用于存储每个请求的标识 和 取消函数
+let pendingMap = new Map();
+
+// * 序列化参数
+export const getPendingUrl = (config: AxiosRequestConfig) =>
+ // qs.stringify 将对象或者数组序列化成URL的格式 join数组转字符串
+ [config.method, config.url, qs.stringify(config.data), qs.stringify(config.params)].join("&");
+
+export class AxiosCanceler {
+ /**
+ * @description: 添加请求
+ * @param {Object} config
+ * @return void
+ */
+ addPending(config: AxiosRequestConfig) {
+ // * 在请求开始前,对之前的请求做检查取消操作
+ this.removePending(config);
+ const url = getPendingUrl(config);
+ config.cancelToken =
+ config.cancelToken ||
+ new axios.CancelToken(cancel => {
+ if (!pendingMap.has(url)) {
+ // 如果 pending 中不存在当前请求,则添加进去
+ pendingMap.set(url, cancel);
+ }
+ });
+ }
+
+ /**
+ * @description: 移除请求
+ * @param {Object} config
+ */
+ removePending(config: AxiosRequestConfig) {
+ const url = getPendingUrl(config);
+
+ if (pendingMap.has(url)) {
+ // 如果在 pending 中存在当前请求标识,需要取消当前请求,并且移除
+ const cancel = pendingMap.get(url);
+ cancel && cancel();
+ pendingMap.delete(url);
+ }
+ }
+
+ /**
+ * @description: 清空所有pending
+ */
+ removeAllPending() {
+ pendingMap.forEach(cancel => {
+ cancel && isFunction(cancel) && cancel();
+ });
+ pendingMap.clear();
+ }
+
+ /**
+ * @description: 重置
+ */
+ reset(): void {
+ pendingMap = new Map();
+ }
+}
diff --git a/src/api/helper/checkStatus.ts b/src/api/helper/checkStatus.ts
new file mode 100644
index 0000000..33074cd
--- /dev/null
+++ b/src/api/helper/checkStatus.ts
@@ -0,0 +1,43 @@
+import { ElMessage } from "element-plus";
+
+/**
+ * @description: 校验网络请求状态码
+ * @param {Number} status
+ * @return void
+ */
+export const checkStatus = (status: number): void => {
+ switch (status) {
+ case 400:
+ ElMessage.error("请求失败!请您稍后重试");
+ break;
+ case 401:
+ ElMessage.error("登录失效!请您重新登录");
+ break;
+ case 403:
+ ElMessage.error("当前账号无权限访问!");
+ break;
+ case 404:
+ ElMessage.error("你所访问的资源不存在!");
+ break;
+ case 405:
+ ElMessage.error("请求方式错误!请您稍后重试");
+ break;
+ case 408:
+ ElMessage.error("请求超时!请您稍后重试");
+ break;
+ case 500:
+ ElMessage.error("服务异常!");
+ break;
+ case 502:
+ ElMessage.error("网关错误!");
+ break;
+ case 503:
+ ElMessage.error("服务不可用!");
+ break;
+ case 504:
+ ElMessage.error("网关超时!");
+ break;
+ default:
+ ElMessage.error("请求失败!");
+ }
+};
diff --git a/src/api/index.ts b/src/api/index.ts
new file mode 100644
index 0000000..85d6ed6
--- /dev/null
+++ b/src/api/index.ts
@@ -0,0 +1,108 @@
+import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from "axios";
+import { showFullScreenLoading, tryHideFullScreenLoading } from "@/config/serviceLoading";
+import { ResultData } from "@/api/interface";
+import { ResultEnum } from "@/enums/httpEnum";
+import { checkStatus } from "./helper/checkStatus";
+import { ElMessage } from "element-plus";
+import { GlobalStore } from "@/stores";
+import { LOGIN_URL } from "@/config/config";
+import router from "@/routers";
+
+/**
+ * pinia 错误使用说明示例
+ * https://github.com/vuejs/pinia/discussions/971
+ * https://github.com/vuejs/pinia/discussions/664#discussioncomment-1329898
+ * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#single-page-applications
+ */
+
+const config = {
+ // 默认地址请求地址,可在 .env 开头文件中修改
+ baseURL: import.meta.env.VITE_API_URL as string,
+ // 设置超时时间(10s)
+ timeout: ResultEnum.TIMEOUT as number,
+ // 跨域时候允许携带凭证
+ withCredentials: true
+};
+
+class RequestHttp {
+ service: AxiosInstance;
+ public constructor(config: AxiosRequestConfig) {
+ // 实例化axios
+ this.service = axios.create(config);
+
+ /**
+ * @description 请求拦截器
+ * 客户端发送请求 -> [请求拦截器] -> 服务器
+ * token校验(JWT) : 接受服务器返回的token,存储到vuex/pinia/本地储存当中
+ */
+ this.service.interceptors.request.use(
+ (config: AxiosRequestConfig) => {
+ const globalStore = GlobalStore();
+ // * 如果当前请求不需要显示 loading,在 api 服务中通过指定的第三个参数: { headers: { noLoading: true } }来控制不显示loading,参见loginApi
+ config.headers!.noLoading || showFullScreenLoading();
+ const token: string = globalStore.token;
+ return { ...config, headers: { ...config.headers, "x-access-token": token } };
+ },
+ (error: AxiosError) => {
+ return Promise.reject(error);
+ }
+ );
+
+ /**
+ * @description 响应拦截器
+ * 服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
+ */
+ this.service.interceptors.response.use(
+ (response: AxiosResponse) => {
+ const { data } = response;
+ const globalStore = GlobalStore();
+ // * 在请求结束后,并关闭请求 loading
+ tryHideFullScreenLoading();
+ // * 登陆失效(code == 599)
+ if (data.code == ResultEnum.OVERDUE) {
+ ElMessage.error(data.msg);
+ globalStore.setToken("");
+ router.replace(LOGIN_URL);
+ return Promise.reject(data);
+ }
+ // * 全局错误信息拦截(防止下载文件得时候返回数据流,没有code,直接报错)
+ if (data.code && data.code !== ResultEnum.SUCCESS) {
+ ElMessage.error(data.msg);
+ return Promise.reject(data);
+ }
+ // * 成功请求(在页面上除非特殊情况,否则不用处理失败逻辑)
+ return data;
+ },
+ async (error: AxiosError) => {
+ const { response } = error;
+ tryHideFullScreenLoading();
+ // 请求超时单独判断,因为请求超时没有 response
+ if (error.message.indexOf("timeout") !== -1) ElMessage.error("请求超时!请您稍后重试");
+ // 根据响应的错误状态码,做不同的处理
+ if (response) checkStatus(response.status);
+ // 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:可以跳转到断网页面
+ if (!window.navigator.onLine) router.replace("/500");
+ return Promise.reject(error);
+ }
+ );
+ }
+
+ // * 常用请求方法封装
+ get(url: string, params?: object, _object = {}): Promise> {
+ return this.service.get(url, { params, ..._object });
+ }
+ post(url: string, params?: object, _object = {}): Promise> {
+ return this.service.post(url, params, _object);
+ }
+ put(url: string, params?: object, _object = {}): Promise> {
+ return this.service.put(url, params, _object);
+ }
+ delete(url: string, params?: any, _object = {}): Promise> {
+ return this.service.delete(url, { params, ..._object });
+ }
+ download(url: string, params?: object, _object = {}): Promise {
+ return this.service.post(url, params, _object);
+ }
+}
+
+export default new RequestHttp(config);
diff --git a/src/api/interface/index.ts b/src/api/interface/index.ts
new file mode 100644
index 0000000..90c84ac
--- /dev/null
+++ b/src/api/interface/index.ts
@@ -0,0 +1,93 @@
+// * 请求响应参数(不包含data)
+export interface Result {
+ code: string;
+ msg: string;
+}
+
+// * 请求响应参数(包含data)
+export interface ResultData extends Result {
+ data: T;
+}
+
+// * 分页响应参数
+export interface ResPage {
+ datalist: T[];
+ pageNum: number;
+ pageSize: number;
+ total: number;
+}
+
+// * 分页请求参数
+export interface ReqPage {
+ pageNum: number;
+ pageSize: number;
+}
+
+// * 文件上传模块
+export namespace Upload {
+ export interface ResFileUrl {
+ fileUrl: string;
+ }
+}
+
+// * 登录模块
+export namespace Login {
+ export interface ReqLoginForm {
+ username: string;
+ password: string;
+ }
+ export interface ResLogin {
+ access_token: string;
+ }
+ export interface ResAuthButtons {
+ [key: string]: string[];
+ }
+}
+
+// * 用户管理模块
+export namespace User {
+ export interface ReqUserParams extends ReqPage {
+ username: string;
+ gender: number;
+ idCard: string;
+ email: string;
+ address: string;
+ createTime: string[];
+ status: number;
+ }
+ export interface ResUserList {
+ id: string;
+ username: string;
+ gender: string;
+ user: {
+ detail: {
+ age: number;
+ };
+ };
+ idCard: string;
+ email: string;
+ address: string;
+ createTime: string;
+ status: number;
+ avatar: string;
+ children?: ResUserList[];
+ }
+ export interface ResStatus {
+ userLabel: string;
+ userValue: number;
+ }
+ export interface ResGender {
+ genderLabel: string;
+ genderValue: number;
+ }
+ export interface ResDepartment {
+ id: string;
+ name: string;
+ children?: ResDepartment[];
+ }
+ export interface ResRole {
+ id: string;
+ name: string;
+ children?: ResDepartment[];
+ }
+}
diff --git a/src/api/modules/login.ts b/src/api/modules/login.ts
new file mode 100644
index 0000000..95a1cd5
--- /dev/null
+++ b/src/api/modules/login.ts
@@ -0,0 +1,39 @@
+import { Login } from "@/api/interface/index";
+import { PORT1 } from "@/api/config/servicePort";
+// import DynamicRouter from "@/assets/json/dynamicRouter.json";
+import menuList from "@/assets/json/menuList.json";
+
+import AuthButtons from "@/assets/json/authButtons.json";
+import qs from "qs";
+import http from "@/api";
+
+/**
+ * @name 登录模块
+ */
+// * 用户登录
+export const loginApi = (params: Login.ReqLoginForm) => {
+ return http.post(PORT1 + `/login`, params, { headers: { noLoading: true } }); // 正常 post json 请求 ==> application/json
+ return http.post(PORT1 + `/login`, params, { headers: { noLoading: true } }); // 控制当前请求不显示 loading
+ return http.post(PORT1 + `/login`, {}, { params }); // post 请求携带 query 参数 ==> ?username=system&password=123456
+ return http.post(PORT1 + `/login`, qs.stringify(params)); // post 请求携带表单参数 ==> application/x-www-form-urlencoded
+ return http.get(PORT1 + `/login?${qs.stringify(params, { arrayFormat: "repeat" })}`); // 如果是 get 请求可以携带数组等复杂参数
+};
+
+// * 获取按钮权限
+export const getAuthButtonListApi = () => {
+ return http.get(PORT1 + `/auth/buttons`, {}, { headers: { noLoading: true } });
+ // 如果想让按钮权限变为本地数据,注释上一行代码,并引入本地 authButtons.json 数据
+ return AuthButtons;
+};
+
+// * 获取菜单列表
+export const getAuthMenuListApi = () => {
+ // return http.get(PORT1 + `/menu/list`, {}, { headers: { noLoading: true } });
+ // 如果想让菜单变为本地数据,注释上一行代码,并引入本地 dynamicRouter.json 数据
+ return menuList;
+};
+
+// * 用户退出登录
+export const logoutApi = () => {
+ return http.post(PORT1 + `/logout`);
+};
diff --git a/src/api/modules/upload.ts b/src/api/modules/upload.ts
new file mode 100644
index 0000000..1c696f3
--- /dev/null
+++ b/src/api/modules/upload.ts
@@ -0,0 +1,16 @@
+import { Upload } from "@/api/interface/index";
+import { PORT1 } from "@/api/config/servicePort";
+import http from "@/api";
+
+/**
+ * @name 文件上传模块
+ */
+// * 图片上传
+export const uploadImg = (params: FormData) => {
+ return http.post(PORT1 + `/file/upload/img`, params);
+};
+
+// * 视频上传
+export const uploadVideo = (params: FormData) => {
+ return http.post(PORT1 + `/file/upload/video`, params);
+};
diff --git a/src/api/modules/user.ts b/src/api/modules/user.ts
new file mode 100644
index 0000000..0689fc9
--- /dev/null
+++ b/src/api/modules/user.ts
@@ -0,0 +1,66 @@
+import { ResPage, User } from "@/api/interface/index";
+import { PORT1 } from "@/api/config/servicePort";
+import http from "@/api";
+
+/**
+ * @name 用户管理模块
+ */
+// * 获取用户列表
+export const getUserList = (params: User.ReqUserParams) => {
+ return http.post>(PORT1 + `/user/list`, params);
+};
+
+// * 新增用户
+export const addUser = (params: { id: string }) => {
+ return http.post(PORT1 + `/user/add`, params);
+};
+
+// * 批量添加用户
+export const BatchAddUser = (params: FormData) => {
+ return http.post(PORT1 + `/user/import`, params);
+};
+
+// * 编辑用户
+export const editUser = (params: { id: string }) => {
+ return http.post(PORT1 + `/user/edit`, params);
+};
+
+// * 删除用户
+export const deleteUser = (params: { id: string[] }) => {
+ return http.post(PORT1 + `/user/delete`, params);
+};
+
+// * 切换用户状态
+export const changeUserStatus = (params: { id: string; status: number }) => {
+ return http.post(PORT1 + `/user/change`, params);
+};
+
+// * 重置用户密码
+export const resetUserPassWord = (params: { id: string }) => {
+ return http.post(PORT1 + `/user/rest_password`, params);
+};
+
+// * 导出用户数据
+export const exportUserInfo = (params: User.ReqUserParams) => {
+ return http.download(PORT1 + `/user/export`, params, { responseType: "blob" });
+};
+
+// * 获取用户状态
+export const getUserStatus = () => {
+ return http.get(PORT1 + `/user/status`);
+};
+
+// * 获取用户性别字典
+export const getUserGender = () => {
+ return http.get(PORT1 + `/user/gender`);
+};
+
+// * 获取用户部门列表
+export const getUserDepartment = () => {
+ return http.get(PORT1 + `/user/department`);
+};
+
+// * 获取用户角色字典
+export const getUserRole = () => {
+ return http.get(PORT1 + `/user/role`);
+};
diff --git a/src/assets/fonts/DIN.otf b/src/assets/fonts/DIN.otf
new file mode 100644
index 0000000000000000000000000000000000000000..3296d1ea7b33a481e682017496ac38c26d7df5a4
GIT binary patch
literal 27828
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
literal 0
HcmV?d00001
diff --git a/src/assets/fonts/MetroDF.ttf b/src/assets/fonts/MetroDF.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..9d31af4977002c65bad9cbc521764401d5035890
GIT binary patch
literal 106934
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