diff --git a/Dockerfile b/Dockerfile index 8a30e19..f1d3db6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,23 @@ FROM node:20-alpine as builder + +# 指定工作目录方便下一阶段引用 WORKDIR /app -COPY package.json . -COPY pnpm-lock.yaml . -COPY .npmrc . +# 启用pnpm功能(v16+) RUN corepack enable -RUN pnpm install +# 仅复制依赖相关文件 +COPY .npmrc package.json pnpm-lock.yaml . +# 安装依赖,利用docker的缓存机制 +RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store pnpm install --frozen-lockfile +# 复制其他文件 COPY . . +# 进行打包 RUN pnpm build FROM nginx:alpine + +# 复制产物 COPY --from=builder /app/dist /usr/share/nginx/html +# 复制nginx配置 COPY --from=builder /app/.github/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 diff --git a/package.json b/package.json index e95f6e8..b54ff3f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "release": "release-it --config ./scripts/release/index.cjs" }, "devDependencies": { - "@apidevtools/swagger-parser": "^10.1.0", "@arco-design/web-vue": "^2.51.1", "@iconify-json/icon-park-outline": "^1.1.12", "@release-it/conventional-changelog": "^5.1.1", @@ -34,19 +33,17 @@ "pinia-plugin-persistedstate": "^3.2.0", "plop": "^3.1.2", "release-it": "^15.11.0", + "rollup-plugin-visualizer": "^5.9.2", "swagger-typescript-api": "^12.0.4", "tsx": "^3.12.9", "typescript": "^4.9.5", "unocss": "^0.49.8", "unplugin-auto-import": "^0.13.0", "unplugin-vue-components": "^0.23.0", - "unplugin-vue-router": "^0.7.0", "vite": "^4.4.9", - "vite-plugin-mock": "^3.0.0", "vite-plugin-pages": "^0.28.0", "vite-plugin-style-import": "^2.0.0", "vue": "^3.3.4", - "vue-drag-resize": "^2.0.3", "vue-router": "^4.2.4", "vue-tsc": "^1.8.11" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 401803f..025cab8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,6 @@ lockfileVersion: '6.0' devDependencies: - '@apidevtools/swagger-parser': - specifier: ^10.1.0 - version: 10.1.0 '@arco-design/web-vue': specifier: ^2.51.1 version: 2.51.1(vue@3.3.4) @@ -67,6 +64,9 @@ devDependencies: release-it: specifier: ^15.11.0 version: 15.11.0 + rollup-plugin-visualizer: + specifier: ^5.9.2 + version: 5.9.2 swagger-typescript-api: specifier: ^12.0.4 version: 12.0.4 @@ -85,15 +85,9 @@ devDependencies: unplugin-vue-components: specifier: ^0.23.0 version: 0.23.0(vue@3.3.4) - unplugin-vue-router: - specifier: ^0.7.0 - version: 0.7.0(vue-router@4.2.4)(vue@3.3.4) vite: specifier: ^4.4.9 version: 4.4.9(less@4.2.0) - vite-plugin-mock: - specifier: ^3.0.0 - version: 3.0.0(vite@4.4.9) vite-plugin-pages: specifier: ^0.28.0 version: 0.28.0(vite@4.4.9) @@ -103,9 +97,6 @@ devDependencies: vue: specifier: ^3.3.4 version: 3.3.4 - vue-drag-resize: - specifier: ^2.0.3 - version: 2.0.3 vue-router: specifier: ^4.2.4 version: 4.2.4(vue@3.3.4) @@ -134,37 +125,6 @@ packages: resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} dev: true - /@apidevtools/json-schema-ref-parser@9.0.6: - resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} - dependencies: - '@jsdevtools/ono': 7.1.3 - call-me-maybe: 1.0.2 - js-yaml: 3.14.1 - dev: true - - /@apidevtools/openapi-schemas@2.1.0: - resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} - engines: {node: '>=10'} - dev: true - - /@apidevtools/swagger-methods@3.0.2: - resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} - dev: true - - /@apidevtools/swagger-parser@10.1.0: - resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} - peerDependencies: - openapi-types: '>=7' - dependencies: - '@apidevtools/json-schema-ref-parser': 9.0.6 - '@apidevtools/openapi-schemas': 2.1.0 - '@apidevtools/swagger-methods': 3.0.2 - '@jsdevtools/ono': 7.1.3 - ajv: 8.12.0 - ajv-draft-04: 1.0.0(ajv@8.12.0) - call-me-maybe: 1.0.2 - dev: true - /@arco-design/color@0.4.0: resolution: {integrity: sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==} dependencies: @@ -764,10 +724,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@jsdevtools/ono@7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1023,6 +979,20 @@ packages: picomatch: 2.3.1 dev: true + /@rollup/pluginutils@5.0.5: + resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@sindresorhus/is@5.6.0: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -1085,10 +1055,6 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/mockjs@1.0.7: - resolution: {integrity: sha512-OCxXz6hEaJOVpRwuJMiVY5a6LtJcih+br9gwB/Q8ooOBikvk5FpBQ31OlNimXo3EqKha1Z7PFBni+q9m+8NCWg==} - dev: true - /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true @@ -1140,7 +1106,7 @@ packages: hasBin: true dependencies: '@ampproject/remapping': 2.2.1 - '@rollup/pluginutils': 5.0.4 + '@rollup/pluginutils': 5.0.5 '@unocss/config': 0.49.8 '@unocss/core': 0.49.8 '@unocss/preset-uno': 0.49.8 @@ -1270,7 +1236,7 @@ packages: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 dependencies: '@ampproject/remapping': 2.2.1 - '@rollup/pluginutils': 5.0.4 + '@rollup/pluginutils': 5.0.5 '@unocss/config': 0.49.8 '@unocss/core': 0.49.8 '@unocss/inspector': 0.49.8 @@ -1329,26 +1295,6 @@ packages: '@volar/language-core': 1.10.1 dev: true - /@vue-macros/common@1.8.0(vue@3.3.4): - resolution: {integrity: sha512-auDJJzE0z3uRe3867e0DsqcseKImktNf5ojCZgUKqiVxb2yTlwlgOVAYCgoep9oITqxkXQymSvFeKhedi8PhaA==} - engines: {node: '>=16.14.0'} - peerDependencies: - vue: ^2.7.0 || ^3.2.25 - peerDependenciesMeta: - vue: - optional: true - dependencies: - '@babel/types': 7.23.0 - '@rollup/pluginutils': 5.0.4 - '@vue/compiler-sfc': 3.3.4 - ast-kit: 0.11.2 - local-pkg: 0.4.3 - magic-string-ast: 0.3.0 - vue: 3.3.4 - transitivePeerDependencies: - - rollup - dev: true - /@vue/babel-helper-vue-transform-on@1.1.5: resolution: {integrity: sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==} dev: true @@ -1561,26 +1507,6 @@ packages: indent-string: 4.0.0 dev: true - /ajv-draft-04@1.0.0(ajv@8.12.0): - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -1631,12 +1557,6 @@ packages: picomatch: 2.3.1 dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1696,28 +1616,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /ast-kit@0.11.2: - resolution: {integrity: sha512-Q0DjXK4ApbVoIf9GLyCo252tUH44iTnD/hiJ2TQaJeydYWSpKk0sI34+WMel8S9Wt5pbLgG02oJ+gkgX5DV3sQ==} - engines: {node: '>=16.14.0'} - dependencies: - '@babel/parser': 7.22.16 - '@rollup/pluginutils': 5.0.4 - pathe: 1.1.1 - transitivePeerDependencies: - - rollup - dev: true - - /ast-kit@0.9.5: - resolution: {integrity: sha512-kbL7ERlqjXubdDd+szuwdlQ1xUxEz9mCz1+m07ftNVStgwRb2RWw+U6oKo08PAvOishMxiqz1mlJyLl8yQx2Qg==} - engines: {node: '>=16.14.0'} - dependencies: - '@babel/parser': 7.22.16 - '@rollup/pluginutils': 5.0.4 - pathe: 1.1.1 - transitivePeerDependencies: - - rollup - dev: true - /ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -1725,16 +1623,6 @@ packages: tslib: 2.6.2 dev: true - /ast-walker-scope@0.5.0: - resolution: {integrity: sha512-NsyHMxBh4dmdEHjBo1/TBZvCKxffmZxRYhmclfu0PP6Aftre47jOHYaYaNqJcV0bxihxFXhDkzLHUwHc0ocd0Q==} - engines: {node: '>=16.14.0'} - dependencies: - '@babel/parser': 7.22.16 - ast-kit: 0.9.5 - transitivePeerDependencies: - - rollup - dev: true - /async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} dependencies: @@ -1892,15 +1780,6 @@ packages: run-applescript: 5.0.0 dev: true - /bundle-require@4.0.1: - resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' - dependencies: - load-tsconfig: 0.2.5 - dev: true - /c12@1.4.2: resolution: {integrity: sha512-3IP/MuamSVRVw8W8+CHWAz9gKN4gd+voF2zm/Ln6D25C2RhytEZ1ABbC8MjKr4BR9rhoV1JQ7jJA158LDiTkLg==} dependencies: @@ -2224,18 +2103,6 @@ packages: xdg-basedir: 5.1.0 dev: true - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: true @@ -2508,17 +2375,6 @@ packages: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2624,6 +2480,11 @@ packages: engines: {node: '>=10'} dev: true + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -2728,10 +2589,6 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} @@ -2752,11 +2609,6 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - /enhanced-resolve@4.5.0: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} @@ -2908,10 +2760,6 @@ packages: engines: {node: '>=12'} dev: true - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -3031,10 +2879,6 @@ packages: parse-code-context: 1.0.0 dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -3096,21 +2940,6 @@ packages: to-regex-range: 5.0.1 dev: true - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -4208,14 +4037,6 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -4241,10 +4062,6 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true @@ -4360,11 +4177,6 @@ packages: strip-bom: 3.0.0 dev: true - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -4478,13 +4290,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /magic-string-ast@0.3.0: - resolution: {integrity: sha512-0shqecEPgdFpnI3AP90epXyxZy9g6CRZ+SZ7BcqFwYmtFEnZ1jpevcV5HoyVnlDS9gCnc1UIg3Rsvp3Ci7r8OA==} - engines: {node: '>=16.14.0'} - dependencies: - magic-string: 0.30.3 - dev: true - /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -4736,10 +4541,6 @@ packages: engines: {node: '>=10'} dev: true - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -5053,13 +4854,6 @@ packages: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} dev: true - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -5080,6 +4874,15 @@ packages: mimic-fn: 4.0.0 dev: true + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /open@9.1.0: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} engines: {node: '>=14.16'} @@ -5311,11 +5114,6 @@ packages: parse-path: 7.0.0 dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: @@ -5371,10 +5169,6 @@ packages: path-root-regex: 0.1.2 dev: true - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true - /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -5551,11 +5345,6 @@ packages: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - /pupa@3.1.0: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} @@ -5755,11 +5544,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: true @@ -5834,6 +5618,22 @@ packages: glob: 7.2.3 dev: true + /rollup-plugin-visualizer@5.9.2: + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + /rollup@3.29.1: resolution: {integrity: sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -6110,6 +5910,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead @@ -6149,15 +5954,6 @@ packages: through: 2.3.8 dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true - /std-env@3.4.3: resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} dev: true @@ -6588,7 +6384,7 @@ packages: /unimport@2.2.4: resolution: {integrity: sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==} dependencies: - '@rollup/pluginutils': 5.0.4 + '@rollup/pluginutils': 5.0.5 escape-string-regexp: 5.0.0 fast-glob: 3.3.1 local-pkg: 0.4.3 @@ -6606,7 +6402,7 @@ packages: /unimport@3.3.0: resolution: {integrity: sha512-3jhq3ZG5hFZzrWGDCpx83kjPzefP/EeuKkIO1T0MA4Zwj+dO/Og1mFvZ4aZ5WSDm0FVbbdVIRH1zKBG7c4wOpg==} dependencies: - '@rollup/pluginutils': 5.0.4 + '@rollup/pluginutils': 5.0.5 escape-string-regexp: 5.0.0 fast-glob: 3.3.1 local-pkg: 0.4.3 @@ -6674,11 +6470,6 @@ packages: - vite dev: true - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - /unplugin-auto-import@0.13.0(@vueuse/core@9.13.0): resolution: {integrity: sha512-nKMxDbkjM4FRPInFfm7sWrJOKgxfKKwb5yLPP+DEGl/SG0/FtBoW1LnZL4PQfx0FXjertoHO1P/5nDf+RSip2Q==} engines: {node: '>=14'} @@ -6726,33 +6517,6 @@ packages: - supports-color dev: true - /unplugin-vue-router@0.7.0(vue-router@4.2.4)(vue@3.3.4): - resolution: {integrity: sha512-ddRreGq0t5vlSB7OMy4e4cfU1w2AwBQCwmvW3oP/0IHQiokzbx4hd3TpwBu3eIAFVuhX2cwNQwp1U32UybTVCw==} - peerDependencies: - vue-router: ^4.1.0 - peerDependenciesMeta: - vue-router: - optional: true - dependencies: - '@babel/types': 7.23.0 - '@rollup/pluginutils': 5.0.4 - '@vue-macros/common': 1.8.0(vue@3.3.4) - ast-walker-scope: 0.5.0 - chokidar: 3.5.3 - fast-glob: 3.3.1 - json5: 2.2.3 - local-pkg: 0.4.3 - mlly: 1.4.2 - pathe: 1.1.1 - scule: 1.0.0 - unplugin: 1.5.0 - vue-router: 4.2.4(vue@3.3.4) - yaml: 2.3.2 - transitivePeerDependencies: - - rollup - - vue - dev: true - /unplugin@1.4.0: resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} dependencies: @@ -6834,12 +6598,6 @@ packages: tslib: 2.6.2 dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - /url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6849,11 +6607,6 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - /v8flags@4.0.1: resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} engines: {node: '>= 10.13.0'} @@ -6866,27 +6619,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-mock@3.0.0(vite@4.4.9): - resolution: {integrity: sha512-Ibwlga2CSgkoFHFtPW3T/l0fwsGVz9Ss5i7HauBQDyDFfMKgbQXh9wKDLksLZHyai9rkDanxJtIcxbD0bUHCfw==} - engines: {node: '>=16.0.0'} - peerDependencies: - mockjs: '>=1.1.0' - vite: '>=4.0.0' - dependencies: - '@types/mockjs': 1.0.7 - bundle-require: 4.0.1 - chokidar: 3.5.3 - connect: 3.7.0 - debug: 4.3.4 - fast-glob: 3.3.1 - path-to-regexp: 6.2.1 - picocolors: 1.0.0 - vite: 4.4.9(less@4.2.0) - transitivePeerDependencies: - - esbuild - - supports-color - dev: true - /vite-plugin-pages@0.28.0(vite@4.4.9): resolution: {integrity: sha512-yncDncFVnjUzhqJnwCgGDZoZ/wO6MEOMe93f2MQjplKXm1MpmHCrTkFCPnQyYGZTVKPAN+y7BQcIpNWPFLQ4+w==} peerDependencies: @@ -6986,10 +6718,6 @@ packages: vue: 3.3.4 dev: true - /vue-drag-resize@2.0.3: - resolution: {integrity: sha512-5q03tZ/LyvQsg1iHRcqs+wI2OKNbNIWl9+7V8rVL6MxJhZLCIYSSgbAUaDE38LhD6dFd5aJhdgNmES61AxjXuw==} - dev: true - /vue-router@4.2.4(vue@3.3.4): resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} peerDependencies: diff --git a/scripts/openapi/index.ts b/scripts/openapi/index.ts index cc8ebfc..240a9aa 100644 --- a/scripts/openapi/index.ts +++ b/scripts/openapi/index.ts @@ -10,7 +10,7 @@ const run = async () => { const output = await generateApi({ url: "http://localhost:3030/openapi.json", templates: path.resolve(__dirname, "./template"), - output: path.resolve(process.cwd(), "src/api/service"), + output: path.resolve(process.cwd(), "src/api/generated"), name: "Api.ts", singleHttpClient: false, httpClientType: "axios", diff --git a/src/api/service/Api.ts b/src/api/generated/Api.ts similarity index 100% rename from src/api/service/Api.ts rename to src/api/generated/Api.ts diff --git a/src/api/index.ts b/src/api/index.ts index 2335ca5..58c4e75 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,3 +1,3 @@ export * from "./instance/api"; -export * from "./service/Api"; -export * from "./helper/useRequest"; +export * from "./generated/Api"; +export * from "./instance/useRequest"; diff --git a/src/api/instance/api.ts b/src/api/instance/api.ts index 8913b5a..35105bb 100644 --- a/src/api/instance/api.ts +++ b/src/api/instance/api.ts @@ -1,21 +1,7 @@ -import { IToastOptions, toast } from "@/components"; -import { store, useUserStore } from "@/store"; -import { Message } from "@arco-design/web-vue"; -import { Api } from "../service/Api"; - -class Service extends Api { - /** - * 登陆过期处理函数 - */ - tokenExpiredHandler: () => void = () => {}; - /** - * 设置登陆过期后的处理函数 - * @param handler - */ - setTokenExpiredHandler(handler: () => void) { - this.tokenExpiredHandler = handler; - } -} +import { Service } from "./service"; +import { addToastInterceptor } from "../interceptors/toast"; +import { addAuthInterceptor } from "../interceptors/auth"; +import { addExceptionInterceptor } from "../interceptors/exception"; /** * API 接口实例 @@ -26,59 +12,18 @@ const api = new Service({ }); /** - * 请求拦截器 + * 添加请求提示拦截器 */ -api.instance.interceptors.request.use( - (config) => { - const userStore = useUserStore(store); - if (userStore.accessToken) { - config.headers.Authorization = `Bearer ${userStore.accessToken}`; - } - if (config.toast) { - let options: IToastOptions = {}; - if (typeof config.toast === "string") { - options = { message: config.toast }; - } - if (typeof config.toast === "object") { - options = config.toast; - } - config.closeToast = toast(options); - } - return config; - }, - (error) => { - error.config?.closeToast?.(); - return Promise.reject(error); - } -); +addToastInterceptor(api.instance); /** - * 响应拦截器 + * 添加登陆令牌拦截器 */ -api.instance.interceptors.response.use( - (res) => { - res.config.closeToast?.(); - if (res.data?.code && res.data.code !== 2000) { - return Promise.reject(res); - } - return res; - }, - (error) => { - error.config.closeToast?.(); - const userStore = useUserStore(store); - if (error.response) { - const code = error.response.data?.code; - if (code === 4050 || code === 4051) { - Message.warning('提示:登陆过期,请重新登陆!') - userStore.clearUser(); - api.tokenExpiredHandler?.(); - } - } else if (error.request) { - console.log("request error", error.request); - Message.error(`提示:网络异常,请检查网络是否正常或稍后重试!`); - } - return Promise.reject(error); - } -); +addAuthInterceptor(api.instance); + +/** + * 添加异常处理拦截器 + */ +addExceptionInterceptor(api.instance, () => api.expireHandler?.()); export { api }; diff --git a/src/api/instance/service.ts b/src/api/instance/service.ts new file mode 100644 index 0000000..6917300 --- /dev/null +++ b/src/api/instance/service.ts @@ -0,0 +1,12 @@ +import { Api } from "../generated/Api"; + +/** + * 扩展生成的API类 + */ +export class Service extends Api { + /** + * 登陆过期处理函数 + * @description 勿动 + */ + expireHandler: () => void = () => {}; +} diff --git a/src/api/helper/useRequest.ts b/src/api/instance/useRequest.ts similarity index 100% rename from src/api/helper/useRequest.ts rename to src/api/instance/useRequest.ts diff --git a/src/api/interceptors/auth.ts b/src/api/interceptors/auth.ts new file mode 100644 index 0000000..c7aceb8 --- /dev/null +++ b/src/api/interceptors/auth.ts @@ -0,0 +1,16 @@ +import { store, useUserStore } from "@/store"; +import { AxiosInstance } from "axios"; + +/** + * 登陆令牌拦截器 + * @param axios Axios实例 + */ +export function addAuthInterceptor(axios: AxiosInstance) { + axios.interceptors.request.use((config) => { + const userStore = useUserStore(store); + if (userStore.accessToken) { + config.headers.Authorization = `Bearer ${userStore.accessToken}`; + } + return config; + }); +} diff --git a/src/api/interceptors/exception.ts b/src/api/interceptors/exception.ts new file mode 100644 index 0000000..edd597a --- /dev/null +++ b/src/api/interceptors/exception.ts @@ -0,0 +1,51 @@ +import { Notification } from "@arco-design/web-vue"; +import { AxiosInstance } from "axios"; + +const successCodes = [2000]; +const expiredCodes = [4050, 4051]; +let tipShowing = false; + +/** + * 异常拦截器 + * @param axios Axios实例 + */ +export function addExceptionInterceptor(axios: AxiosInstance, exipreHandler?: (...args: any[]) => any) { + axios.interceptors.response.use( + (res) => { + const code = res.data?.code; + if (code && !successCodes.includes(code)) { + return Promise.reject(res); + } + return res; + }, + (error) => { + // 服务端响应错误 + if (error.response) { + const code = error.response.data?.code; + if (expiredCodes.includes(code)) { + Notification.warning({ + title: "登陆提示", + content: "当前登陆已过期,请重新登陆!", + }); + exipreHandler?.(error); + } + return Promise.reject(error); + } + + // 客户端请求错误 + if (error.request) { + if (!tipShowing) { + tipShowing = true; + Notification.error({ + title: "请求提示", + content: `请求服务器失败,请检查网络或稍后重试!`, + onClose: () => (tipShowing = false), + }); + } + return Promise.reject(error); + } + + return Promise.reject(error); + } + ); +} diff --git a/src/api/interceptors/toast.ts b/src/api/interceptors/toast.ts new file mode 100644 index 0000000..0fb3b42 --- /dev/null +++ b/src/api/interceptors/toast.ts @@ -0,0 +1,39 @@ +import { IToastOptions, toast } from "@/components"; +import { AxiosInstance } from "axios"; + +/** + * 提示拦截器 + * @param axios Axios实例 + */ +export function addToastInterceptor(axios: AxiosInstance) { + axios.interceptors.request.use( + (config) => { + if (config.toast) { + let options: IToastOptions = {}; + if (typeof config.toast === "string") { + options = { message: config.toast }; + } + if (typeof config.toast === "object") { + options = config.toast; + } + config.closeToast = toast(options); + } + return config; + }, + (error) => { + error.config.closeToast?.(); + return Promise.reject(error); + } + ); + + axios.interceptors.response.use( + (response) => { + response.config.closeToast?.(); + return response; + }, + (error) => { + error.config.closeToast?.(); + return Promise.reject(error); + } + ); +} diff --git a/src/components/table/colume.tsx b/src/components/table/colume.tsx index 535009e..f792292 100644 --- a/src/components/table/colume.tsx +++ b/src/components/table/colume.tsx @@ -6,7 +6,7 @@ const defineColumn = (column: T) => { }; export const updateColumn = defineColumn({ - title: "更新者", + title: "更新用户", dataIndex: "createdAt", width: 190, render({ record }) { @@ -22,7 +22,7 @@ export const updateColumn = defineColumn({ }); export const createColumn = defineColumn({ - title: "创建者", + title: "创建用户", dataIndex: "createdAt", width: 190, render({ record }) { diff --git a/src/libs/index.ts b/src/libs/index.ts deleted file mode 100644 index 17bac88..0000000 --- a/src/libs/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './nprogress'; -export * from './dayjs'; diff --git a/src/pages/_login/index.vue b/src/pages/_login/index.vue index 1e2cf38..ad21b8c 100644 --- a/src/pages/_login/index.vue +++ b/src/pages/_login/index.vue @@ -56,7 +56,7 @@