From 3db2285317ba6a9565824d9504addee1e14a7cae Mon Sep 17 00:00:00 2001 From: vben Date: Wed, 8 Nov 2023 23:50:11 +0800 Subject: [PATCH] chore: update deps --- .gitignore | 4 + .vscode/settings.json | 88 +- README.md | 1 - README.zh-CN.md | 1 - apps/backend/.gitkeep | 0 apps/vben-admin/.env.analyze | 2 +- apps/vben-admin/.env.development | 2 +- apps/vben-admin/.env.production | 2 +- apps/vben-admin/.gitkeep | 0 apps/vben-admin/index.html | 4 +- apps/vben-admin/mock/user.ts | 8 +- apps/vben-admin/package.json | 23 +- apps/vben-admin/preference.ts | 1 - apps/vben-admin/public/logo.png | Bin 4042 -> 28304 bytes apps/vben-admin/src/App.vue | 38 +- apps/vben-admin/src/layouts/basic/index.vue | 68 - .../components/header/UserDropdown.vue | 83 + .../src/layouts/components/header/index.vue | 35 + .../src/layouts/components/menu/index.vue | 45 + .../layouts/components/menu/useMenuState.ts | 81 + apps/vben-admin/src/layouts/index.ts | 1 - apps/vben-admin/src/layouts/index.vue | 56 + apps/vben-admin/src/main.ts | 24 +- apps/vben-admin/src/router/guard/access.ts | 145 +- apps/vben-admin/src/router/guard/index.ts | 4 +- apps/vben-admin/src/router/index.ts | 47 +- apps/vben-admin/src/router/routes/index.ts | 99 +- .../src/services/modules/user/index.ts | 10 +- .../src/services/modules/user/typing.ts | 4 +- apps/vben-admin/src/services/request.ts | 14 +- apps/vben-admin/src/views/login/LoginForm.vue | 20 +- apps/vben-admin/src/views/login/index.vue | 4 +- apps/vben-admin/src/views/test/test1.vue | 3 + apps/vben-admin/src/views/test/test2.vue | 3 + apps/vben-admin/src/views/test/test3.vue | 3 + apps/vben-admin/tsconfig.json | 4 +- .../{vite.config.ts => vite.config.mts} | 10 +- internal/eslint-config/package.json | 26 +- internal/eslint-config/src/index.ts | 3 +- internal/eslint-config/tsconfig.json | 2 +- internal/prettier-config/package.json | 4 +- internal/prettier-config/tsconfig.json | 2 +- internal/stylelint-config/package.json | 24 +- internal/stylelint-config/src/index.ts | 35 +- internal/stylelint-config/tsconfig.json | 2 +- internal/stylelint-config/yarn.lock | 1349 ---- internal/ts-config/node-server.json | 18 - internal/{ts-config => tsconfig}/base.json | 0 internal/tsconfig/library.json | 13 + internal/{ts-config => tsconfig}/node.json | 0 internal/{ts-config => tsconfig}/package.json | 10 +- internal/{ts-config => tsconfig}/web.json | 4 +- internal/vite-config/build.config.ts | 3 - internal/vite-config/package.json | 36 +- .../vite-config/src/config/application.ts | 39 +- internal/vite-config/src/config/common.ts | 5 +- internal/vite-config/src/config/package.ts | 4 +- internal/vite-config/src/plugins/index.ts | 8 - internal/vite-config/src/plugins/svgSprite.ts | 17 - internal/vite-config/tsconfig.json | 2 +- monorepo.code-workspace | 38 +- package.json | 38 +- .../{assets => _preference}/.eslintrc.cjs | 0 .../{ui/ant-ui => _preference}/package.json | 32 +- packages/_preference/src/createPreference.ts | 39 + packages/_preference/src/custom/index.ts | 16 + packages/_preference/src/index.ts | 24 + .../{design => _preference}/tsconfig.json | 2 +- packages/assets/src/iamges/logo.png | Bin 4042 -> 0 bytes packages/assets/src/index.ts | 8 - packages/assets/vite.config.ts | 3 - packages/design/build.config.ts | 10 - packages/design/src/common/global.scss | 27 - packages/hooks/package.json | 13 +- packages/hooks/src/index.ts | 1 - packages/hooks/src/onMountedOrActivated.ts | 2 +- packages/hooks/src/useWindowSizeFn.ts | 2 +- packages/hooks/tsconfig.json | 2 +- packages/{design => icons}/.eslintrc.cjs | 0 packages/{assets => icons}/package.json | 20 +- packages/icons/src/iconify-icons/iconPark.ts | 8 + packages/icons/src/iconify-icons/index.ts | 1 + packages/icons/src/index.ts | 4 + packages/icons/src/svg-icons/index.ts | 6 + packages/icons/src/svg-icons/init.ts | 25 + packages/icons/src/svg-icons/svg/avatar.svg | 1 + packages/{assets => icons}/tsconfig.json | 2 +- packages/layout/package.json | 24 +- packages/layout/src/VbenLayout.vue | 75 +- .../layout/src/components/LayoutFooter.vue | 4 +- .../layout/src/components/LayoutHeader.vue | 22 +- packages/layout/src/components/LayoutSide.vue | 94 +- packages/layout/src/components/LayoutTab.vue | 4 +- packages/layout/tsconfig.json | 2 +- packages/layout/vite.config.ts | 3 - packages/shared/README.md | 7 + packages/shared/src/constants/design.ts | 50 - packages/shared/src/constants/index.ts | 3 - packages/shared/src/constants/static.ts | 12 - packages/shared/src/constants/vben.ts | 21 - packages/shared/src/index.ts | 2 - packages/shared/{ => styles}/.eslintrc.cjs | 0 .../{design => shared/styles}/package.json | 11 +- .../styles}/src/common/entry.scss | 0 packages/shared/styles/src/common/global.scss | 27 + packages/shared/styles/src/common/reset.scss | 8 + .../index.ts => shared/styles/src/index.mjs} | 2 + .../styles/src/shared.scss} | 2 +- packages/shared/{ => styles}/tsconfig.json | 2 +- .../{types => shared/toolkit}/.eslintrc.cjs | 0 packages/shared/{ => toolkit}/build.config.ts | 0 packages/shared/{ => toolkit}/package.json | 16 +- .../src}/__tests__/data.test.ts | 0 .../src}/__tests__/hash.test.ts | 0 .../src}/__tests__/inferene.test.ts | 0 .../src}/__tests__/tree.test.ts | 0 .../shared/{src/utils => toolkit/src}/date.ts | 0 .../shared/{src/utils => toolkit/src}/hash.ts | 0 .../{src/utils => toolkit/src}/index.ts | 1 + .../{src/utils => toolkit/src}/inference.ts | 0 .../{src/utils => toolkit/src}/logger.ts | 0 .../toolkit/src/namespace.ts} | 7 +- .../shared/{src/utils => toolkit/src}/tree.ts | 11 +- .../ant-ui => shared/toolkit}/tsconfig.json | 2 +- .../ant-ui => shared/typings}/.eslintrc.cjs | 0 .../typings}/build.config.ts | 3 - packages/shared/typings/global.d.ts | 28 + .../{types => shared/typings}/package.json | 13 +- packages/shared/typings/src/index.ts | 4 + .../typings/src/menuRecord.ts} | 8 + packages/shared/typings/src/preference.ts | 23 + .../{types => shared/typings}/src/shared.ts | 0 .../{types => shared/typings}/src/tools.ts | 16 +- packages/shared/typings/tsconfig.json | 5 + packages/store/package.json | 15 +- packages/store/src/index.ts | 3 +- packages/store/src/modules/access.ts | 93 + packages/store/src/modules/preference.ts | 22 +- packages/store/src/modules/user.ts | 75 - packages/store/tsconfig.json | 2 +- packages/types/build.config.ts | 7 - packages/types/src/global.ts | 8 - packages/types/src/index.ts | 3 - packages/types/tsconfig.json | 5 - packages/ui/ant-ui/src/menu/SubMenu.vue | 39 - packages/ui/ant-ui/src/menu/index.vue | 80 - packages/ui/ant-ui/vite.config.ts | 3 - packages/ui/antv-ui/.eslintrc.cjs | 3 + packages/ui/antv-ui/package.json | 36 + packages/ui/{ant-ui => antv-ui}/src/index.ts | 0 packages/ui/antv-ui/src/menu/SubMenu.vue | 39 + packages/ui/antv-ui/src/menu/index.vue | 100 + packages/ui/antv-ui/tsconfig.json | 4 + packages/ui/share-ui/package.json | 26 +- packages/ui/share-ui/src/icon/index.vue | 104 - packages/ui/share-ui/src/index.ts | 5 +- packages/ui/share-ui/src/login/index.vue | 33 +- .../share-ui/src/login}/login-bg-dark.svg | 0 .../share-ui/src/login}/login-bg.svg | 0 .../share-ui/src/login}/login-slogan.svg | 2 +- packages/ui/share-ui/src/logo/index.vue | 101 + packages/ui/share-ui/src/not-found/index.vue | 16 +- .../src/not-found}/page-not-found.svg | 0 packages/ui/share-ui/src/redirect/index.vue | 2 +- packages/ui/share-ui/src/svg-icon/index.vue | 65 - packages/ui/share-ui/tsconfig.json | 3 +- packages/ui/share-ui/vite.config.ts | 3 - pnpm-lock.yaml | 6242 ++++++++--------- turbo.json | 5 +- 169 files changed, 4571 insertions(+), 5952 deletions(-) delete mode 100644 apps/backend/.gitkeep delete mode 100644 apps/vben-admin/.gitkeep delete mode 100644 apps/vben-admin/preference.ts delete mode 100644 apps/vben-admin/src/layouts/basic/index.vue create mode 100644 apps/vben-admin/src/layouts/components/header/UserDropdown.vue create mode 100644 apps/vben-admin/src/layouts/components/header/index.vue create mode 100644 apps/vben-admin/src/layouts/components/menu/index.vue create mode 100644 apps/vben-admin/src/layouts/components/menu/useMenuState.ts delete mode 100644 apps/vben-admin/src/layouts/index.ts create mode 100644 apps/vben-admin/src/layouts/index.vue create mode 100644 apps/vben-admin/src/views/test/test1.vue create mode 100644 apps/vben-admin/src/views/test/test2.vue create mode 100644 apps/vben-admin/src/views/test/test3.vue rename apps/vben-admin/{vite.config.ts => vite.config.mts} (57%) delete mode 100644 internal/stylelint-config/yarn.lock delete mode 100644 internal/ts-config/node-server.json rename internal/{ts-config => tsconfig}/base.json (100%) create mode 100644 internal/tsconfig/library.json rename internal/{ts-config => tsconfig}/node.json (100%) rename internal/{ts-config => tsconfig}/package.json (75%) rename internal/{ts-config => tsconfig}/web.json (73%) delete mode 100644 internal/vite-config/src/plugins/svgSprite.ts rename packages/{assets => _preference}/.eslintrc.cjs (100%) rename packages/{ui/ant-ui => _preference}/package.json (53%) create mode 100644 packages/_preference/src/createPreference.ts create mode 100644 packages/_preference/src/custom/index.ts create mode 100644 packages/_preference/src/index.ts rename packages/{design => _preference}/tsconfig.json (64%) delete mode 100644 packages/assets/src/iamges/logo.png delete mode 100644 packages/assets/src/index.ts delete mode 100644 packages/assets/vite.config.ts delete mode 100644 packages/design/build.config.ts delete mode 100644 packages/design/src/common/global.scss rename packages/{design => icons}/.eslintrc.cjs (100%) rename packages/{assets => icons}/package.json (55%) create mode 100644 packages/icons/src/iconify-icons/iconPark.ts create mode 100644 packages/icons/src/iconify-icons/index.ts create mode 100644 packages/icons/src/index.ts create mode 100644 packages/icons/src/svg-icons/index.ts create mode 100644 packages/icons/src/svg-icons/init.ts create mode 100644 packages/icons/src/svg-icons/svg/avatar.svg rename packages/{assets => icons}/tsconfig.json (65%) delete mode 100644 packages/layout/vite.config.ts create mode 100644 packages/shared/README.md delete mode 100644 packages/shared/src/constants/design.ts delete mode 100644 packages/shared/src/constants/index.ts delete mode 100644 packages/shared/src/constants/static.ts delete mode 100644 packages/shared/src/constants/vben.ts delete mode 100644 packages/shared/src/index.ts rename packages/shared/{ => styles}/.eslintrc.cjs (100%) rename packages/{design => shared/styles}/package.json (75%) rename packages/{design => shared/styles}/src/common/entry.scss (100%) create mode 100644 packages/shared/styles/src/common/global.scss create mode 100644 packages/shared/styles/src/common/reset.scss rename packages/{design/src/index.ts => shared/styles/src/index.mjs} (75%) rename packages/{design/src/_shared.scss => shared/styles/src/shared.scss} (94%) rename packages/shared/{ => styles}/tsconfig.json (64%) rename packages/{types => shared/toolkit}/.eslintrc.cjs (100%) rename packages/shared/{ => toolkit}/build.config.ts (100%) rename packages/shared/{ => toolkit}/package.json (78%) rename packages/shared/{src/utils => toolkit/src}/__tests__/data.test.ts (100%) rename packages/shared/{src/utils => toolkit/src}/__tests__/hash.test.ts (100%) rename packages/shared/{src/utils => toolkit/src}/__tests__/inferene.test.ts (100%) rename packages/shared/{src/utils => toolkit/src}/__tests__/tree.test.ts (100%) rename packages/shared/{src/utils => toolkit/src}/date.ts (100%) rename packages/shared/{src/utils => toolkit/src}/hash.ts (100%) rename packages/shared/{src/utils => toolkit/src}/index.ts (81%) rename packages/shared/{src/utils => toolkit/src}/inference.ts (100%) rename packages/shared/{src/utils => toolkit/src}/logger.ts (100%) rename packages/{hooks/src/useNamespace.ts => shared/toolkit/src/namespace.ts} (92%) rename packages/shared/{src/utils => toolkit/src}/tree.ts (95%) rename packages/{ui/ant-ui => shared/toolkit}/tsconfig.json (64%) rename packages/{ui/ant-ui => shared/typings}/.eslintrc.cjs (100%) rename packages/{assets => shared/typings}/build.config.ts (80%) create mode 100644 packages/shared/typings/global.d.ts rename packages/{types => shared/typings}/package.json (80%) create mode 100644 packages/shared/typings/src/index.ts rename packages/{types/src/menu.ts => shared/typings/src/menuRecord.ts} (82%) create mode 100644 packages/shared/typings/src/preference.ts rename packages/{types => shared/typings}/src/shared.ts (100%) rename packages/{types => shared/typings}/src/tools.ts (89%) create mode 100644 packages/shared/typings/tsconfig.json create mode 100644 packages/store/src/modules/access.ts delete mode 100644 packages/store/src/modules/user.ts delete mode 100644 packages/types/build.config.ts delete mode 100644 packages/types/src/global.ts delete mode 100644 packages/types/src/index.ts delete mode 100644 packages/types/tsconfig.json delete mode 100644 packages/ui/ant-ui/src/menu/SubMenu.vue delete mode 100644 packages/ui/ant-ui/src/menu/index.vue delete mode 100644 packages/ui/ant-ui/vite.config.ts create mode 100644 packages/ui/antv-ui/.eslintrc.cjs create mode 100644 packages/ui/antv-ui/package.json rename packages/ui/{ant-ui => antv-ui}/src/index.ts (100%) create mode 100644 packages/ui/antv-ui/src/menu/SubMenu.vue create mode 100644 packages/ui/antv-ui/src/menu/index.vue create mode 100644 packages/ui/antv-ui/tsconfig.json delete mode 100644 packages/ui/share-ui/src/icon/index.vue rename packages/{assets/src/svg => ui/share-ui/src/login}/login-bg-dark.svg (100%) rename packages/{assets/src/svg => ui/share-ui/src/login}/login-bg.svg (100%) rename packages/{assets/src/svg => ui/share-ui/src/login}/login-slogan.svg (99%) create mode 100644 packages/ui/share-ui/src/logo/index.vue rename packages/{assets/src/svg => ui/share-ui/src/not-found}/page-not-found.svg (100%) delete mode 100644 packages/ui/share-ui/src/svg-icon/index.vue delete mode 100644 packages/ui/share-ui/vite.config.ts diff --git a/.gitignore b/.gitignore index d3a94c00..5adb2c9c 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,10 @@ yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* +vite.config.mts.* +vite.config.mjs.* +vite.config.js.* +vite.config.ts.* # Editor directories and files .idea diff --git a/.vscode/settings.json b/.vscode/settings.json index b42bccc8..df74378d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,6 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "files.eol": "\n", "npm.packageManager": "pnpm", - "eslint.packageManager": "pnpm", "stylelint.packageManager": "pnpm", "search.exclude": { "**/node_modules": true, @@ -19,20 +18,15 @@ "**/.DS_Store": true, "**/.idea": true, "**/.vscode": false, - "**/yarn.lock": true, "**/tmp": true, + "*.xml": true, "out": true, "dist": true, "node_modules": true, - "CHANGELOG.md": true, - "examples": true, - "res": true, - "screenshots": true, - "yarn-error.log": true, - "**/.yarn": true + "CHANGELOG.md": true }, "files.exclude": { - "**/.cache": true, + "**/.cache": false, "**/.editorconfig": true, "**/.eslintcache": true, "**/bower_components": true, @@ -57,81 +51,12 @@ }, "stylelint.enable": true, "stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"], - "[javascriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[typescriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[html]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[css]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[less]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[markdown]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, "editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.fixAll.stylelint": true }, - "[vue]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true, - "source.fixAll.stylelint": true - } - }, - "i18n-ally.localesPaths": ["src/locales/lang"], - "i18n-ally.keystyle": "nested", - "i18n-ally.sortKeys": true, - "i18n-ally.namespace": true, - "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}", - "i18n-ally.enabledParsers": ["ts"], - "i18n-ally.sourceLanguage": "en", - "i18n-ally.displayLanguage": "zh-CN", - "i18n-ally.enabledFrameworks": ["vue", "react"], - "cSpell.words": [ - "vben", - "browserslist", - "tailwindcss", - "esnext", - "antv", - "sider", - "pinia", - "sider", - "nprogress", - "INTLIFY", - "stylelint", - "esno", - "vitejs", - "sortablejs", - "mockjs", - "codemirror", - "iconify", - "commitlint", - "echarts", - "cropperjs", - "logicflow", - "vueuse", - "zxcvbn", - "lintstagedrc", - "brotli", - "tailwindcss", - "sider", - "pnpm", - "antd", - "unref" - ], + + "cSpell.words": ["vben", "iconify", "pinia", "nprogress"], // 控制相关文件嵌套展示 "explorer.fileNesting.enabled": true, "explorer.fileNesting.expand": false, @@ -144,5 +69,6 @@ "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,.npmrc,.browserslistrc,.nvmrc", ".eslintrc.cjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,.stylelintrc.*,.lintstagedrc" }, - "terminal.integrated.scrollback": 10000 + "terminal.integrated.scrollback": 10000, + "search.followSymlinks": false } diff --git a/README.md b/README.md index 81069451..c99e4ccf 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,6 @@ If these plugins are helpful to you, you can give a star support - [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - Used for local and development environment data mock - [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - Used for html template conversion and compression - [vite-plugin-compression](https://github.com/anncwb/vite-plugin-compression) - Used to pack input .gz|.brotil files -- [vite-plugin-svg-icons](https://github.com/anncwb/vite-plugin-svg-icons) - Used to quickly generate svg sprite ## Browser support diff --git a/README.zh-CN.md b/README.zh-CN.md index d5db0c2e..1d227364 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -142,7 +142,6 @@ pnpm build - [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - 用于本地及开发环境数据 mock - [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - 用于 html 模版转换及压缩 - [vite-plugin-compression](https://github.com/anncwb/vite-plugin-compression) - 用于打包输出.gz|.brotil 文件 -- [vite-plugin-svg-icons](https://github.com/anncwb/vite-plugin-svg-icons) - 用于快速生成 svg 雪碧图 ## 后台整合示例 diff --git a/apps/backend/.gitkeep b/apps/backend/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/vben-admin/.env.analyze b/apps/vben-admin/.env.analyze index 9eada8ac..70480a98 100644 --- a/apps/vben-admin/.env.analyze +++ b/apps/vben-admin/.env.analyze @@ -11,7 +11,7 @@ VITE_BUILD_COMPRESS = 'none' # Basic interface address SPA -VITE_GLOB_API_URL=/basic-api +VITE_GLOB_API_URL=/vben-api # Interface prefix VITE_GLOB_API_URL_PREFIX= diff --git a/apps/vben-admin/.env.development b/apps/vben-admin/.env.development index e4e63047..7d5f7cc7 100644 --- a/apps/vben-admin/.env.development +++ b/apps/vben-admin/.env.development @@ -2,6 +2,6 @@ VITE_USE_MOCK = true VITE_PUBLIC_PATH = / -VITE_GLOB_API_URL=/req-api +VITE_GLOB_API_URL=/vben-api VITE_GLOB_API_URL_PREFIX= diff --git a/apps/vben-admin/.env.production b/apps/vben-admin/.env.production index a91f9eee..a86310d5 100644 --- a/apps/vben-admin/.env.production +++ b/apps/vben-admin/.env.production @@ -11,7 +11,7 @@ VITE_BUILD_COMPRESS = 'none' # Basic interface address SPA -VITE_GLOB_API_URL=/req-api +VITE_GLOB_API_URL=/vben-api # Interface prefix VITE_GLOB_API_URL_PREFIX= diff --git a/apps/vben-admin/.gitkeep b/apps/vben-admin/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/vben-admin/index.html b/apps/vben-admin/index.html index d4fda77f..8bf1610c 100644 --- a/apps/vben-admin/index.html +++ b/apps/vben-admin/index.html @@ -1,5 +1,5 @@ - - + + diff --git a/apps/vben-admin/mock/user.ts b/apps/vben-admin/mock/user.ts index d416c34a..407af928 100644 --- a/apps/vben-admin/mock/user.ts +++ b/apps/vben-admin/mock/user.ts @@ -27,7 +27,7 @@ const fakeUserList = [ avatar: '', desc: 'tester', accessToken: 'fakeTestToken', - homePath: '/dashboard/workbench', + homePath: '/workbench', roles: [ { roleName: 'Tester', @@ -40,7 +40,7 @@ const fakeUserList = [ export default (_config: MockConfig): MockMethod[] => { return [ { - url: '/req-api/login', + url: '/vben-api/login', timeout: 200, method: 'post', response: ({ body }) => { @@ -63,7 +63,7 @@ export default (_config: MockConfig): MockMethod[] => { }, }, { - url: '/req-api/getUserInfo', + url: '/vben-api/getUserInfo', method: 'get', response: (request) => { const token = getRequestToken(request); @@ -77,7 +77,7 @@ export default (_config: MockConfig): MockMethod[] => { }, }, { - url: '/req-api/logout', + url: '/vben-api/logout', timeout: 200, method: 'get', response: (request) => { diff --git a/apps/vben-admin/package.json b/apps/vben-admin/package.json index 2afad30e..c8e0ffcb 100644 --- a/apps/vben-admin/package.json +++ b/apps/vben-admin/package.json @@ -24,23 +24,24 @@ "type:check": "vue-tsc --noEmit --skipLibCheck" }, "dependencies": { - "@vben/ant-ui": "workspace:*", - "@vben/design": "workspace:*", + "@vben/antv-ui": "workspace:*", "@vben/hooks": "workspace:*", + "@vben/icons": "workspace:*", "@vben/layout": "workspace:*", + "@vben/preference": "workspace:*", "@vben/share-ui": "workspace:*", - "@vben/shared": "workspace:*", "@vben/store": "workspace:*", - "@vben/types": "workspace:*", - "ant-design-vue": "^4.0.0-beta.4", - "axios": "^1.4.0", - "dayjs": "^1.11.7", - "pinia": "2.0.35", - "vue": "^3.3.0-beta.5", - "vue-router": "^4.1.6" + "@vben/styles": "workspace:*", + "@vben/toolkit": "workspace:*", + "@vben/typings": "workspace:*", + "ant-design-vue": "^4.0.6", + "axios": "^1.6.0", + "dayjs": "^1.11.10", + "pinia": "2.1.7", + "vue": "^3.3.8", + "vue-router": "^4.2.5" }, "devDependencies": { - "@iconify/iconify": "^3.1.0", "vite-plugin-mock": "^3.0.0" } } diff --git a/apps/vben-admin/preference.ts b/apps/vben-admin/preference.ts deleted file mode 100644 index 6c8ea4d0..00000000 --- a/apps/vben-admin/preference.ts +++ /dev/null @@ -1 +0,0 @@ -// TODO: diff --git a/apps/vben-admin/public/logo.png b/apps/vben-admin/public/logo.png index cd4c33d8b71f31d32aaed9fefe14f237b81e764f..16f2e7ab7c74552c5653652547ebce7adc4901dc 100644 GIT binary patch literal 28304 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 literal 4042 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 diff --git a/apps/vben-admin/src/App.vue b/apps/vben-admin/src/App.vue index 9d593eef..56b3cb9f 100644 --- a/apps/vben-admin/src/App.vue +++ b/apps/vben-admin/src/App.vue @@ -1,17 +1,51 @@ diff --git a/apps/vben-admin/src/layouts/basic/index.vue b/apps/vben-admin/src/layouts/basic/index.vue deleted file mode 100644 index dde356c8..00000000 --- a/apps/vben-admin/src/layouts/basic/index.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - diff --git a/apps/vben-admin/src/layouts/components/header/UserDropdown.vue b/apps/vben-admin/src/layouts/components/header/UserDropdown.vue new file mode 100644 index 00000000..e84c75ad --- /dev/null +++ b/apps/vben-admin/src/layouts/components/header/UserDropdown.vue @@ -0,0 +1,83 @@ + + + + diff --git a/apps/vben-admin/src/layouts/components/header/index.vue b/apps/vben-admin/src/layouts/components/header/index.vue new file mode 100644 index 00000000..97d61049 --- /dev/null +++ b/apps/vben-admin/src/layouts/components/header/index.vue @@ -0,0 +1,35 @@ + + + + diff --git a/apps/vben-admin/src/layouts/components/menu/index.vue b/apps/vben-admin/src/layouts/components/menu/index.vue new file mode 100644 index 00000000..1ca58f19 --- /dev/null +++ b/apps/vben-admin/src/layouts/components/menu/index.vue @@ -0,0 +1,45 @@ + + + diff --git a/apps/vben-admin/src/layouts/components/menu/useMenuState.ts b/apps/vben-admin/src/layouts/components/menu/useMenuState.ts new file mode 100644 index 00000000..43c26771 --- /dev/null +++ b/apps/vben-admin/src/layouts/components/menu/useMenuState.ts @@ -0,0 +1,81 @@ +import { useAccessStore } from '@vben/store'; +import { traverseTreeValues } from '@vben/toolkit'; +import { computed, onBeforeMount, reactive, toRefs, watch } from 'vue'; +import { useRoute, useRouter } from 'vue-router'; + +interface State { + collapsed: boolean; + selectedKeys: string[]; + openKeys: string[]; +} + +const state = reactive({ + collapsed: false, + openKeys: [], + selectedKeys: [], +}); + +/** + * 菜单状态管理 + */ +function useMenuState() { + const router = useRouter(); + const route = useRoute(); + + const accessStore = useAccessStore(); + + /** + * 获取菜单及父级菜单集合 + */ + const menuParentPathMap = computed(() => { + const menus = accessStore.getAccessMenus; + const map: Record = {}; + traverseTreeValues(menus, (menu) => { + map[menu.path] = menu.parents || []; + }); + return map; + }); + + /** + * 菜单项点击事件 + */ + watch( + () => state.selectedKeys, + (selectedKeys) => { + if (!selectedKeys) { + return; + } + const path = selectedKeys[selectedKeys.length - 1]; + + // 变更openKeys值 + state.openKeys = getOpenKeysByPath(path); + + // 点击跳转 + router.push(path); + }, + ); + + /** + * 获取菜单的所有父级菜单路径 + * @param path + */ + function getOpenKeysByPath(path: string) { + return menuParentPathMap.value?.[path]; + } + + function updateCollapsed(collapsed: boolean) { + state.collapsed = collapsed; + } + + onBeforeMount(() => { + // 页面打开或者刷新后,进行赋值 + state.selectedKeys = [route.path]; + }); + + return { + ...toRefs(state), + updateCollapsed, + }; +} + +export { useMenuState }; diff --git a/apps/vben-admin/src/layouts/index.ts b/apps/vben-admin/src/layouts/index.ts deleted file mode 100644 index f729b4e7..00000000 --- a/apps/vben-admin/src/layouts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as BasicLayout } from './basic/index.vue'; diff --git a/apps/vben-admin/src/layouts/index.vue b/apps/vben-admin/src/layouts/index.vue new file mode 100644 index 00000000..0d28a3c4 --- /dev/null +++ b/apps/vben-admin/src/layouts/index.vue @@ -0,0 +1,56 @@ + + + diff --git a/apps/vben-admin/src/main.ts b/apps/vben-admin/src/main.ts index 25fc4874..234750d4 100644 --- a/apps/vben-admin/src/main.ts +++ b/apps/vben-admin/src/main.ts @@ -1,26 +1,22 @@ -/** uno.css 样式表,需要插件配合 */ import 'uno.css'; -import '@vben/design'; +import '@vben/styles'; +import { initIcons } from '@vben/icons'; import { useStore } from '@vben/store'; import { createApp } from 'vue'; import App from './App.vue'; import { router } from './router'; -async function bootstrap() { - const app = createApp(App); +const app = createApp(App); - // 配置 pinia-store - useStore(app); +// 配置 pinia-store +useStore(app); - // 配置路由 - app.use(router); +// 配置路由及路由守卫 +app.use(router); - // 路由守卫 - // setupRouterGuard(router); +// 初始化图标 +initIcons(); - app.mount('#app'); -} - -bootstrap(); +app.mount('#app'); diff --git a/apps/vben-admin/src/router/guard/access.ts b/apps/vben-admin/src/router/guard/access.ts index b506492b..d6ee7062 100644 --- a/apps/vben-admin/src/router/guard/access.ts +++ b/apps/vben-admin/src/router/guard/access.ts @@ -1,26 +1,149 @@ -import { useUserStore } from '@vben/store'; -import type { Router } from 'vue-router'; +import { useAccessStore } from '@vben/store'; +import { filterTree, mapTree, traverseTreeValues } from '@vben/toolkit'; +import type { MenuRecordRaw } from '@vben/typings'; +import type { Router, RouteRecordRaw } from 'vue-router'; + +import { dynamicRoutes } from '../routes'; + +// 登录页面路由 name +const LOGIN_ROUTE_NAME = 'Login'; +// 登录页面路由 path +const LOGIN_ROUTE_PATH = '/login'; +// 不需要权限的页面白名单 +const WHITE_ROUTE_NAMES = ['Login', 'Index']; /** * 权限访问守卫配置 * @param router */ function configAccessGuard(router: Router) { - router.beforeEach(async (to, _from, next) => { - const userStore = useUserStore(); - const accessToken = userStore.getAccessToken; + router.beforeEach(async (to, from) => { + const accessStore = useAccessStore(); + const accessToken = accessStore.getAccessToken; - // 没有 accessToken 逻辑 + // accessToken 检查 if (!accessToken) { - // You can access without permission. You need to set the routing meta.ignoreAuth to true - if (!to.meta.requiresAuth) { - next(); - return; + // 明确声明忽略权限访问权限,则可以访问 + if (to.meta.ignoreAccess) { + return true; } + + // 白名单路由列表检查 + if (WHITE_ROUTE_NAMES.includes(to.name as string)) { + return true; + } + + // 没有访问权限,跳转登录页面 + if (to.fullPath !== LOGIN_ROUTE_PATH) { + return { + name: LOGIN_ROUTE_NAME, + replace: true, + // 携带当前跳转的页面,登录后重新跳转该页面 + // 如不需要,直接删除 query + query: { redirect: encodeURIComponent(to.fullPath) }, + }; + } + return to; } + + const accessRoutes = accessStore.getAccessRoutes; + + // 是否已经生成过动态路由 + if (accessRoutes && accessRoutes.length) { + return true; + } + + // 生成路由表 + // 当前登录用户拥有的角色标识列表 + const userRoles = accessStore.getUserRoles; + const routes = await generatorRoutes(userRoles); + // 动态添加到router实例内 + routes.forEach((route) => router.addRoute(route)); + + const menus = await generatorMenus(routes, router); + + // 保存菜单信息和路由信息 + accessStore.setAccessMenus(menus); + accessStore.setAccessRoutes(routes); + const redirectPath = (from.query.redirect || to.path) as string; + const redirect = decodeURIComponent(redirectPath); + + return { + path: redirect, + replace: true, + }; + }); +} + +/** + * 动态生成路由 + */ +async function generatorRoutes(roles: string[]): Promise { + // 根据角色标识过滤路由表,判断当前用户是否拥有指定权限 + return filterTree(dynamicRoutes, (route) => hasAuthority(route, roles)); +} + +/** + * 根据 routes 生成菜单列表 + * @param routes + */ + +async function generatorMenus(routes: RouteRecordRaw[], router: Router): Promise { + // 获取所有router最终的path及name + const finalRoutes = traverseTreeValues(router.getRoutes(), ({ name, path }) => { + return { + name, + path, + }; }); - router.afterEach((_to) => {}); + // 提取树指定结构 + const menus = mapTree( + routes, + (route) => { + // 路由表的路径写法有多种,这里从router获取到最终的path并赋值 + const matchRoute = finalRoutes.find((finalRoute) => finalRoute.name === route.name); + + // 转换为菜单结构 + const path = matchRoute?.path ?? route.path; + const { children, meta, name: routeName } = route; + const { title = '', orderNo, icon } = meta || {}; + const name = (title || routeName || '') as string; + + // 将菜单的所有父级和父级菜单记录到菜单项内 + if (children && children.length) { + children.forEach((child: any) => { + child.parents = [...(route.parents || []), path]; + child.parent = path; + }); + } + return { + parents: route.parents, + parent: route.parent, + name, + path, + orderNo, + icon, + children: children as MenuRecordRaw[], + }; + }, + ); + + return menus; +} + +/** + * 判断路由是否有权限访问 + * @param route + * @param roles + */ +function hasAuthority(route: RouteRecordRaw, access: string[]) { + if (route.meta?.authority) { + return access.some((value) => { + return route.meta?.authority?.includes(value); + }); + } + return true; } export { configAccessGuard }; diff --git a/apps/vben-admin/src/router/guard/index.ts b/apps/vben-admin/src/router/guard/index.ts index 772ec2c2..2b220925 100644 --- a/apps/vben-admin/src/router/guard/index.ts +++ b/apps/vben-admin/src/router/guard/index.ts @@ -25,11 +25,11 @@ function configCommonGuard(router: Router) { * 项目守卫配置 * @param router */ -function setupRouteGuard(router: Router) { +function createRouteGuard(router: Router) { /** 通用 */ configCommonGuard(router); /** 权限访问 */ configAccessGuard(router); } -export { setupRouteGuard }; +export { createRouteGuard }; diff --git a/apps/vben-admin/src/router/index.ts b/apps/vben-admin/src/router/index.ts index 09766e2d..8d2d236a 100644 --- a/apps/vben-admin/src/router/index.ts +++ b/apps/vben-admin/src/router/index.ts @@ -1,23 +1,10 @@ -import { loggerWarning, traverseTreeValues } from '@vben/shared'; +import { loggerWarning, traverseTreeValues } from '@vben/toolkit'; import type { RouteRecordName, RouteRecordRaw } from 'vue-router'; import { createRouter, createWebHashHistory } from 'vue-router'; +import { createRouteGuard } from './guard'; import { staticRoutes } from './routes'; -/** - * @description 获取静态路由所有节点包含子节点的 name,并排除不存在 name 字段的路由 - */ -const staticRouteNames = traverseTreeValues( - staticRoutes, - (route) => { - // 这些路由需要指定 name,防止在路由重置时,不能删除没有指定 name 的路由 - if (!route.name) { - loggerWarning(`The route with the path ${route.path} needs to specify the field name.`); - } - return route.name; - }, -); - /** * @description 创建vue-router实例 */ @@ -25,15 +12,37 @@ const router = createRouter({ history: createWebHashHistory(import.meta.env.VITE_PUBLIC_PATH), // 应该添加到路由的初始路由列表。 routes: staticRoutes, - scrollBehavior: (_to, _from, savedPosition) => savedPosition || { left: 0, top: 0 }, + scrollBehavior: (to, from, savedPosition) => { + if (to.path !== from.path) { + setTimeout(() => { + const app = document.getElementById('app'); + if (app) { + app.scrollTop = 0; + } + }); + } + return savedPosition || { left: 0, top: 0 }; + }, }); /** * @description 重置所有路由,如有指定白名单除外 */ function resetRoutes() { - const routes = router.getRoutes(); - const { hasRoute, removeRoute } = router; + // 获取静态路由所有节点包含子节点的 name,并排除不存在 name 字段的路由 + const staticRouteNames = traverseTreeValues( + staticRoutes, + (route) => { + // 这些路由需要指定 name,防止在路由重置时,不能删除没有指定 name 的路由 + if (!route.name) { + loggerWarning(`The route with the path ${route.path} needs to specify the field name.`); + } + return route.name; + }, + ); + + const { hasRoute, removeRoute, getRoutes } = router; + const routes = getRoutes(); routes.forEach(({ name }) => { // 存在于路由表且非白名单才需要删除 if (name && !staticRouteNames.includes(name) && hasRoute(name)) { @@ -41,5 +50,7 @@ function resetRoutes() { } }); } +// 创建路由守卫 +createRouteGuard(router); export { resetRoutes, router }; diff --git a/apps/vben-admin/src/router/routes/index.ts b/apps/vben-admin/src/router/routes/index.ts index bacd5678..be6d16ef 100644 --- a/apps/vben-admin/src/router/routes/index.ts +++ b/apps/vben-admin/src/router/routes/index.ts @@ -1,40 +1,9 @@ import type { RouteRecordRaw } from 'vue-router'; -import { BasicLayout } from '@/layouts/index'; - -/** 动态路由 */ -const dynamicRoutes: RouteRecordRaw[] = [ - { - path: '/dashboard', - name: 'Dashboard', - component: BasicLayout, - redirect: { name: 'Analysis' }, - children: [ - { - path: '', - name: 'Analysis', - component: () => import('@/views/dashboard/index.vue'), - }, - ], - }, -]; +const Layout = () => import('@/layouts/index.vue'); /** 静态路由列表,访问这些页面可以不需要权限 */ const staticRoutes: RouteRecordRaw[] = [ - ...dynamicRoutes, - // { - // path: '/:catchAll(.*)', - // redirect: { name: 'Dashboard' }, - // }, - // 根路由 - { - path: '/', - name: 'Root', - redirect: '/dashboard', - meta: { - title: 'Root', - }, - }, { path: '/login', name: 'Login', @@ -53,12 +22,74 @@ const staticRoutes: RouteRecordRaw[] = [ }, { path: '/:path(.*)*', - name: 'PageNotFound', + name: 'NotFound', component: () => import('@vben/share-ui').then((m) => m.NotFound), meta: { - title: 'PageNotFound', + title: 'NotFound', }, }, + // +]; + +/** 动态路由 */ +const dynamicRoutes: RouteRecordRaw[] = [ + // 根路由 + { + path: '/', + name: 'Dashboard', + redirect: '/dashboard', + component: Layout, + children: [ + { + path: '/dashboard', + name: 'Dashboard', + component: () => import('@/views/dashboard/index.vue'), + meta: { + title: 'Dashboard', + }, + }, + ], + }, + { + path: '/test', + name: 'Test', + component: Layout, + children: [ + { + path: '/test1', + name: 'Test1', + component: () => import('@/views/test/test1.vue'), + meta: { + title: 'Test1', + }, + }, + { + path: '/test2', + name: 'Test2', + component: () => import('@/views/test/test2.vue'), + meta: { + title: 'Test2', + }, + }, + { + path: '/test3', + name: 'Test3', + meta: { + title: 'Test3', + }, + children: [ + { + path: '/test31', + name: 'Test31', + component: () => import('@/views/test/test3.vue'), + meta: { + title: 'Test31', + }, + }, + ], + }, + ], + }, ]; /** 排除在主框架外的路由,这些路由没有菜单和顶部及其他框架内容 */ diff --git a/apps/vben-admin/src/services/modules/user/index.ts b/apps/vben-admin/src/services/modules/user/index.ts index 638ff3eb..a94a2663 100644 --- a/apps/vben-admin/src/services/modules/user/index.ts +++ b/apps/vben-admin/src/services/modules/user/index.ts @@ -1,14 +1,14 @@ -import type { UserInfo } from '@vben/types'; +import type { UserInfo } from '@vben/typings'; import { request } from '@/services/request'; -import type { UserService } from './typing'; +import type { UserApi } from './typing'; /** * 登录 */ -async function userLogin(data: UserService.LoginParams) { - return request('/login', { data, method: 'POST' }); +async function userLogin(data: UserApi.LoginParams) { + return request('/login', { data, method: 'POST' }); } /** @@ -20,4 +20,4 @@ async function getUserInfo() { export { getUserInfo, userLogin }; -export type { UserService } from './typing'; +export type { UserApi } from './typing'; diff --git a/apps/vben-admin/src/services/modules/user/typing.ts b/apps/vben-admin/src/services/modules/user/typing.ts index 8863db23..9b93ac34 100644 --- a/apps/vben-admin/src/services/modules/user/typing.ts +++ b/apps/vben-admin/src/services/modules/user/typing.ts @@ -1,4 +1,4 @@ -namespace UserService { +namespace UserApi { /** 登录接口参数 */ export interface LoginParams { username: string; @@ -15,4 +15,4 @@ namespace UserService { } } -export type { UserService }; +export type { UserApi }; diff --git a/apps/vben-admin/src/services/request.ts b/apps/vben-admin/src/services/request.ts index 139e970a..42bf5c6d 100644 --- a/apps/vben-admin/src/services/request.ts +++ b/apps/vben-admin/src/services/request.ts @@ -2,7 +2,7 @@ * 该文件可自行根据业务逻辑进行调整 */ -import { useUserStore } from '@vben/store'; +import { useAccessStore } from '@vben/store'; import { message } from 'ant-design-vue'; import axios, { AxiosError, @@ -11,6 +11,10 @@ import axios, { InternalAxiosRequestConfig, } from 'axios'; +// 后端需要的 token 存放在header内的key字段 +// 可以根据自己的需要修改 +const REQUEST_HEADER_TOKEN_KEY = 'Authorization'; + type HttpConfig = InternalAxiosRequestConfig; interface HttpResponse { @@ -87,13 +91,13 @@ axiosInstance.interceptors.request.use( addRequestSignal(config); // 携带 getAccessToken 在请求头 - const userStore = useUserStore(); - const getAccessToken = userStore.getAccessToken; + const accessStore = useAccessStore(); + const getAccessToken = accessStore.getAccessToken; if (getAccessToken) { - config.headers.Authorization = getAccessToken; + config.headers[REQUEST_HEADER_TOKEN_KEY] = getAccessToken; } - return config as InternalAxiosRequestConfig; + return config; }, (error: AxiosError) => { return Promise.reject(error); diff --git a/apps/vben-admin/src/views/login/LoginForm.vue b/apps/vben-admin/src/views/login/LoginForm.vue index 50ad925e..99d32062 100644 --- a/apps/vben-admin/src/views/login/LoginForm.vue +++ b/apps/vben-admin/src/views/login/LoginForm.vue @@ -1,18 +1,18 @@ @@ -291,19 +298,31 @@
+ + + +