Commit 29cd9b79defce7fdf3772ac74cb12ddebef0f0f1
Committed by
Gitee
!299 refactor vue3 vxe crud
Merge pull request !299 from xingyu/feature/vue3
Showing
20 changed files
with
693 additions
and
704 deletions
yudao-ui-admin-vue3/pnpm-lock.yaml
| 1 | -lockfileVersion: 5.3 | |
| 1 | +lockfileVersion: 5.4 | |
| 2 | 2 | |
| 3 | 3 | specifiers: |
| 4 | 4 | '@commitlint/cli': ^17.2.0 |
| ... | ... | @@ -84,7 +84,7 @@ dependencies: |
| 84 | 84 | '@iconify/iconify': 3.0.0 |
| 85 | 85 | '@vueuse/core': 9.5.0_vue@3.2.44 |
| 86 | 86 | '@wangeditor/editor': 5.1.22 |
| 87 | - '@wangeditor/editor-for-vue': 5.1.12_95363b7c2c964a937bf2a01c911df30e | |
| 87 | + '@wangeditor/editor-for-vue': 5.1.12_su3dw7bmszfjg67suaojchptby | |
| 88 | 88 | '@zxcvbn-ts/core': 2.1.0 |
| 89 | 89 | animate.css: 4.1.1 |
| 90 | 90 | axios: 0.27.2 |
| ... | ... | @@ -99,7 +99,7 @@ dependencies: |
| 99 | 99 | lodash-es: 4.17.21 |
| 100 | 100 | mitt: 3.0.0 |
| 101 | 101 | nprogress: 0.2.0 |
| 102 | - pinia: 2.0.23_typescript@4.8.4+vue@3.2.44 | |
| 102 | + pinia: 2.0.23_d45o5shxrtvj6wh4y524t7cqnm | |
| 103 | 103 | qrcode: 1.5.1 |
| 104 | 104 | qs: 6.11.0 |
| 105 | 105 | url: 0.11.0 |
| ... | ... | @@ -124,15 +124,15 @@ devDependencies: |
| 124 | 124 | '@types/nprogress': 0.2.0 |
| 125 | 125 | '@types/qrcode': 1.5.0 |
| 126 | 126 | '@types/qs': 6.9.7 |
| 127 | - '@typescript-eslint/eslint-plugin': 5.42.1_d506b9be61cb4ac2646ecbc6e0680464 | |
| 128 | - '@typescript-eslint/parser': 5.42.1_eslint@8.27.0+typescript@4.8.4 | |
| 127 | + '@typescript-eslint/eslint-plugin': 5.42.1_2udltptbznfmezdozpdoa2aemq | |
| 128 | + '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy | |
| 129 | 129 | '@vitejs/plugin-vue': 3.2.0_vite@3.2.3+vue@3.2.44 |
| 130 | 130 | '@vitejs/plugin-vue-jsx': 2.1.1_vite@3.2.3+vue@3.2.44 |
| 131 | 131 | autoprefixer: 10.4.13_postcss@8.4.18 |
| 132 | 132 | eslint: 8.27.0 |
| 133 | 133 | eslint-config-prettier: 8.5.0_eslint@8.27.0 |
| 134 | 134 | eslint-define-config: 1.12.0 |
| 135 | - eslint-plugin-prettier: 4.2.1_afddd95fb7dd832efd05cfac2e17feb1 | |
| 135 | + eslint-plugin-prettier: 4.2.1_v7o5sx5x3wbs57ifz6wc4f76we | |
| 136 | 136 | eslint-plugin-vue: 9.7.0_eslint@8.27.0 |
| 137 | 137 | less: 4.1.3 |
| 138 | 138 | lint-staged: 13.0.3 |
| ... | ... | @@ -144,14 +144,14 @@ devDependencies: |
| 144 | 144 | rimraf: 3.0.2 |
| 145 | 145 | rollup: 3.2.5 |
| 146 | 146 | stylelint: 14.14.1 |
| 147 | - stylelint-config-html: 1.1.0_0711e485e505c8bbf0b549e6b356f7f2 | |
| 147 | + stylelint-config-html: 1.1.0_a4i6jbpfaxelx4fvjhtlgvxx6i | |
| 148 | 148 | stylelint-config-prettier: 9.0.4_stylelint@14.14.1 |
| 149 | 149 | stylelint-config-recommended: 9.0.0_stylelint@14.14.1 |
| 150 | 150 | stylelint-config-standard: 29.0.0_stylelint@14.14.1 |
| 151 | 151 | stylelint-order: 5.0.0_stylelint@14.14.1 |
| 152 | 152 | typescript: 4.8.4 |
| 153 | - unplugin-vue-macros: 0.16.2_688fcac82e974ec4fd5c071d8de5a7a5 | |
| 154 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 153 | + unplugin-vue-macros: 0.16.2_nch4vsbos5hmj7k4a4oy3znhuu | |
| 154 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 155 | 155 | vite-plugin-compression: 0.5.1_vite@3.2.3 |
| 156 | 156 | vite-plugin-eslint: 1.8.1_eslint@8.27.0+vite@3.2.3 |
| 157 | 157 | vite-plugin-html: 3.2.0_vite@3.2.3 |
| ... | ... | @@ -574,10 +574,10 @@ packages: |
| 574 | 574 | '@types/node': 14.18.31 |
| 575 | 575 | chalk: 4.1.2 |
| 576 | 576 | cosmiconfig: 7.0.1 |
| 577 | - cosmiconfig-typescript-loader: 4.1.1_33d7b64ae90e9bb80d48469351c457b9 | |
| 577 | + cosmiconfig-typescript-loader: 4.1.1_gpl3msxjb2n3qdkii2jvdrcxxe | |
| 578 | 578 | lodash: 4.17.21 |
| 579 | 579 | resolve-from: 5.0.0 |
| 580 | - ts-node: 10.9.1_2abc08acbb4fe741ae8218df9aa74f5c | |
| 580 | + ts-node: 10.9.1_fk6arlf3j7tudlucddpzvj2plq | |
| 581 | 581 | typescript: 4.8.4 |
| 582 | 582 | transitivePeerDependencies: |
| 583 | 583 | - '@swc/core' |
| ... | ... | @@ -658,7 +658,7 @@ packages: |
| 658 | 658 | '@jridgewell/trace-mapping': 0.3.9 |
| 659 | 659 | dev: true |
| 660 | 660 | |
| 661 | - /@csstools/selector-specificity/2.0.2_1d546e2941f6b4ca889831b9fbdc79d8: | |
| 661 | + /@csstools/selector-specificity/2.0.2_dvkg4kkb622mvceygg47xxdz3a: | |
| 662 | 662 | resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} |
| 663 | 663 | engines: {node: ^12 || ^14 || >=16} |
| 664 | 664 | peerDependencies: |
| ... | ... | @@ -798,14 +798,12 @@ packages: |
| 798 | 798 | '@intlify/message-compiler': 9.2.2 |
| 799 | 799 | '@intlify/shared': 9.2.2 |
| 800 | 800 | '@intlify/vue-devtools': 9.2.2 |
| 801 | - dev: false | |
| 802 | 801 | |
| 803 | 802 | /@intlify/devtools-if/9.2.2: |
| 804 | 803 | resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} |
| 805 | 804 | engines: {node: '>= 14'} |
| 806 | 805 | dependencies: |
| 807 | 806 | '@intlify/shared': 9.2.2 |
| 808 | - dev: false | |
| 809 | 807 | |
| 810 | 808 | /@intlify/message-compiler/9.2.2: |
| 811 | 809 | resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} |
| ... | ... | @@ -813,7 +811,6 @@ packages: |
| 813 | 811 | dependencies: |
| 814 | 812 | '@intlify/shared': 9.2.2 |
| 815 | 813 | source-map: 0.6.1 |
| 816 | - dev: false | |
| 817 | 814 | |
| 818 | 815 | /@intlify/message-compiler/9.3.0-beta.6: |
| 819 | 816 | resolution: {integrity: sha512-3PJqRJoqvFHExA9DCkf7fZYKbvYne1tYQ0fptJAhUOZsELarh8wr4aPLKWCkQSRuutdrtZ/n5CcPgJgUmVthDw==} |
| ... | ... | @@ -826,7 +823,6 @@ packages: |
| 826 | 823 | /@intlify/shared/9.2.2: |
| 827 | 824 | resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} |
| 828 | 825 | engines: {node: '>= 14'} |
| 829 | - dev: false | |
| 830 | 826 | |
| 831 | 827 | /@intlify/shared/9.3.0-beta.6: |
| 832 | 828 | resolution: {integrity: sha512-ITA1R4tvJYwZXT5x6QCSwxcwQ4dU52zrzVm/EUbgsp8oWzYS1xexBrxyNM80PSQudYvL2rvcZJKQ7yBh7b0LkQ==} |
| ... | ... | @@ -854,7 +850,7 @@ packages: |
| 854 | 850 | debug: 4.3.4 |
| 855 | 851 | fast-glob: 3.2.12 |
| 856 | 852 | source-map: 0.6.1 |
| 857 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 853 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 858 | 854 | vue-i18n: 9.2.2_vue@3.2.44 |
| 859 | 855 | transitivePeerDependencies: |
| 860 | 856 | - supports-color |
| ... | ... | @@ -866,7 +862,6 @@ packages: |
| 866 | 862 | dependencies: |
| 867 | 863 | '@intlify/core-base': 9.2.2 |
| 868 | 864 | '@intlify/shared': 9.2.2 |
| 869 | - dev: false | |
| 870 | 865 | |
| 871 | 866 | /@jridgewell/gen-mapping/0.1.1: |
| 872 | 867 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} |
| ... | ... | @@ -1097,9 +1092,8 @@ packages: |
| 1097 | 1092 | |
| 1098 | 1093 | /@types/web-bluetooth/0.0.16: |
| 1099 | 1094 | resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} |
| 1100 | - dev: false | |
| 1101 | 1095 | |
| 1102 | - /@typescript-eslint/eslint-plugin/5.42.1_d506b9be61cb4ac2646ecbc6e0680464: | |
| 1096 | + /@typescript-eslint/eslint-plugin/5.42.1_2udltptbznfmezdozpdoa2aemq: | |
| 1103 | 1097 | resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==} |
| 1104 | 1098 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} |
| 1105 | 1099 | peerDependencies: |
| ... | ... | @@ -1110,10 +1104,10 @@ packages: |
| 1110 | 1104 | typescript: |
| 1111 | 1105 | optional: true |
| 1112 | 1106 | dependencies: |
| 1113 | - '@typescript-eslint/parser': 5.42.1_eslint@8.27.0+typescript@4.8.4 | |
| 1107 | + '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy | |
| 1114 | 1108 | '@typescript-eslint/scope-manager': 5.42.1 |
| 1115 | - '@typescript-eslint/type-utils': 5.42.1_eslint@8.27.0+typescript@4.8.4 | |
| 1116 | - '@typescript-eslint/utils': 5.42.1_eslint@8.27.0+typescript@4.8.4 | |
| 1109 | + '@typescript-eslint/type-utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy | |
| 1110 | + '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy | |
| 1117 | 1111 | debug: 4.3.4 |
| 1118 | 1112 | eslint: 8.27.0 |
| 1119 | 1113 | ignore: 5.2.0 |
| ... | ... | @@ -1126,7 +1120,7 @@ packages: |
| 1126 | 1120 | - supports-color |
| 1127 | 1121 | dev: true |
| 1128 | 1122 | |
| 1129 | - /@typescript-eslint/parser/5.42.1_eslint@8.27.0+typescript@4.8.4: | |
| 1123 | + /@typescript-eslint/parser/5.42.1_rmayb2veg2btbq6mbmnyivgasy: | |
| 1130 | 1124 | resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} |
| 1131 | 1125 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} |
| 1132 | 1126 | peerDependencies: |
| ... | ... | @@ -1154,7 +1148,7 @@ packages: |
| 1154 | 1148 | '@typescript-eslint/visitor-keys': 5.42.1 |
| 1155 | 1149 | dev: true |
| 1156 | 1150 | |
| 1157 | - /@typescript-eslint/type-utils/5.42.1_eslint@8.27.0+typescript@4.8.4: | |
| 1151 | + /@typescript-eslint/type-utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: | |
| 1158 | 1152 | resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} |
| 1159 | 1153 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} |
| 1160 | 1154 | peerDependencies: |
| ... | ... | @@ -1165,7 +1159,7 @@ packages: |
| 1165 | 1159 | optional: true |
| 1166 | 1160 | dependencies: |
| 1167 | 1161 | '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 |
| 1168 | - '@typescript-eslint/utils': 5.42.1_eslint@8.27.0+typescript@4.8.4 | |
| 1162 | + '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy | |
| 1169 | 1163 | debug: 4.3.4 |
| 1170 | 1164 | eslint: 8.27.0 |
| 1171 | 1165 | tsutils: 3.21.0_typescript@4.8.4 |
| ... | ... | @@ -1200,7 +1194,7 @@ packages: |
| 1200 | 1194 | - supports-color |
| 1201 | 1195 | dev: true |
| 1202 | 1196 | |
| 1203 | - /@typescript-eslint/utils/5.42.1_eslint@8.27.0+typescript@4.8.4: | |
| 1197 | + /@typescript-eslint/utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: | |
| 1204 | 1198 | resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} |
| 1205 | 1199 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} |
| 1206 | 1200 | peerDependencies: |
| ... | ... | @@ -1279,7 +1273,7 @@ packages: |
| 1279 | 1273 | '@babel/core': 7.19.6 |
| 1280 | 1274 | '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.19.6 |
| 1281 | 1275 | '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.19.6 |
| 1282 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 1276 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 1283 | 1277 | vue: 3.2.44 |
| 1284 | 1278 | transitivePeerDependencies: |
| 1285 | 1279 | - supports-color |
| ... | ... | @@ -1292,7 +1286,7 @@ packages: |
| 1292 | 1286 | vite: ^3.0.0 |
| 1293 | 1287 | vue: ^3.2.25 |
| 1294 | 1288 | dependencies: |
| 1295 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 1289 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 1296 | 1290 | vue: 3.2.44 |
| 1297 | 1291 | dev: true |
| 1298 | 1292 | |
| ... | ... | @@ -1424,7 +1418,7 @@ packages: |
| 1424 | 1418 | unplugin: 0.10.2 |
| 1425 | 1419 | dev: true |
| 1426 | 1420 | |
| 1427 | - /@vue-macros/named-template/0.0.5_aaae75a03f99901122a33a7412c8cd0a: | |
| 1421 | + /@vue-macros/named-template/0.0.5_vkxhlib7tgibcivdhj2bfsgnbi: | |
| 1428 | 1422 | resolution: {integrity: sha512-bZRUljNyvOOqeE9dyqXvKPQCLUCcPt1EkThmXqSbxagV29ohyviF8+CCs/8OdmNygLTBIChjP8DexQ3nUIFzUg==} |
| 1429 | 1423 | engines: {node: '>=14.19.0'} |
| 1430 | 1424 | dependencies: |
| ... | ... | @@ -1521,7 +1515,6 @@ packages: |
| 1521 | 1515 | '@vue/shared': 3.2.44 |
| 1522 | 1516 | estree-walker: 2.0.2 |
| 1523 | 1517 | source-map: 0.6.1 |
| 1524 | - dev: false | |
| 1525 | 1518 | |
| 1526 | 1519 | /@vue/compiler-dom/3.2.41: |
| 1527 | 1520 | resolution: {integrity: sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==} |
| ... | ... | @@ -1542,7 +1535,6 @@ packages: |
| 1542 | 1535 | dependencies: |
| 1543 | 1536 | '@vue/compiler-core': 3.2.44 |
| 1544 | 1537 | '@vue/shared': 3.2.44 |
| 1545 | - dev: false | |
| 1546 | 1538 | |
| 1547 | 1539 | /@vue/compiler-sfc/3.2.41: |
| 1548 | 1540 | resolution: {integrity: sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==} |
| ... | ... | @@ -1587,7 +1579,6 @@ packages: |
| 1587 | 1579 | magic-string: 0.25.9 |
| 1588 | 1580 | postcss: 8.4.18 |
| 1589 | 1581 | source-map: 0.6.1 |
| 1590 | - dev: false | |
| 1591 | 1582 | |
| 1592 | 1583 | /@vue/compiler-ssr/3.2.41: |
| 1593 | 1584 | resolution: {integrity: sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==} |
| ... | ... | @@ -1608,11 +1599,9 @@ packages: |
| 1608 | 1599 | dependencies: |
| 1609 | 1600 | '@vue/compiler-dom': 3.2.44 |
| 1610 | 1601 | '@vue/shared': 3.2.44 |
| 1611 | - dev: false | |
| 1612 | 1602 | |
| 1613 | 1603 | /@vue/devtools-api/6.4.3: |
| 1614 | 1604 | resolution: {integrity: sha512-9WCRwdROJvWcHAdyrR7SZMM/qUvllDZnpndHXokThkUsjnJ2xe4/pvsH9FZrxFe22L+JmDKczL79HjLJ7DK9rg==} |
| 1615 | - dev: false | |
| 1616 | 1605 | |
| 1617 | 1606 | /@vue/devtools-api/6.4.4: |
| 1618 | 1607 | resolution: {integrity: sha512-Ku31WzpOV/8cruFaXaEZKF81WkNnvCSlBY4eOGtz5WMSdJvX1v1WWlSMGZeqUwPtQ27ZZz7B62erEMq8JDjcXw==} |
| ... | ... | @@ -1650,7 +1639,6 @@ packages: |
| 1650 | 1639 | '@vue/shared': 3.2.44 |
| 1651 | 1640 | estree-walker: 2.0.2 |
| 1652 | 1641 | magic-string: 0.25.9 |
| 1653 | - dev: false | |
| 1654 | 1642 | |
| 1655 | 1643 | /@vue/reactivity/3.2.41: |
| 1656 | 1644 | resolution: {integrity: sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==} |
| ... | ... | @@ -1662,14 +1650,12 @@ packages: |
| 1662 | 1650 | resolution: {integrity: sha512-Fe0s52fTsPl+RSdvoqUZ3HRKlaVsKhIh1mea5EWOedFvZCjnymzlj3YC1wZMxi89qXRFSdEASVA/BWUGypk0Ig==} |
| 1663 | 1651 | dependencies: |
| 1664 | 1652 | '@vue/shared': 3.2.44 |
| 1665 | - dev: false | |
| 1666 | 1653 | |
| 1667 | 1654 | /@vue/runtime-core/3.2.44: |
| 1668 | 1655 | resolution: {integrity: sha512-uwEV1cttL33k2dC+CNGYhKEYqGejT9KmgQ+4n/LmYUfZ1Gorl8F32DlIX+1pANyGHL1tBAisqHDxKyQBp2oBNA==} |
| 1669 | 1656 | dependencies: |
| 1670 | 1657 | '@vue/reactivity': 3.2.44 |
| 1671 | 1658 | '@vue/shared': 3.2.44 |
| 1672 | - dev: false | |
| 1673 | 1659 | |
| 1674 | 1660 | /@vue/runtime-dom/3.2.44: |
| 1675 | 1661 | resolution: {integrity: sha512-LDzNwXpU/nSpxrLk5jS0bfStgt88msgsgFzj6vHrl7es3QktIrCGybQS5CB/p/TO0q98iAiYtEVmi+Lej7Vgjg==} |
| ... | ... | @@ -1677,7 +1663,6 @@ packages: |
| 1677 | 1663 | '@vue/runtime-core': 3.2.44 |
| 1678 | 1664 | '@vue/shared': 3.2.44 |
| 1679 | 1665 | csstype: 2.6.21 |
| 1680 | - dev: false | |
| 1681 | 1666 | |
| 1682 | 1667 | /@vue/server-renderer/3.2.44_vue@3.2.44: |
| 1683 | 1668 | resolution: {integrity: sha512-3+ArN07UgOAdbGKIp3uVqeC3bnR3J324QNjPR6vxHbLrTlkibFv8QNled/ux3fVq0KDCkVVKGOKB2V4sCIYOgg==} |
| ... | ... | @@ -1687,7 +1672,6 @@ packages: |
| 1687 | 1672 | '@vue/compiler-ssr': 3.2.44 |
| 1688 | 1673 | '@vue/shared': 3.2.44 |
| 1689 | 1674 | vue: 3.2.44 |
| 1690 | - dev: false | |
| 1691 | 1675 | |
| 1692 | 1676 | /@vue/shared/3.2.41: |
| 1693 | 1677 | resolution: {integrity: sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==} |
| ... | ... | @@ -1699,7 +1683,6 @@ packages: |
| 1699 | 1683 | |
| 1700 | 1684 | /@vue/shared/3.2.44: |
| 1701 | 1685 | resolution: {integrity: sha512-mGZ44bnn0zpZ36nXtxbrBPno43yr96wjQE1dBEKS1Sieugt27HS4OGZVBRIgsdGzosB7vqZAvu0ttu1FDVdolA==} |
| 1702 | - dev: false | |
| 1703 | 1686 | |
| 1704 | 1687 | /@vueuse/core/9.5.0_vue@3.2.44: |
| 1705 | 1688 | resolution: {integrity: sha512-6GsWBsJHEb3sYw15mbLrcbslAVY45pkzjJYTKYKCXv88z7srAF0VEW0q+oXKsl58tCbqooplInahXFg8Yo1m4w==} |
| ... | ... | @@ -1711,11 +1694,9 @@ packages: |
| 1711 | 1694 | transitivePeerDependencies: |
| 1712 | 1695 | - '@vue/composition-api' |
| 1713 | 1696 | - vue |
| 1714 | - dev: false | |
| 1715 | 1697 | |
| 1716 | 1698 | /@vueuse/metadata/9.5.0: |
| 1717 | 1699 | resolution: {integrity: sha512-4M1AyPZmIv41pym+K5+4wup3bKuYebbH8w8BROY1hmT7rIwcyS4tEL+UsGz0Hiu1FCOxcoBrwtAizc0YmBJjyQ==} |
| 1718 | - dev: false | |
| 1719 | 1700 | |
| 1720 | 1701 | /@vueuse/shared/9.5.0_vue@3.2.44: |
| 1721 | 1702 | resolution: {integrity: sha512-HnnCWU1Vg9CVWRCcI8ohDKDRB2Sc4bTgT1XAIaoLSfVHHn+TKbrox6pd3klCSw4UDxkhDfOk8cAdcK+Z5KleCA==} |
| ... | ... | @@ -1724,9 +1705,8 @@ packages: |
| 1724 | 1705 | transitivePeerDependencies: |
| 1725 | 1706 | - '@vue/composition-api' |
| 1726 | 1707 | - vue |
| 1727 | - dev: false | |
| 1728 | 1708 | |
| 1729 | - /@wangeditor/basic-modules/1.1.6_77a30faf19af486fa77beec27d9e830b: | |
| 1709 | + /@wangeditor/basic-modules/1.1.6_o6rq7lyzv5eg7j3353bh3hudbm: | |
| 1730 | 1710 | resolution: {integrity: sha512-wckcFm/kEAHpTn7dTmN0+7POFoygqt9bZdNHJUkdKObXtAerml8RdjrkHRcwJFCkSELbrNK63fvkwS0+FsabfA==} |
| 1731 | 1711 | peerDependencies: |
| 1732 | 1712 | '@wangeditor/core': 1.x |
| ... | ... | @@ -1736,7 +1716,7 @@ packages: |
| 1736 | 1716 | slate: ^0.72.0 |
| 1737 | 1717 | snabbdom: ^3.1.0 |
| 1738 | 1718 | dependencies: |
| 1739 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1719 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1740 | 1720 | dom7: 3.0.0 |
| 1741 | 1721 | is-url: 1.2.4 |
| 1742 | 1722 | lodash.throttle: 4.1.1 |
| ... | ... | @@ -1745,7 +1725,7 @@ packages: |
| 1745 | 1725 | snabbdom: 3.5.1 |
| 1746 | 1726 | dev: false |
| 1747 | 1727 | |
| 1748 | - /@wangeditor/code-highlight/1.0.3_5fc334405e4d9219aba9f66fdd32274f: | |
| 1728 | + /@wangeditor/code-highlight/1.0.3_l7btiqc6jwjbtk5j6zx52mrhj4: | |
| 1749 | 1729 | resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} |
| 1750 | 1730 | peerDependencies: |
| 1751 | 1731 | '@wangeditor/core': 1.x |
| ... | ... | @@ -1753,14 +1733,14 @@ packages: |
| 1753 | 1733 | slate: ^0.72.0 |
| 1754 | 1734 | snabbdom: ^3.1.0 |
| 1755 | 1735 | dependencies: |
| 1756 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1736 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1757 | 1737 | dom7: 3.0.0 |
| 1758 | 1738 | prismjs: 1.29.0 |
| 1759 | 1739 | slate: 0.72.8 |
| 1760 | 1740 | snabbdom: 3.5.1 |
| 1761 | 1741 | dev: false |
| 1762 | 1742 | |
| 1763 | - /@wangeditor/core/1.1.18_83942e33b1d7a7a6aab922626cc5c0f9: | |
| 1743 | + /@wangeditor/core/1.1.18_qokc4m5r26t2nkvzejrgzroa7e: | |
| 1764 | 1744 | resolution: {integrity: sha512-GZsW/8tm2Hc2hZKX8BZP9PO7vTZll9YXsOt+jKck3D2bj9nk4T0FZymuE5fq9ZHdo+MwLiXBHXS/D1SIGlVnGQ==} |
| 1765 | 1745 | peerDependencies: |
| 1766 | 1746 | '@uppy/core': ^2.1.1 |
| ... | ... | @@ -1800,7 +1780,7 @@ packages: |
| 1800 | 1780 | snabbdom: 3.5.1 |
| 1801 | 1781 | dev: false |
| 1802 | 1782 | |
| 1803 | - /@wangeditor/editor-for-vue/5.1.12_95363b7c2c964a937bf2a01c911df30e: | |
| 1783 | + /@wangeditor/editor-for-vue/5.1.12_su3dw7bmszfjg67suaojchptby: | |
| 1804 | 1784 | resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==} |
| 1805 | 1785 | peerDependencies: |
| 1806 | 1786 | '@wangeditor/editor': '>=5.1.0' |
| ... | ... | @@ -1815,13 +1795,13 @@ packages: |
| 1815 | 1795 | dependencies: |
| 1816 | 1796 | '@uppy/core': 2.3.4 |
| 1817 | 1797 | '@uppy/xhr-upload': 2.1.3_@uppy+core@2.3.4 |
| 1818 | - '@wangeditor/basic-modules': 1.1.6_77a30faf19af486fa77beec27d9e830b | |
| 1819 | - '@wangeditor/code-highlight': 1.0.3_5fc334405e4d9219aba9f66fdd32274f | |
| 1820 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1821 | - '@wangeditor/list-module': 1.0.5_5fc334405e4d9219aba9f66fdd32274f | |
| 1822 | - '@wangeditor/table-module': 1.1.4_5d8cd29e73aad229850928ebedfb04b7 | |
| 1823 | - '@wangeditor/upload-image-module': 1.0.2_7a9aad2bf3b86405f1f37087d2b924a4 | |
| 1824 | - '@wangeditor/video-module': 1.1.4_47db22f98847f2d6b6569a7e95c5dcf5 | |
| 1798 | + '@wangeditor/basic-modules': 1.1.6_o6rq7lyzv5eg7j3353bh3hudbm | |
| 1799 | + '@wangeditor/code-highlight': 1.0.3_l7btiqc6jwjbtk5j6zx52mrhj4 | |
| 1800 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1801 | + '@wangeditor/list-module': 1.0.5_l7btiqc6jwjbtk5j6zx52mrhj4 | |
| 1802 | + '@wangeditor/table-module': 1.1.4_lwgnfhttvljctbijfdv636yew4 | |
| 1803 | + '@wangeditor/upload-image-module': 1.0.2_pknk2k7txbsal4ptocd5fojeuq | |
| 1804 | + '@wangeditor/video-module': 1.1.4_i7nsf6mii7znnnswtj7jlro46u | |
| 1825 | 1805 | dom7: 3.0.0 |
| 1826 | 1806 | is-hotkey: 0.2.0 |
| 1827 | 1807 | lodash.camelcase: 4.3.0 |
| ... | ... | @@ -1836,7 +1816,7 @@ packages: |
| 1836 | 1816 | snabbdom: 3.5.1 |
| 1837 | 1817 | dev: false |
| 1838 | 1818 | |
| 1839 | - /@wangeditor/list-module/1.0.5_5fc334405e4d9219aba9f66fdd32274f: | |
| 1819 | + /@wangeditor/list-module/1.0.5_l7btiqc6jwjbtk5j6zx52mrhj4: | |
| 1840 | 1820 | resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} |
| 1841 | 1821 | peerDependencies: |
| 1842 | 1822 | '@wangeditor/core': 1.x |
| ... | ... | @@ -1844,13 +1824,13 @@ packages: |
| 1844 | 1824 | slate: ^0.72.0 |
| 1845 | 1825 | snabbdom: ^3.1.0 |
| 1846 | 1826 | dependencies: |
| 1847 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1827 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1848 | 1828 | dom7: 3.0.0 |
| 1849 | 1829 | slate: 0.72.8 |
| 1850 | 1830 | snabbdom: 3.5.1 |
| 1851 | 1831 | dev: false |
| 1852 | 1832 | |
| 1853 | - /@wangeditor/table-module/1.1.4_5d8cd29e73aad229850928ebedfb04b7: | |
| 1833 | + /@wangeditor/table-module/1.1.4_lwgnfhttvljctbijfdv636yew4: | |
| 1854 | 1834 | resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} |
| 1855 | 1835 | peerDependencies: |
| 1856 | 1836 | '@wangeditor/core': 1.x |
| ... | ... | @@ -1861,7 +1841,7 @@ packages: |
| 1861 | 1841 | slate: ^0.72.0 |
| 1862 | 1842 | snabbdom: ^3.1.0 |
| 1863 | 1843 | dependencies: |
| 1864 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1844 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1865 | 1845 | dom7: 3.0.0 |
| 1866 | 1846 | lodash.isequal: 4.5.0 |
| 1867 | 1847 | lodash.throttle: 4.1.1 |
| ... | ... | @@ -1870,7 +1850,7 @@ packages: |
| 1870 | 1850 | snabbdom: 3.5.1 |
| 1871 | 1851 | dev: false |
| 1872 | 1852 | |
| 1873 | - /@wangeditor/upload-image-module/1.0.2_7a9aad2bf3b86405f1f37087d2b924a4: | |
| 1853 | + /@wangeditor/upload-image-module/1.0.2_pknk2k7txbsal4ptocd5fojeuq: | |
| 1874 | 1854 | resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} |
| 1875 | 1855 | peerDependencies: |
| 1876 | 1856 | '@uppy/core': ^2.0.3 |
| ... | ... | @@ -1884,15 +1864,15 @@ packages: |
| 1884 | 1864 | dependencies: |
| 1885 | 1865 | '@uppy/core': 2.3.4 |
| 1886 | 1866 | '@uppy/xhr-upload': 2.1.3_@uppy+core@2.3.4 |
| 1887 | - '@wangeditor/basic-modules': 1.1.6_77a30faf19af486fa77beec27d9e830b | |
| 1888 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1867 | + '@wangeditor/basic-modules': 1.1.6_o6rq7lyzv5eg7j3353bh3hudbm | |
| 1868 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1889 | 1869 | dom7: 3.0.0 |
| 1890 | 1870 | lodash.foreach: 4.5.0 |
| 1891 | 1871 | slate: 0.72.8 |
| 1892 | 1872 | snabbdom: 3.5.1 |
| 1893 | 1873 | dev: false |
| 1894 | 1874 | |
| 1895 | - /@wangeditor/video-module/1.1.4_47db22f98847f2d6b6569a7e95c5dcf5: | |
| 1875 | + /@wangeditor/video-module/1.1.4_i7nsf6mii7znnnswtj7jlro46u: | |
| 1896 | 1876 | resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} |
| 1897 | 1877 | peerDependencies: |
| 1898 | 1878 | '@uppy/core': ^2.1.4 |
| ... | ... | @@ -1905,7 +1885,7 @@ packages: |
| 1905 | 1885 | dependencies: |
| 1906 | 1886 | '@uppy/core': 2.3.4 |
| 1907 | 1887 | '@uppy/xhr-upload': 2.1.3_@uppy+core@2.3.4 |
| 1908 | - '@wangeditor/core': 1.1.18_83942e33b1d7a7a6aab922626cc5c0f9 | |
| 1888 | + '@wangeditor/core': 1.1.18_qokc4m5r26t2nkvzejrgzroa7e | |
| 1909 | 1889 | dom7: 3.0.0 |
| 1910 | 1890 | nanoid: 3.3.4 |
| 1911 | 1891 | slate: 0.72.8 |
| ... | ... | @@ -2269,6 +2249,8 @@ packages: |
| 2269 | 2249 | snapdragon-node: 2.1.1 |
| 2270 | 2250 | split-string: 3.1.0 |
| 2271 | 2251 | to-regex: 3.0.2 |
| 2252 | + transitivePeerDependencies: | |
| 2253 | + - supports-color | |
| 2272 | 2254 | dev: true |
| 2273 | 2255 | |
| 2274 | 2256 | /braces/3.0.2: |
| ... | ... | @@ -2652,8 +2634,8 @@ packages: |
| 2652 | 2634 | engines: {node: '>=10'} |
| 2653 | 2635 | hasBin: true |
| 2654 | 2636 | dependencies: |
| 2655 | - is-text-path: 1.0.1 | |
| 2656 | 2637 | JSONStream: 1.3.5 |
| 2638 | + is-text-path: 1.0.1 | |
| 2657 | 2639 | lodash: 4.17.21 |
| 2658 | 2640 | meow: 8.1.2 |
| 2659 | 2641 | split2: 3.2.2 |
| ... | ... | @@ -2685,7 +2667,7 @@ packages: |
| 2685 | 2667 | vary: 1.1.2 |
| 2686 | 2668 | dev: true |
| 2687 | 2669 | |
| 2688 | - /cosmiconfig-typescript-loader/4.1.1_33d7b64ae90e9bb80d48469351c457b9: | |
| 2670 | + /cosmiconfig-typescript-loader/4.1.1_gpl3msxjb2n3qdkii2jvdrcxxe: | |
| 2689 | 2671 | resolution: {integrity: sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg==} |
| 2690 | 2672 | engines: {node: '>=12', npm: '>=6'} |
| 2691 | 2673 | peerDependencies: |
| ... | ... | @@ -2696,7 +2678,7 @@ packages: |
| 2696 | 2678 | dependencies: |
| 2697 | 2679 | '@types/node': 14.18.31 |
| 2698 | 2680 | cosmiconfig: 7.0.1 |
| 2699 | - ts-node: 10.9.1_2abc08acbb4fe741ae8218df9aa74f5c | |
| 2681 | + ts-node: 10.9.1_fk6arlf3j7tudlucddpzvj2plq | |
| 2700 | 2682 | typescript: 4.8.4 |
| 2701 | 2683 | dev: true |
| 2702 | 2684 | |
| ... | ... | @@ -2779,7 +2761,6 @@ packages: |
| 2779 | 2761 | |
| 2780 | 2762 | /csstype/2.6.21: |
| 2781 | 2763 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} |
| 2782 | - dev: false | |
| 2783 | 2764 | |
| 2784 | 2765 | /d/1.0.1: |
| 2785 | 2766 | resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} |
| ... | ... | @@ -2803,12 +2784,22 @@ packages: |
| 2803 | 2784 | |
| 2804 | 2785 | /debug/2.6.9: |
| 2805 | 2786 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} |
| 2787 | + peerDependencies: | |
| 2788 | + supports-color: '*' | |
| 2789 | + peerDependenciesMeta: | |
| 2790 | + supports-color: | |
| 2791 | + optional: true | |
| 2806 | 2792 | dependencies: |
| 2807 | 2793 | ms: 2.0.0 |
| 2808 | 2794 | dev: true |
| 2809 | 2795 | |
| 2810 | 2796 | /debug/3.2.7: |
| 2811 | 2797 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} |
| 2798 | + peerDependencies: | |
| 2799 | + supports-color: '*' | |
| 2800 | + peerDependenciesMeta: | |
| 2801 | + supports-color: | |
| 2802 | + optional: true | |
| 2812 | 2803 | dependencies: |
| 2813 | 2804 | ms: 2.1.3 |
| 2814 | 2805 | dev: true |
| ... | ... | @@ -3074,7 +3065,7 @@ packages: |
| 3074 | 3065 | escape-html: 1.0.3 |
| 3075 | 3066 | lodash: 4.17.21 |
| 3076 | 3067 | lodash-es: 4.17.21 |
| 3077 | - lodash-unified: 1.0.2_da03a4540fbd16bbaafbb96724306afd | |
| 3068 | + lodash-unified: 1.0.2_3ib2ivapxullxkx3xftsimdk7u | |
| 3078 | 3069 | memoize-one: 6.0.0 |
| 3079 | 3070 | normalize-wheel-es: 1.2.0 |
| 3080 | 3071 | vue: 3.2.44 |
| ... | ... | @@ -3398,7 +3389,7 @@ packages: |
| 3398 | 3389 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'} |
| 3399 | 3390 | dev: true |
| 3400 | 3391 | |
| 3401 | - /eslint-plugin-prettier/4.2.1_afddd95fb7dd832efd05cfac2e17feb1: | |
| 3392 | + /eslint-plugin-prettier/4.2.1_v7o5sx5x3wbs57ifz6wc4f76we: | |
| 3402 | 3393 | resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} |
| 3403 | 3394 | engines: {node: '>=12.0.0'} |
| 3404 | 3395 | peerDependencies: |
| ... | ... | @@ -3632,6 +3623,8 @@ packages: |
| 3632 | 3623 | regex-not: 1.0.2 |
| 3633 | 3624 | snapdragon: 0.8.2 |
| 3634 | 3625 | to-regex: 3.0.2 |
| 3626 | + transitivePeerDependencies: | |
| 3627 | + - supports-color | |
| 3635 | 3628 | dev: true |
| 3636 | 3629 | |
| 3637 | 3630 | /expand-tilde/2.0.2: |
| ... | ... | @@ -3687,6 +3680,8 @@ packages: |
| 3687 | 3680 | regex-not: 1.0.2 |
| 3688 | 3681 | snapdragon: 0.8.2 |
| 3689 | 3682 | to-regex: 3.0.2 |
| 3683 | + transitivePeerDependencies: | |
| 3684 | + - supports-color | |
| 3690 | 3685 | dev: true |
| 3691 | 3686 | |
| 3692 | 3687 | /fast-deep-equal/3.1.3: |
| ... | ... | @@ -4708,6 +4703,8 @@ packages: |
| 4708 | 4703 | mime: 1.6.0 |
| 4709 | 4704 | needle: 3.1.0 |
| 4710 | 4705 | source-map: 0.6.1 |
| 4706 | + transitivePeerDependencies: | |
| 4707 | + - supports-color | |
| 4711 | 4708 | dev: true |
| 4712 | 4709 | |
| 4713 | 4710 | /levn/0.4.1: |
| ... | ... | @@ -4814,7 +4811,7 @@ packages: |
| 4814 | 4811 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} |
| 4815 | 4812 | dev: false |
| 4816 | 4813 | |
| 4817 | - /lodash-unified/1.0.2_da03a4540fbd16bbaafbb96724306afd: | |
| 4814 | + /lodash-unified/1.0.2_3ib2ivapxullxkx3xftsimdk7u: | |
| 4818 | 4815 | resolution: {integrity: sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==} |
| 4819 | 4816 | peerDependencies: |
| 4820 | 4817 | '@types/lodash-es': '*' |
| ... | ... | @@ -5043,6 +5040,8 @@ packages: |
| 5043 | 5040 | regex-not: 1.0.2 |
| 5044 | 5041 | snapdragon: 0.8.2 |
| 5045 | 5042 | to-regex: 3.0.2 |
| 5043 | + transitivePeerDependencies: | |
| 5044 | + - supports-color | |
| 5046 | 5045 | dev: true |
| 5047 | 5046 | |
| 5048 | 5047 | /micromatch/4.0.5: |
| ... | ... | @@ -5183,6 +5182,8 @@ packages: |
| 5183 | 5182 | regex-not: 1.0.2 |
| 5184 | 5183 | snapdragon: 0.8.2 |
| 5185 | 5184 | to-regex: 3.0.2 |
| 5185 | + transitivePeerDependencies: | |
| 5186 | + - supports-color | |
| 5186 | 5187 | dev: true |
| 5187 | 5188 | |
| 5188 | 5189 | /natural-compare-lite/1.4.0: |
| ... | ... | @@ -5202,6 +5203,8 @@ packages: |
| 5202 | 5203 | debug: 3.2.7 |
| 5203 | 5204 | iconv-lite: 0.6.3 |
| 5204 | 5205 | sax: 1.2.4 |
| 5206 | + transitivePeerDependencies: | |
| 5207 | + - supports-color | |
| 5205 | 5208 | dev: true |
| 5206 | 5209 | optional: true |
| 5207 | 5210 | |
| ... | ... | @@ -5602,7 +5605,7 @@ packages: |
| 5602 | 5605 | dev: true |
| 5603 | 5606 | optional: true |
| 5604 | 5607 | |
| 5605 | - /pinia/2.0.23_typescript@4.8.4+vue@3.2.44: | |
| 5608 | + /pinia/2.0.23_d45o5shxrtvj6wh4y524t7cqnm: | |
| 5606 | 5609 | resolution: {integrity: sha512-N15hFf4o5STrxpNrib1IEb1GOArvPYf1zPvQVRGOO1G1d74Ak0J0lVyalX/SmrzdT4Q0nlEFjbURsmBmIGUR5Q==} |
| 5607 | 5610 | peerDependencies: |
| 5608 | 5611 | '@vue/composition-api': ^1.4.0 |
| ... | ... | @@ -6258,6 +6261,8 @@ packages: |
| 6258 | 6261 | source-map: 0.5.7 |
| 6259 | 6262 | source-map-resolve: 0.5.3 |
| 6260 | 6263 | use: 3.1.1 |
| 6264 | + transitivePeerDependencies: | |
| 6265 | + - supports-color | |
| 6261 | 6266 | dev: true |
| 6262 | 6267 | |
| 6263 | 6268 | /source-map-js/1.0.2: |
| ... | ... | @@ -6430,7 +6435,7 @@ packages: |
| 6430 | 6435 | resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} |
| 6431 | 6436 | dev: true |
| 6432 | 6437 | |
| 6433 | - /stylelint-config-html/1.1.0_0711e485e505c8bbf0b549e6b356f7f2: | |
| 6438 | + /stylelint-config-html/1.1.0_a4i6jbpfaxelx4fvjhtlgvxx6i: | |
| 6434 | 6439 | resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} |
| 6435 | 6440 | engines: {node: ^12 || >=14} |
| 6436 | 6441 | peerDependencies: |
| ... | ... | @@ -6483,7 +6488,7 @@ packages: |
| 6483 | 6488 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} |
| 6484 | 6489 | hasBin: true |
| 6485 | 6490 | dependencies: |
| 6486 | - '@csstools/selector-specificity': 2.0.2_1d546e2941f6b4ca889831b9fbdc79d8 | |
| 6491 | + '@csstools/selector-specificity': 2.0.2_dvkg4kkb622mvceygg47xxdz3a | |
| 6487 | 6492 | balanced-match: 2.0.0 |
| 6488 | 6493 | colord: 2.9.3 |
| 6489 | 6494 | cosmiconfig: 7.0.1 |
| ... | ... | @@ -6580,6 +6585,8 @@ packages: |
| 6580 | 6585 | posthtml-svg-mode: 1.0.3 |
| 6581 | 6586 | query-string: 4.3.4 |
| 6582 | 6587 | traverse: 0.6.6 |
| 6588 | + transitivePeerDependencies: | |
| 6589 | + - supports-color | |
| 6583 | 6590 | dev: true |
| 6584 | 6591 | |
| 6585 | 6592 | /svg-tags/1.0.0: |
| ... | ... | @@ -6707,7 +6714,7 @@ packages: |
| 6707 | 6714 | engines: {node: '>=8'} |
| 6708 | 6715 | dev: true |
| 6709 | 6716 | |
| 6710 | - /ts-node/10.9.1_2abc08acbb4fe741ae8218df9aa74f5c: | |
| 6717 | + /ts-node/10.9.1_fk6arlf3j7tudlucddpzvj2plq: | |
| 6711 | 6718 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} |
| 6712 | 6719 | hasBin: true |
| 6713 | 6720 | peerDependencies: |
| ... | ... | @@ -6804,7 +6811,6 @@ packages: |
| 6804 | 6811 | resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} |
| 6805 | 6812 | engines: {node: '>=4.2.0'} |
| 6806 | 6813 | hasBin: true |
| 6807 | - dev: true | |
| 6808 | 6814 | |
| 6809 | 6815 | /uglify-js/3.17.3: |
| 6810 | 6816 | resolution: {integrity: sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==} |
| ... | ... | @@ -6855,7 +6861,7 @@ packages: |
| 6855 | 6861 | '@antfu/utils': 0.6.0 |
| 6856 | 6862 | rollup: 3.2.5 |
| 6857 | 6863 | unplugin: 0.10.2 |
| 6858 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 6864 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 6859 | 6865 | dev: true |
| 6860 | 6866 | |
| 6861 | 6867 | /unplugin-vue-define-options/0.12.7: |
| ... | ... | @@ -6868,7 +6874,7 @@ packages: |
| 6868 | 6874 | unplugin: 0.10.2 |
| 6869 | 6875 | dev: true |
| 6870 | 6876 | |
| 6871 | - /unplugin-vue-macros/0.16.2_688fcac82e974ec4fd5c071d8de5a7a5: | |
| 6877 | + /unplugin-vue-macros/0.16.2_nch4vsbos5hmj7k4a4oy3znhuu: | |
| 6872 | 6878 | resolution: {integrity: sha512-uNfjIXVUYBujbjJUcjXreE6zipZlPAIEMsx6bc/5qygwTfdvkJeHCAvvxrl0c8hdcT5/18OV2VDdwI60vCh56g==} |
| 6873 | 6879 | engines: {node: '>=14.19.0'} |
| 6874 | 6880 | peerDependencies: |
| ... | ... | @@ -6881,7 +6887,7 @@ packages: |
| 6881 | 6887 | '@vue-macros/define-render': 0.13.8_vue@3.2.44 |
| 6882 | 6888 | '@vue-macros/define-slots': 0.0.5_vue@3.2.44 |
| 6883 | 6889 | '@vue-macros/hoist-static': 0.12.7 |
| 6884 | - '@vue-macros/named-template': 0.0.5_aaae75a03f99901122a33a7412c8cd0a | |
| 6890 | + '@vue-macros/named-template': 0.0.5_vkxhlib7tgibcivdhj2bfsgnbi | |
| 6885 | 6891 | '@vue-macros/setup-component': 0.12.7_rollup@3.2.5+vite@3.2.3 |
| 6886 | 6892 | '@vue-macros/setup-sfc': 0.12.7 |
| 6887 | 6893 | '@vue-macros/short-emits': 0.12.8 |
| ... | ... | @@ -6997,7 +7003,7 @@ packages: |
| 6997 | 7003 | chalk: 4.1.2 |
| 6998 | 7004 | debug: 4.3.4 |
| 6999 | 7005 | fs-extra: 10.1.0 |
| 7000 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7006 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7001 | 7007 | transitivePeerDependencies: |
| 7002 | 7008 | - supports-color |
| 7003 | 7009 | dev: true |
| ... | ... | @@ -7012,7 +7018,7 @@ packages: |
| 7012 | 7018 | '@types/eslint': 8.4.6 |
| 7013 | 7019 | eslint: 8.27.0 |
| 7014 | 7020 | rollup: 2.79.1 |
| 7015 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7021 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7016 | 7022 | dev: true |
| 7017 | 7023 | |
| 7018 | 7024 | /vite-plugin-html/3.2.0_vite@3.2.3: |
| ... | ... | @@ -7032,7 +7038,7 @@ packages: |
| 7032 | 7038 | html-minifier-terser: 6.1.0 |
| 7033 | 7039 | node-html-parser: 5.4.2 |
| 7034 | 7040 | pathe: 0.2.0 |
| 7035 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7041 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7036 | 7042 | dev: true |
| 7037 | 7043 | |
| 7038 | 7044 | /vite-plugin-purge-icons/0.9.1_vite@3.2.3: |
| ... | ... | @@ -7044,7 +7050,7 @@ packages: |
| 7044 | 7050 | '@purge-icons/core': 0.9.1 |
| 7045 | 7051 | '@purge-icons/generated': 0.9.0 |
| 7046 | 7052 | rollup-plugin-purge-icons: 0.9.1 |
| 7047 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7053 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7048 | 7054 | transitivePeerDependencies: |
| 7049 | 7055 | - encoding |
| 7050 | 7056 | - supports-color |
| ... | ... | @@ -7062,7 +7068,7 @@ packages: |
| 7062 | 7068 | fs-extra: 10.1.0 |
| 7063 | 7069 | magic-string: 0.25.9 |
| 7064 | 7070 | pathe: 0.2.0 |
| 7065 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7071 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7066 | 7072 | dev: true |
| 7067 | 7073 | |
| 7068 | 7074 | /vite-plugin-svg-icons/2.0.1_vite@3.2.3: |
| ... | ... | @@ -7078,7 +7084,7 @@ packages: |
| 7078 | 7084 | pathe: 0.2.0 |
| 7079 | 7085 | svg-baker: 1.7.0 |
| 7080 | 7086 | svgo: 2.8.0 |
| 7081 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7087 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7082 | 7088 | transitivePeerDependencies: |
| 7083 | 7089 | - supports-color |
| 7084 | 7090 | dev: true |
| ... | ... | @@ -7091,13 +7097,13 @@ packages: |
| 7091 | 7097 | '@windicss/plugin-utils': 1.8.8 |
| 7092 | 7098 | debug: 4.3.4 |
| 7093 | 7099 | kolorist: 1.6.0 |
| 7094 | - vite: 3.2.3_@types+node@18.11.9+less@4.1.3 | |
| 7100 | + vite: 3.2.3_mp5lu76ee5qtwstsyca37sdhqi | |
| 7095 | 7101 | windicss: 3.5.6 |
| 7096 | 7102 | transitivePeerDependencies: |
| 7097 | 7103 | - supports-color |
| 7098 | 7104 | dev: true |
| 7099 | 7105 | |
| 7100 | - /vite/3.2.3_@types+node@18.11.9+less@4.1.3: | |
| 7106 | + /vite/3.2.3_mp5lu76ee5qtwstsyca37sdhqi: | |
| 7101 | 7107 | resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} |
| 7102 | 7108 | engines: {node: ^14.18.0 || >=16.0.0} |
| 7103 | 7109 | hasBin: true |
| ... | ... | @@ -7149,7 +7155,6 @@ packages: |
| 7149 | 7155 | optional: true |
| 7150 | 7156 | dependencies: |
| 7151 | 7157 | vue: 3.2.44 |
| 7152 | - dev: false | |
| 7153 | 7158 | |
| 7154 | 7159 | /vue-eslint-parser/9.1.0_eslint@8.27.0: |
| 7155 | 7160 | resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} |
| ... | ... | @@ -7180,7 +7185,6 @@ packages: |
| 7180 | 7185 | '@intlify/vue-devtools': 9.2.2 |
| 7181 | 7186 | '@vue/devtools-api': 6.4.3 |
| 7182 | 7187 | vue: 3.2.44 |
| 7183 | - dev: false | |
| 7184 | 7188 | |
| 7185 | 7189 | /vue-router/4.1.6_vue@3.2.44: |
| 7186 | 7190 | resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} |
| ... | ... | @@ -7227,7 +7231,6 @@ packages: |
| 7227 | 7231 | '@vue/runtime-dom': 3.2.44 |
| 7228 | 7232 | '@vue/server-renderer': 3.2.44_vue@3.2.44 |
| 7229 | 7233 | '@vue/shared': 3.2.44 |
| 7230 | - dev: false | |
| 7231 | 7234 | |
| 7232 | 7235 | /vxe-table/4.3.5_vue@3.2.44+xe-utils@3.5.7: |
| 7233 | 7236 | resolution: {integrity: sha512-JEvGAs7SBN1rWn5f2tkoRiXd/rAT7RfnDTTlFsHsTtASiUTKNTISI2WBsVeLkkNRTs0SXh6FgrYsIPO2soSBXA==} | ... | ... |
yudao-ui-admin-vue3/src/api/system/menu/index.ts
| 1 | 1 | import request from '@/config/axios' |
| 2 | 2 | import type { MenuVO } from './types' |
| 3 | 3 | |
| 4 | -// 查询菜单(精简)列表 | |
| 4 | +// 查询菜单(精简)列表 | |
| 5 | 5 | export const listSimpleMenusApi = () => { |
| 6 | 6 | return request.get({ url: '/system/menu/list-all-simple' }) |
| 7 | 7 | } |
| 8 | + | |
| 8 | 9 | // 查询菜单列表 |
| 9 | 10 | export const getMenuListApi = (params) => { |
| 10 | 11 | return request.get({ url: '/system/menu/list', params }) | ... | ... |
yudao-ui-admin-vue3/src/api/system/post/index.ts
| ... | ... | @@ -31,6 +31,7 @@ export const deletePostApi = async (id: number) => { |
| 31 | 31 | } |
| 32 | 32 | |
| 33 | 33 | // 导出岗位 |
| 34 | +// TODO @星语:导出这块,咱怎么弄哈 | |
| 34 | 35 | export const exportPostApi = async (params: PostExportReqVO) => { |
| 35 | 36 | return await request.download({ url: '/system/post/export', params }) |
| 36 | 37 | } | ... | ... |
yudao-ui-admin-vue3/src/api/system/post/types.ts
yudao-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue
| 1 | 1 | <script setup lang="ts"> |
| 2 | +import dayjs from 'dayjs' | |
| 2 | 3 | import { ElCollapseTransition, ElDescriptions, ElDescriptionsItem, ElTooltip } from 'element-plus' |
| 3 | 4 | import { useDesign } from '@/hooks/web/useDesign' |
| 4 | 5 | import { propTypes } from '@/utils/propTypes' |
| ... | ... | @@ -111,7 +112,13 @@ const toggleClick = () => { |
| 111 | 112 | </template> |
| 112 | 113 | |
| 113 | 114 | <template #default> |
| 114 | - <slot :name="item.field" :row="data">{{ data[item.field] }}</slot> | |
| 115 | + <slot v-if="item.dateFormat"> | |
| 116 | + {{ dayjs(data[item.field]).format(item.dateFormat) }} | |
| 117 | + </slot> | |
| 118 | + <slot v-else-if="item.dictType"> | |
| 119 | + <DictTag :type="item.dictType" :value="data[item.field]" /> | |
| 120 | + </slot> | |
| 121 | + <slot v-else :name="item.field" :row="data">{{ data[item.field] }}</slot> | |
| 115 | 122 | </template> |
| 116 | 123 | </ElDescriptionsItem> |
| 117 | 124 | </ElDescriptions> | ... | ... |
yudao-ui-admin-vue3/src/config/axios/service.ts
| ... | ... | @@ -5,7 +5,7 @@ import axios, { |
| 5 | 5 | AxiosResponse, |
| 6 | 6 | AxiosError |
| 7 | 7 | } from 'axios' |
| 8 | -import { useMessage } from '@/hooks/web/useMessage' | |
| 8 | +import { ElMessage, ElMessageBox, ElNotification } from 'element-plus' | |
| 9 | 9 | import qs from 'qs' |
| 10 | 10 | import { config } from '@/config/axios/config' |
| 11 | 11 | import { getAccessToken, getRefreshToken, getTenantId, removeToken, setToken } from '@/utils/auth' |
| ... | ... | @@ -17,7 +17,6 @@ import { useCache } from '@/hooks/web/useCache' |
| 17 | 17 | const tenantEnable = import.meta.env.VITE_APP_TENANT_ENABLE |
| 18 | 18 | const { result_code, base_url, request_timeout } = config |
| 19 | 19 | |
| 20 | -const message = useMessage() | |
| 21 | 20 | // 需要忽略的提示。忽略后,自动 Promise.reject('error') |
| 22 | 21 | const ignoreMsgs = [ |
| 23 | 22 | '无效的刷新令牌', // 刷新令牌被删除时,不用提示 |
| ... | ... | @@ -30,6 +29,8 @@ export const isRelogin = { show: false } |
| 30 | 29 | let requestList: any[] = [] |
| 31 | 30 | // 是否正在刷新中 |
| 32 | 31 | let isRefreshToken = false |
| 32 | +// 请求白名单,无须token的接口 | |
| 33 | +const whiteList: string[] = ['/login', '/refresh-token'] | |
| 33 | 34 | |
| 34 | 35 | // 创建axios实例 |
| 35 | 36 | const service: AxiosInstance = axios.create({ |
| ... | ... | @@ -42,14 +43,20 @@ const service: AxiosInstance = axios.create({ |
| 42 | 43 | service.interceptors.request.use( |
| 43 | 44 | (config: AxiosRequestConfig) => { |
| 44 | 45 | // 是否需要设置 token |
| 45 | - const isToken = (config!.headers || {}).isToken === false | |
| 46 | + let isToken = (config!.headers || {}).isToken === false | |
| 47 | + whiteList.some((v) => { | |
| 48 | + if (config.url) { | |
| 49 | + config.url.indexOf(v) > -1 | |
| 50 | + return (isToken = false) | |
| 51 | + } | |
| 52 | + }) | |
| 46 | 53 | if (getAccessToken() && !isToken) { |
| 47 | 54 | ;(config as Recordable).headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token |
| 48 | 55 | } |
| 49 | 56 | // 设置租户 |
| 50 | 57 | if (tenantEnable && tenantEnable === 'true') { |
| 51 | 58 | const tenantId = getTenantId() |
| 52 | - if (tenantId) (config as Recordable).headers.common['tenant-id'] = tenantId | |
| 59 | + if (tenantId) (config as Recordable).headers['tenant-id'] = tenantId | |
| 53 | 60 | } |
| 54 | 61 | const params = config.params || {} |
| 55 | 62 | const data = config.data || false |
| ... | ... | @@ -157,10 +164,10 @@ service.interceptors.response.use( |
| 157 | 164 | }) |
| 158 | 165 | } |
| 159 | 166 | } else if (code === 500) { |
| 160 | - message.error(t('sys.api.errMsg500')) | |
| 167 | + ElMessage.error(t('sys.api.errMsg500')) | |
| 161 | 168 | return Promise.reject(new Error(msg)) |
| 162 | 169 | } else if (code === 901) { |
| 163 | - message.error( | |
| 170 | + ElMessage.error( | |
| 164 | 171 | '<div>' + |
| 165 | 172 | t('sys.api.errMsg901') + |
| 166 | 173 | '</div>' + |
| ... | ... | @@ -175,7 +182,7 @@ service.interceptors.response.use( |
| 175 | 182 | // hard coding:忽略这个提示,直接登出 |
| 176 | 183 | console.log(msg) |
| 177 | 184 | } else { |
| 178 | - message.notifyError(msg) | |
| 185 | + ElNotification.error({ title: msg }) | |
| 179 | 186 | } |
| 180 | 187 | return Promise.reject('error') |
| 181 | 188 | } else { |
| ... | ... | @@ -184,16 +191,16 @@ service.interceptors.response.use( |
| 184 | 191 | }, |
| 185 | 192 | (error: AxiosError) => { |
| 186 | 193 | console.log('err' + error) // for debug |
| 187 | - let { message: msg } = error | |
| 194 | + let { message } = error | |
| 188 | 195 | const { t } = useI18n() |
| 189 | - if (msg === 'Network Error') { | |
| 190 | - msg = t('sys.api.errorMessage') | |
| 191 | - } else if (msg.includes('timeout')) { | |
| 192 | - msg = t('sys.api.apiTimeoutMessage') | |
| 193 | - } else if (msg.includes('Request failed with status code')) { | |
| 194 | - msg = t('sys.api.apiRequestFailed') + msg.substr(msg.length - 3) | |
| 196 | + if (message === 'Network Error') { | |
| 197 | + message = t('sys.api.errorMessage') | |
| 198 | + } else if (message.includes('timeout')) { | |
| 199 | + message = t('sys.api.apiTimeoutMessage') | |
| 200 | + } else if (message.includes('Request failed with status code')) { | |
| 201 | + message = t('sys.api.apiRequestFailed') + message.substr(message.length - 3) | |
| 195 | 202 | } |
| 196 | - message.error(msg) | |
| 203 | + ElMessage.error(message) | |
| 197 | 204 | return Promise.reject(error) |
| 198 | 205 | } |
| 199 | 206 | ) |
| ... | ... | @@ -205,8 +212,11 @@ const handleAuthorized = () => { |
| 205 | 212 | const { t } = useI18n() |
| 206 | 213 | if (!isRelogin.show) { |
| 207 | 214 | isRelogin.show = true |
| 208 | - message | |
| 209 | - .confirm(t('sys.api.timeoutMessage')) | |
| 215 | + ElMessageBox.confirm(t('sys.api.timeoutMessage'), t('common.confirmTitle'), { | |
| 216 | + confirmButtonText: t('login.relogin'), | |
| 217 | + cancelButtonText: t('common.cancel'), | |
| 218 | + type: 'warning' | |
| 219 | + }) | |
| 210 | 220 | .then(() => { |
| 211 | 221 | const { wsCache } = useCache() |
| 212 | 222 | resetRouter() // 重置静态路由表 | ... | ... |
yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts
| ... | ... | @@ -14,18 +14,31 @@ import { VxeTableColumn } from '@/types/table' |
| 14 | 14 | import { FormSchema } from '@/types/form' |
| 15 | 15 | import { ComponentOptions } from '@/types/components' |
| 16 | 16 | |
| 17 | -export type VxeCrudSchema = Omit<VxeTableColumn, 'children'> & { | |
| 17 | +export type VxeCrudSchema = { | |
| 18 | + // 主键ID | |
| 19 | + primaryKey?: string | |
| 20 | + primaryType?: VxeColumnPropTypes.Type | |
| 21 | + // 是否开启操作栏插槽 | |
| 22 | + action?: boolean | |
| 23 | + columns: VxeCrudColumns[] | |
| 24 | +} | |
| 25 | +type VxeCrudColumns = Omit<VxeTableColumn, 'children'> & { | |
| 18 | 26 | field: string |
| 19 | 27 | title?: string |
| 20 | 28 | formatter?: VxeColumnPropTypes.Formatter |
| 29 | + isSearch?: boolean | |
| 21 | 30 | search?: CrudSearchParams |
| 31 | + isTable?: boolean | |
| 22 | 32 | table?: CrudTableParams |
| 33 | + isForm?: boolean | |
| 23 | 34 | form?: CrudFormParams |
| 35 | + isDetail?: boolean | |
| 24 | 36 | detail?: CrudDescriptionsParams |
| 25 | 37 | print?: CrudPrintParams |
| 26 | - children?: VxeCrudSchema[] | |
| 38 | + children?: VxeCrudColumns[] | |
| 27 | 39 | dictType?: string |
| 28 | 40 | } |
| 41 | + | |
| 29 | 42 | type CrudSearchParams = { |
| 30 | 43 | // 是否显示在查询项 |
| 31 | 44 | show?: boolean |
| ... | ... | @@ -61,7 +74,7 @@ export type VxeAllSchemas = { |
| 61 | 74 | |
| 62 | 75 | // 过滤所有结构 |
| 63 | 76 | export const useVxeCrudSchemas = ( |
| 64 | - crudSchema: VxeCrudSchema[] | |
| 77 | + crudSchema: VxeCrudSchema | |
| 65 | 78 | ): { |
| 66 | 79 | allSchemas: VxeAllSchemas |
| 67 | 80 | } => { |
| ... | ... | @@ -95,12 +108,12 @@ export const useVxeCrudSchemas = ( |
| 95 | 108 | } |
| 96 | 109 | |
| 97 | 110 | // 过滤 Search 结构 |
| 98 | -const filterSearchSchema = (crudSchema: VxeCrudSchema[]): VxeFormItemProps[] => { | |
| 99 | - const searchSchema: VxeFormItemProps[] = [] | |
| 111 | +const filterSearchSchema = (crudSchema: VxeCrudSchema): VxeFormItemProps[] => { | |
| 100 | 112 | const { t } = useI18n() |
| 101 | - eachTree(crudSchema, (schemaItem: VxeCrudSchema) => { | |
| 113 | + const searchSchema: VxeFormItemProps[] = [] | |
| 114 | + eachTree(crudSchema.columns, (schemaItem: VxeCrudColumns) => { | |
| 102 | 115 | // 判断是否显示 |
| 103 | - if (schemaItem?.search?.show) { | |
| 116 | + if (schemaItem?.isSearch) { | |
| 104 | 117 | let itemRenderName = schemaItem?.search?.itemRender?.name || '$input' |
| 105 | 118 | const options: any[] = [] |
| 106 | 119 | let itemRender: FormItemRenderOptions = { |
| ... | ... | @@ -114,7 +127,7 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema[]): VxeFormItemProps[] => |
| 114 | 127 | options.push(dict) |
| 115 | 128 | }) |
| 116 | 129 | itemRender.options = options |
| 117 | - if (!schemaItem.search.itemRender?.name) itemRenderName = '$select' | |
| 130 | + if (!schemaItem?.search?.itemRender?.name) itemRenderName = '$select' | |
| 118 | 131 | itemRender = { |
| 119 | 132 | name: itemRenderName, |
| 120 | 133 | options: options, |
| ... | ... | @@ -123,15 +136,12 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema[]): VxeFormItemProps[] => |
| 123 | 136 | } |
| 124 | 137 | const searchSchemaItem = { |
| 125 | 138 | // 默认为 input |
| 126 | - span: 8, | |
| 127 | 139 | folding: searchSchema.length > 2, |
| 128 | - itemRender: itemRender, | |
| 129 | - ...schemaItem.search, | |
| 140 | + itemRender: schemaItem.itemRender ? schemaItem.itemRender : itemRender, | |
| 130 | 141 | field: schemaItem.field, |
| 131 | - title: schemaItem.search?.title || schemaItem.title | |
| 142 | + title: schemaItem.search?.title || schemaItem.title, | |
| 143 | + span: 8 | |
| 132 | 144 | } |
| 133 | - // 删除不必要的字段 | |
| 134 | - delete searchSchemaItem.show | |
| 135 | 145 | |
| 136 | 146 | searchSchema.push(searchSchemaItem) |
| 137 | 147 | } |
| ... | ... | @@ -154,36 +164,63 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema[]): VxeFormItemProps[] => |
| 154 | 164 | } |
| 155 | 165 | |
| 156 | 166 | // 过滤 table 结构 |
| 157 | -const filterTableSchema = (crudSchema: VxeCrudSchema[]): VxeGridPropTypes.Columns => { | |
| 167 | +const filterTableSchema = (crudSchema: VxeCrudSchema): VxeGridPropTypes.Columns => { | |
| 168 | + const { t } = useI18n() | |
| 158 | 169 | const tableSchema: VxeGridPropTypes.Columns = [] |
| 159 | - eachTree(crudSchema, (schemaItem: VxeCrudSchema) => { | |
| 170 | + // 主键ID | |
| 171 | + if (crudSchema.primaryKey) { | |
| 172 | + const tableSchemaItem = { | |
| 173 | + title: t('common.index'), | |
| 174 | + field: crudSchema.primaryKey, | |
| 175 | + type: crudSchema.primaryType ? crudSchema.primaryType : 'seq', | |
| 176 | + width: '50px' | |
| 177 | + } | |
| 178 | + tableSchema.push(tableSchemaItem) | |
| 179 | + } | |
| 180 | + eachTree(crudSchema.columns, (schemaItem: VxeCrudColumns) => { | |
| 160 | 181 | // 判断是否显示 |
| 161 | - if (schemaItem?.table?.show !== false) { | |
| 182 | + if (schemaItem?.isTable !== false) { | |
| 162 | 183 | const tableSchemaItem = { |
| 163 | 184 | ...schemaItem.table, |
| 164 | 185 | field: schemaItem.field, |
| 165 | 186 | title: schemaItem.table?.title || schemaItem.title |
| 166 | 187 | } |
| 188 | + tableSchemaItem.showOverflow = 'tooltip' | |
| 167 | 189 | if (schemaItem?.formatter) { |
| 168 | 190 | tableSchemaItem.formatter = schemaItem.formatter |
| 169 | 191 | } |
| 170 | - | |
| 171 | - // 删除不必要的字段 | |
| 172 | - delete tableSchemaItem.show | |
| 192 | + if (schemaItem?.dictType) { | |
| 193 | + tableSchemaItem.cellRender = { | |
| 194 | + name: 'XDict', | |
| 195 | + content: schemaItem.dictType | |
| 196 | + } | |
| 197 | + } | |
| 173 | 198 | |
| 174 | 199 | tableSchema.push(tableSchemaItem) |
| 175 | 200 | } |
| 176 | 201 | }) |
| 202 | + // 操作栏插槽 | |
| 203 | + if (crudSchema.action && crudSchema.action == true) { | |
| 204 | + const tableSchemaItem = { | |
| 205 | + title: t('table.action'), | |
| 206 | + field: 'actionbtns', | |
| 207 | + width: '240px', | |
| 208 | + slots: { | |
| 209 | + default: 'actionbtns_default' | |
| 210 | + } | |
| 211 | + } | |
| 212 | + tableSchema.push(tableSchemaItem) | |
| 213 | + } | |
| 177 | 214 | return tableSchema |
| 178 | 215 | } |
| 179 | 216 | |
| 180 | 217 | // 过滤 form 结构 |
| 181 | -const filterFormSchema = (crudSchema: VxeCrudSchema[]): FormSchema[] => { | |
| 218 | +const filterFormSchema = (crudSchema: VxeCrudSchema): FormSchema[] => { | |
| 182 | 219 | const formSchema: FormSchema[] = [] |
| 183 | 220 | |
| 184 | - eachTree(crudSchema, (schemaItem: VxeCrudSchema) => { | |
| 221 | + eachTree(crudSchema.columns, (schemaItem: VxeCrudColumns) => { | |
| 185 | 222 | // 判断是否显示 |
| 186 | - if (schemaItem?.form?.show !== false) { | |
| 223 | + if (schemaItem?.isForm !== false) { | |
| 187 | 224 | let component = schemaItem?.form?.component || 'Input' |
| 188 | 225 | const options: ComponentOptions[] = [] |
| 189 | 226 | let comonentProps = {} |
| ... | ... | @@ -205,9 +242,6 @@ const filterFormSchema = (crudSchema: VxeCrudSchema[]): FormSchema[] => { |
| 205 | 242 | label: schemaItem.form?.label || schemaItem.title |
| 206 | 243 | } |
| 207 | 244 | |
| 208 | - // 删除不必要的字段 | |
| 209 | - delete formSchemaItem.show | |
| 210 | - | |
| 211 | 245 | formSchema.push(formSchemaItem) |
| 212 | 246 | } |
| 213 | 247 | }) |
| ... | ... | @@ -216,20 +250,26 @@ const filterFormSchema = (crudSchema: VxeCrudSchema[]): FormSchema[] => { |
| 216 | 250 | } |
| 217 | 251 | |
| 218 | 252 | // 过滤 descriptions 结构 |
| 219 | -const filterDescriptionsSchema = (crudSchema: VxeCrudSchema[]): DescriptionsSchema[] => { | |
| 253 | +const filterDescriptionsSchema = (crudSchema: VxeCrudSchema): DescriptionsSchema[] => { | |
| 220 | 254 | const descriptionsSchema: DescriptionsSchema[] = [] |
| 221 | 255 | |
| 222 | - eachTree(crudSchema, (schemaItem: VxeCrudSchema) => { | |
| 256 | + eachTree(crudSchema.columns, (schemaItem: VxeCrudColumns) => { | |
| 223 | 257 | // 判断是否显示 |
| 224 | - if (schemaItem?.detail?.show !== false) { | |
| 258 | + if (schemaItem?.isDetail !== false) { | |
| 225 | 259 | const descriptionsSchemaItem = { |
| 226 | 260 | ...schemaItem.detail, |
| 227 | 261 | field: schemaItem.field, |
| 228 | 262 | label: schemaItem.detail?.label || schemaItem.title |
| 229 | 263 | } |
| 230 | - | |
| 231 | - // 删除不必要的字段 | |
| 232 | - delete descriptionsSchemaItem.show | |
| 264 | + if (schemaItem.dictType) { | |
| 265 | + descriptionsSchemaItem.dictType = schemaItem.dictType | |
| 266 | + } | |
| 267 | + if (schemaItem.detail?.dateFormat || schemaItem.formatter == 'formatDate') { | |
| 268 | + // descriptionsSchemaItem.dateFormat = schemaItem.detail.dateFormat | |
| 269 | + // ? schemaItem?.detail?.dateFormat | |
| 270 | + // : 'YYYY-MM-DD HH:mm:ss' | |
| 271 | + descriptionsSchemaItem.dateFormat = 'YYYY-MM-DD HH:mm:ss' | |
| 272 | + } | |
| 233 | 273 | |
| 234 | 274 | descriptionsSchema.push(descriptionsSchemaItem) |
| 235 | 275 | } |
| ... | ... | @@ -239,10 +279,10 @@ const filterDescriptionsSchema = (crudSchema: VxeCrudSchema[]): DescriptionsSche |
| 239 | 279 | } |
| 240 | 280 | |
| 241 | 281 | // 过滤 打印 结构 |
| 242 | -const filterPrintSchema = (crudSchema: VxeCrudSchema[]): any[] => { | |
| 282 | +const filterPrintSchema = (crudSchema: VxeCrudSchema): any[] => { | |
| 243 | 283 | const printSchema: any[] = [] |
| 244 | 284 | |
| 245 | - eachTree(crudSchema, (schemaItem: VxeCrudSchema) => { | |
| 285 | + eachTree(crudSchema.columns, (schemaItem: VxeCrudColumns) => { | |
| 246 | 286 | // 判断是否显示 |
| 247 | 287 | if (schemaItem?.print?.show !== false) { |
| 248 | 288 | const printSchemaItem = { | ... | ... |
yudao-ui-admin-vue3/src/hooks/web/useVxeGrid.ts
| ... | ... | @@ -43,10 +43,6 @@ export const useVxeGrid = <T = any>(config?: UseVxeGridConfig<T>) => { |
| 43 | 43 | isCurrent: true, // 当鼠标点击行时,是否要高亮当前行 |
| 44 | 44 | isHover: true // 当鼠标移到行时,是否要高亮当前行 |
| 45 | 45 | }, |
| 46 | - showOverflow: 'tooltip', // 当内容溢出时显示为省略号 | |
| 47 | - tooltipConfig: { | |
| 48 | - showAll: true // 开启全表工具提示 | |
| 49 | - }, | |
| 50 | 46 | toolbarConfig: { |
| 51 | 47 | custom: true, |
| 52 | 48 | slots: { buttons: 'toolbar_buttons' } |
| ... | ... | @@ -85,7 +81,7 @@ export const useVxeGrid = <T = any>(config?: UseVxeGridConfig<T>) => { |
| 85 | 81 | props: { result: 'list', total: 'total' }, |
| 86 | 82 | ajax: { |
| 87 | 83 | query: ({ page, form }) => { |
| 88 | - const queryParams = Object.assign({}, form) | |
| 84 | + const queryParams = Object.assign({}, JSON.parse(JSON.stringify(form))) | |
| 89 | 85 | queryParams.pageSize = page.pageSize |
| 90 | 86 | queryParams.pageNo = page.currentPage |
| 91 | 87 | gridOptions.loading = false | ... | ... |
yudao-ui-admin-vue3/src/plugins/vxeTable/index.ts
| 1 | 1 | import { App, unref } from 'vue' |
| 2 | 2 | import 'xe-utils' |
| 3 | 3 | import XEUtils from 'xe-utils' |
| 4 | +import './renderer' | |
| 4 | 5 | import { i18n } from '@/plugins/vueI18n' |
| 5 | 6 | import zhCN from 'vxe-table/es/locale/lang/zh-CN' |
| 6 | 7 | import enUS from 'vxe-table/lib/locale/lang/en-US' |
| ... | ... | @@ -138,6 +139,10 @@ VXETable.formats.mixin({ |
| 138 | 139 | formatDate({ cellValue }, format) { |
| 139 | 140 | return XEUtils.toDateString(cellValue, format || 'yyyy-MM-dd HH:mm:ss') |
| 140 | 141 | }, |
| 142 | + // 格式字典 | |
| 143 | + formatDict() { | |
| 144 | + return 'cellValue 123' | |
| 145 | + }, | |
| 141 | 146 | // 四舍五入金额,每隔3位逗号分隔,默认2位数 |
| 142 | 147 | formatAmount({ cellValue }, digits = 2) { |
| 143 | 148 | return XEUtils.commafy(Number(cellValue), { digits }) | ... | ... |
yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/dataTimePicker.tsx
0 → 100644
| 1 | +import { useI18n } from '@/hooks/web/useI18n' | |
| 2 | +import { ElDatePicker } from 'element-plus' | |
| 3 | +import { VXETable } from 'vxe-table' | |
| 4 | + | |
| 5 | +// 日期区间选择渲染 | |
| 6 | +VXETable.renderer.add('XDataTimePicker', { | |
| 7 | + // 默认显示模板 | |
| 8 | + renderItemContent(renderOpts, params) { | |
| 9 | + const { t } = useI18n() | |
| 10 | + const { data, field } = params | |
| 11 | + const { content } = renderOpts | |
| 12 | + return ( | |
| 13 | + <ElDatePicker | |
| 14 | + v-model={data[field]} | |
| 15 | + type={content ? (content as any) : 'datetimerange'} | |
| 16 | + value-format="YYYY-MM-DD HH:mm:ss" | |
| 17 | + range-separator="-" | |
| 18 | + start-placeholder={t('common.startTimeText')} | |
| 19 | + end-placeholder={t('common.endTimeText')} | |
| 20 | + ></ElDatePicker> | |
| 21 | + ) | |
| 22 | + } | |
| 23 | +}) | ... | ... |
yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/dict.tsx
0 → 100644
| 1 | +import { DictTag } from '@/components/DictTag' | |
| 2 | +import { VXETable } from 'vxe-table' | |
| 3 | + | |
| 4 | +// 字典渲染 | |
| 5 | +VXETable.renderer.add('XDict', { | |
| 6 | + // 默认显示模板 | |
| 7 | + renderDefault(renderOpts, params) { | |
| 8 | + const { row, column } = params | |
| 9 | + const { content } = renderOpts | |
| 10 | + return <DictTag type={content as unknown as string} value={row[column.field]}></DictTag> | |
| 11 | + } | |
| 12 | +}) | ... | ... |
yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/index.tsx
0 → 100644
yudao-ui-admin-vue3/src/types/descriptions.d.ts
yudao-ui-admin-vue3/src/views/system/errorCode/errorCode.data.ts
| ... | ... | @@ -2,9 +2,8 @@ import { reactive } from 'vue' |
| 2 | 2 | import { required } from '@/utils/formRules' |
| 3 | 3 | import { useI18n } from '@/hooks/web/useI18n' |
| 4 | 4 | import { DICT_TYPE } from '@/utils/dict' |
| 5 | -import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' | |
| 6 | -// 国际化 | |
| 7 | -const { t } = useI18n() | |
| 5 | +import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | |
| 6 | +const { t } = useI18n() // 国际化 | |
| 8 | 7 | // 表单校验 |
| 9 | 8 | export const rules = reactive({ |
| 10 | 9 | applicationName: [required], |
| ... | ... | @@ -12,71 +11,43 @@ export const rules = reactive({ |
| 12 | 11 | message: [required] |
| 13 | 12 | }) |
| 14 | 13 | // 新增 + 修改 |
| 15 | -const crudSchemas = reactive<CrudSchema[]>([ | |
| 16 | - { | |
| 17 | - label: t('common.index'), | |
| 18 | - field: 'id', | |
| 19 | - type: 'index', | |
| 20 | - form: { | |
| 21 | - show: false | |
| 14 | +const crudSchemas = reactive<VxeCrudSchema>({ | |
| 15 | + primaryKey: 'id', | |
| 16 | + primaryType: 'seq', | |
| 17 | + action: true, | |
| 18 | + columns: [ | |
| 19 | + { | |
| 20 | + title: '错误码类型', | |
| 21 | + field: 'type', | |
| 22 | + dictType: DICT_TYPE.SYSTEM_ERROR_CODE_TYPE, | |
| 23 | + isSearch: true | |
| 22 | 24 | }, |
| 23 | - detail: { | |
| 24 | - show: false | |
| 25 | - } | |
| 26 | - }, | |
| 27 | - { | |
| 28 | - label: '错误码类型', | |
| 29 | - field: 'type', | |
| 30 | - component: 'InputNumber', | |
| 31 | - dictType: DICT_TYPE.SYSTEM_ERROR_CODE_TYPE, | |
| 32 | - search: { | |
| 33 | - show: true | |
| 34 | - } | |
| 35 | - }, | |
| 36 | - { | |
| 37 | - label: '应用名', | |
| 38 | - field: 'applicationName', | |
| 39 | - search: { | |
| 40 | - show: true | |
| 41 | - } | |
| 42 | - }, | |
| 43 | - { | |
| 44 | - label: '错误码编码', | |
| 45 | - field: 'code', | |
| 46 | - search: { | |
| 47 | - show: true | |
| 48 | - } | |
| 49 | - }, | |
| 50 | - { | |
| 51 | - label: '错误码错误提示', | |
| 52 | - field: 'message' | |
| 53 | - }, | |
| 54 | - { | |
| 55 | - label: t('common.createTime'), | |
| 56 | - field: 'createTime', | |
| 57 | - form: { | |
| 58 | - show: false | |
| 25 | + { | |
| 26 | + title: '应用名', | |
| 27 | + field: 'applicationName', | |
| 28 | + isSearch: true | |
| 59 | 29 | }, |
| 60 | - search: { | |
| 61 | - show: true, | |
| 62 | - component: 'DatePicker', | |
| 63 | - componentProps: { | |
| 64 | - type: 'daterange', | |
| 65 | - valueFormat: 'YYYY-MM-DD HH:mm:ss', | |
| 66 | - defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)] | |
| 67 | - } | |
| 68 | - } | |
| 69 | - }, | |
| 70 | - { | |
| 71 | - field: 'action', | |
| 72 | - width: '240px', | |
| 73 | - label: t('table.action'), | |
| 74 | - form: { | |
| 75 | - show: false | |
| 30 | + { | |
| 31 | + title: '错误码编码', | |
| 32 | + field: 'code', | |
| 33 | + isSearch: true | |
| 34 | + }, | |
| 35 | + { | |
| 36 | + title: '错误码错误提示', | |
| 37 | + field: 'message' | |
| 76 | 38 | }, |
| 77 | - detail: { | |
| 78 | - show: false | |
| 39 | + { | |
| 40 | + title: t('common.createTime'), | |
| 41 | + field: 'createTime', | |
| 42 | + formatter: 'formatDate', | |
| 43 | + isForm: false, | |
| 44 | + isSearch: true, | |
| 45 | + search: { | |
| 46 | + itemRender: { | |
| 47 | + name: 'XDataTimePicker' | |
| 48 | + } | |
| 49 | + } | |
| 79 | 50 | } |
| 80 | - } | |
| 81 | -]) | |
| 82 | -export const { allSchemas } = useCrudSchemas(crudSchemas) | |
| 51 | + ] | |
| 52 | +}) | |
| 53 | +export const { allSchemas } = useVxeCrudSchemas(crudSchemas) | ... | ... |
yudao-ui-admin-vue3/src/views/system/errorCode/index.vue
| 1 | +<template> | |
| 2 | + <ContentWrap> | |
| 3 | + <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> | |
| 4 | + <template #toolbar_buttons> | |
| 5 | + <XButton | |
| 6 | + type="primary" | |
| 7 | + preIcon="ep:zoom-in" | |
| 8 | + :title="t('action.add')" | |
| 9 | + v-hasPermi="['system:error-code:create']" | |
| 10 | + @click="handleCreate()" | |
| 11 | + /> | |
| 12 | + </template> | |
| 13 | + <template #actionbtns_default="{ row }"> | |
| 14 | + <XTextButton | |
| 15 | + preIcon="ep:edit" | |
| 16 | + :title="t('action.edit')" | |
| 17 | + v-hasPermi="['system:error-code:update']" | |
| 18 | + @click="handleUpdate(row.id)" | |
| 19 | + /> | |
| 20 | + <XTextButton | |
| 21 | + preIcon="ep:view" | |
| 22 | + :title="t('action.detail')" | |
| 23 | + v-hasPermi="['system:error-code:update']" | |
| 24 | + @click="handleDetail(row)" | |
| 25 | + /> | |
| 26 | + <XTextButton | |
| 27 | + preIcon="ep:delete" | |
| 28 | + :title="t('action.del')" | |
| 29 | + v-hasPermi="['system:error-code:delete']" | |
| 30 | + @click="handleDelete(row.id)" | |
| 31 | + /> | |
| 32 | + </template> | |
| 33 | + </vxe-grid> | |
| 34 | + </ContentWrap> | |
| 35 | + <XModal id="errorCodeModel" v-model="dialogVisible" :title="dialogTitle"> | |
| 36 | + <template #default> | |
| 37 | + <!-- 对话框(添加 / 修改) --> | |
| 38 | + <Form | |
| 39 | + v-if="['create', 'update'].includes(actionType)" | |
| 40 | + :schema="allSchemas.formSchema" | |
| 41 | + :rules="rules" | |
| 42 | + ref="formRef" | |
| 43 | + /> | |
| 44 | + <!-- 对话框(详情) --> | |
| 45 | + <Descriptions | |
| 46 | + v-if="actionType === 'detail'" | |
| 47 | + :schema="allSchemas.detailSchema" | |
| 48 | + :data="detailRef" | |
| 49 | + /> | |
| 50 | + </template> | |
| 51 | + <!-- 操作按钮 --> | |
| 52 | + <template #footer> | |
| 53 | + <XButton | |
| 54 | + v-if="['create', 'update'].includes(actionType)" | |
| 55 | + type="primary" | |
| 56 | + :title="t('action.save')" | |
| 57 | + :loading="actionLoading" | |
| 58 | + @click="submitForm" | |
| 59 | + /> | |
| 60 | + <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" /> | |
| 61 | + </template> | |
| 62 | + </XModal> | |
| 63 | +</template> | |
| 64 | + | |
| 1 | 65 | <script setup lang="ts"> |
| 2 | 66 | import { ref, unref } from 'vue' |
| 3 | -import dayjs from 'dayjs' | |
| 4 | -import { ElMessage } from 'element-plus' | |
| 5 | -import { DICT_TYPE } from '@/utils/dict' | |
| 6 | -import { useTable } from '@/hooks/web/useTable' | |
| 7 | -import { useI18n } from '@/hooks/web/useI18n' | |
| 8 | -import { FormExpose } from '@/components/Form' | |
| 9 | 67 | import type { ErrorCodeVO } from '@/api/system/errorCode/types' |
| 10 | 68 | import { rules, allSchemas } from './errorCode.data' |
| 11 | 69 | import * as ErrorCodeApi from '@/api/system/errorCode' |
| 12 | -const { t } = useI18n() // 国际化 | |
| 13 | - | |
| 14 | -// ========== 列表相关 ========== | |
| 15 | -const { register, tableObject, methods } = useTable<ErrorCodeVO>({ | |
| 16 | - getListApi: ErrorCodeApi.getErrorCodePageApi, | |
| 17 | - delListApi: ErrorCodeApi.deleteErrorCodeApi | |
| 18 | -}) | |
| 19 | -const { getList, setSearchParams, delList } = methods | |
| 70 | +import { useI18n } from '@/hooks/web/useI18n' | |
| 71 | +import { useMessage } from '@/hooks/web/useMessage' | |
| 72 | +import { useVxeGrid } from '@/hooks/web/useVxeGrid' | |
| 73 | +import { VxeGridInstance } from 'vxe-table' | |
| 74 | +import { FormExpose } from '@/components/Form' | |
| 20 | 75 | |
| 21 | -// ========== CRUD 相关 ========== | |
| 22 | -const loading = ref(false) // 遮罩层 | |
| 23 | -const actionType = ref('') // 操作按钮的类型 | |
| 76 | +const { t } = useI18n() // 国际化 | |
| 77 | +const message = useMessage() // 消息弹窗 | |
| 24 | 78 | const dialogVisible = ref(false) // 是否显示弹出层 |
| 25 | 79 | const dialogTitle = ref('edit') // 弹出层标题 |
| 80 | +const actionType = ref('') // 操作按钮的类型 | |
| 81 | +const actionLoading = ref(false) // 按钮Loading | |
| 82 | +const xGrid = ref<VxeGridInstance>() // grid Ref | |
| 26 | 83 | const formRef = ref<FormExpose>() // 表单 Ref |
| 84 | +const detailRef = ref() // 详情 Ref | |
| 27 | 85 | |
| 86 | +const { gridOptions } = useVxeGrid<ErrorCodeVO>({ | |
| 87 | + allSchemas: allSchemas, | |
| 88 | + getListApi: ErrorCodeApi.getErrorCodePageApi | |
| 89 | +}) | |
| 28 | 90 | // 设置标题 |
| 29 | 91 | const setDialogTile = (type: string) => { |
| 30 | 92 | dialogTitle.value = t('action.' + type) |
| ... | ... | @@ -39,147 +101,57 @@ const handleCreate = () => { |
| 39 | 101 | unref(formRef)?.getElFormRef()?.resetFields() |
| 40 | 102 | } |
| 41 | 103 | |
| 104 | +// 详情操作 | |
| 105 | +const handleDetail = async (row: ErrorCodeVO) => { | |
| 106 | + // 设置数据 | |
| 107 | + detailRef.value = row | |
| 108 | + setDialogTile('detail') | |
| 109 | +} | |
| 110 | + | |
| 42 | 111 | // 修改操作 |
| 43 | -const handleUpdate = async (row: ErrorCodeVO) => { | |
| 112 | +const handleUpdate = async (rowId: number) => { | |
| 44 | 113 | setDialogTile('update') |
| 45 | 114 | // 设置数据 |
| 46 | - const res = await ErrorCodeApi.getErrorCodeApi(row.id) | |
| 115 | + const res = await ErrorCodeApi.getErrorCodeApi(rowId) | |
| 47 | 116 | unref(formRef)?.setValues(res) |
| 48 | 117 | } |
| 49 | 118 | |
| 119 | +// 删除操作 | |
| 120 | +const handleDelete = async (rowId: number) => { | |
| 121 | + message | |
| 122 | + .delConfirm() | |
| 123 | + .then(async () => { | |
| 124 | + await ErrorCodeApi.deleteErrorCodeApi(rowId) | |
| 125 | + message.success(t('common.delSuccess')) | |
| 126 | + }) | |
| 127 | + .finally(() => { | |
| 128 | + xGrid.value?.commitProxy('query') | |
| 129 | + }) | |
| 130 | +} | |
| 131 | + | |
| 50 | 132 | // 提交按钮 |
| 51 | 133 | const submitForm = async () => { |
| 52 | 134 | const elForm = unref(formRef)?.getElFormRef() |
| 53 | 135 | if (!elForm) return |
| 54 | 136 | elForm.validate(async (valid) => { |
| 55 | 137 | if (valid) { |
| 56 | - loading.value = true | |
| 138 | + actionLoading.value = true | |
| 57 | 139 | // 提交请求 |
| 58 | 140 | try { |
| 59 | 141 | const data = unref(formRef)?.formModel as ErrorCodeVO |
| 60 | 142 | if (actionType.value === 'create') { |
| 61 | 143 | await ErrorCodeApi.createErrorCodeApi(data) |
| 62 | - ElMessage.success(t('common.createSuccess')) | |
| 144 | + message.success(t('common.createSuccess')) | |
| 63 | 145 | } else { |
| 64 | 146 | await ErrorCodeApi.updateErrorCodeApi(data) |
| 65 | - ElMessage.success(t('common.updateSuccess')) | |
| 147 | + message.success(t('common.updateSuccess')) | |
| 66 | 148 | } |
| 67 | - // 操作成功,重新加载列表 | |
| 68 | 149 | dialogVisible.value = false |
| 69 | - await getList() | |
| 70 | 150 | } finally { |
| 71 | - loading.value = false | |
| 151 | + actionLoading.value = false | |
| 152 | + xGrid.value?.commitProxy('query') | |
| 72 | 153 | } |
| 73 | 154 | } |
| 74 | 155 | }) |
| 75 | 156 | } |
| 76 | - | |
| 77 | -// ========== 详情相关 ========== | |
| 78 | -const detailRef = ref() // 详情 Ref | |
| 79 | - | |
| 80 | -// 详情操作 | |
| 81 | -const handleDetail = async (row: ErrorCodeVO) => { | |
| 82 | - // 设置数据 | |
| 83 | - detailRef.value = row | |
| 84 | - setDialogTile('detail') | |
| 85 | -} | |
| 86 | - | |
| 87 | -// ========== 初始化 ========== | |
| 88 | -getList() | |
| 89 | 157 | </script> |
| 90 | - | |
| 91 | -<template> | |
| 92 | - <!-- 搜索工作区 --> | |
| 93 | - <ContentWrap> | |
| 94 | - <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" /> | |
| 95 | - </ContentWrap> | |
| 96 | - <ContentWrap> | |
| 97 | - <!-- 操作工具栏 --> | |
| 98 | - <div class="mb-10px"> | |
| 99 | - <el-button v-hasPermi="['system:error-code:create']" type="primary" @click="handleCreate"> | |
| 100 | - <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }} | |
| 101 | - </el-button> | |
| 102 | - </div> | |
| 103 | - <!-- 列表 --> | |
| 104 | - <Table | |
| 105 | - :columns="allSchemas.tableColumns" | |
| 106 | - :selection="false" | |
| 107 | - :data="tableObject.tableList" | |
| 108 | - :loading="tableObject.loading" | |
| 109 | - :pagination="{ | |
| 110 | - total: tableObject.total | |
| 111 | - }" | |
| 112 | - v-model:pageSize="tableObject.pageSize" | |
| 113 | - v-model:currentPage="tableObject.currentPage" | |
| 114 | - @register="register" | |
| 115 | - > | |
| 116 | - <template #type="{ row }"> | |
| 117 | - <DictTag :type="DICT_TYPE.SYSTEM_ERROR_CODE_TYPE" :value="row.type" /> | |
| 118 | - </template> | |
| 119 | - <template #createTime="{ row }"> | |
| 120 | - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span> | |
| 121 | - </template> | |
| 122 | - <template #action="{ row }"> | |
| 123 | - <el-button | |
| 124 | - link | |
| 125 | - type="primary" | |
| 126 | - v-hasPermi="['system:error-code:update']" | |
| 127 | - @click="handleUpdate(row)" | |
| 128 | - > | |
| 129 | - <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }} | |
| 130 | - </el-button> | |
| 131 | - <el-button | |
| 132 | - link | |
| 133 | - type="primary" | |
| 134 | - v-hasPermi="['system:error-code:update']" | |
| 135 | - @click="handleDetail(row)" | |
| 136 | - > | |
| 137 | - <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }} | |
| 138 | - </el-button> | |
| 139 | - <el-button | |
| 140 | - link | |
| 141 | - type="primary" | |
| 142 | - v-hasPermi="['system:error-code:delete']" | |
| 143 | - @click="delList(row.id, false)" | |
| 144 | - > | |
| 145 | - <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }} | |
| 146 | - </el-button> | |
| 147 | - </template> | |
| 148 | - </Table> | |
| 149 | - </ContentWrap> | |
| 150 | - | |
| 151 | - <Dialog v-model="dialogVisible" :title="dialogTitle"> | |
| 152 | - <!-- 对话框(添加 / 修改) --> | |
| 153 | - <Form | |
| 154 | - v-if="['create', 'update'].includes(actionType)" | |
| 155 | - :schema="allSchemas.formSchema" | |
| 156 | - :rules="rules" | |
| 157 | - ref="formRef" | |
| 158 | - /> | |
| 159 | - <!-- 对话框(详情) --> | |
| 160 | - <Descriptions | |
| 161 | - v-if="actionType === 'detail'" | |
| 162 | - :schema="allSchemas.detailSchema" | |
| 163 | - :data="detailRef" | |
| 164 | - > | |
| 165 | - <template #type="{ row }"> | |
| 166 | - <DictTag :type="DICT_TYPE.SYSTEM_ERROR_CODE_TYPE" :value="row.type" /> | |
| 167 | - </template> | |
| 168 | - <template #createTime="{ row }"> | |
| 169 | - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span> | |
| 170 | - </template> | |
| 171 | - </Descriptions> | |
| 172 | - <!-- 操作按钮 --> | |
| 173 | - <template #footer> | |
| 174 | - <el-button | |
| 175 | - v-if="['create', 'update'].includes(actionType)" | |
| 176 | - type="primary" | |
| 177 | - :loading="loading" | |
| 178 | - @click="submitForm" | |
| 179 | - > | |
| 180 | - {{ t('action.save') }} | |
| 181 | - </el-button> | |
| 182 | - <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button> | |
| 183 | - </template> | |
| 184 | - </Dialog> | |
| 185 | -</template> | ... | ... |
yudao-ui-admin-vue3/src/views/system/menu/index.vue
| 1 | 1 | <template> |
| 2 | 2 | <ContentWrap> |
| 3 | + <!-- 搜索工作栏 --> | |
| 3 | 4 | <el-form :model="queryParams" ref="queryForm" :inline="true"> |
| 4 | 5 | <el-form-item label="菜单名称" prop="name"> |
| 5 | 6 | <el-input v-model="queryParams.name" placeholder="请输入菜单名称" /> |
| ... | ... | @@ -15,17 +16,20 @@ |
| 15 | 16 | </el-select> |
| 16 | 17 | </el-form-item> |
| 17 | 18 | <el-form-item> |
| 19 | + <!-- 操作:搜索 --> | |
| 18 | 20 | <XButton |
| 19 | 21 | type="primary" |
| 20 | 22 | preIcon="ep:search" |
| 21 | 23 | :title="t('common.query')" |
| 22 | 24 | @click="handleQuery()" |
| 23 | 25 | /> |
| 26 | + <!-- 操作:重置 --> | |
| 24 | 27 | <XButton preIcon="ep:refresh-right" :title="t('common.reset')" @click="resetQuery()" /> |
| 25 | 28 | </el-form-item> |
| 26 | 29 | </el-form> |
| 27 | 30 | <vxe-toolbar> |
| 28 | 31 | <template #buttons> |
| 32 | + <!-- 操作:新增 --> | |
| 29 | 33 | <XButton |
| 30 | 34 | type="primary" |
| 31 | 35 | preIcon="ep:zoom-in" |
| ... | ... | @@ -37,6 +41,8 @@ |
| 37 | 41 | <XButton title="关闭所有" @click="xTable?.clearTreeExpand()" /> |
| 38 | 42 | </template> |
| 39 | 43 | </vxe-toolbar> |
| 44 | + <!-- 列表 --> | |
| 45 | + <!-- TODO 星语:是不是也搞成 grid 会好点,后续代码就统一走 grid 风格? --> | |
| 40 | 46 | <vxe-table |
| 41 | 47 | show-overflow |
| 42 | 48 | keep-source |
| ... | ... | @@ -73,12 +79,14 @@ |
| 73 | 79 | <vxe-column title="创建时间" field="createTime" formatter="formatDate" /> |
| 74 | 80 | <vxe-column title="操作" width="200"> |
| 75 | 81 | <template #default="{ row }"> |
| 82 | + <!-- 操作:修改 --> | |
| 76 | 83 | <XTextButton |
| 77 | 84 | preIcon="ep:edit" |
| 78 | 85 | :title="t('action.edit')" |
| 79 | 86 | v-hasPermi="['system:menu:update']" |
| 80 | 87 | @click="handleUpdate(row)" |
| 81 | 88 | /> |
| 89 | + <!-- 操作:删除 --> | |
| 82 | 90 | <XTextButton |
| 83 | 91 | preIcon="ep:delete" |
| 84 | 92 | :title="t('action.del')" |
| ... | ... | @@ -89,6 +97,7 @@ |
| 89 | 97 | </vxe-column> |
| 90 | 98 | </vxe-table> |
| 91 | 99 | </ContentWrap> |
| 100 | + <!-- 添加或修改菜单对话框 --> | |
| 92 | 101 | <XModal v-model="dialogVisible" id="menuModel" :title="dialogTitle"> |
| 93 | 102 | <template #default> |
| 94 | 103 | <!-- 对话框(添加 / 修改) --> |
| ... | ... | @@ -107,6 +116,7 @@ |
| 107 | 116 | v-model="menuForm.parentId" |
| 108 | 117 | :props="menuProps" |
| 109 | 118 | :data="menuOptions" |
| 119 | + :default-expanded-keys="[0]" | |
| 110 | 120 | check-strictly |
| 111 | 121 | /> |
| 112 | 122 | </el-form-item> |
| ... | ... | @@ -226,7 +236,7 @@ |
| 226 | 236 | </el-form> |
| 227 | 237 | </template> |
| 228 | 238 | <template #footer> |
| 229 | - <!-- 操作按钮 --> | |
| 239 | + <!-- 按钮:保存 --> | |
| 230 | 240 | <XButton |
| 231 | 241 | v-if="['create', 'update'].includes(actionType)" |
| 232 | 242 | type="primary" |
| ... | ... | @@ -234,22 +244,17 @@ |
| 234 | 244 | @click="submitForm" |
| 235 | 245 | :title="t('action.save')" |
| 236 | 246 | /> |
| 247 | + <!-- 按钮:关闭 --> | |
| 237 | 248 | <XButton :loading="actionLoading" @click="dialogVisible = false" :title="t('dialog.close')" /> |
| 238 | 249 | </template> |
| 239 | 250 | </XModal> |
| 240 | 251 | </template> |
| 241 | 252 | <script setup lang="ts"> |
| 242 | -import * as MenuApi from '@/api/system/menu' | |
| 243 | -import { MenuVO } from '@/api/system/menu/types' | |
| 253 | +// 全局相关的 import | |
| 254 | +import { onMounted, reactive, ref } from 'vue' | |
| 244 | 255 | import { useI18n } from '@/hooks/web/useI18n' |
| 245 | 256 | import { useMessage } from '@/hooks/web/useMessage' |
| 246 | -import { IconSelect } from '@/components/Icon' | |
| 247 | -import { Tooltip } from '@/components/Tooltip' | |
| 248 | -import { required } from '@/utils/formRules.js' | |
| 249 | -import { onMounted, reactive, ref } from 'vue' | |
| 250 | -import { VxeTableInstance } from 'vxe-table' | |
| 251 | -import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | |
| 252 | -import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants' | |
| 257 | +// TODO @星语:是不是 'element-plus' 和 '@/components/Tooltip' 和 '@/components/Icon' 全局直接引入 | |
| 253 | 258 | import { |
| 254 | 259 | ElRow, |
| 255 | 260 | ElCol, |
| ... | ... | @@ -263,17 +268,29 @@ import { |
| 263 | 268 | ElRadioGroup, |
| 264 | 269 | ElRadioButton |
| 265 | 270 | } from 'element-plus' |
| 271 | +import { Tooltip } from '@/components/Tooltip' | |
| 272 | +import { IconSelect } from '@/components/Icon' | |
| 273 | +import { VxeTableInstance } from 'vxe-table' | |
| 274 | +// 业务相关的 import | |
| 275 | +import * as MenuApi from '@/api/system/menu' | |
| 276 | +import { MenuVO } from '@/api/system/menu/types' | |
| 277 | +import { required } from '@/utils/formRules.js' | |
| 278 | +import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | |
| 279 | +import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants' | |
| 266 | 280 | import { handleTree } from '@/utils/tree' |
| 281 | + | |
| 267 | 282 | const { t } = useI18n() // 国际化 |
| 268 | -const message = useMessage() | |
| 283 | +const message = useMessage() // 消息弹窗 | |
| 284 | +// 列表相关的变量 | |
| 269 | 285 | const xTable = ref<VxeTableInstance>() |
| 270 | 286 | const tableLoading = ref(false) |
| 271 | 287 | const tableData = ref() |
| 272 | -const actionLoading = ref(false) // 遮罩层 | |
| 273 | -const actionType = ref('') // 操作按钮的类型 | |
| 288 | +// 弹窗相关的变量 | |
| 274 | 289 | const dialogVisible = ref(false) // 是否显示弹出层 |
| 275 | 290 | const dialogTitle = ref('edit') // 弹出层标题 |
| 276 | -const statusOption = ref() // 状态选项 | |
| 291 | +const actionType = ref('') // 操作按钮的类型 | |
| 292 | +const actionLoading = ref(false) // 遮罩层 | |
| 293 | +// 新增和修改的表单值 | |
| 277 | 294 | const menuForm = ref<MenuVO>({ |
| 278 | 295 | id: 0, |
| 279 | 296 | name: '', |
| ... | ... | @@ -289,12 +306,24 @@ const menuForm = ref<MenuVO>({ |
| 289 | 306 | keepAlive: true, |
| 290 | 307 | createTime: '' |
| 291 | 308 | }) |
| 309 | +// 新增和修改的表单校验 | |
| 310 | +const rules = reactive({ | |
| 311 | + name: [required], | |
| 312 | + sort: [required], | |
| 313 | + path: [required], | |
| 314 | + status: [required] | |
| 315 | +}) | |
| 316 | + | |
| 317 | +// ========== 下拉框[上级菜单] ========== | |
| 318 | +// 下拉框[上级菜单]的配置项目 | |
| 319 | +// TODO @星语:menuProps 貌似也可以抽到全局? | |
| 292 | 320 | const menuProps = { |
| 293 | 321 | checkStrictly: true, |
| 294 | 322 | children: 'children', |
| 295 | 323 | label: 'name', |
| 296 | 324 | value: 'id' |
| 297 | 325 | } |
| 326 | +// TODO @星语:Tree 可以是全局的 | |
| 298 | 327 | interface Tree { |
| 299 | 328 | id: number |
| 300 | 329 | name: string |
| ... | ... | @@ -308,6 +337,7 @@ const getTree = async () => { |
| 308 | 337 | menu.children = handleTree(res) |
| 309 | 338 | menuOptions.value.push(menu) |
| 310 | 339 | } |
| 340 | + | |
| 311 | 341 | // ========== 查询 ========== |
| 312 | 342 | const queryParams = reactive({ |
| 313 | 343 | name: null, |
| ... | ... | @@ -315,58 +345,47 @@ const queryParams = reactive({ |
| 315 | 345 | }) |
| 316 | 346 | const getList = async () => { |
| 317 | 347 | tableLoading.value = true |
| 318 | - statusOption.value = getIntDictOptions(DICT_TYPE.COMMON_STATUS) | |
| 319 | 348 | const res = await MenuApi.getMenuListApi(queryParams) |
| 320 | 349 | tableData.value = res |
| 321 | 350 | tableLoading.value = false |
| 322 | 351 | } |
| 352 | + | |
| 353 | +// 查询操作 | |
| 354 | +const handleQuery = async () => { | |
| 355 | + await getList() | |
| 356 | +} | |
| 357 | + | |
| 358 | +// 重置操作 | |
| 359 | +const resetQuery = async () => { | |
| 360 | + queryParams.name = null | |
| 361 | + queryParams.status = null | |
| 362 | + await getList() | |
| 363 | +} | |
| 364 | + | |
| 365 | +// ========== 新增/修改 ========== | |
| 366 | + | |
| 323 | 367 | // 设置标题 |
| 324 | 368 | const setDialogTile = (type: string) => { |
| 325 | 369 | dialogTitle.value = t('action.' + type) |
| 326 | 370 | actionType.value = type |
| 327 | 371 | dialogVisible.value = true |
| 328 | 372 | } |
| 373 | + | |
| 329 | 374 | // 新建操作 |
| 330 | 375 | const handleCreate = () => { |
| 331 | 376 | setDialogTile('create') |
| 377 | + // TODO @星语:重置表单 | |
| 332 | 378 | } |
| 379 | + | |
| 333 | 380 | // 修改操作 |
| 334 | 381 | const handleUpdate = async (row: MenuVO) => { |
| 382 | + setDialogTile('update') | |
| 335 | 383 | // 设置数据 |
| 336 | 384 | const res = await MenuApi.getMenuApi(row.id) |
| 337 | - console.log(res) | |
| 338 | 385 | menuForm.value = res |
| 339 | - setDialogTile('update') | |
| 340 | -} | |
| 341 | -// 删除操作 | |
| 342 | -const handleDelete = async (row: MenuVO) => { | |
| 343 | - message.confirm(t('common.delDataMessage'), t('common.confirmTitle')).then(async () => { | |
| 344 | - await MenuApi.deleteMenuApi(row.id) | |
| 345 | - message.success(t('common.delSuccess')) | |
| 346 | - await getList() | |
| 347 | - }) | |
| 348 | -} | |
| 349 | -// 表单校验 | |
| 350 | -const rules = reactive({ | |
| 351 | - name: [required], | |
| 352 | - sort: [required], | |
| 353 | - path: [required], | |
| 354 | - status: [required] | |
| 355 | -}) | |
| 356 | -// 查询操作 | |
| 357 | -const handleQuery = async () => { | |
| 358 | - await getList() | |
| 359 | -} | |
| 360 | -// 重置操作 | |
| 361 | -const resetQuery = async () => { | |
| 362 | - queryParams.name = null | |
| 363 | - queryParams.status = null | |
| 364 | - await getList() | |
| 365 | -} | |
| 366 | -// 保存操作 | |
| 367 | -const isExternal = (path: string) => { | |
| 368 | - return /^(https?:|mailto:|tel:)/.test(path) | |
| 369 | 386 | } |
| 387 | + | |
| 388 | +// 提交新增/修改的表单 | |
| 370 | 389 | const submitForm = async () => { |
| 371 | 390 | actionLoading.value = true |
| 372 | 391 | // 提交请求 |
| ... | ... | @@ -399,8 +418,26 @@ const submitForm = async () => { |
| 399 | 418 | actionLoading.value = false |
| 400 | 419 | } |
| 401 | 420 | } |
| 421 | + | |
| 422 | +// 判断 path 是不是外部的 HTTP 等链接 | |
| 423 | +const isExternal = (path: string) => { | |
| 424 | + return /^(https?:|mailto:|tel:)/.test(path) | |
| 425 | +} | |
| 426 | + | |
| 427 | +// ========== 删除 ========== | |
| 428 | +// 删除操作 | |
| 429 | +const handleDelete = async (row: MenuVO) => { | |
| 430 | + message.confirm(t('common.delDataMessage'), t('common.confirmTitle')).then(async () => { | |
| 431 | + await MenuApi.deleteMenuApi(row.id) | |
| 432 | + message.success(t('common.delSuccess')) | |
| 433 | + await getList() | |
| 434 | + }) | |
| 435 | +} | |
| 436 | + | |
| 437 | +// ========== 初始化 ========== | |
| 402 | 438 | onMounted(async () => { |
| 403 | 439 | await getList() |
| 440 | + // TODO @星语:这个告警解决下;是不是改成新增和修改点击的时候,去加载下好一点哈? | |
| 404 | 441 | getTree() |
| 405 | 442 | }) |
| 406 | 443 | </script> | ... | ... |
yudao-ui-admin-vue3/src/views/system/notice/index.vue
| 1 | +<template> | |
| 2 | + <ContentWrap> | |
| 3 | + <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> | |
| 4 | + <template #toolbar_buttons> | |
| 5 | + <XButton | |
| 6 | + type="primary" | |
| 7 | + preIcon="ep:zoom-in" | |
| 8 | + :title="t('action.add')" | |
| 9 | + v-hasPermi="['system:notice:create']" | |
| 10 | + @click="handleCreate()" | |
| 11 | + /> | |
| 12 | + </template> | |
| 13 | + <template #actionbtns_default="{ row }"> | |
| 14 | + <XTextButton | |
| 15 | + preIcon="ep:edit" | |
| 16 | + :title="t('action.edit')" | |
| 17 | + v-hasPermi="['system:notice:update']" | |
| 18 | + @click="handleUpdate(row.id)" | |
| 19 | + /> | |
| 20 | + <XTextButton | |
| 21 | + preIcon="ep:view" | |
| 22 | + :title="t('action.detail')" | |
| 23 | + v-hasPermi="['system:notice:update']" | |
| 24 | + @click="handleDetail(row)" | |
| 25 | + /> | |
| 26 | + <XTextButton | |
| 27 | + preIcon="ep:delete" | |
| 28 | + :title="t('action.del')" | |
| 29 | + v-hasPermi="['system:notice:delete']" | |
| 30 | + @click="handleDelete(row.id)" | |
| 31 | + /> | |
| 32 | + </template> | |
| 33 | + </vxe-grid> | |
| 34 | + </ContentWrap> | |
| 35 | + <XModal id="noticeModel" v-model="dialogVisible" :title="dialogTitle"> | |
| 36 | + <template #default> | |
| 37 | + <!-- 对话框(添加 / 修改) --> | |
| 38 | + <Form | |
| 39 | + v-if="['create', 'update'].includes(actionType)" | |
| 40 | + :schema="allSchemas.formSchema" | |
| 41 | + :rules="rules" | |
| 42 | + ref="formRef" | |
| 43 | + /> | |
| 44 | + <!-- 对话框(详情) --> | |
| 45 | + <Descriptions | |
| 46 | + v-if="actionType === 'detail'" | |
| 47 | + :schema="allSchemas.detailSchema" | |
| 48 | + :data="detailRef" | |
| 49 | + /> | |
| 50 | + </template> | |
| 51 | + <!-- 操作按钮 --> | |
| 52 | + <template #footer> | |
| 53 | + <XButton | |
| 54 | + v-if="['create', 'update'].includes(actionType)" | |
| 55 | + type="primary" | |
| 56 | + :title="t('action.save')" | |
| 57 | + :loading="actionLoading" | |
| 58 | + @click="submitForm" | |
| 59 | + /> | |
| 60 | + <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" /> | |
| 61 | + </template> | |
| 62 | + </XModal> | |
| 63 | +</template> | |
| 1 | 64 | <script setup lang="ts"> |
| 2 | 65 | import { ref, unref } from 'vue' |
| 3 | -import dayjs from 'dayjs' | |
| 4 | -import { ElMessage } from 'element-plus' | |
| 5 | -import { DICT_TYPE } from '@/utils/dict' | |
| 6 | -import { useTable } from '@/hooks/web/useTable' | |
| 66 | +import * as NoticeApi from '@/api/system/notice' | |
| 67 | +import { NoticeVO } from '@/api/system/notice/types' | |
| 68 | +import { rules, allSchemas } from './notice.data' | |
| 7 | 69 | import { useI18n } from '@/hooks/web/useI18n' |
| 70 | +import { useMessage } from '@/hooks/web/useMessage' | |
| 71 | +import { useVxeGrid } from '@/hooks/web/useVxeGrid' | |
| 72 | +import { VxeGridInstance } from 'vxe-table' | |
| 8 | 73 | import { FormExpose } from '@/components/Form' |
| 9 | -import type { NoticeVO } from '@/api/system/notice/types' | |
| 10 | -import { rules, allSchemas } from './notice.data' | |
| 11 | -import * as NoticeApi from '@/api/system/notice' | |
| 12 | -const { t } = useI18n() // 国际化 | |
| 13 | -// ========== 列表相关 ========== | |
| 14 | -const { register, tableObject, methods } = useTable<NoticeVO>({ | |
| 15 | - getListApi: NoticeApi.getNoticePageApi, | |
| 16 | - delListApi: NoticeApi.deleteNoticeApi | |
| 17 | -}) | |
| 18 | -const { getList, setSearchParams, delList } = methods | |
| 19 | 74 | |
| 20 | -// ========== CRUD 相关 ========== | |
| 21 | -const actionLoading = ref(false) // 遮罩层 | |
| 22 | -const actionType = ref('') // 操作按钮的类型 | |
| 75 | +const { t } = useI18n() // 国际化 | |
| 76 | +const message = useMessage() // 消息弹窗 | |
| 23 | 77 | const dialogVisible = ref(false) // 是否显示弹出层 |
| 24 | 78 | const dialogTitle = ref('edit') // 弹出层标题 |
| 79 | +const actionType = ref('') // 操作按钮的类型 | |
| 80 | +const actionLoading = ref(false) // 按钮Loading | |
| 81 | +const xGrid = ref<VxeGridInstance>() // grid Ref | |
| 25 | 82 | const formRef = ref<FormExpose>() // 表单 Ref |
| 83 | +const detailRef = ref() // 详情 Ref | |
| 84 | + | |
| 85 | +const { gridOptions } = useVxeGrid<NoticeVO>({ | |
| 86 | + allSchemas: allSchemas, | |
| 87 | + getListApi: NoticeApi.getNoticePageApi | |
| 88 | +}) | |
| 26 | 89 | |
| 27 | 90 | // 设置标题 |
| 28 | 91 | const setDialogTile = (type: string) => { |
| ... | ... | @@ -39,13 +102,32 @@ const handleCreate = () => { |
| 39 | 102 | } |
| 40 | 103 | |
| 41 | 104 | // 修改操作 |
| 42 | -const handleUpdate = async (row: NoticeVO) => { | |
| 105 | +const handleUpdate = async (rowId: number) => { | |
| 43 | 106 | setDialogTile('update') |
| 44 | 107 | // 设置数据 |
| 45 | - const res = await NoticeApi.getNoticeApi(row.id) | |
| 108 | + const res = await NoticeApi.getNoticeApi(rowId) | |
| 46 | 109 | unref(formRef)?.setValues(res) |
| 47 | 110 | } |
| 48 | 111 | |
| 112 | +// 详情操作 | |
| 113 | +const handleDetail = (row: NoticeVO) => { | |
| 114 | + setDialogTile('detail') | |
| 115 | + detailRef.value = row | |
| 116 | +} | |
| 117 | + | |
| 118 | +// 删除操作 | |
| 119 | +const handleDelete = async (rowId: number) => { | |
| 120 | + message | |
| 121 | + .delConfirm() | |
| 122 | + .then(async () => { | |
| 123 | + await NoticeApi.deleteNoticeApi(rowId) | |
| 124 | + message.success(t('common.delSuccess')) | |
| 125 | + }) | |
| 126 | + .finally(() => { | |
| 127 | + xGrid.value?.commitProxy('query') | |
| 128 | + }) | |
| 129 | +} | |
| 130 | + | |
| 49 | 131 | // 提交按钮 |
| 50 | 132 | const submitForm = async () => { |
| 51 | 133 | const elForm = unref(formRef)?.getElFormRef() |
| ... | ... | @@ -58,133 +140,17 @@ const submitForm = async () => { |
| 58 | 140 | const data = unref(formRef)?.formModel as NoticeVO |
| 59 | 141 | if (actionType.value === 'create') { |
| 60 | 142 | await NoticeApi.createNoticeApi(data) |
| 61 | - ElMessage.success(t('common.createSuccess')) | |
| 143 | + message.success(t('common.createSuccess')) | |
| 62 | 144 | } else { |
| 63 | 145 | await NoticeApi.updateNoticeApi(data) |
| 64 | - ElMessage.success(t('common.updateSuccess')) | |
| 146 | + message.success(t('common.updateSuccess')) | |
| 65 | 147 | } |
| 66 | - // 操作成功,重新加载列表 | |
| 67 | 148 | dialogVisible.value = false |
| 68 | - await getList() | |
| 69 | 149 | } finally { |
| 70 | 150 | actionLoading.value = false |
| 151 | + xGrid.value?.commitProxy('query') | |
| 71 | 152 | } |
| 72 | 153 | } |
| 73 | 154 | }) |
| 74 | 155 | } |
| 75 | - | |
| 76 | -// ========== 详情相关 ========== | |
| 77 | -const detailRef = ref() // 详情 Ref | |
| 78 | - | |
| 79 | -// 详情操作 | |
| 80 | -const handleDetail = async (row: NoticeVO) => { | |
| 81 | - // 设置数据 | |
| 82 | - detailRef.value = row | |
| 83 | - setDialogTile('detail') | |
| 84 | -} | |
| 85 | - | |
| 86 | -// ========== 初始化 ========== | |
| 87 | -getList() | |
| 88 | 156 | </script> |
| 89 | - | |
| 90 | -<template> | |
| 91 | - <!-- 搜索工作区 --> | |
| 92 | - <ContentWrap> | |
| 93 | - <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" /> | |
| 94 | - </ContentWrap> | |
| 95 | - <ContentWrap> | |
| 96 | - <!-- 操作工具栏 --> | |
| 97 | - <div class="mb-10px"> | |
| 98 | - <el-button type="primary" v-hasPermi="['system:notice:create']" @click="handleCreate"> | |
| 99 | - <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }} | |
| 100 | - </el-button> | |
| 101 | - </div> | |
| 102 | - <!-- 列表 --> | |
| 103 | - <Table | |
| 104 | - :columns="allSchemas.tableColumns" | |
| 105 | - :selection="false" | |
| 106 | - :data="tableObject.tableList" | |
| 107 | - :loading="tableObject.loading" | |
| 108 | - :pagination="{ | |
| 109 | - total: tableObject.total | |
| 110 | - }" | |
| 111 | - v-model:pageSize="tableObject.pageSize" | |
| 112 | - v-model:currentPage="tableObject.currentPage" | |
| 113 | - @register="register" | |
| 114 | - > | |
| 115 | - <template #type="{ row }"> | |
| 116 | - <DictTag :type="DICT_TYPE.SYSTEM_NOTICE_TYPE" :value="row.type" /> | |
| 117 | - </template> | |
| 118 | - <template #status="{ row }"> | |
| 119 | - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" /> | |
| 120 | - </template> | |
| 121 | - <template #createTime="{ row }"> | |
| 122 | - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span> | |
| 123 | - </template> | |
| 124 | - <template #action="{ row }"> | |
| 125 | - <el-button | |
| 126 | - link | |
| 127 | - type="primary" | |
| 128 | - v-hasPermi="['system:notice:update']" | |
| 129 | - @click="handleUpdate(row)" | |
| 130 | - > | |
| 131 | - <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }} | |
| 132 | - </el-button> | |
| 133 | - <el-button | |
| 134 | - link | |
| 135 | - type="primary" | |
| 136 | - v-hasPermi="['system:notice:update']" | |
| 137 | - @click="handleDetail(row)" | |
| 138 | - > | |
| 139 | - <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }} | |
| 140 | - </el-button> | |
| 141 | - <el-button | |
| 142 | - link | |
| 143 | - type="primary" | |
| 144 | - v-hasPermi="['system:notice:delete']" | |
| 145 | - @click="delList(row.id, false)" | |
| 146 | - > | |
| 147 | - <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }} | |
| 148 | - </el-button> | |
| 149 | - </template> | |
| 150 | - </Table> | |
| 151 | - </ContentWrap> | |
| 152 | - | |
| 153 | - <Dialog v-model="dialogVisible" :title="dialogTitle" maxHeight="500px" width="50%"> | |
| 154 | - <!-- 对话框(添加 / 修改) --> | |
| 155 | - <Form | |
| 156 | - v-if="['create', 'update'].includes(actionType)" | |
| 157 | - :schema="allSchemas.formSchema" | |
| 158 | - :rules="rules" | |
| 159 | - ref="formRef" | |
| 160 | - /> | |
| 161 | - <!-- 对话框(详情) --> | |
| 162 | - <Descriptions | |
| 163 | - v-if="actionType === 'detail'" | |
| 164 | - :schema="allSchemas.detailSchema" | |
| 165 | - :data="detailRef" | |
| 166 | - > | |
| 167 | - <template #type="{ row }"> | |
| 168 | - <DictTag :type="DICT_TYPE.SYSTEM_NOTICE_TYPE" :value="row.type" /> | |
| 169 | - </template> | |
| 170 | - <template #status="{ row }"> | |
| 171 | - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" /> | |
| 172 | - </template> | |
| 173 | - <template #createTime="{ row }"> | |
| 174 | - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span> | |
| 175 | - </template> | |
| 176 | - </Descriptions> | |
| 177 | - <!-- 操作按钮 --> | |
| 178 | - <template #footer> | |
| 179 | - <el-button | |
| 180 | - v-if="['create', 'update'].includes(actionType)" | |
| 181 | - type="primary" | |
| 182 | - :loading="actionLoading" | |
| 183 | - @click="submitForm" | |
| 184 | - > | |
| 185 | - {{ t('action.save') }} | |
| 186 | - </el-button> | |
| 187 | - <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button> | |
| 188 | - </template> | |
| 189 | - </Dialog> | |
| 190 | -</template> | ... | ... |
yudao-ui-admin-vue3/src/views/system/notice/notice.data.ts
| ... | ... | @@ -2,7 +2,7 @@ import { reactive } from 'vue' |
| 2 | 2 | import { useI18n } from '@/hooks/web/useI18n' |
| 3 | 3 | import { required } from '@/utils/formRules' |
| 4 | 4 | import { DICT_TYPE } from '@/utils/dict' |
| 5 | -import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' | |
| 5 | +import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | |
| 6 | 6 | const { t } = useI18n() // 国际化 |
| 7 | 7 | |
| 8 | 8 | // 表单校验 |
| ... | ... | @@ -12,74 +12,47 @@ export const rules = reactive({ |
| 12 | 12 | }) |
| 13 | 13 | |
| 14 | 14 | // CrudSchema |
| 15 | -const crudSchemas = reactive<CrudSchema[]>([ | |
| 16 | - { | |
| 17 | - label: t('common.index'), | |
| 18 | - field: 'id', | |
| 19 | - type: 'index', | |
| 20 | - form: { | |
| 21 | - show: false | |
| 15 | +const crudSchemas = reactive<VxeCrudSchema>({ | |
| 16 | + primaryKey: 'id', | |
| 17 | + primaryType: 'seq', | |
| 18 | + action: true, | |
| 19 | + columns: [ | |
| 20 | + { | |
| 21 | + title: '公告标题', | |
| 22 | + field: 'title', | |
| 23 | + isSearch: true | |
| 22 | 24 | }, |
| 23 | - detail: { | |
| 24 | - show: false | |
| 25 | - } | |
| 26 | - }, | |
| 27 | - { | |
| 28 | - label: '公告标题', | |
| 29 | - field: 'title', | |
| 30 | - search: { | |
| 31 | - show: true | |
| 32 | - } | |
| 33 | - }, | |
| 34 | - { | |
| 35 | - label: '公告类型', | |
| 36 | - field: 'type', | |
| 37 | - dictType: DICT_TYPE.SYSTEM_NOTICE_TYPE, | |
| 38 | - search: { | |
| 39 | - show: true | |
| 40 | - } | |
| 41 | - }, | |
| 42 | - { | |
| 43 | - label: t('common.status'), | |
| 44 | - field: 'status', | |
| 45 | - dictType: DICT_TYPE.COMMON_STATUS, | |
| 46 | - search: { | |
| 47 | - show: true | |
| 25 | + { | |
| 26 | + title: '公告类型', | |
| 27 | + field: 'type', | |
| 28 | + dictType: DICT_TYPE.SYSTEM_NOTICE_TYPE, | |
| 29 | + isSearch: true | |
| 48 | 30 | }, |
| 49 | - form: { | |
| 50 | - component: 'RadioButton' | |
| 51 | - } | |
| 52 | - }, | |
| 53 | - { | |
| 54 | - label: '公告内容', | |
| 55 | - field: 'content', | |
| 56 | - form: { | |
| 57 | - component: 'Editor', | |
| 58 | - colProps: { | |
| 59 | - span: 24 | |
| 60 | - }, | |
| 61 | - componentProps: { | |
| 62 | - valueHtml: '' | |
| 31 | + { | |
| 32 | + title: t('common.status'), | |
| 33 | + field: 'status', | |
| 34 | + dictType: DICT_TYPE.COMMON_STATUS, | |
| 35 | + isSearch: true | |
| 36 | + }, | |
| 37 | + { | |
| 38 | + title: '公告内容', | |
| 39 | + field: 'content', | |
| 40 | + form: { | |
| 41 | + component: 'Editor', | |
| 42 | + colProps: { | |
| 43 | + span: 24 | |
| 44 | + }, | |
| 45 | + componentProps: { | |
| 46 | + valueHtml: '' | |
| 47 | + } | |
| 63 | 48 | } |
| 64 | - } | |
| 65 | - }, | |
| 66 | - { | |
| 67 | - label: t('common.createTime'), | |
| 68 | - field: 'createTime', | |
| 69 | - form: { | |
| 70 | - show: false | |
| 71 | - } | |
| 72 | - }, | |
| 73 | - { | |
| 74 | - label: t('table.action'), | |
| 75 | - field: 'action', | |
| 76 | - width: '240px', | |
| 77 | - form: { | |
| 78 | - show: false | |
| 79 | 49 | }, |
| 80 | - detail: { | |
| 81 | - show: false | |
| 50 | + { | |
| 51 | + title: t('common.createTime'), | |
| 52 | + field: 'createTime', | |
| 53 | + formatter: 'formatDate', | |
| 54 | + isForm: false | |
| 82 | 55 | } |
| 83 | - } | |
| 84 | -]) | |
| 85 | -export const { allSchemas } = useCrudSchemas(crudSchemas) | |
| 56 | + ] | |
| 57 | +}) | |
| 58 | +export const { allSchemas } = useVxeCrudSchemas(crudSchemas) | ... | ... |
yudao-ui-admin-vue3/src/views/system/post/index.vue
| 1 | 1 | <template> |
| 2 | 2 | <ContentWrap> |
| 3 | + <!-- 列表 --> | |
| 3 | 4 | <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> |
| 5 | + <!-- 操作:新增 --> | |
| 4 | 6 | <template #toolbar_buttons> |
| 5 | 7 | <XButton |
| 6 | 8 | type="primary" |
| ... | ... | @@ -10,22 +12,22 @@ |
| 10 | 12 | @click="handleCreate()" |
| 11 | 13 | /> |
| 12 | 14 | </template> |
| 13 | - <template #status_default="{ row }"> | |
| 14 | - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" /> | |
| 15 | - </template> | |
| 16 | - <template #action_default="{ row }"> | |
| 15 | + <template #actionbtns_default="{ row }"> | |
| 16 | + <!-- 操作:修改 --> | |
| 17 | 17 | <XTextButton |
| 18 | 18 | preIcon="ep:edit" |
| 19 | 19 | :title="t('action.edit')" |
| 20 | 20 | v-hasPermi="['system:post:update']" |
| 21 | 21 | @click="handleUpdate(row.id)" |
| 22 | 22 | /> |
| 23 | + <!-- 操作:详情 --> | |
| 23 | 24 | <XTextButton |
| 24 | 25 | preIcon="ep:view" |
| 25 | 26 | :title="t('action.detail')" |
| 26 | 27 | v-hasPermi="['system:post:update']" |
| 27 | 28 | @click="handleDetail(row)" |
| 28 | 29 | /> |
| 30 | + <!-- 操作:删除 --> | |
| 29 | 31 | <XTextButton |
| 30 | 32 | preIcon="ep:delete" |
| 31 | 33 | :title="t('action.del')" |
| ... | ... | @@ -35,29 +37,25 @@ |
| 35 | 37 | </template> |
| 36 | 38 | </vxe-grid> |
| 37 | 39 | </ContentWrap> |
| 40 | + <!-- 弹窗 --> | |
| 38 | 41 | <XModal id="postModel" v-model="dialogVisible" :title="dialogTitle"> |
| 39 | 42 | <template #default> |
| 40 | - <!-- 对话框(添加 / 修改) --> | |
| 43 | + <!-- 表单:添加/修改 --> | |
| 41 | 44 | <Form |
| 42 | 45 | v-if="['create', 'update'].includes(actionType)" |
| 43 | 46 | :schema="allSchemas.formSchema" |
| 44 | 47 | :rules="rules" |
| 45 | 48 | ref="formRef" |
| 46 | 49 | /> |
| 50 | + <!-- 表单:详情 --> | |
| 47 | 51 | <Descriptions |
| 48 | 52 | v-if="actionType === 'detail'" |
| 49 | 53 | :schema="allSchemas.detailSchema" |
| 50 | 54 | :data="detailRef" |
| 51 | - > | |
| 52 | - <template #status="{ row }"> | |
| 53 | - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" /> | |
| 54 | - </template> | |
| 55 | - <template #createTime="{ row }"> | |
| 56 | - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span> | |
| 57 | - </template> | |
| 58 | - </Descriptions> | |
| 55 | + /> | |
| 59 | 56 | </template> |
| 60 | 57 | <template #footer> |
| 58 | + <!-- 按钮:保存 --> | |
| 61 | 59 | <XButton |
| 62 | 60 | v-if="['create', 'update'].includes(actionType)" |
| 63 | 61 | type="primary" |
| ... | ... | @@ -65,38 +63,40 @@ |
| 65 | 63 | :loading="actionLoading" |
| 66 | 64 | @click="submitForm" |
| 67 | 65 | /> |
| 66 | + <!-- 按钮:关闭 --> | |
| 68 | 67 | <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" /> |
| 69 | 68 | </template> |
| 70 | 69 | </XModal> |
| 71 | 70 | </template> |
| 72 | 71 | <script setup lang="ts"> |
| 72 | +// 全局相关的 import | |
| 73 | 73 | import { ref, unref } from 'vue' |
| 74 | -import dayjs from 'dayjs' | |
| 75 | -import { DICT_TYPE } from '@/utils/dict' | |
| 76 | -import * as PostApi from '@/api/system/post' | |
| 77 | -import { PostVO } from '@/api/system/post/types' | |
| 78 | -import { rules, allSchemas } from './post.data' | |
| 79 | 74 | import { useI18n } from '@/hooks/web/useI18n' |
| 80 | 75 | import { useMessage } from '@/hooks/web/useMessage' |
| 81 | 76 | import { useVxeGrid } from '@/hooks/web/useVxeGrid' |
| 82 | 77 | import { VxeGridInstance } from 'vxe-table' |
| 83 | 78 | import { FormExpose } from '@/components/Form' |
| 79 | +// 业务相关的 import | |
| 80 | +import * as PostApi from '@/api/system/post' | |
| 81 | +import { PostVO } from '@/api/system/post/types' | |
| 82 | +import { rules, allSchemas } from './post.data' | |
| 84 | 83 | |
| 85 | 84 | const { t } = useI18n() // 国际化 |
| 86 | 85 | const message = useMessage() // 消息弹窗 |
| 86 | +// 列表相关的变量 | |
| 87 | +const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref | |
| 88 | +const { gridOptions } = useVxeGrid<PostVO>({ | |
| 89 | + allSchemas: allSchemas, | |
| 90 | + getListApi: PostApi.getPostPageApi | |
| 91 | +}) | |
| 92 | +// 弹窗相关的变量 | |
| 87 | 93 | const dialogVisible = ref(false) // 是否显示弹出层 |
| 88 | 94 | const dialogTitle = ref('edit') // 弹出层标题 |
| 89 | 95 | const actionType = ref('') // 操作按钮的类型 |
| 90 | -const actionLoading = ref(false) // 按钮Loading | |
| 91 | -const xGrid = ref<VxeGridInstance>() // grid Ref | |
| 96 | +const actionLoading = ref(false) // 按钮 Loading | |
| 92 | 97 | const formRef = ref<FormExpose>() // 表单 Ref |
| 93 | 98 | const detailRef = ref() // 详情 Ref |
| 94 | 99 | |
| 95 | -const { gridOptions } = useVxeGrid<PostVO>({ | |
| 96 | - allSchemas: allSchemas, | |
| 97 | - getListApi: PostApi.getPostPageApi | |
| 98 | -}) | |
| 99 | - | |
| 100 | 100 | // 设置标题 |
| 101 | 101 | const setDialogTile = (type: string) => { |
| 102 | 102 | dialogTitle.value = t('action.' + type) |
| ... | ... | @@ -111,12 +111,6 @@ const handleCreate = () => { |
| 111 | 111 | unref(formRef)?.getElFormRef()?.resetFields() |
| 112 | 112 | } |
| 113 | 113 | |
| 114 | -// 详情操作 | |
| 115 | -const handleDetail = (row: PostVO) => { | |
| 116 | - setDialogTile('detail') | |
| 117 | - detailRef.value = row | |
| 118 | -} | |
| 119 | - | |
| 120 | 114 | // 修改操作 |
| 121 | 115 | const handleUpdate = async (rowId: number) => { |
| 122 | 116 | setDialogTile('update') |
| ... | ... | @@ -125,6 +119,13 @@ const handleUpdate = async (rowId: number) => { |
| 125 | 119 | unref(formRef)?.setValues(res) |
| 126 | 120 | } |
| 127 | 121 | |
| 122 | +// 详情操作 | |
| 123 | +const handleDetail = (row: PostVO) => { | |
| 124 | + setDialogTile('detail') | |
| 125 | + // TODO @星语:要不读取下后端? | |
| 126 | + detailRef.value = row | |
| 127 | +} | |
| 128 | + | |
| 128 | 129 | // 删除操作 |
| 129 | 130 | const handleDelete = async (rowId: number) => { |
| 130 | 131 | message |
| ... | ... | @@ -134,14 +135,16 @@ const handleDelete = async (rowId: number) => { |
| 134 | 135 | message.success(t('common.delSuccess')) |
| 135 | 136 | }) |
| 136 | 137 | .finally(() => { |
| 138 | + // 刷新列表 | |
| 137 | 139 | xGrid.value?.commitProxy('query') |
| 138 | 140 | }) |
| 139 | 141 | } |
| 140 | 142 | |
| 141 | -// 提交按钮 | |
| 143 | +// 提交新增/修改的表单 | |
| 142 | 144 | const submitForm = async () => { |
| 143 | 145 | const elForm = unref(formRef)?.getElFormRef() |
| 144 | 146 | if (!elForm) return |
| 147 | + // TODO @星语:这个告警,要不要解决下? | |
| 145 | 148 | elForm.validate(async (valid) => { |
| 146 | 149 | if (valid) { |
| 147 | 150 | actionLoading.value = true |
| ... | ... | @@ -158,6 +161,7 @@ const submitForm = async () => { |
| 158 | 161 | dialogVisible.value = false |
| 159 | 162 | } finally { |
| 160 | 163 | actionLoading.value = false |
| 164 | + // 刷新列表 | |
| 161 | 165 | xGrid.value?.commitProxy('query') |
| 162 | 166 | } |
| 163 | 167 | } | ... | ... |
yudao-ui-admin-vue3/src/views/system/post/post.data.ts
| ... | ... | @@ -13,79 +13,42 @@ export const rules = reactive({ |
| 13 | 13 | }) |
| 14 | 14 | |
| 15 | 15 | // CrudSchema |
| 16 | -const crudSchemas = reactive<VxeCrudSchema[]>([ | |
| 17 | - { | |
| 18 | - title: t('common.index'), | |
| 19 | - field: 'id', | |
| 20 | - type: 'seq', | |
| 21 | - form: { | |
| 22 | - show: false | |
| 16 | +const crudSchemas = reactive<VxeCrudSchema>({ | |
| 17 | + primaryKey: 'id', | |
| 18 | + primaryType: 'seq', | |
| 19 | + action: true, | |
| 20 | + columns: [ | |
| 21 | + { | |
| 22 | + title: '岗位名称', | |
| 23 | + field: 'name', | |
| 24 | + isSearch: true | |
| 23 | 25 | }, |
| 24 | - detail: { | |
| 25 | - show: false | |
| 26 | - } | |
| 27 | - }, | |
| 28 | - { | |
| 29 | - title: '岗位名称', | |
| 30 | - field: 'name', | |
| 31 | - search: { | |
| 32 | - show: true | |
| 33 | - } | |
| 34 | - }, | |
| 35 | - { | |
| 36 | - title: '岗位编码', | |
| 37 | - field: 'code', | |
| 38 | - search: { | |
| 39 | - show: true | |
| 40 | - } | |
| 41 | - }, | |
| 42 | - { | |
| 43 | - title: '岗位顺序', | |
| 44 | - field: 'sort' | |
| 45 | - }, | |
| 46 | - { | |
| 47 | - title: t('common.status'), | |
| 48 | - field: 'status', | |
| 49 | - dictType: DICT_TYPE.COMMON_STATUS, | |
| 50 | - table: { | |
| 51 | - slots: { | |
| 52 | - default: 'status_default' | |
| 53 | - } | |
| 26 | + { | |
| 27 | + title: '岗位编码', | |
| 28 | + field: 'code', | |
| 29 | + isSearch: true | |
| 54 | 30 | }, |
| 55 | - search: { | |
| 56 | - show: true | |
| 57 | - } | |
| 58 | - }, | |
| 59 | - { | |
| 60 | - title: '备注', | |
| 61 | - field: 'remark', | |
| 62 | - table: { | |
| 63 | - show: false | |
| 64 | - } | |
| 65 | - }, | |
| 66 | - { | |
| 67 | - title: t('common.createTime'), | |
| 68 | - field: 'createTime', | |
| 69 | - formatter: 'formatDate', | |
| 70 | - form: { | |
| 71 | - show: false | |
| 72 | - } | |
| 73 | - }, | |
| 74 | - { | |
| 75 | - title: t('table.action'), | |
| 76 | - field: 'action', | |
| 77 | - table: { | |
| 78 | - width: '240px', | |
| 79 | - slots: { | |
| 80 | - default: 'action_default' | |
| 81 | - } | |
| 31 | + { | |
| 32 | + title: '岗位顺序', | |
| 33 | + field: 'sort' | |
| 82 | 34 | }, |
| 83 | - form: { | |
| 84 | - show: false | |
| 35 | + { | |
| 36 | + title: t('common.status'), | |
| 37 | + field: 'status', | |
| 38 | + dictType: DICT_TYPE.COMMON_STATUS, | |
| 39 | + isSearch: true | |
| 85 | 40 | }, |
| 86 | - detail: { | |
| 87 | - show: false | |
| 41 | + { | |
| 42 | + title: '备注', | |
| 43 | + field: 'remark', | |
| 44 | + isTable: false | |
| 45 | + }, | |
| 46 | + { | |
| 47 | + title: t('common.createTime'), | |
| 48 | + field: 'createTime', | |
| 49 | + formatter: 'formatDate', | |
| 50 | + isForm: false | |
| 88 | 51 | } |
| 89 | - } | |
| 90 | -]) | |
| 52 | + ] | |
| 53 | +}) | |
| 91 | 54 | export const { allSchemas } = useVxeCrudSchemas(crudSchemas) | ... | ... |