提交 97f0c27f authored 作者: 王鹏飞's avatar 王鹏飞

updates

上级 6731bd7b
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
"scripts": { "scripts": {
"dev": "vite --mode dev", "dev": "vite --mode dev",
"build": "vue-tsc --noEmit && vite build --mode prod && npm run deploy", "build": "vue-tsc --noEmit && vite build --mode prod && npm run deploy",
"build:test": "vue-tsc --noEmit && vite build --test prod", "build:test": "vue-tsc --noEmit && vite build --mode test",
"build:pre": "vue-tsc --noEmit && vite build --pre prod", "build:pre": "vue-tsc --noEmit && vite build --mode pre",
"preview": "vite preview --port 5050", "preview": "vite preview --port 5050",
"typecheck": "vue-tsc --noEmit", "typecheck": "vue-tsc --noEmit",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
...@@ -19,9 +19,9 @@ ...@@ -19,9 +19,9 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"pinia": "^2.0.13", "pinia": "^2.0.13",
"qs": "^6.10.3", "qs": "^6.10.3",
"sass": "^1.50.0", "sass": "^1.50.1",
"swiper": "^8.1.0", "swiper": "^8.1.1",
"vant": "^3.4.7", "vant": "^3.4.8",
"vue": "^3.2.33", "vue": "^3.2.33",
"vue-router": "^4.0.14" "vue-router": "^4.0.14"
}, },
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
"@rushstack/eslint-patch": "^1.1.3", "@rushstack/eslint-patch": "^1.1.3",
"@types/blueimp-md5": "^2.18.0", "@types/blueimp-md5": "^2.18.0",
"@types/lodash-es": "^4.17.6", "@types/lodash-es": "^4.17.6",
"@types/node": "^17.0.24", "@types/node": "^17.0.25",
"@types/qs": "^6.9.7", "@types/qs": "^6.9.7",
"@vitejs/plugin-vue": "^2.3.1", "@vitejs/plugin-vue": "^2.3.1",
"@vue/eslint-config-typescript": "^10.0.0", "@vue/eslint-config-typescript": "^10.0.0",
...@@ -41,6 +41,6 @@ ...@@ -41,6 +41,6 @@
"typescript": "~4.6.3", "typescript": "~4.6.3",
"vite": "^2.9.5", "vite": "^2.9.5",
"vite-plugin-checker": "^0.4.6", "vite-plugin-checker": "^0.4.6",
"vue-tsc": "^0.34.6" "vue-tsc": "^0.34.7"
} }
} }
...@@ -4,7 +4,7 @@ specifiers: ...@@ -4,7 +4,7 @@ specifiers:
'@rushstack/eslint-patch': ^1.1.3 '@rushstack/eslint-patch': ^1.1.3
'@types/blueimp-md5': ^2.18.0 '@types/blueimp-md5': ^2.18.0
'@types/lodash-es': ^4.17.6 '@types/lodash-es': ^4.17.6
'@types/node': ^17.0.24 '@types/node': ^17.0.25
'@types/qs': ^6.9.7 '@types/qs': ^6.9.7
'@vitejs/plugin-vue': ^2.3.1 '@vitejs/plugin-vue': ^2.3.1
'@vue/eslint-config-typescript': ^10.0.0 '@vue/eslint-config-typescript': ^10.0.0
...@@ -19,15 +19,15 @@ specifiers: ...@@ -19,15 +19,15 @@ specifiers:
lodash-es: ^4.17.21 lodash-es: ^4.17.21
pinia: ^2.0.13 pinia: ^2.0.13
qs: ^6.10.3 qs: ^6.10.3
sass: ^1.50.0 sass: ^1.50.1
swiper: ^8.1.0 swiper: ^8.1.1
typescript: ~4.6.3 typescript: ~4.6.3
vant: ^3.4.7 vant: ^3.4.8
vite: ^2.9.5 vite: ^2.9.5
vite-plugin-checker: ^0.4.6 vite-plugin-checker: ^0.4.6
vue: ^3.2.33 vue: ^3.2.33
vue-router: ^4.0.14 vue-router: ^4.0.14
vue-tsc: ^0.34.6 vue-tsc: ^0.34.7
dependencies: dependencies:
'@vueuse/core': 8.2.6_vue@3.2.33 '@vueuse/core': 8.2.6_vue@3.2.33
...@@ -36,9 +36,9 @@ dependencies: ...@@ -36,9 +36,9 @@ dependencies:
lodash-es: 4.17.21 lodash-es: 4.17.21
pinia: 2.0.13_typescript@4.6.3+vue@3.2.33 pinia: 2.0.13_typescript@4.6.3+vue@3.2.33
qs: 6.10.3 qs: 6.10.3
sass: 1.50.0 sass: 1.50.1
swiper: 8.1.0 swiper: 8.1.1
vant: 3.4.7_vue@3.2.33 vant: 3.4.8_vue@3.2.33
vue: 3.2.33 vue: 3.2.33
vue-router: 4.0.14_vue@3.2.33 vue-router: 4.0.14_vue@3.2.33
...@@ -46,19 +46,19 @@ devDependencies: ...@@ -46,19 +46,19 @@ devDependencies:
'@rushstack/eslint-patch': 1.1.3 '@rushstack/eslint-patch': 1.1.3
'@types/blueimp-md5': 2.18.0 '@types/blueimp-md5': 2.18.0
'@types/lodash-es': 4.17.6 '@types/lodash-es': 4.17.6
'@types/node': 17.0.24 '@types/node': 17.0.25
'@types/qs': 6.9.7 '@types/qs': 6.9.7
'@vitejs/plugin-vue': 2.3.1_vite@2.9.5+vue@3.2.33 '@vitejs/plugin-vue': 2.3.1_vite@2.9.5+vue@3.2.33
'@vue/eslint-config-typescript': 10.0.0_a62cbc2f4797496d74696b1f6538012a '@vue/eslint-config-typescript': 10.0.0_a62cbc2f4797496d74696b1f6538012a
'@vue/tsconfig': 0.1.3_@types+node@17.0.24 '@vue/tsconfig': 0.1.3_@types+node@17.0.25
ali-oss: 6.17.1 ali-oss: 6.17.1
chalk: 5.0.1 chalk: 5.0.1
eslint: 8.13.0 eslint: 8.13.0
eslint-plugin-vue: 8.6.0_eslint@8.13.0 eslint-plugin-vue: 8.6.0_eslint@8.13.0
typescript: 4.6.3 typescript: 4.6.3
vite: 2.9.5_sass@1.50.0 vite: 2.9.5_sass@1.50.1
vite-plugin-checker: 0.4.6_vite@2.9.5 vite-plugin-checker: 0.4.6_vite@2.9.5
vue-tsc: 0.34.6_typescript@4.6.3 vue-tsc: 0.34.7_typescript@4.6.3
packages: packages:
...@@ -172,8 +172,8 @@ packages: ...@@ -172,8 +172,8 @@ packages:
resolution: {integrity: sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==} resolution: {integrity: sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==}
dev: true dev: true
/@types/node/17.0.24: /@types/node/17.0.25:
resolution: {integrity: sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==} resolution: {integrity: sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==}
dev: true dev: true
/@types/qs/6.9.7: /@types/qs/6.9.7:
...@@ -327,56 +327,38 @@ packages: ...@@ -327,56 +327,38 @@ packages:
vite: ^2.5.10 vite: ^2.5.10
vue: ^3.2.25 vue: ^3.2.25
dependencies: dependencies:
vite: 2.9.5_sass@1.50.0 vite: 2.9.5_sass@1.50.1
vue: 3.2.33 vue: 3.2.33
dev: true dev: true
/@volar/code-gen/0.34.6: /@volar/code-gen/0.34.7:
resolution: {integrity: sha512-sFgiaN3F+Sy93uVDtnZxfhEdy15ERSZ9qHY9wny4oQHztxS0pscrIGOQcvSoaK3pcyR8xGTouXkNf0BsOUwuXA==} resolution: {integrity: sha512-E1N1VGlChXd0D7WPmmjKhtcZdUKNpBFC4BRqfY+7FZGh89FZlw3uG6Nn76/DjMBLVhfCIY9vA8pwWIN1lI8nYw==}
dependencies: dependencies:
'@volar/source-map': 0.34.6 '@volar/source-map': 0.34.7
dev: true dev: true
/@volar/source-map/0.34.6: /@volar/source-map/0.34.7:
resolution: {integrity: sha512-TIAxtvFIANh0PfQFY7dT/f2MIvpNRzJ7xrvlqwl1oYt7sa8AIposBFGS873s4avOuz15AoubKU7uZnVLYJ5AWg==} resolution: {integrity: sha512-KBNcKCWKsY2f965xuuT4dSbt8GR6nHMzb9gi7ucUHtmRQnvrB31BLBvZNQTHMqkbhRmKArDSuIrbUUG9yu0OXQ==}
dev: true dev: true
/@volar/vue-code-gen/0.34.6: /@volar/vue-code-gen/0.34.7:
resolution: {integrity: sha512-0wh5fhQsxY6GL/zrxabjY+lAsFsaUNWDl+45iVeuczGP9sU07lpHoCwHBHBqCK8kxbvAJZaa3Me66apoq5BEvw==} resolution: {integrity: sha512-vejzO30QrDAEZKguZI8hlAnKhwNoX1INXrOMurlmwCbNft2oEloT+ikFF8QYDz3vWWrdFSsoOKp3BTHyurJ5Nw==}
dependencies: dependencies:
'@volar/code-gen': 0.34.6 '@volar/code-gen': 0.34.7
'@volar/source-map': 0.34.6 '@volar/source-map': 0.34.7
'@vue/compiler-core': 3.2.31 '@vue/compiler-core': 3.2.33
'@vue/compiler-dom': 3.2.32 '@vue/compiler-dom': 3.2.33
'@vue/shared': 3.2.32 '@vue/shared': 3.2.33
dev: true
/@volar/vue-typescript/0.34.6:
resolution: {integrity: sha512-vKEYnDw9BhIMR6+Rp1Ue/8TpBjYNm4+3fIom4wMxFDlEOCku7fsF169QgZuDDvyPrFlurT878qjKYf88cYFCgA==}
dependencies:
'@volar/code-gen': 0.34.6
'@volar/source-map': 0.34.6
'@volar/vue-code-gen': 0.34.6
'@vue/compiler-sfc': 3.2.31
'@vue/reactivity': 3.2.31
dev: true
/@vue/compiler-core/3.2.31:
resolution: {integrity: sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==}
dependencies:
'@babel/parser': 7.17.9
'@vue/shared': 3.2.31
estree-walker: 2.0.2
source-map: 0.6.1
dev: true dev: true
/@vue/compiler-core/3.2.32: /@volar/vue-typescript/0.34.7:
resolution: {integrity: sha512-bRQ8Rkpm/aYFElDWtKkTPHeLnX5pEkNxhPUcqu5crEJIilZH0yeFu/qUAcV4VfSE2AudNPkQSOwMZofhnuutmA==} resolution: {integrity: sha512-Ebln64LQutjuNs8nk57oFo45JMQVdZKThkNAeFrzaqB0UItazRQpSXet4vHzfV18FMCV3Cc6fEqZ14WZzQAxgQ==}
dependencies: dependencies:
'@babel/parser': 7.17.9 '@volar/code-gen': 0.34.7
'@vue/shared': 3.2.32 '@volar/source-map': 0.34.7
estree-walker: 2.0.2 '@volar/vue-code-gen': 0.34.7
source-map: 0.6.1 '@vue/compiler-sfc': 3.2.33
'@vue/reactivity': 3.2.33
dev: true dev: true
/@vue/compiler-core/3.2.33: /@vue/compiler-core/3.2.33:
...@@ -386,43 +368,12 @@ packages: ...@@ -386,43 +368,12 @@ packages:
'@vue/shared': 3.2.33 '@vue/shared': 3.2.33
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map: 0.6.1 source-map: 0.6.1
dev: false
/@vue/compiler-dom/3.2.31:
resolution: {integrity: sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==}
dependencies:
'@vue/compiler-core': 3.2.31
'@vue/shared': 3.2.31
dev: true
/@vue/compiler-dom/3.2.32:
resolution: {integrity: sha512-maa3PNB/NxR17h2hDQfcmS02o1f9r9QIpN1y6fe8tWPrS1E4+q8MqrvDDQNhYVPd84rc3ybtyumrgm9D5Rf/kg==}
dependencies:
'@vue/compiler-core': 3.2.32
'@vue/shared': 3.2.32
dev: true
/@vue/compiler-dom/3.2.33: /@vue/compiler-dom/3.2.33:
resolution: {integrity: sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==} resolution: {integrity: sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==}
dependencies: dependencies:
'@vue/compiler-core': 3.2.33 '@vue/compiler-core': 3.2.33
'@vue/shared': 3.2.33 '@vue/shared': 3.2.33
dev: false
/@vue/compiler-sfc/3.2.31:
resolution: {integrity: sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==}
dependencies:
'@babel/parser': 7.17.9
'@vue/compiler-core': 3.2.31
'@vue/compiler-dom': 3.2.31
'@vue/compiler-ssr': 3.2.31
'@vue/reactivity-transform': 3.2.31
'@vue/shared': 3.2.31
estree-walker: 2.0.2
magic-string: 0.25.9
postcss: 8.4.12
source-map: 0.6.1
dev: true
/@vue/compiler-sfc/3.2.33: /@vue/compiler-sfc/3.2.33:
resolution: {integrity: sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==} resolution: {integrity: sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==}
...@@ -437,21 +388,12 @@ packages: ...@@ -437,21 +388,12 @@ packages:
magic-string: 0.25.9 magic-string: 0.25.9
postcss: 8.4.12 postcss: 8.4.12
source-map: 0.6.1 source-map: 0.6.1
dev: false
/@vue/compiler-ssr/3.2.31:
resolution: {integrity: sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==}
dependencies:
'@vue/compiler-dom': 3.2.31
'@vue/shared': 3.2.31
dev: true
/@vue/compiler-ssr/3.2.33: /@vue/compiler-ssr/3.2.33:
resolution: {integrity: sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==} resolution: {integrity: sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==}
dependencies: dependencies:
'@vue/compiler-dom': 3.2.33 '@vue/compiler-dom': 3.2.33
'@vue/shared': 3.2.33 '@vue/shared': 3.2.33
dev: false
/@vue/devtools-api/6.1.4: /@vue/devtools-api/6.1.4:
resolution: {integrity: sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==} resolution: {integrity: sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==}
...@@ -474,16 +416,6 @@ packages: ...@@ -474,16 +416,6 @@ packages:
- typescript - typescript
dev: true dev: true
/@vue/reactivity-transform/3.2.31:
resolution: {integrity: sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==}
dependencies:
'@babel/parser': 7.17.9
'@vue/compiler-core': 3.2.31
'@vue/shared': 3.2.31
estree-walker: 2.0.2
magic-string: 0.25.9
dev: true
/@vue/reactivity-transform/3.2.33: /@vue/reactivity-transform/3.2.33:
resolution: {integrity: sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==} resolution: {integrity: sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==}
dependencies: dependencies:
...@@ -492,19 +424,11 @@ packages: ...@@ -492,19 +424,11 @@ packages:
'@vue/shared': 3.2.33 '@vue/shared': 3.2.33
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.25.9 magic-string: 0.25.9
dev: false
/@vue/reactivity/3.2.31:
resolution: {integrity: sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==}
dependencies:
'@vue/shared': 3.2.31
dev: true
/@vue/reactivity/3.2.33: /@vue/reactivity/3.2.33:
resolution: {integrity: sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==} resolution: {integrity: sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==}
dependencies: dependencies:
'@vue/shared': 3.2.33 '@vue/shared': 3.2.33
dev: false
/@vue/runtime-core/3.2.33: /@vue/runtime-core/3.2.33:
resolution: {integrity: sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==} resolution: {integrity: sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==}
...@@ -531,19 +455,10 @@ packages: ...@@ -531,19 +455,10 @@ packages:
vue: 3.2.33 vue: 3.2.33
dev: false dev: false
/@vue/shared/3.2.31:
resolution: {integrity: sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==}
dev: true
/@vue/shared/3.2.32:
resolution: {integrity: sha512-bjcixPErUsAnTQRQX4Z5IQnICYjIfNCyCl8p29v1M6kfVzvwOICPw+dz48nNuWlTOOx2RHhzHdazJibE8GSnsw==}
dev: true
/@vue/shared/3.2.33: /@vue/shared/3.2.33:
resolution: {integrity: sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==} resolution: {integrity: sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==}
dev: false
/@vue/tsconfig/0.1.3_@types+node@17.0.24: /@vue/tsconfig/0.1.3_@types+node@17.0.25:
resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==} resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==}
peerDependencies: peerDependencies:
'@types/node': '*' '@types/node': '*'
...@@ -551,7 +466,7 @@ packages: ...@@ -551,7 +466,7 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
dependencies: dependencies:
'@types/node': 17.0.24 '@types/node': 17.0.25
dev: true dev: true
/@vueuse/core/8.2.6_vue@3.2.33: /@vueuse/core/8.2.6_vue@3.2.33:
...@@ -2188,8 +2103,8 @@ packages: ...@@ -2188,8 +2103,8 @@ packages:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true dev: true
/sass/1.50.0: /sass/1.50.1:
resolution: {integrity: sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==} resolution: {integrity: sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
hasBin: true hasBin: true
dependencies: dependencies:
...@@ -2354,8 +2269,8 @@ packages: ...@@ -2354,8 +2269,8 @@ packages:
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dev: true dev: true
/swiper/8.1.0: /swiper/8.1.1:
resolution: {integrity: sha512-Py2vuk7Nb3xlZMB2e201DQkjslTb6Uaju6wvr4BB7VjWrouSZegA0QjbxDVheJOsbKMUV092iDL3kymPBbuVzw==} resolution: {integrity: sha512-Ypx0K79en1Y5EcTy4ArR6E9EP/OwMMY2K0gawl/P27B5PYRiHedFdbdgfyuOFuxSUKsMoSVqFdmKs3DPXYHTdQ==}
engines: {node: '>= 4.7.0'} engines: {node: '>= 4.7.0'}
requiresBuild: true requiresBuild: true
dependencies: dependencies:
...@@ -2523,8 +2438,8 @@ packages: ...@@ -2523,8 +2438,8 @@ packages:
resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
dev: true dev: true
/vant/3.4.7_vue@3.2.33: /vant/3.4.8_vue@3.2.33:
resolution: {integrity: sha512-/iafbNF3VPcDevIun8DMj84V9sGMcBZ2LW8j20uqthW6NpFmkMpDFJxMINQFIZ0myEogqVSDVhS6XFAwlx3nkQ==} resolution: {integrity: sha512-xPAiPdCiaZbcdbVplVh4N2lmYzDAr2UdadkUHoa9uwfHS9/dab4f8TigfCFzlfAEk53U1J6w+6qZ+whtt4T3hw==}
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
dependencies: dependencies:
...@@ -2551,14 +2466,14 @@ packages: ...@@ -2551,14 +2466,14 @@ packages:
npm-run-path: 4.0.1 npm-run-path: 4.0.1
strip-ansi: 6.0.1 strip-ansi: 6.0.1
tiny-invariant: 1.2.0 tiny-invariant: 1.2.0
vite: 2.9.5_sass@1.50.0 vite: 2.9.5_sass@1.50.1
vscode-languageclient: 7.0.0 vscode-languageclient: 7.0.0
vscode-languageserver: 7.0.0 vscode-languageserver: 7.0.0
vscode-languageserver-textdocument: 1.0.4 vscode-languageserver-textdocument: 1.0.4
vscode-uri: 3.0.3 vscode-uri: 3.0.3
dev: true dev: true
/vite/2.9.5_sass@1.50.0: /vite/2.9.5_sass@1.50.1:
resolution: {integrity: sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg==} resolution: {integrity: sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg==}
engines: {node: '>=12.2.0'} engines: {node: '>=12.2.0'}
hasBin: true hasBin: true
...@@ -2578,7 +2493,7 @@ packages: ...@@ -2578,7 +2493,7 @@ packages:
postcss: 8.4.12 postcss: 8.4.12
resolve: 1.22.0 resolve: 1.22.0
rollup: 2.70.1 rollup: 2.70.1
sass: 1.50.0 sass: 1.50.1
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
...@@ -2674,13 +2589,13 @@ packages: ...@@ -2674,13 +2589,13 @@ packages:
vue: 3.2.33 vue: 3.2.33
dev: false dev: false
/vue-tsc/0.34.6_typescript@4.6.3: /vue-tsc/0.34.7_typescript@4.6.3:
resolution: {integrity: sha512-rEr8/BrpSN2QmnTw6MuT0WJA/qx54xDqSXG6EBGt37fn7jLCrKYF37GW3xZCdktO0V53l1XF2ssBtmLL+OI2ww==} resolution: {integrity: sha512-GcdwGuddEakVBHKw7uiZUfHqobGD4Ym2XExGuwYuxw7rT50ZnRZvYQ3IB7zyPLa7UZEmiy6HTJiTrArw7ZOu+w==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
dependencies: dependencies:
'@volar/vue-typescript': 0.34.6 '@volar/vue-typescript': 0.34.7
typescript: 4.6.3 typescript: 4.6.3
dev: true dev: true
......
...@@ -27,3 +27,8 @@ export function uploadFile(data: object) { ...@@ -27,3 +27,8 @@ export function uploadFile(data: object) {
headers: { 'Content-Type': 'multipart/form-data' } headers: { 'Content-Type': 'multipart/form-data' }
}) })
} }
// 获取导学视频详情
export function getVideoView(params: { id: string }) {
return httpRequest.get('/api/psp/v1/learning/video-view', { params })
}
<script setup lang="ts">
import type { ICourseItem } from '@/types'
defineProps<{ data: ICourseItem }>()
const studyStatus = (progress: number) => {
if (progress === 100) {
return '已完成'
} else if (progress > 0) {
return '已学习'
} else {
return '未学习'
}
}
</script>
<template>
<div class="course-item">
<router-link :to="{ path: `/course/view/${data.id}` }" class="course-item-inner">
<img :src="data.course_picture" class="course-item-pic" />
<div class="course-item-content">
<h5>{{ data.course_name }}</h5>
<p class="t1">
<span v-for="(lecturer, index) in data.course_lectures" :key="index">{{ lecturer.lecturer_name }}</span>
</p>
<p class="t2">
<span>{{ data.course_chapters.big_total }}章节</span>
<span>{{ data.course_chapters.small_total }}课时</span>
</p>
<p class="t2">
<span>{{ data.pv }}人看过</span>
<span>{{ data.records_total }}人评论</span>
</p>
<p class="t3">{{ studyStatus(data.progress) }}</p>
</div>
</router-link>
</div>
</template>
<style lang="scss">
.course-item {
padding: 0.22rem;
background: #fff;
border-radius: 0.2rem;
}
.course-item-inner {
display: flex;
}
.course-item-pic {
width: 1.6rem;
height: 1.9rem;
border-radius: 0.1rem;
overflow: hidden;
object-fit: cover;
}
.course-item-content {
flex: 1;
margin-left: 0.26rem;
line-height: 0.33rem;
overflow: hidden;
h5 {
font-size: 0.24rem;
font-weight: 500;
line-height: 0.33rem;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.t1 {
margin-top: 0.05rem;
font-size: 0.24rem;
font-weight: 400;
line-height: 0.33rem;
color: #666;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.t2 {
margin-top: 0.05rem;
font-size: 0.2rem;
font-weight: 400;
color: #999;
line-height: 0.28rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
span + span {
margin-left: 0.2rem;
}
}
.t3 {
margin-top: 0.23rem;
font-size: 0.2rem;
font-weight: 400;
color: #999;
text-align: right;
}
}
</style>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { getVideoView } from '@/api/base'
import type { IVideoItem } from '@/types'
defineProps<{ data: IVideoItem }>()
// 查看详情
const dialogVisible = ref<boolean>(false)
const videoInfo = ref<IVideoItem>()
const videoUrl = computed(() => {
if (videoInfo.value) {
// 优先取mp4
const [first = {}] = videoInfo.value.play_info.filter(item => item.Format === 'mp4')
return first.PlayURL
}
return ''
})
const fetchVideoView = (id: string) => {
getVideoView({ id }).then(res => {
videoInfo.value = res.data
})
}
const onClick = (data: IVideoItem) => {
fetchVideoView(data.id)
dialogVisible.value = true
}
</script>
<template>
<div class="video-item" @click="onClick(data)">
<img :src="data.cover_page" />
<h5>{{ data.course_name }}</h5>
<p>{{ data.pv }}播放</p>
</div>
<van-popup v-model:show="dialogVisible" round teleport="body" v-if="dialogVisible">
<div class="video-wrap" v-if="dialogVisible">
<video controls autoplay :src="videoUrl"></video>
</div>
</van-popup>
</template>
<style lang="scss">
.video-item {
width: 2rem;
cursor: pointer;
img {
width: 2rem;
height: 1.9rem;
border-radius: 0.1rem;
overflow: hidden;
object-fit: cover;
}
h5 {
margin-top: 0.09rem;
font-size: 0.24rem;
font-weight: 500;
line-height: 0.33rem;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
p {
margin-top: 0.04rem;
font-size: 0.1rem;
line-height: 0.28rem;
color: #999999;
}
}
.video-wrap {
width: 80vw;
margin: 0.2rem;
video {
width: 100%;
max-height: 80vh;
}
}
</style>
...@@ -5,6 +5,6 @@ export const routes: Array<RouteRecordRaw> = [ ...@@ -5,6 +5,6 @@ export const routes: Array<RouteRecordRaw> = [
{ {
path: '/message', path: '/message',
component: AppLayout, component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }] children: [{ path: '', component: () => import('./views/View.vue') }]
} }
] ]
<script setup lang="ts"> <script setup lang="ts">
import { Notify } from 'vant' import { Notify } from 'vant'
import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/css'
import VideoItem from '@/components/VideoItem.vue'
import type { IDocItem, IVideoItem } from '../types' import type { IDocItem, IVideoItem } from '../types'
defineProps<{ docs: IDocItem[]; videos: IVideoItem[] }>() defineProps<{ docs: IDocItem[]; videos: IVideoItem[] }>()
function showTips() { function showTips() {
...@@ -36,10 +41,18 @@ function showTips() { ...@@ -36,10 +41,18 @@ function showTips() {
</div> </div>
</div> </div>
</div> </div>
<div class="admission-box" v-if="videos.length">
<h2>免费视频观看</h2>
<swiper slides-per-view="auto" :space-between="10">
<swiper-slide v-for="item in videos" :key="item.id" class="video-swiper-slide">
<VideoItem :data="item"></VideoItem>
</swiper-slide>
</swiper>
</div>
</AppCard> </AppCard>
</template> </template>
<style lang="scss"> <style lang="scss" scoped>
.admission { .admission {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -126,4 +139,21 @@ function showTips() { ...@@ -126,4 +139,21 @@ function showTips() {
background-size: 50%; background-size: 50%;
} }
} }
.admission-box {
margin-top: 0.28rem;
padding: 0.2rem;
background: #fff;
border-radius: 0.2rem;
overflow: hidden;
box-sizing: border-box;
h2 {
margin-bottom: 0.15rem;
font-size: 26px;
font-weight: 600;
color: #333333;
}
}
.video-swiper-slide {
width: 2rem;
}
</style> </style>
...@@ -76,6 +76,29 @@ function showTips() { ...@@ -76,6 +76,29 @@ function showTips() {
.learn-docs { .learn-docs {
background: url(https://webapp-pub.ezijing.com/project/prp-h5/learning_map_bg.png) no-repeat; background: url(https://webapp-pub.ezijing.com/project/prp-h5/learning_map_bg.png) no-repeat;
background-size: contain; background-size: contain;
ul {
overflow: hidden;
}
li {
margin: 0.3rem 0.14rem 0;
display: flex;
align-items: center;
font-size: 0.2rem;
color: #adadad;
}
p {
flex: 1;
font-size: 0.24rem;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
span {
min-width: 0.44rem;
font-size: 0.2rem;
color: #c6c6c6;
}
} }
.learn-banner { .learn-banner {
margin-top: 0.2rem; margin-top: 0.2rem;
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { Swiper, SwiperSlide } from 'swiper/vue' import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/css' import 'swiper/css'
import CourseItem from '@/components/CourseItem.vue'
import type { ICourseItem } from '../types' import type { ICourseItem } from '../types'
import { getCourseList } from '../api' import { getCourseList } from '../api'
...@@ -12,15 +14,7 @@ const fetchCourseList = () => { ...@@ -12,15 +14,7 @@ const fetchCourseList = () => {
dataset.value = res.data dataset.value = res.data
}) })
} }
const studyStatus = (progress: number) => {
if (progress === 100) {
return '已完成'
} else if (progress > 0) {
return '已学习'
} else {
return '未学习'
}
}
onMounted(() => { onMounted(() => {
fetchCourseList() fetchCourseList()
}) })
...@@ -28,89 +22,14 @@ onMounted(() => { ...@@ -28,89 +22,14 @@ onMounted(() => {
<template> <template>
<swiper slides-per-view="auto" :space-between="10"> <swiper slides-per-view="auto" :space-between="10">
<swiper-slide v-for="(item, index) in dataset.list" :key="index" class="course-item"> <swiper-slide v-for="item in dataset.list" :key="item.id" class="course-swiper-slide">
<router-link :to="{ path: `/course/view/${item.id}` }" class="course-item-inner"> <CourseItem :data="item"></CourseItem>
<img :src="item.course_picture" class="course-item-pic" />
<div class="course-item-content">
<h5>{{ item.course_name }}</h5>
<p class="t1">
<span v-for="(lecturer, index) in item.course_lectures" :key="index">{{ lecturer.lecturer_name }}</span>
</p>
<p class="t2">
<span>{{ item.course_chapters.big_total }}章节</span>
<span>{{ item.course_chapters.small_total }}课时</span>
</p>
<p class="t2">
<span>{{ item.pv }}人看过</span>
<span>{{ item.records_total }}人评论</span>
</p>
<p class="t3">{{ studyStatus(item.progress) }}</p>
</div>
</router-link>
</swiper-slide> </swiper-slide>
</swiper> </swiper>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.course-item { .course-swiper-slide {
width: 4.7rem; width: 4.7rem;
padding: 0.22rem;
background: #fff;
border-radius: 0.2rem;
}
.course-item-inner {
display: flex;
}
.course-item-pic {
width: 1.6rem;
height: 1.9rem;
border-radius: 0.1rem;
overflow: hidden;
object-fit: cover;
}
.course-item-content {
flex: 1;
margin-left: 0.26rem;
line-height: 0.33rem;
overflow: hidden;
h5 {
font-size: 0.24rem;
font-weight: 500;
line-height: 0.33rem;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.t1 {
margin-top: 0.05rem;
font-size: 0.24rem;
font-weight: 400;
line-height: 0.33rem;
color: #666;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.t2 {
margin-top: 0.05rem;
font-size: 0.2rem;
font-weight: 400;
color: #999;
line-height: 0.28rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
span + span {
margin-left: 0.2rem;
}
}
.t3 {
margin-top: 0.23rem;
font-size: 0.2rem;
font-weight: 400;
color: #999;
text-align: right;
}
} }
</style> </style>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { Swiper, SwiperSlide } from 'swiper/vue' import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/css' import 'swiper/css'
import VideoItem from '@/components/VideoItem.vue'
import type { IVideoItem } from '../types' import type { IVideoItem } from '../types'
import { getVideoList, getVideoView } from '../api' import { getVideoList } from '../api'
// 课程导学 // 课程导学
const dataset = ref<{ total: number; list: IVideoItem[] }>({ total: 0, list: [] }) const dataset = ref<{ total: number; list: IVideoItem[] }>({ total: 0, list: [] })
...@@ -15,77 +16,18 @@ const fetchVideoList = () => { ...@@ -15,77 +16,18 @@ const fetchVideoList = () => {
onMounted(() => { onMounted(() => {
fetchVideoList() fetchVideoList()
}) })
// 查看详情
const dialogVisible = ref<boolean>(false)
const videoInfo = ref<IVideoItem>()
const videoUrl = computed(() => {
if (videoInfo.value) {
// 优先取mp4
const [first = {}] = videoInfo.value.play_info.filter(item => item.Format === 'mp4')
return first.PlayURL
}
return ''
})
const fetchVideoView = (id: string) => {
getVideoView({ id }).then(res => {
videoInfo.value = res.data
})
}
const onClick = (data: IVideoItem) => {
fetchVideoView(data.id)
dialogVisible.value = true
}
</script> </script>
<template> <template>
<swiper slides-per-view="auto" :space-between="10"> <swiper slides-per-view="auto" :space-between="10">
<swiper-slide v-for="(item, index) in dataset.list" :key="index" class="video-item" @click="onClick(item)"> <swiper-slide v-for="item in dataset.list" :key="item.id" class="video-swiper-slide">
<img :src="item.cover_page" /> <VideoItem :data="item"></VideoItem>
<h5>{{ item.course_name }}</h5>
<p>{{ item.pv }}播放</p>
</swiper-slide> </swiper-slide>
</swiper> </swiper>
<van-popup v-model:show="dialogVisible" round>
<div class="video-wrap" v-if="dialogVisible">
<video controls autoplay :src="videoUrl"></video>
</div>
</van-popup>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.video-item { .video-swiper-slide {
width: 2rem; width: 2rem;
img {
width: 2rem;
height: 1.9rem;
border-radius: 0.1rem;
overflow: hidden;
object-fit: cover;
}
h5 {
margin-top: 0.09rem;
font-size: 0.24rem;
font-weight: 500;
line-height: 0.33rem;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
p {
margin-top: 0.04rem;
font-size: 0.1rem;
line-height: 0.28rem;
color: #999999;
}
}
.video-wrap {
width: 80vw;
margin: 0.2rem;
video {
width: 100%;
max-height: 80vh;
}
} }
</style> </style>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import CourseItem from '@/components/CourseItem.vue'
import type { ICourseItem } from '@/types' import type { ICourseItem } from '@/types'
import { getCourseList } from '../api' import { getCourseList } from '../api'
...@@ -10,43 +11,18 @@ const fetchCourseList = () => { ...@@ -10,43 +11,18 @@ const fetchCourseList = () => {
dataset.value = res.data dataset.value = res.data
}) })
} }
const studyStatus = (progress: number) => {
if (progress === 100) {
return '已完成'
} else if (progress > 0) {
return '已学习'
} else {
return '未学习'
}
}
onMounted(() => { onMounted(() => {
fetchCourseList() fetchCourseList()
}) })
</script> </script>
<template> <template>
<img src="https://webapp-pub.ezijing.com/project/prp-h5/banner_my_course.png" style="width: 100%" /> <a href="https://mp.weixin.qq.com/s/fDf4NpPZH4BNI_KEopiSwQ" target="_blank">
<img src="https://webapp-pub.ezijing.com/project/prp-h5/banner_my_course.png" style="width: 100%" />
</a>
<p class="tips">如果你也是知识获得者,点击课程,晒出你的海报、说出你的感想,得到你的星星。</p> <p class="tips">如果你也是知识获得者,点击课程,晒出你的海报、说出你的感想,得到你的星星。</p>
<div v-for="(item, index) in dataset.list" :key="index" class="course-item"> <CourseItem v-for="item in dataset.list" :data="item" :key="item.id"></CourseItem>
<router-link :to="{ path: `/course/view/${item.id}` }" class="course-item-inner">
<img :src="item.course_picture" class="course-item-pic" />
<div class="course-item-content">
<h5>{{ item.course_name }}</h5>
<p class="t1">
<span v-for="(lecturer, index) in item.course_lectures" :key="index">{{ lecturer.lecturer_name }}</span>
</p>
<p class="t2">
<span>{{ item.course_chapters.big_total }}章节</span>
<span>{{ item.course_chapters.small_total }}课时</span>
</p>
<p class="t2">
<span>{{ item.pv }}人看过</span>
<span>{{ item.records_total }}人评论</span>
</p>
<p class="t3">{{ studyStatus(item.progress) }}</p>
</div>
</router-link>
</div>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -58,64 +34,6 @@ onMounted(() => { ...@@ -58,64 +34,6 @@ onMounted(() => {
line-height: 0.36rem; line-height: 0.36rem;
} }
.course-item { .course-item {
padding: 0.22rem;
background: #fff;
border-radius: 0.2rem;
margin-bottom: 0.3rem; margin-bottom: 0.3rem;
} }
.course-item-inner {
display: flex;
}
.course-item-pic {
width: 1.6rem;
height: 1.9rem;
border-radius: 0.1rem;
overflow: hidden;
object-fit: cover;
}
.course-item-content {
flex: 1;
margin-left: 0.26rem;
line-height: 0.33rem;
overflow: hidden;
h5 {
font-size: 0.24rem;
font-weight: 500;
line-height: 0.33rem;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.t1 {
margin-top: 0.05rem;
font-size: 0.24rem;
font-weight: 400;
line-height: 0.33rem;
color: #666;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.t2 {
margin-top: 0.05rem;
font-size: 0.2rem;
font-weight: 400;
color: #999;
line-height: 0.28rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
span + span {
margin-left: 0.2rem;
}
}
.t3 {
margin-top: 0.23rem;
font-size: 0.2rem;
font-weight: 400;
color: #999;
text-align: right;
}
}
</style> </style>
...@@ -23,32 +23,32 @@ const menus: Array<{ ...@@ -23,32 +23,32 @@ const menus: Array<{
path: '/my/course', path: '/my/course',
name: '我的课程', name: '我的课程',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_1.png' icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_1.png'
},
{
path: '/',
name: '我的团队',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_2.png'
},
{
path: '/',
name: '我的问答',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_3.png'
},
{
path: '/',
name: '申请导师',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_4.png'
},
{
path: '/',
name: '申请紫荆奖',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_5.png'
},
{
path: '/',
name: '参加PRP大会',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_6.png'
} }
// {
// path: '/',
// name: '我的团队',
// icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_2.png'
// },
// {
// path: '/',
// name: '我的问答',
// icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_3.png'
// },
// {
// path: '/',
// name: '申请导师',
// icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_4.png'
// },
// {
// path: '/',
// name: '申请紫荆奖',
// icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_5.png'
// },
// {
// path: '/',
// name: '参加PRP大会',
// icon: 'https://webapp-pub.ezijing.com/project/prp-h5/my_menu_6.png'
// }
] ]
// 退出登录 // 退出登录
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论