Просмотр исходного кода

!375 重构代码生成 路由 优化性能
Merge pull request !375 from xingyu/dev

芋道源码 2 лет назад
Родитель
Сommit
161205d32a

+ 7 - 7
yudao-ui-admin-vue3/package.json

@@ -1,6 +1,6 @@
 {
   "name": "yudao-ui-admin-vue3",
-  "version": "1.6.6-snapshot.1911",
+  "version": "1.6.6-snapshot.1912",
   "description": "基于vue3、vite4、element-plus、typesScript",
   "author": "xingyu",
   "private": false,
@@ -55,9 +55,9 @@
     "xe-utils": "^3.5.7"
   },
   "devDependencies": {
-    "@commitlint/cli": "^17.4.1",
-    "@commitlint/config-conventional": "^17.4.0",
-    "@iconify/json": "^2.2.5",
+    "@commitlint/cli": "^17.4.2",
+    "@commitlint/config-conventional": "^17.4.2",
+    "@iconify/json": "^2.2.6",
     "@intlify/unplugin-vue-i18n": "^0.8.1",
     "@purge-icons/generated": "^0.9.0",
     "@types/intro.js": "^5.1.0",
@@ -77,14 +77,14 @@
     "eslint-config-prettier": "^8.6.0",
     "eslint-define-config": "^1.14.0",
     "eslint-plugin-prettier": "^4.2.1",
-    "eslint-plugin-vue": "^9.8.0",
+    "eslint-plugin-vue": "^9.9.0",
     "lint-staged": "^13.1.0",
     "postcss": "^8.4.21",
     "postcss-html": "^1.5.0",
     "postcss-scss": "^4.0.6",
     "prettier": "^2.8.2",
-    "rimraf": "^3.0.2",
-    "rollup": "^3.9.1",
+    "rimraf": "^4.0.4",
+    "rollup": "^3.10.0",
     "sass": "^1.57.1",
     "stylelint": "^14.16.1",
     "stylelint-config-html": "^1.1.0",

+ 51 - 53
yudao-ui-admin-vue3/pnpm-lock.yaml

@@ -1,10 +1,10 @@
 lockfileVersion: 5.4
 
 specifiers:
-  '@commitlint/cli': ^17.4.1
-  '@commitlint/config-conventional': ^17.4.0
+  '@commitlint/cli': ^17.4.2
+  '@commitlint/config-conventional': ^17.4.2
   '@iconify/iconify': ^3.0.1
-  '@iconify/json': ^2.2.5
+  '@iconify/json': ^2.2.6
   '@intlify/unplugin-vue-i18n': ^0.8.1
   '@purge-icons/generated': ^0.9.0
   '@types/intro.js': ^5.1.0
@@ -36,7 +36,7 @@ specifiers:
   eslint-config-prettier: ^8.6.0
   eslint-define-config: ^1.14.0
   eslint-plugin-prettier: ^4.2.1
-  eslint-plugin-vue: ^9.8.0
+  eslint-plugin-vue: ^9.9.0
   intro.js: ^6.0.0
   jsencrypt: ^3.3.1
   lint-staged: ^13.1.0
@@ -50,8 +50,8 @@ specifiers:
   prettier: ^2.8.2
   qrcode: ^1.5.1
   qs: ^6.11.0
-  rimraf: ^3.0.2
-  rollup: ^3.9.1
+  rimraf: ^4.0.4
+  rollup: ^3.10.0
   sass: ^1.57.1
   stylelint: ^14.16.1
   stylelint-config-html: ^1.1.0
@@ -114,9 +114,9 @@ dependencies:
   xe-utils: 3.5.7
 
 devDependencies:
-  '@commitlint/cli': 17.4.1
-  '@commitlint/config-conventional': 17.4.0
-  '@iconify/json': 2.2.5
+  '@commitlint/cli': 17.4.2
+  '@commitlint/config-conventional': 17.4.2
+  '@iconify/json': 2.2.6
   '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2
   '@purge-icons/generated': 0.9.0
   '@types/intro.js': 5.1.0
@@ -136,14 +136,14 @@ devDependencies:
   eslint-config-prettier: 8.6.0_eslint@8.31.0
   eslint-define-config: 1.14.0
   eslint-plugin-prettier: 4.2.1_iu5s7nk6dw7o3tajefwfiqfmge
-  eslint-plugin-vue: 9.8.0_eslint@8.31.0
+  eslint-plugin-vue: 9.9.0_eslint@8.31.0
   lint-staged: 13.1.0
   postcss: 8.4.21
   postcss-html: 1.5.0
   postcss-scss: 4.0.6_postcss@8.4.21
   prettier: 2.8.2
-  rimraf: 3.0.2
-  rollup: 3.9.1
+  rimraf: 4.0.4
+  rollup: 3.10.0
   sass: 1.57.1
   stylelint: 14.16.1
   stylelint-config-html: 1.1.0_kbto3rg3njmczth2rrsgfnlsqa
@@ -506,15 +506,15 @@ packages:
       '@babel/helper-validator-identifier': 7.19.1
       to-fast-properties: 2.0.0
 
-  /@commitlint/cli/17.4.1:
-    resolution: {integrity: sha512-W8OJwz+izY+fVwyUt1HveCDmABMZNRVZHSVPw/Bh9Y62tp11SmmQaycgbsYLMiMy7JGn4mAJqEGlSHS9Uti9ZQ==}
+  /@commitlint/cli/17.4.2:
+    resolution: {integrity: sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA==}
     engines: {node: '>=v14'}
     hasBin: true
     dependencies:
       '@commitlint/format': 17.4.0
-      '@commitlint/lint': 17.4.0
-      '@commitlint/load': 17.4.1
-      '@commitlint/read': 17.4.0
+      '@commitlint/lint': 17.4.2
+      '@commitlint/load': 17.4.2
+      '@commitlint/read': 17.4.2
       '@commitlint/types': 17.4.0
       execa: 5.1.1
       lodash.isfunction: 3.0.9
@@ -526,8 +526,8 @@ packages:
       - '@swc/wasm'
     dev: true
 
-  /@commitlint/config-conventional/17.4.0:
-    resolution: {integrity: sha512-G4XBf45J4ZMspO4NwBFzY3g/1Kb+B42BcIxeikF8wucQxcyxcmhRdjeQpRpS1XEcBq5pdtEEQFipuB9IuiNFhw==}
+  /@commitlint/config-conventional/17.4.2:
+    resolution: {integrity: sha512-JVo1moSj5eDMoql159q8zKCU8lkOhQ+b23Vl3LVVrS6PXDLQIELnJ34ChQmFVbBdSSRNAbbXnRDhosFU+wnuHw==}
     engines: {node: '>=v14'}
     dependencies:
       conventional-changelog-conventionalcommits: 5.0.0
@@ -566,26 +566,26 @@ packages:
       chalk: 4.1.2
     dev: true
 
-  /@commitlint/is-ignored/17.4.0:
-    resolution: {integrity: sha512-mkRuBlPUaBimvSvJyIHEHEW1/jP1SqEI7NOoaO9/eyJkMbsaiv5b1QgDYL4ZXlHdS64RMV7Y21MVVzuIceImDA==}
+  /@commitlint/is-ignored/17.4.2:
+    resolution: {integrity: sha512-1b2Y2qJ6n7bHG9K6h8S4lBGUl6kc7mMhJN9gy1SQfUZqe92ToDjUTtgNWb6LbzR1X8Cq4SEus4VU8Z/riEa94Q==}
     engines: {node: '>=v14'}
     dependencies:
       '@commitlint/types': 17.4.0
       semver: 7.3.8
     dev: true
 
-  /@commitlint/lint/17.4.0:
-    resolution: {integrity: sha512-HG2YT4TUbQKs9v8QvpQjJ6OK+fhflsDB8M+D5tLrY79hbQOWA9mDKdRkABsW/AAhpNI9+zeGUWF3jj245jSHKw==}
+  /@commitlint/lint/17.4.2:
+    resolution: {integrity: sha512-HcymabrdBhsDMNzIv146+ZPNBPBK5gMNsVH+el2lCagnYgCi/4ixrHooeVyS64Fgce2K26+MC7OQ4vVH8wQWVw==}
     engines: {node: '>=v14'}
     dependencies:
-      '@commitlint/is-ignored': 17.4.0
-      '@commitlint/parse': 17.4.0
-      '@commitlint/rules': 17.4.0
+      '@commitlint/is-ignored': 17.4.2
+      '@commitlint/parse': 17.4.2
+      '@commitlint/rules': 17.4.2
       '@commitlint/types': 17.4.0
     dev: true
 
-  /@commitlint/load/17.4.1:
-    resolution: {integrity: sha512-6A7/LhIaQpL4ieciIDcVvK2d5z/UI1GBrtDaHm6sQSCL0265clB2/F7XKQNTJHXv9yG4LByT2r+QCpM4GugIfw==}
+  /@commitlint/load/17.4.2:
+    resolution: {integrity: sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw==}
     engines: {node: '>=v14'}
     dependencies:
       '@commitlint/config-validator': 17.4.0
@@ -607,13 +607,13 @@ packages:
       - '@swc/wasm'
     dev: true
 
-  /@commitlint/message/17.4.0:
-    resolution: {integrity: sha512-USGJDU9PPxcgQjKXCzvPUal65KAhxWq3hp+MrU1pNCN2itWM654CLIoY2LMIQ7rScTli9B5dTLH3vXhzbItmzA==}
+  /@commitlint/message/17.4.2:
+    resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==}
     engines: {node: '>=v14'}
     dev: true
 
-  /@commitlint/parse/17.4.0:
-    resolution: {integrity: sha512-x8opKc5p+Hgs+CrMbq3VAnW2L2foPAX6arW8u9c8nTzksldGgFsENT+XVyPmpSMLlVBswZ1tndcz1xyKiY9TJA==}
+  /@commitlint/parse/17.4.2:
+    resolution: {integrity: sha512-DK4EwqhxfXpyCA+UH8TBRIAXAfmmX4q9QRBz/2h9F9sI91yt6mltTrL6TKURMcjUVmgaB80wgS9QybNIyVBIJA==}
     engines: {node: '>=v14'}
     dependencies:
       '@commitlint/types': 17.4.0
@@ -621,8 +621,8 @@ packages:
       conventional-commits-parser: 3.2.4
     dev: true
 
-  /@commitlint/read/17.4.0:
-    resolution: {integrity: sha512-pGDeZpbkyvhxK8ZoCDUacPPRpauKPWF3n2XpDBEnuGreqUF2clq2PVJpwMMaNN5cHW8iFKCbcoOjXhD01sln0A==}
+  /@commitlint/read/17.4.2:
+    resolution: {integrity: sha512-hasYOdbhEg+W4hi0InmXHxtD/1favB4WdwyFxs1eOy/DvMw6+2IZBmATgGOlqhahsypk4kChhxjAFJAZ2F+JBg==}
     engines: {node: '>=v14'}
     dependencies:
       '@commitlint/top-level': 17.4.0
@@ -644,12 +644,12 @@ packages:
       resolve-global: 1.0.0
     dev: true
 
-  /@commitlint/rules/17.4.0:
-    resolution: {integrity: sha512-lz3i1jet2NNjTWpAMwjjQjMZCPWBIHK1Kkja9o09UmUtMjRdALTb8uMLe8gCyeq3DiiZ5lLYOhbsoPK56xGQKA==}
+  /@commitlint/rules/17.4.2:
+    resolution: {integrity: sha512-OGrPsMb9Fx3/bZ64/EzJehY9YDSGWzp81Pj+zJiY+r/NSgJI3nUYdlS37jykNIugzazdEXfMtQ10kmA+Kx2pZQ==}
     engines: {node: '>=v14'}
     dependencies:
       '@commitlint/ensure': 17.4.0
-      '@commitlint/message': 17.4.0
+      '@commitlint/message': 17.4.2
       '@commitlint/to-lines': 17.4.0
       '@commitlint/types': 17.4.0
       execa: 5.1.1
@@ -963,8 +963,8 @@ packages:
     dependencies:
       '@iconify/types': 2.0.0
 
-  /@iconify/json/2.2.5:
-    resolution: {integrity: sha512-AIbJTRF9HJz7FJ8t7058huwDXHaFEY4a4f6uuPtctEQ8/I3ybrX66iZMgoLD1kLaamU4tzZPlZ6tSpA3pM8LZg==}
+  /@iconify/json/2.2.6:
+    resolution: {integrity: sha512-fRP5PwXvX0PAGne1/xHvd6zVYiHq9dQzdvhhxamwJuNjoIVRWNNP5y465NkxybzEX94kn2JnoULkA9kbZkXoqA==}
     dependencies:
       '@iconify/types': 2.0.0
       pathe: 1.0.0
@@ -3029,8 +3029,8 @@ packages:
       prettier-linter-helpers: 1.0.0
     dev: true
 
-  /eslint-plugin-vue/9.8.0_eslint@8.31.0:
-    resolution: {integrity: sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==}
+  /eslint-plugin-vue/9.9.0_eslint@8.31.0:
+    resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
@@ -3039,7 +3039,7 @@ packages:
       eslint-utils: 3.0.0_eslint@8.31.0
       natural-compare: 1.4.0
       nth-check: 2.1.1
-      postcss-selector-parser: 6.0.10
+      postcss-selector-parser: 6.0.11
       semver: 7.3.8
       vue-eslint-parser: 9.1.0_eslint@8.31.0
       xml-name-validator: 4.0.0
@@ -4880,14 +4880,6 @@ packages:
       postcss: 8.4.21
     dev: true
 
-  /postcss-selector-parser/6.0.10:
-    resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
-    engines: {node: '>=4'}
-    dependencies:
-      cssesc: 3.0.0
-      util-deprecate: 1.0.2
-    dev: true
-
   /postcss-selector-parser/6.0.11:
     resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
     engines: {node: '>=4'}
@@ -5200,6 +5192,12 @@ packages:
       glob: 7.2.3
     dev: true
 
+  /rimraf/4.0.4:
+    resolution: {integrity: sha512-R0hoVr9xTwemarQjoWlNt/nb5dEGVTBhVdkRmEX2zEkT8T6onH0XKiGjuaC7rNNj/gYzY2p4NVRJ3sjO1ascHQ==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dev: true
+
   /rollup-plugin-purge-icons/0.9.1:
     resolution: {integrity: sha512-hRDKBsPUz47UMdBufki2feTmBF2ClEJlYqL7N6vpVAHSLd7V2BJUaNKOF7YYbLMofVVF+9hm44YSkYO6k9hUgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.9.1.tgz}
     engines: {node: '>= 12'}
@@ -5219,8 +5217,8 @@ packages:
       fsevents: 2.3.2
     dev: true
 
-  /rollup/3.9.1:
-    resolution: {integrity: sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w==}
+  /rollup/3.10.0:
+    resolution: {integrity: sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==}
     engines: {node: '>=14.18.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
@@ -6207,7 +6205,7 @@ packages:
       esbuild: 0.16.5
       postcss: 8.4.21
       resolve: 1.22.1
-      rollup: 3.9.1
+      rollup: 3.10.0
       sass: 1.57.1
       terser: 5.16.1
     optionalDependencies:

+ 1 - 1
yudao-ui-admin-vue3/src/components/XTable/src/style/dark.scss

@@ -78,4 +78,4 @@ $vxe-modal-border-color: #3b3b3b;
 /*pulldown*/
 $vxe-pulldown-panel-background-color: #262626 !default;
 
-@import 'vxe-table/styles/index';
+@import 'vxe-table/styles/index.scss';

+ 2 - 2
yudao-ui-admin-vue3/src/components/XTable/src/style/index.scss

@@ -1,5 +1,5 @@
-@import 'vxe-table/styles/variable.scss';
-@import 'vxe-table/styles/modules.scss';
+// @import 'vxe-table/styles/variable.scss';
+// @import 'vxe-table/styles/modules.scss';
 // @import './theme/light.scss';
 i {
   border-color: initial;

+ 1 - 1
yudao-ui-admin-vue3/src/components/XTable/src/style/light.scss

@@ -13,4 +13,4 @@ $vxe-danger-color: #f56c6c !default;
 $vxe-disabled-color: #bfbfbf !default;
 $vxe-primary-disabled-color: #c0c4cc !default;
 
-@import 'vxe-table/styles/index';
+@import 'vxe-table/styles/index.scss';

+ 2 - 0
yudao-ui-admin-vue3/src/main.ts

@@ -35,6 +35,8 @@ import { createApp } from 'vue'
 
 import App from './App.vue'
 
+import './permission'
+
 // 创建实例
 const setupAll = async () => {
   const app = createApp(App)

+ 70 - 0
yudao-ui-admin-vue3/src/permission.ts

@@ -0,0 +1,70 @@
+import router from './router'
+import type { RouteRecordRaw } from 'vue-router'
+import { isRelogin } from '@/config/axios/service'
+import { getAccessToken } from '@/utils/auth'
+import { useTitle } from '@/hooks/web/useTitle'
+import { useNProgress } from '@/hooks/web/useNProgress'
+import { usePageLoading } from '@/hooks/web/usePageLoading'
+import { useDictStoreWithOut } from '@/store/modules/dict'
+import { useUserStoreWithOut } from '@/store/modules/user'
+import { usePermissionStoreWithOut } from '@/store/modules/permission'
+
+const { start, done } = useNProgress()
+
+const { loadStart, loadDone } = usePageLoading()
+// 路由不重定向白名单
+const whiteList = [
+  '/login',
+  '/social-login',
+  '/auth-redirect',
+  '/bind',
+  '/register',
+  '/oauthLogin/gitee'
+]
+
+// 路由加载前
+router.beforeEach(async (to, from, next) => {
+  start()
+  loadStart()
+  if (getAccessToken()) {
+    if (to.path === '/login') {
+      next({ path: '/' })
+    } else {
+      // 获取所有字典
+      const dictStore = useDictStoreWithOut()
+      const userStore = useUserStoreWithOut()
+      const permissionStore = usePermissionStoreWithOut()
+      if (!dictStore.getIsSetDict) {
+        dictStore.setDictMap()
+      }
+      if (!userStore.getIsSetUser) {
+        isRelogin.show = true
+        await userStore.setUserInfoAction()
+        isRelogin.show = false
+        // 后端过滤菜单
+        await permissionStore.generateRoutes()
+        permissionStore.getAddRouters.forEach((route) => {
+          router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
+        })
+        const redirectPath = from.query.redirect || to.path
+        const redirect = decodeURIComponent(redirectPath as string)
+        const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }
+        next(nextData)
+      } else {
+        next()
+      }
+    }
+  } else {
+    if (whiteList.indexOf(to.path) !== -1) {
+      next()
+    } else {
+      next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+    }
+  }
+})
+
+router.afterEach((to) => {
+  useTitle(to?.meta?.title as string)
+  done() // 结束Progress
+  loadDone()
+})

+ 0 - 6
yudao-ui-admin-vue3/src/plugins/vxeTable/index.scss

@@ -1,6 +0,0 @@
-@import 'vxe-table/styles/variable.scss';
-@import 'vxe-table/styles/modules.scss';
-// @import './theme/light.scss';
-i {
-  border-color: initial;
-}

+ 0 - 81
yudao-ui-admin-vue3/src/plugins/vxeTable/theme/dark.scss

@@ -1,81 +0,0 @@
-// 修改样式变量
-//@import 'vxe-table/styles/variable.scss';
-
-/*font*/
-$vxe-font-color: #e5e7eb;
-// $vxe-font-size: 14px !default;
-// $vxe-font-size-medium: 16px !default;
-// $vxe-font-size-small: 14px !default;
-// $vxe-font-size-mini: 12px !default;
-
-/*color*/
-$vxe-primary-color: #409eff !default;
-$vxe-success-color: #67c23a !default;
-$vxe-info-color: #909399 !default;
-$vxe-warning-color: #e6a23c !default;
-$vxe-danger-color: #f56c6c !default;
-$vxe-disabled-color: #bfbfbf !default;
-$vxe-primary-disabled-color: #c0c4cc !default;
-
-/*loading*/
-$vxe-loading-color: $vxe-primary-color !default;
-$vxe-loading-background-color: #1d1e1f !default;
-$vxe-loading-z-index: 999 !default;
-
-/*icon*/
-$vxe-icon-font-family: Verdana, Arial, Tahoma !default;
-$vxe-icon-background-color: #e5e7eb !default;
-
-/*toolbar*/
-$vxe-toolbar-background-color: #1d1e1f !default;
-$vxe-toolbar-button-border: #dcdfe6 !default;
-$vxe-toolbar-custom-active-background-color: #d9dadb !default;
-$vxe-toolbar-panel-background-color: #e5e7eb !default;
-
-$vxe-table-font-color: #e5e7eb;
-$vxe-table-header-background-color: #1d1e1f;
-$vxe-table-body-background-color: #141414;
-$vxe-table-row-striped-background-color: #1d1d1d;
-$vxe-table-row-hover-background-color: #1d1e1f;
-$vxe-table-row-hover-striped-background-color: #1e1e1e;
-$vxe-table-footer-background-color: #1d1e1f;
-$vxe-table-row-current-background-color: #302d2d;
-$vxe-table-column-current-background-color: #302d2d;
-$vxe-table-column-hover-background-color: #302d2d;
-$vxe-table-row-hover-current-background-color: #302d2d;
-$vxe-table-row-checkbox-checked-background-color: #3e3c37 !default;
-$vxe-table-row-hover-checkbox-checked-background-color: #615a4a !default;
-$vxe-table-menu-background-color: #1d1e1f;
-$vxe-table-border-width: 1px !default;
-$vxe-table-border-color: #4c4d4f !default;
-$vxe-table-fixed-left-scrolling-box-shadow: 8px 0px 10px -5px rgba(0, 0, 0, 0.12) !default;
-$vxe-table-fixed-right-scrolling-box-shadow: -8px 0px 10px -5px rgba(0, 0, 0, 0.12) !default;
-
-$vxe-form-background-color: #141414;
-
-/*pager*/
-$vxe-pager-background-color: #1d1e1f !default;
-$vxe-pager-perfect-background-color: #262727 !default;
-$vxe-pager-perfect-button-background-color: #a7a3a3 !default;
-
-$vxe-input-background-color: #141414;
-$vxe-input-border-color: #4c4d4f !default;
-
-$vxe-select-option-hover-background-color: #262626 !default;
-$vxe-select-panel-background-color: #141414 !default;
-$vxe-select-empty-color: #262626 !default;
-$vxe-optgroup-title-color: #909399 !default;
-
-/*button*/
-$vxe-button-default-background-color: #262626;
-$vxe-button-dropdown-panel-background-color: #141414;
-
-/*modal*/
-$vxe-modal-header-background-color: #141414;
-$vxe-modal-body-background-color: #141414;
-$vxe-modal-border-color: #3b3b3b;
-
-/*pulldown*/
-$vxe-pulldown-panel-background-color: #262626 !default;
-
-@import 'vxe-table/styles/index';

+ 0 - 16
yudao-ui-admin-vue3/src/plugins/vxeTable/theme/light.scss

@@ -1,16 +0,0 @@
-// 修改样式变量
-// /*font*/
-// $vxe-font-size: 12px !default;
-// $vxe-font-size-medium: 16px !default;
-// $vxe-font-size-small: 14px !default;
-// $vxe-font-size-mini: 12px !default;
-/*color*/
-$vxe-primary-color: #409eff !default;
-$vxe-success-color: #67c23a !default;
-$vxe-info-color: #909399 !default;
-$vxe-warning-color: #e6a23c !default;
-$vxe-danger-color: #f56c6c !default;
-$vxe-disabled-color: #bfbfbf !default;
-$vxe-primary-disabled-color: #c0c4cc !default;
-
-@import 'vxe-table/styles/index.scss';

+ 0 - 71
yudao-ui-admin-vue3/src/router/index.ts

@@ -2,19 +2,6 @@ import type { App } from 'vue'
 import type { RouteRecordRaw } from 'vue-router'
 import { createRouter, createWebHashHistory } from 'vue-router'
 import remainingRouter from './modules/remaining'
-import { isRelogin } from '@/config/axios/service'
-import { getAccessToken } from '@/utils/auth'
-import { useTitle } from '@/hooks/web/useTitle'
-import { useNProgress } from '@/hooks/web/useNProgress'
-import { usePageLoading } from '@/hooks/web/usePageLoading'
-import { useDictStoreWithOut } from '@/store/modules/dict'
-import { useUserStoreWithOut } from '@/store/modules/user'
-import { usePermissionStoreWithOut } from '@/store/modules/permission'
-import { getInfoApi } from '@/api/login'
-
-const { start, done } = useNProgress()
-
-const { loadStart, loadDone } = usePageLoading()
 
 // 创建路由实例
 const router = createRouter({
@@ -24,64 +11,6 @@ const router = createRouter({
   scrollBehavior: () => ({ left: 0, top: 0 })
 })
 
-// 路由不重定向白名单
-const whiteList = [
-  '/login',
-  '/social-login',
-  '/auth-redirect',
-  '/bind',
-  '/register',
-  '/oauthLogin/gitee'
-]
-
-// 路由加载前
-router.beforeEach(async (to, from, next) => {
-  start()
-  loadStart()
-  if (getAccessToken()) {
-    if (to.path === '/login') {
-      next({ path: '/' })
-    } else {
-      // 获取所有字典
-      const dictStore = useDictStoreWithOut()
-      const userStore = useUserStoreWithOut()
-      const permissionStore = usePermissionStoreWithOut()
-      if (!dictStore.getIsSetDict) {
-        dictStore.setDictMap()
-      }
-      if (!userStore.getIsSetUser) {
-        isRelogin.show = true
-        const res = await getInfoApi()
-        await userStore.setUserInfoAction(res)
-        isRelogin.show = false
-        // 后端过滤菜单
-        await permissionStore.generateRoutes()
-        permissionStore.getAddRouters.forEach((route) => {
-          router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
-        })
-        const redirectPath = from.query.redirect || to.path
-        const redirect = decodeURIComponent(redirectPath as string)
-        const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }
-        next(nextData)
-      } else {
-        next()
-      }
-    }
-  } else {
-    if (whiteList.indexOf(to.path) !== -1) {
-      next()
-    } else {
-      next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
-    }
-  }
-})
-
-router.afterEach((to) => {
-  useTitle(to?.meta?.title as string)
-  done() // 结束Progress
-  loadDone()
-})
-
 export const resetRouter = (): void => {
   const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root']
   router.getRoutes().forEach((route) => {

+ 6 - 1
yudao-ui-admin-vue3/src/store/modules/user.ts

@@ -2,6 +2,7 @@ import { store } from '../index'
 import { defineStore } from 'pinia'
 import { getAccessToken, removeToken } from '@/utils/auth'
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+import { getInfoApi } from '@/api/login'
 
 const { wsCache } = useCache()
 
@@ -43,11 +44,15 @@ export const useUserStore = defineStore('admin-user', {
     }
   },
   actions: {
-    async setUserInfoAction(userInfo: UserInfoVO) {
+    async setUserInfoAction() {
       if (!getAccessToken()) {
         this.resetState()
         return null
       }
+      let userInfo = wsCache.get(CACHE_KEY.USER)
+      if (!userInfo) {
+        userInfo = await getInfoApi()
+      }
       this.permissions = userInfo.permissions
       this.roles = userInfo.roles
       this.user = userInfo.user

+ 2 - 0
yudao-ui-admin-vue3/src/styles/variables.scss

@@ -2,3 +2,5 @@
 $namespace: v;
 // el命名空间
 $elNamespace: el;
+// vxe命名空间
+$vxeNamespace: vxe;

+ 8 - 9
yudao-ui-admin-vue3/src/utils/propTypes.ts

@@ -17,13 +17,12 @@ const propTypes = createTypes({
 
 // 需要自定义扩展的类型
 // see: https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#the-extend-method
-propTypes.extend([
-  {
-    name: 'style',
-    getter: true,
-    type: [String, Object],
-    default: undefined
-  }
-])
-
+// propTypes.extend([
+//   {
+//     name: 'style',
+//     getter: true,
+//     type: [String, Object],
+//     default: undefined
+//   }
+// ])
 export { propTypes }

+ 5 - 12
yudao-ui-admin-vue3/src/views/infra/codegen/EditTable.vue

@@ -8,9 +8,6 @@
         <el-tab-pane label="字段信息" name="cloum">
           <CloumInfoForm ref="cloumInfoRef" :info="cloumCurrentRow" />
         </el-tab-pane>
-        <el-tab-pane label="生成信息" name="genInfo">
-          <GenInfoForm ref="genInfoRef" :genInfo="tableCurrentRow" />
-        </el-tab-pane>
       </el-tabs>
       <template #right>
         <XButton
@@ -30,7 +27,7 @@ import { ElTabs, ElTabPane } from 'element-plus'
 import { useI18n } from '@/hooks/web/useI18n'
 import { useMessage } from '@/hooks/web/useMessage'
 import { ContentDetailWrap } from '@/components/ContentDetailWrap'
-import { BasicInfoForm, CloumInfoForm, GenInfoForm } from './components'
+import { BasicInfoForm, CloumInfoForm } from './components'
 import { getCodegenTableApi, updateCodegenTableApi } from '@/api/infra/codegen'
 import { CodegenTableVO, CodegenColumnVO, CodegenUpdateReqVO } from '@/api/infra/codegen/types'
 
@@ -40,33 +37,29 @@ const { push } = useRouter()
 const { query } = useRoute()
 const loading = ref(false)
 const title = ref('代码生成')
-const activeName = ref('cloum')
+const activeName = ref('basicInfo')
 const cloumInfoRef = ref(null)
 const tableCurrentRow = ref<CodegenTableVO>()
 const cloumCurrentRow = ref<CodegenColumnVO[]>([])
 const basicInfoRef = ref<ComponentRef<typeof BasicInfoForm>>()
-const genInfoRef = ref<ComponentRef<typeof GenInfoForm>>()
 
 const getList = async () => {
   const id = query.id as unknown as number
   if (id) {
     // 获取表详细信息
     const res = await getCodegenTableApi(id)
-    tableCurrentRow.value = res.table
     title.value = '修改[ ' + res.table.tableName + ' ]生成配置'
+    tableCurrentRow.value = res.table
     cloumCurrentRow.value = res.columns
   }
 }
 const submitForm = async () => {
   const basicInfo = unref(basicInfoRef)
-  const genInfo = unref(genInfoRef)
   const basicForm = await basicInfo?.elFormRef?.validate()?.catch(() => {})
-  const genForm = await genInfo?.elFormRef?.validate()?.catch(() => {})
-  if (basicForm && genForm) {
+  if (basicForm) {
     const basicInfoData = (await basicInfo?.getFormData()) as CodegenTableVO
-    const genInfoData = (await genInfo?.getFormData()) as CodegenTableVO
     const genTable: CodegenUpdateReqVO = {
-      table: Object.assign({}, basicInfoData, genInfoData),
+      table: basicInfoData,
       columns: cloumCurrentRow.value
     }
     await updateCodegenTableApi(genTable)

+ 99 - 3
yudao-ui-admin-vue3/src/views/infra/codegen/components/BasicInfoForm.vue

@@ -2,25 +2,59 @@
   <Form :rules="rules" @register="register" />
 </template>
 <script setup lang="ts">
-import { PropType, reactive, watch } from 'vue'
+import { onMounted, PropType, reactive, ref, watch } from 'vue'
 import { required } from '@/utils/formRules'
 import { useForm } from '@/hooks/web/useForm'
 import { Form } from '@/components/Form'
 import { FormSchema } from '@/types/form'
 import { CodegenTableVO } from '@/api/infra/codegen/types'
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { listSimpleMenusApi } from '@/api/system/menu'
+import { handleTree, defaultProps } from '@/utils/tree'
+
 const props = defineProps({
   basicInfo: {
     type: Object as PropType<Nullable<CodegenTableVO>>,
     default: () => null
   }
 })
+
+const templateTypeOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_TYPE)
+const sceneOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE)
+const menuOptions = ref<any>([]) // 树形结构
+const getTree = async () => {
+  const res = await listSimpleMenusApi()
+  menuOptions.value = handleTree(res)
+}
+
 const rules = reactive({
   tableName: [required],
   tableComment: [required],
   className: [required],
-  author: [required]
+  author: [required],
+  templateType: [required],
+  scene: [required],
+  moduleName: [required],
+  businessName: [required],
+  businessPackage: [required],
+  classComment: [required]
 })
 const schema = reactive<FormSchema[]>([
+  {
+    label: '上级菜单',
+    field: 'parentMenuId',
+    component: 'TreeSelect',
+    componentProps: {
+      data: menuOptions,
+      props: defaultProps,
+      checkStrictly: true,
+      nodeKey: 'id'
+    },
+    labelMessage: '分配到指定菜单下,例如 系统管理',
+    colProps: {
+      span: 24
+    }
+  },
   {
     label: '表名称',
     field: 'tableName',
@@ -45,6 +79,64 @@ const schema = reactive<FormSchema[]>([
       span: 12
     }
   },
+  {
+    label: '类名称',
+    field: 'className',
+    component: 'Input',
+    labelMessage: '类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等',
+    colProps: {
+      span: 12
+    }
+  },
+  {
+    label: '生成模板',
+    field: 'templateType',
+    component: 'Select',
+    componentProps: {
+      options: templateTypeOptions
+    },
+    colProps: {
+      span: 12
+    }
+  },
+  {
+    label: '生成场景',
+    field: 'scene',
+    component: 'Select',
+    componentProps: {
+      options: sceneOptions
+    },
+    colProps: {
+      span: 12
+    }
+  },
+  {
+    label: '模块名',
+    field: 'moduleName',
+    component: 'Input',
+    labelMessage: '模块名,即一级目录,例如 system、infra、tool 等等',
+    colProps: {
+      span: 12
+    }
+  },
+  {
+    label: '业务名',
+    field: 'businessName',
+    component: 'Input',
+    labelMessage: '业务名,即二级目录,例如 user、permission、dict 等等',
+    colProps: {
+      span: 12
+    }
+  },
+  {
+    label: '类描述',
+    field: 'classComment',
+    component: 'Input',
+    labelMessage: '用作类描述,例如 用户',
+    colProps: {
+      span: 12
+    }
+  },
   {
     label: '作者',
     field: 'author',
@@ -62,7 +154,7 @@ const schema = reactive<FormSchema[]>([
       rows: 4
     },
     colProps: {
-      span: 12
+      span: 24
     }
   }
 ])
@@ -81,6 +173,10 @@ watch(
     immediate: true
   }
 )
+// ========== 初始化 ==========
+onMounted(async () => {
+  await getTree()
+})
 
 defineExpose({
   elFormRef,

+ 84 - 80
yudao-ui-admin-vue3/src/views/infra/codegen/components/CloumInfoForm.vue

@@ -1,113 +1,117 @@
 <template>
   <vxe-table
     ref="dragTable"
+    border
     :data="info"
     max-height="600"
     stripe
     class="xtable-scrollbar"
     :column-config="{ resizable: true }"
   >
-    <vxe-column title="字段列名" field="columnName" fixed="left" width="80" />
-    <vxe-column title="字段描述" field="columnComment">
-      <template #default="{ row }">
-        <el-input v-model="row.columnComment" />
-      </template>
-    </vxe-column>
-    <vxe-column title="物理类型" field="dataType" width="10%" />
-    <vxe-column title="Java类型" width="10%" field="javaType">
-      <template #default="{ row }">
-        <el-select v-model="row.javaType">
-          <el-option label="Long" value="Long" />
-          <el-option label="String" value="String" />
-          <el-option label="Integer" value="Integer" />
-          <el-option label="Double" value="Double" />
-          <el-option label="BigDecimal" value="BigDecimal" />
-          <el-option label="LocalDateTime" value="LocalDateTime" />
-          <el-option label="Boolean" value="Boolean" />
-        </el-select>
-      </template>
-    </vxe-column>
-    <vxe-column title="java属性" width="10%" field="javaField">
-      <template #default="{ row }">
-        <el-input v-model="row.javaField" />
-      </template>
-    </vxe-column>
-    <vxe-column title="插入" width="4%" field="createOperation">
-      <template #default="{ row }">
-        <vxe-checkbox true-label="true" false-label="false" v-model="row.createOperation" />
-      </template>
-    </vxe-column>
-    <vxe-column title="编辑" width="4%" field="updateOperation">
-      <template #default="{ row }">
-        <vxe-checkbox true-label="true" false-label="false" v-model="row.updateOperation" />
-      </template>
-    </vxe-column>
-    <vxe-column title="列表" width="4%" field="listOperationResult">
-      <template #default="{ row }">
-        <vxe-checkbox true-label="true" false-label="false" v-model="row.listOperationResult" />
-      </template>
-    </vxe-column>
-    <vxe-column title="查询" width="4%" field="listOperation">
-      <template #default="{ row }">
-        <vxe-checkbox true-label="true" false-label="false" v-model="row.listOperation" />
-      </template>
-    </vxe-column>
-    <vxe-column title="查询方式" width="8%" field="listOperationCondition">
-      <template #default="{ row }">
-        <el-select v-model="row.listOperationCondition">
-          <el-option label="=" value="=" />
-          <el-option label="!=" value="!=" />
-          <el-option label=">" value=">" />
-          <el-option label=">=" value=">=" />
-          <el-option label="<" value="<>" />
-          <el-option label="<=" value="<=" />
-          <el-option label="LIKE" value="LIKE" />
-          <el-option label="BETWEEN" value="BETWEEN" />
-        </el-select>
-      </template>
-    </vxe-column>
-    <vxe-column title="允许空" width="4%" field="nullable">
-      <template #default="{ row }">
-        <vxe-checkbox true-label="true" false-label="false" v-model="row.nullable" />
-      </template>
-    </vxe-column>
+    <vxe-column title="字段列名" field="columnName" fixed="left" width="10%" />
+    <vxe-colgroup title="基础属性">
+      <vxe-column title="字段描述" field="columnComment" width="10%">
+        <template #default="{ row }">
+          <vxe-input v-model="row.columnComment" placeholder="请输入字段描述" />
+        </template>
+      </vxe-column>
+      <vxe-column title="物理类型" field="dataType" width="10%" />
+      <vxe-column title="Java类型" width="10%" field="javaType">
+        <template #default="{ row }">
+          <vxe-select v-model="row.javaType" placeholder="请选择Java类型">
+            <vxe-option label="Long" value="Long" />
+            <vxe-option label="String" value="String" />
+            <vxe-option label="Integer" value="Integer" />
+            <vxe-option label="Double" value="Double" />
+            <vxe-option label="BigDecimal" value="BigDecimal" />
+            <vxe-option label="LocalDateTime" value="LocalDateTime" />
+            <vxe-option label="Boolean" value="Boolean" />
+          </vxe-select>
+        </template>
+      </vxe-column>
+      <vxe-column title="java属性" width="8%" field="javaField">
+        <template #default="{ row }">
+          <vxe-input v-model="row.javaField" placeholder="请输入java属性" />
+        </template>
+      </vxe-column>
+    </vxe-colgroup>
+    <vxe-colgroup title="增删改查">
+      <vxe-column title="插入" width="40px" field="createOperation">
+        <template #default="{ row }">
+          <vxe-checkbox true-label="true" false-label="false" v-model="row.createOperation" />
+        </template>
+      </vxe-column>
+      <vxe-column title="编辑" width="40px" field="updateOperation">
+        <template #default="{ row }">
+          <vxe-checkbox true-label="true" false-label="false" v-model="row.updateOperation" />
+        </template>
+      </vxe-column>
+      <vxe-column title="列表" width="40px" field="listOperationResult">
+        <template #default="{ row }">
+          <vxe-checkbox true-label="true" false-label="false" v-model="row.listOperationResult" />
+        </template>
+      </vxe-column>
+      <vxe-column title="查询" width="40px" field="listOperation">
+        <template #default="{ row }">
+          <vxe-checkbox true-label="true" false-label="false" v-model="row.listOperation" />
+        </template>
+      </vxe-column>
+      <vxe-column title="允许空" width="40px" field="nullable">
+        <template #default="{ row }">
+          <vxe-checkbox true-label="true" false-label="false" v-model="row.nullable" />
+        </template>
+      </vxe-column>
+      <vxe-column title="查询方式" width="60px" field="listOperationCondition">
+        <template #default="{ row }">
+          <vxe-select v-model="row.listOperationCondition" placeholder="请选择查询方式">
+            <vxe-option label="=" value="=" />
+            <vxe-option label="!=" value="!=" />
+            <vxe-option label=">" value=">" />
+            <vxe-option label=">=" value=">=" />
+            <vxe-option label="<" value="<>" />
+            <vxe-option label="<=" value="<=" />
+            <vxe-option label="LIKE" value="LIKE" />
+            <vxe-option label="BETWEEN" value="BETWEEN" />
+          </vxe-select>
+        </template>
+      </vxe-column>
+    </vxe-colgroup>
     <vxe-column title="显示类型" width="10%" field="htmlType">
       <template #default="{ row }">
-        <el-select v-model="row.htmlType">
-          <el-option label="文本框" value="input" />
-          <el-option label="文本域" value="textarea" />
-          <el-option label="下拉框" value="select" />
-          <el-option label="单选框" value="radio" />
-          <el-option label="复选框" value="checkbox" />
-          <el-option label="日期控件" value="datetime" />
-          <el-option label="图片上传" value="imageUpload" />
-          <el-option label="文件上传" value="fileUpload" />
-          <el-option label="富文本控件" value="editor" />
-        </el-select>
+        <vxe-select v-model="row.htmlType" placeholder="请选择显示类型">
+          <vxe-option label="文本框" value="input" />
+          <vxe-option label="文本域" value="textarea" />
+          <vxe-option label="下拉框" value="select" />
+          <vxe-option label="单选框" value="radio" />
+          <vxe-option label="复选框" value="checkbox" />
+          <vxe-option label="日期控件" value="datetime" />
+          <vxe-option label="图片上传" value="imageUpload" />
+          <vxe-option label="文件上传" value="fileUpload" />
+          <vxe-option label="富文本控件" value="editor" />
+        </vxe-select>
       </template>
     </vxe-column>
     <vxe-column title="字典类型" width="10%" field="dictType">
       <template #default="{ row }">
-        <el-select v-model="row.dictType" clearable filterable placeholder="请选择">
-          <el-option
+        <vxe-select v-model="row.dictType" clearable filterable placeholder="请选择字典类型">
+          <vxe-option
             v-for="dict in dictOptions"
             :key="dict.id"
             :label="dict.name"
             :value="dict.type"
           />
-        </el-select>
+        </vxe-select>
       </template>
     </vxe-column>
     <vxe-column title="示例" field="example">
       <template #default="{ row }">
-        <el-input v-model="row.example" />
+        <vxe-input v-model="row.example" placeholder="请输入示例" />
       </template>
     </vxe-column>
   </vxe-table>
 </template>
 <script setup lang="ts">
 import { onMounted, PropType, ref } from 'vue'
-import { ElInput, ElSelect, ElOption } from 'element-plus'
 import { DictTypeVO } from '@/api/system/dict/types'
 import { CodegenColumnVO } from '@/api/infra/codegen/types'
 import { listSimpleDictTypeApi } from '@/api/system/dict/dict.type'

+ 0 - 135
yudao-ui-admin-vue3/src/views/infra/codegen/components/GenInfoForm.vue

@@ -1,135 +0,0 @@
-<template>
-  <Form :rules="rules" @register="register" />
-</template>
-<script setup lang="ts">
-import { onMounted, PropType, reactive, ref, watch } from 'vue'
-import { Form } from '@/components/Form'
-import { useForm } from '@/hooks/web/useForm'
-import { required } from '@/utils/formRules'
-import { handleTree, defaultProps } from '@/utils/tree'
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { listSimpleMenusApi } from '@/api/system/menu'
-import { CodegenTableVO } from '@/api/infra/codegen/types'
-import { FormSchema } from '@/types/form'
-const props = defineProps({
-  genInfo: {
-    type: Object as PropType<Nullable<CodegenTableVO>>,
-    default: () => null
-  }
-})
-const rules = reactive({
-  templateType: [required],
-  scene: [required],
-  moduleName: [required],
-  businessName: [required],
-  businessPackage: [required],
-  className: [required],
-  classComment: [required]
-})
-const templateTypeOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_TYPE)
-const sceneOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE)
-const menuOptions = ref<any>([]) // 树形结构
-const getTree = async () => {
-  const res = await listSimpleMenusApi()
-  menuOptions.value = handleTree(res)
-}
-const schema = reactive<FormSchema[]>([
-  {
-    label: '生成模板',
-    field: 'templateType',
-    component: 'Select',
-    componentProps: {
-      options: templateTypeOptions
-    },
-    colProps: {
-      span: 12
-    }
-  },
-  {
-    label: '生成场景',
-    field: 'scene',
-    component: 'Select',
-    componentProps: {
-      options: sceneOptions
-    },
-    colProps: {
-      span: 12
-    }
-  },
-  {
-    label: '模块名',
-    field: 'moduleName',
-    component: 'Input',
-    labelMessage: '模块名,即一级目录,例如 system、infra、tool 等等',
-    colProps: {
-      span: 12
-    }
-  },
-  {
-    label: '业务名',
-    field: 'businessName',
-    component: 'Input',
-    labelMessage: '业务名,即二级目录,例如 user、permission、dict 等等',
-    colProps: {
-      span: 12
-    }
-  },
-  {
-    label: '类名称',
-    field: 'className',
-    component: 'Input',
-    labelMessage: '类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等',
-    colProps: {
-      span: 12
-    }
-  },
-  {
-    label: '类描述',
-    field: 'classComment',
-    component: 'Input',
-    labelMessage: '用作类描述,例如 用户',
-    colProps: {
-      span: 12
-    }
-  },
-  {
-    label: '上级菜单',
-    field: 'parentMenuId',
-    component: 'TreeSelect',
-    componentProps: {
-      data: menuOptions,
-      props: defaultProps,
-      checkStrictly: true,
-      nodeKey: 'id'
-    },
-    labelMessage: '分配到指定菜单下,例如 系统管理',
-    colProps: {
-      span: 12
-    }
-  }
-])
-const { register, methods, elFormRef } = useForm({
-  schema
-})
-
-// ========== 初始化 ==========
-onMounted(async () => {
-  await getTree()
-})
-watch(
-  () => props.genInfo,
-  (genInfo) => {
-    if (!genInfo) return
-    const { setValues } = methods
-    setValues(genInfo)
-  },
-  {
-    deep: true,
-    immediate: true
-  }
-)
-defineExpose({
-  elFormRef,
-  getFormData: methods.getFormData
-})
-</script>

+ 1 - 2
yudao-ui-admin-vue3/src/views/infra/codegen/components/index.ts

@@ -1,6 +1,5 @@
 import BasicInfoForm from './BasicInfoForm.vue'
 import CloumInfoForm from './CloumInfoForm.vue'
-import GenInfoForm from './GenInfoForm.vue'
 import ImportTable from './ImportTable.vue'
 import Preview from './Preview.vue'
-export { BasicInfoForm, CloumInfoForm, GenInfoForm, ImportTable, Preview }
+export { BasicInfoForm, CloumInfoForm, ImportTable, Preview }

+ 1 - 0
yudao-ui-admin-vue3/src/views/system/dept/index.vue

@@ -167,6 +167,7 @@ const submitForm = async () => {
         dialogVisible.value = false
       } finally {
         actionLoading.value = false
+        await getTree()
         await reload()
       }
     }