提交 477b7357 authored 作者: 王鹏飞's avatar 王鹏飞

updates

上级 43040b35
......@@ -18,20 +18,20 @@
"sass": "^1.50.0",
"swiper": "^8.1.0",
"vant": "^3.4.7",
"vue": "^3.2.31",
"vue": "^3.2.32",
"vue-router": "^4.0.14"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.1.0",
"@types/node": "^16.11.26",
"@rushstack/eslint-patch": "^1.1.2",
"@types/node": "^17.0.23",
"@vitejs/plugin-vue": "^2.3.1",
"@vue/eslint-config-typescript": "^10.0.0",
"@vue/tsconfig": "^0.1.3",
"eslint": "^8.5.0",
"eslint-plugin-vue": "^8.2.0",
"eslint": "^8.13.0",
"eslint-plugin-vue": "^8.6.0",
"typescript": "~4.6.3",
"vite": "^2.9.1",
"vite": "^2.9.4",
"vite-plugin-checker": "^0.4.5",
"vue-tsc": "^0.33.9"
"vue-tsc": "^0.34.6"
}
}
lockfileVersion: 5.3
specifiers:
'@rushstack/eslint-patch': ^1.1.0
'@types/node': ^16.11.26
'@rushstack/eslint-patch': ^1.1.2
'@types/node': ^17.0.23
'@vitejs/plugin-vue': ^2.3.1
'@vue/eslint-config-typescript': ^10.0.0
'@vue/tsconfig': ^0.1.3
axios: ^0.26.1
eslint: ^8.5.0
eslint-plugin-vue: ^8.2.0
eslint: ^8.13.0
eslint-plugin-vue: ^8.6.0
pinia: ^2.0.13
qs: ^6.10.3
sass: ^1.50.0
swiper: ^8.1.0
typescript: ~4.6.3
vant: ^3.4.7
vite: ^2.9.1
vite: ^2.9.4
vite-plugin-checker: ^0.4.5
vue: ^3.2.31
vue: ^3.2.32
vue-router: ^4.0.14
vue-tsc: ^0.33.9
vue-tsc: ^0.34.6
dependencies:
axios: 0.26.1
pinia: 2.0.13_typescript@4.6.3+vue@3.2.31
pinia: 2.0.13_typescript@4.6.3+vue@3.2.32
qs: 6.10.3
sass: 1.50.0
swiper: 8.1.0
vant: 3.4.7_vue@3.2.31
vue: 3.2.31
vue-router: 4.0.14_vue@3.2.31
vant: 3.4.7_vue@3.2.32
vue: 3.2.32
vue-router: 4.0.14_vue@3.2.32
devDependencies:
'@rushstack/eslint-patch': 1.1.2
'@types/node': 16.11.26
'@vitejs/plugin-vue': 2.3.1_vite@2.9.1+vue@3.2.31
'@types/node': 17.0.23
'@vitejs/plugin-vue': 2.3.1_vite@2.9.4+vue@3.2.32
'@vue/eslint-config-typescript': 10.0.0_a62cbc2f4797496d74696b1f6538012a
'@vue/tsconfig': 0.1.3_@types+node@16.11.26
'@vue/tsconfig': 0.1.3_@types+node@17.0.23
eslint: 8.13.0
eslint-plugin-vue: 8.6.0_eslint@8.13.0
typescript: 4.6.3
vite: 2.9.1_sass@1.50.0
vite-plugin-checker: 0.4.5_vite@2.9.1
vue-tsc: 0.33.9_typescript@4.6.3
vite: 2.9.4_sass@1.50.0
vite-plugin-checker: 0.4.5_vite@2.9.4
vue-tsc: 0.34.6_typescript@4.6.3
packages:
......@@ -137,8 +137,8 @@ packages:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true
/@types/node/16.11.26:
resolution: {integrity: sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==}
/@types/node/17.0.23:
resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==}
dev: true
/@typescript-eslint/eslint-plugin/5.19.0_f34adc8488d2e4f014fe61432d70cbf2:
......@@ -281,72 +281,43 @@ packages:
resolution: {integrity: sha512-3z+nywPaV2F5BdJO7RQxWlgfzJeEOmViD2yHMb7Tg+R4NR/7iQskqW8v2Cnv9FWSJgTOSHlcr7UzeLpiTAP4HA==}
dev: false
/@vitejs/plugin-vue/2.3.1_vite@2.9.1+vue@3.2.31:
/@vitejs/plugin-vue/2.3.1_vite@2.9.4+vue@3.2.32:
resolution: {integrity: sha512-YNzBt8+jt6bSwpt7LP890U1UcTOIZZxfpE5WOJ638PNxSEKOqAi0+FSKS0nVeukfdZ0Ai/H7AFd6k3hayfGZqQ==}
engines: {node: '>=12.0.0'}
peerDependencies:
vite: ^2.5.10
vue: ^3.2.25
dependencies:
vite: 2.9.1_sass@1.50.0
vue: 3.2.31
vite: 2.9.4_sass@1.50.0
vue: 3.2.32
dev: true
/@volar/code-gen/0.33.9:
resolution: {integrity: sha512-HI+XemEjvOv9uSjqaNXIL1brSTaBy9vRTcXqz9787nL5VKktI8aU1Zk4w9yJR88eTqw7mlPIdMaib7Ps/QPq8Q==}
/@volar/code-gen/0.34.6:
resolution: {integrity: sha512-sFgiaN3F+Sy93uVDtnZxfhEdy15ERSZ9qHY9wny4oQHztxS0pscrIGOQcvSoaK3pcyR8xGTouXkNf0BsOUwuXA==}
dependencies:
'@volar/source-map': 0.33.9
'@volar/source-map': 0.34.6
dev: true
/@volar/pug-language-service/0.33.9:
resolution: {integrity: sha512-3oOV0HmoqkCyPAiHXSMoDzbLrSEQQv3d1dY/Lfo4H8hGoS8kUYJ958328TuLFc90yzsSmYnuvIux5AUok138pg==}
dependencies:
'@volar/code-gen': 0.33.9
'@volar/shared': 0.33.9
'@volar/source-map': 0.33.9
'@volar/transforms': 0.33.9
pug-lexer: 5.0.1
pug-parser: 6.0.0
vscode-languageserver-textdocument: 1.0.4
vscode-languageserver-types: 3.17.0-next.9
/@volar/source-map/0.34.6:
resolution: {integrity: sha512-TIAxtvFIANh0PfQFY7dT/f2MIvpNRzJ7xrvlqwl1oYt7sa8AIposBFGS873s4avOuz15AoubKU7uZnVLYJ5AWg==}
dev: true
/@volar/shared/0.33.9:
resolution: {integrity: sha512-YqEBYT1SjyO+/W73lyKZlftumimsrYGvd98pHrIyvgc6HNhFnCcthRbyHskstjU6P8Bgj90mRl+7Sb29J+Z5ng==}
/@volar/vue-code-gen/0.34.6:
resolution: {integrity: sha512-0wh5fhQsxY6GL/zrxabjY+lAsFsaUNWDl+45iVeuczGP9sU07lpHoCwHBHBqCK8kxbvAJZaa3Me66apoq5BEvw==}
dependencies:
upath: 2.0.1
vscode-jsonrpc: 8.0.0-next.7
vscode-uri: 3.0.3
dev: true
/@volar/source-map/0.33.9:
resolution: {integrity: sha512-SE7dfumZ8pLsbj4DtiSDTg2/d/JT45nF51rUnuz1UNSBPEeXBexlzvz5EQ2AyrX0FjAAd2ijrRtirTk1a0SFhQ==}
dev: true
/@volar/transforms/0.33.9:
resolution: {integrity: sha512-qdc2d0ZW/G6jCx1pBmoMjMJTY245pZJjpPL/OCT3zgbDLGvLvqhowXxQYQd2YiNXqxJvbadEKviH5LiZL3sU9g==}
dependencies:
'@volar/shared': 0.33.9
vscode-languageserver-types: 3.17.0-next.9
dev: true
/@volar/vue-code-gen/0.33.9:
resolution: {integrity: sha512-qRCXcBhm1kUlI06sW5zolavn8gqZdSC2eIWw7jgbW68K/cGlTyXHGGZgJPM9P22cF9pcrjV1ByehO18ke2u+aA==}
dependencies:
'@volar/code-gen': 0.33.9
'@volar/source-map': 0.33.9
'@volar/code-gen': 0.34.6
'@volar/source-map': 0.34.6
'@vue/compiler-core': 3.2.31
'@vue/compiler-dom': 3.2.31
'@vue/shared': 3.2.31
'@vue/compiler-dom': 3.2.32
'@vue/shared': 3.2.32
dev: true
/@volar/vue-typescript/0.33.9:
resolution: {integrity: sha512-UUViaQfzAV7z49TB+IsGCT6ls7zdEUib2N0L4k8U9nZbd2BQA4kcR9nyS/8oDOU5fK3ErP+pPlC+XzGGamKhcw==}
/@volar/vue-typescript/0.34.6:
resolution: {integrity: sha512-vKEYnDw9BhIMR6+Rp1Ue/8TpBjYNm4+3fIom4wMxFDlEOCku7fsF169QgZuDDvyPrFlurT878qjKYf88cYFCgA==}
dependencies:
'@volar/code-gen': 0.33.9
'@volar/pug-language-service': 0.33.9
'@volar/source-map': 0.33.9
'@volar/vue-code-gen': 0.33.9
'@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
......@@ -358,12 +329,28 @@ packages:
'@vue/shared': 3.2.31
estree-walker: 2.0.2
source-map: 0.6.1
dev: true
/@vue/compiler-core/3.2.32:
resolution: {integrity: sha512-bRQ8Rkpm/aYFElDWtKkTPHeLnX5pEkNxhPUcqu5crEJIilZH0yeFu/qUAcV4VfSE2AudNPkQSOwMZofhnuutmA==}
dependencies:
'@babel/parser': 7.17.9
'@vue/shared': 3.2.32
estree-walker: 2.0.2
source-map: 0.6.1
/@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
/@vue/compiler-sfc/3.2.31:
resolution: {integrity: sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==}
......@@ -378,12 +365,36 @@ packages:
magic-string: 0.25.9
postcss: 8.4.12
source-map: 0.6.1
dev: true
/@vue/compiler-sfc/3.2.32:
resolution: {integrity: sha512-uO6+Gh3AVdWm72lRRCjMr8nMOEqc6ezT9lWs5dPzh1E9TNaJkMYPaRtdY9flUv/fyVQotkfjY/ponjfR+trPSg==}
dependencies:
'@babel/parser': 7.17.9
'@vue/compiler-core': 3.2.32
'@vue/compiler-dom': 3.2.32
'@vue/compiler-ssr': 3.2.32
'@vue/reactivity-transform': 3.2.32
'@vue/shared': 3.2.32
estree-walker: 2.0.2
magic-string: 0.25.9
postcss: 8.4.12
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.32:
resolution: {integrity: sha512-ZklVUF/SgTx6yrDUkaTaBL/JMVOtSocP+z5Xz/qIqqLdW/hWL90P+ob/jOQ0Xc/om57892Q7sRSrex0wujOL2Q==}
dependencies:
'@vue/compiler-dom': 3.2.32
'@vue/shared': 3.2.32
dev: false
/@vue/devtools-api/6.1.4:
resolution: {integrity: sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==}
......@@ -414,41 +425,63 @@ packages:
'@vue/shared': 3.2.31
estree-walker: 2.0.2
magic-string: 0.25.9
dev: true
/@vue/reactivity-transform/3.2.32:
resolution: {integrity: sha512-CW1W9zaJtE275tZSWIfQKiPG0iHpdtSlmTqYBu7Y62qvtMgKG5yOxtvBs4RlrZHlaqFSE26avLAgQiTp4YHozw==}
dependencies:
'@babel/parser': 7.17.9
'@vue/compiler-core': 3.2.32
'@vue/shared': 3.2.32
estree-walker: 2.0.2
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/runtime-core/3.2.31:
resolution: {integrity: sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==}
/@vue/reactivity/3.2.32:
resolution: {integrity: sha512-4zaDumuyDqkuhbb63hRd+YHFGopW7srFIWesLUQ2su/rJfWrSq3YUvoKAJE8Eu1EhZ2Q4c1NuwnEreKj1FkDxA==}
dependencies:
'@vue/reactivity': 3.2.31
'@vue/shared': 3.2.31
'@vue/shared': 3.2.32
dev: false
/@vue/runtime-dom/3.2.31:
resolution: {integrity: sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==}
/@vue/runtime-core/3.2.32:
resolution: {integrity: sha512-uKKzK6LaCnbCJ7rcHvsK0azHLGpqs+Vi9B28CV1mfWVq1F3Bj8Okk3cX+5DtD06aUh4V2bYhS2UjjWiUUKUF0w==}
dependencies:
'@vue/runtime-core': 3.2.31
'@vue/shared': 3.2.31
'@vue/reactivity': 3.2.32
'@vue/shared': 3.2.32
dev: false
/@vue/runtime-dom/3.2.32:
resolution: {integrity: sha512-AmlIg+GPqjkNoADLjHojEX5RGcAg+TsgXOOcUrtDHwKvA8mO26EnLQLB8nylDjU6AMJh2CIYn8NEgyOV5ZIScQ==}
dependencies:
'@vue/runtime-core': 3.2.32
'@vue/shared': 3.2.32
csstype: 2.6.20
dev: false
/@vue/server-renderer/3.2.31_vue@3.2.31:
resolution: {integrity: sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==}
/@vue/server-renderer/3.2.32_vue@3.2.32:
resolution: {integrity: sha512-TYKpZZfRJpGTTiy/s6bVYwQJpAUx3G03z4G7/3O18M11oacrMTVHaHjiPuPqf3xQtY8R4LKmQ3EOT/DRCA/7Wg==}
peerDependencies:
vue: 3.2.31
vue: 3.2.32
dependencies:
'@vue/compiler-ssr': 3.2.31
'@vue/shared': 3.2.31
vue: 3.2.31
'@vue/compiler-ssr': 3.2.32
'@vue/shared': 3.2.32
vue: 3.2.32
dev: false
/@vue/shared/3.2.31:
resolution: {integrity: sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==}
dev: true
/@vue/tsconfig/0.1.3_@types+node@16.11.26:
/@vue/shared/3.2.32:
resolution: {integrity: sha512-bjcixPErUsAnTQRQX4Z5IQnICYjIfNCyCl8p29v1M6kfVzvwOICPw+dz48nNuWlTOOx2RHhzHdazJibE8GSnsw==}
/@vue/tsconfig/0.1.3_@types+node@17.0.23:
resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==}
peerDependencies:
'@types/node': '*'
......@@ -456,7 +489,7 @@ packages:
'@types/node':
optional: true
dependencies:
'@types/node': 16.11.26
'@types/node': 17.0.23
dev: true
/acorn-jsx/5.3.2_acorn@8.7.0:
......@@ -467,12 +500,6 @@ packages:
acorn: 8.7.0
dev: true
/acorn/7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
/acorn/8.7.0:
resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==}
engines: {node: '>=0.4.0'}
......@@ -564,6 +591,7 @@ packages:
dependencies:
function-bind: 1.1.1
get-intrinsic: 1.1.1
dev: false
/callsites/3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
......@@ -587,12 +615,6 @@ packages:
supports-color: 7.2.0
dev: true
/character-parser/2.2.0:
resolution: {integrity: sha1-x84o821LzZdE5f/CxfzeHHMmH8A=}
dependencies:
is-regex: 1.1.4
dev: true
/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
......@@ -1128,6 +1150,7 @@ packages:
function-bind: 1.1.1
has: 1.0.3
has-symbols: 1.0.3
dev: false
/glob-parent/5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
......@@ -1185,13 +1208,7 @@ packages:
/has-symbols/1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
/has-tostringtag/1.0.0:
resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
dev: true
dev: false
/has/1.0.3:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
......@@ -1244,13 +1261,6 @@ packages:
has: 1.0.3
dev: true
/is-expression/4.0.0:
resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==}
dependencies:
acorn: 7.4.1
object-assign: 4.1.1
dev: true
/is-extglob/2.1.1:
resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
engines: {node: '>=0.10.0'}
......@@ -1265,14 +1275,6 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
/is-regex/1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
has-tostringtag: 1.0.0
dev: true
/isexe/2.0.0:
resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
dev: true
......@@ -1373,11 +1375,6 @@ packages:
path-key: 3.1.1
dev: true
/object-assign/4.1.1:
resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
engines: {node: '>=0.10.0'}
dev: true
/object-inspect/1.12.0:
resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==}
dev: false
......@@ -1433,7 +1430,7 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
/pinia/2.0.13_typescript@4.6.3+vue@3.2.31:
/pinia/2.0.13_typescript@4.6.3+vue@3.2.32:
resolution: {integrity: sha512-B7rSqm1xNpwcPMnqns8/gVBfbbi7lWTByzS6aPZ4JOXSJD4Y531rZHDCoYWBwLyHY/8hWnXljgiXp6rRyrofcw==}
peerDependencies:
'@vue/composition-api': ^1.4.0
......@@ -1447,8 +1444,8 @@ packages:
dependencies:
'@vue/devtools-api': 6.1.4
typescript: 4.6.3
vue: 3.2.31
vue-demi: 0.12.5_vue@3.2.31
vue: 3.2.32
vue-demi: 0.12.5_vue@3.2.32
dev: false
/postcss/8.4.12:
......@@ -1464,25 +1461,6 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
/pug-error/2.0.0:
resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==}
dev: true
/pug-lexer/5.0.1:
resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==}
dependencies:
character-parser: 2.2.0
is-expression: 4.0.0
pug-error: 2.0.0
dev: true
/pug-parser/6.0.0:
resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==}
dependencies:
pug-error: 2.0.0
token-stream: 1.0.0
dev: true
/punycode/2.1.1:
resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
engines: {node: '>=6'}
......@@ -1662,10 +1640,6 @@ packages:
dependencies:
is-number: 7.0.0
/token-stream/1.0.0:
resolution: {integrity: sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=}
dev: true
/tslib/1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
......@@ -1703,11 +1677,6 @@ packages:
hasBin: true
dev: true
/upath/2.0.1:
resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==}
engines: {node: '>=4'}
dev: true
/uri-js/4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
......@@ -1718,7 +1687,7 @@ packages:
resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
dev: true
/vant/3.4.7_vue@3.2.31:
/vant/3.4.7_vue@3.2.32:
resolution: {integrity: sha512-/iafbNF3VPcDevIun8DMj84V9sGMcBZ2LW8j20uqthW6NpFmkMpDFJxMINQFIZ0myEogqVSDVhS6XFAwlx3nkQ==}
peerDependencies:
vue: ^3.0.0
......@@ -1726,10 +1695,10 @@ packages:
'@vant/icons': 1.8.0
'@vant/popperjs': 1.1.0
'@vant/use': 1.3.6
vue: 3.2.31
vue: 3.2.32
dev: false
/vite-plugin-checker/0.4.5_vite@2.9.1:
/vite-plugin-checker/0.4.5_vite@2.9.4:
resolution: {integrity: sha512-kCfVzfGzK4D/G6vGPpAffpg9e57AlxUFOjMTr4qEiZpqHyy4ejBNi6OD1UzKn+ZIrWryLKMhjxjQ8hkwns45xA==}
hasBin: true
peerDependencies:
......@@ -1746,15 +1715,15 @@ packages:
npm-run-path: 4.0.1
strip-ansi: 6.0.1
tiny-invariant: 1.2.0
vite: 2.9.1_sass@1.50.0
vite: 2.9.4_sass@1.50.0
vscode-languageclient: 7.0.0
vscode-languageserver: 7.0.0
vscode-languageserver-textdocument: 1.0.4
vscode-uri: 3.0.3
dev: true
/vite/2.9.1_sass@1.50.0:
resolution: {integrity: sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==}
/vite/2.9.4_sass@1.50.0:
resolution: {integrity: sha512-7pO6ruZMsyTpaPB7kGtW+yj15Ze5g+E4w4Ramk1sAJLIuI4uPd5sauqubmZNpq0Yc1vLVxoXRf2Uj+qWxk5aXw==}
engines: {node: '>=12.2.0'}
hasBin: true
peerDependencies:
......@@ -1783,11 +1752,6 @@ packages:
engines: {node: '>=8.0.0 || >=10.0.0'}
dev: true
/vscode-jsonrpc/8.0.0-next.7:
resolution: {integrity: sha512-JX/F31LEsims0dAlOTKFE4E+AJMiJvdRSRViifFJSqSN7EzeYyWlfuDchF7g91oRNPZOIWfibTkDf3/UMsQGzQ==}
engines: {node: '>=14.0.0'}
dev: true
/vscode-languageclient/7.0.0:
resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==}
engines: {vscode: ^1.52.0}
......@@ -1812,10 +1776,6 @@ packages:
resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==}
dev: true
/vscode-languageserver-types/3.17.0-next.9:
resolution: {integrity: sha512-9/PeDNPYduaoXRUzYpqmu4ZV9L01HGo0wH9FUt+sSHR7IXwA7xoXBfNUlv8gB9H0D2WwEmMomSy1NmhjKQyn3A==}
dev: true
/vscode-languageserver/7.0.0:
resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==}
hasBin: true
......@@ -1827,7 +1787,7 @@ packages:
resolution: {integrity: sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==}
dev: true
/vue-demi/0.12.5_vue@3.2.31:
/vue-demi/0.12.5_vue@3.2.32:
resolution: {integrity: sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==}
engines: {node: '>=12'}
hasBin: true
......@@ -1839,7 +1799,7 @@ packages:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.2.31
vue: 3.2.32
dev: false
/vue-eslint-parser/8.3.0_eslint@8.13.0:
......@@ -1860,33 +1820,33 @@ packages:
- supports-color
dev: true
/vue-router/4.0.14_vue@3.2.31:
/vue-router/4.0.14_vue@3.2.32:
resolution: {integrity: sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==}
peerDependencies:
vue: ^3.2.0
dependencies:
'@vue/devtools-api': 6.1.4
vue: 3.2.31
vue: 3.2.32
dev: false
/vue-tsc/0.33.9_typescript@4.6.3:
resolution: {integrity: sha512-s/+r4JNsCh4e3MUdsYrjEA8IgPPDzHL5kEah/OznxIHd1XMlYiIkXGdiyU6JE5J+lzXNOKdOlNliqwwpeETQWw==}
/vue-tsc/0.34.6_typescript@4.6.3:
resolution: {integrity: sha512-rEr8/BrpSN2QmnTw6MuT0WJA/qx54xDqSXG6EBGt37fn7jLCrKYF37GW3xZCdktO0V53l1XF2ssBtmLL+OI2ww==}
hasBin: true
peerDependencies:
typescript: '*'
dependencies:
'@volar/vue-typescript': 0.33.9
'@volar/vue-typescript': 0.34.6
typescript: 4.6.3
dev: true
/vue/3.2.31:
resolution: {integrity: sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==}
/vue/3.2.32:
resolution: {integrity: sha512-6L3jKZApF042OgbCkh+HcFeAkiYi3Lovi8wNhWqIK98Pi5efAMLZzRHgi91v+60oIRxdJsGS9sTMsb+yDpY8Eg==}
dependencies:
'@vue/compiler-dom': 3.2.31
'@vue/compiler-sfc': 3.2.31
'@vue/runtime-dom': 3.2.31
'@vue/server-renderer': 3.2.31_vue@3.2.31
'@vue/shared': 3.2.31
'@vue/compiler-dom': 3.2.32
'@vue/compiler-sfc': 3.2.32
'@vue/runtime-dom': 3.2.32
'@vue/server-renderer': 3.2.32_vue@3.2.32
'@vue/shared': 3.2.32
dev: false
/which/2.0.2:
......
<template>
<router-view />
<RouterView />
</template>
<style>
......
import AppCard from '@/components/base/AppCard.vue'
import AppContainer from '@/components/base/AppContainer.vue'
declare module 'vue' {
export interface GlobalComponents {
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
AppCard: typeof AppCard
AppContainer: typeof AppContainer
}
}
<script setup lang="ts">
import type { ICourseItem } from '@/types'
defineProps<{ data: ICourseItem }>()
</script>
<template>
<div class="course-item">
<img :src="data.course_picture" class="course-item-pic" />
<div class="course-item-content">
<h5>{{ data.course_name }}</h5>
<div>
<span>{{ data.course_chapters.big_total }}章节</span>
<span>{{ data.course_chapters.small_total }}课时</span>
</div>
<div>
<span>{{ data.pv }}人看过</span>
<span>{{ data.records_total }}人评论</span>
</div>
<p>{{ data.status }}</p>
</div>
</div>
</template>
<style lang="scss">
.course-item {
display: flex;
padding: 0.22rem;
background: #fff;
border-radius: 0.2rem;
}
.course-item-pic {
width: 1.6rem;
height: 1.9rem;
border-radius: 0.1rem;
overflow: hidden;
object-fit: cover;
}
.course-item-content {
margin-left: 0.26rem;
font-size: 0.24rem;
line-height: 0.33rem;
font-weight: 500;
color: #4e4e4e;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
</style>
<script setup lang="ts">
import type { IVideoItem } from '@/types'
defineProps<{ data: IVideoItem }>()
</script>
<template>
<div class="video-item">
<img :src="data.cover_page" />
<h5>{{ data.course_name }}</h5>
<p>{{ data.pv }}播放</p>
</div>
</template>
<style lang="scss">
.video-item {
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;
}
}
</style>
......@@ -7,7 +7,9 @@ defineProps<{ title?: string }>()
<div class="app-card-hd">
<slot name="header">
<h2 class="app-card-hd__title" v-if="title">{{ title }}</h2>
<div class="app-card-hd-aside">
<slot name="header-aside"></slot>
</div>
</slot>
</div>
<div class="app-card-bd">
......@@ -22,12 +24,30 @@ defineProps<{ title?: string }>()
}
.app-card-hd {
display: flex;
align-items: center;
margin-bottom: 0.18rem;
}
.app-card-hd__title {
flex: 1;
font-size: 0.28rem;
font-weight: 600;
line-height: 1;
color: #333;
}
.app-card-hd-aside {
.button {
min-width: 1.18rem;
height: 0.4rem;
font-size: 0.22rem;
line-height: 0.4rem;
color: #ffffff;
text-align: center;
background: linear-gradient(164deg, #f7c988 0%, #e5a448 100%);
border-radius: 0.2rem;
}
.more {
font-size: 0.22rem;
color: #999;
}
}
</style>
<script setup lang="ts">
import { withDefaults } from 'vue'
import { useRouter } from 'vue-router'
interface Props {
title?: string
headerAlign?: boolean
backgroundColor?: string
}
withDefaults(defineProps<Props>(), {
headerAlign: false
})
const router = useRouter()
function handleBack() {
router.push('/')
}
</script>
<template>
<section class="app-container">
<div class="app-container-hd">
<slot name="header">
<van-icon name="arrow-left" @click="handleBack" />
<h2 class="app-container-hd__title" @click="handleBack" v-if="title">{{ title }}</h2>
<div class="app-container-hd-aside">
<slot name="header-aside"></slot>
</div>
</slot>
</div>
<div class="app-container-bd">
<slot></slot>
</div>
</section>
</template>
<style lang="scss">
.app-container-hd {
display: flex;
align-items: center;
font-size: 0.32rem;
}
.app-container-hd__title {
margin-left: 0.22rem;
font-size: 0.32rem;
font-weight: 600;
color: #333333;
}
</style>
......@@ -7,7 +7,7 @@
</div>
<ul class="app-header-right">
<li>
<router-link to="/messages"
<router-link to="/message"
><img src="https://webapp-pub.ezijing.com/project/prp-h5/icon_message.png"
/></router-link>
</li>
......
......@@ -5,7 +5,7 @@ import AppHeader from './Header.vue'
<template>
<div class="app-layout">
<AppHeader />
<router-view />
<RouterView />
</div>
</template>
......@@ -18,5 +18,6 @@ import AppHeader from './Header.vue'
background-size: 100% auto;
padding: 0 0.3rem;
box-sizing: border-box;
overflow: hidden;
}
</style>
......@@ -6,12 +6,13 @@ import Vant from 'vant'
import 'vant/lib/index.css'
// 公共组件
import AppCard from '@/components/base/AppCard.vue'
import AppContainer from '@/components/base/AppContainer.vue'
import modules from './modules'
const app = createApp(App)
// 注册公共组件
app.component('AppCard', AppCard)
app.component('AppCard', AppCard).component('AppContainer', AppContainer)
// 注册模块
modules({ router })
......
import httpRequest from '@/utils/axios'
// 获取课程列表
export function getCourseList(params: { page_size: number; page: number }) {
return httpRequest.get('/api/psp/v1/learning/course-list', { params })
}
// 获取课程列表
export function getCourseView(params: { id: string }) {
return httpRequest.get('/api/psp/v1/learning/course-view', { params })
}
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/course',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
{ path: 'view/:id', component: () => import('./views/View.vue'), props: true }
]
}
]
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { getCourseView } from '../api'
const props = defineProps<{ id: string }>()
const data = ref()
function getCourse() {
getCourseView({ id: props.id }).then(res => {
data.value = res.data.course
})
}
onMounted(() => {
getCourse()
})
</script>
<template>
<div class="course" v-if="data">
<div class="course-top">
<div class="course-info">
<img :src="data.course_picture" class="course-info-pic" />
<div class="course-info-content">
<h1>{{ data.course_name }}</h1>
<ul>
<li class="l1">
<span>{{ data.course_chapters.big_total }}章节</span>
<span>{{ data.course_chapters.small_total }}课时</span>
</li>
<li class="l2">
<span>{{ data.course_chapters.big_total }}人看过</span>
<span>{{ data.course_chapters.small_total }}人评论</span>
</li>
</ul>
<div class="star">
<p>
共计可得<b>{{ data.star_total }}</b
>个星星
</p>
</div>
<div class="lecturer" v-for="(lecturer, index) in data.course_lectures" :key="index">
<h4>{{ lecturer.lecturer_name }}</h4>
<p>{{ lecturer.lecturer_title }}</p>
<p>{{ lecturer.lecturer_office }}</p>
</div>
</div>
</div>
<div class="course-desc" v-html="data.course_represent"></div>
</div>
<div class="course-bottom">
<div class="course-tips">如果你也是知识获得者,请晒出你的海报、说出你的感想,得到你的星星。</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.course-info {
display: flex;
}
.course-info-pic {
width: 2rem;
height: 2.4rem;
background-color: #fff;
border-radius: 0.2rem;
overflow: hidden;
object-fit: cover;
}
.course-info-content {
flex: 1;
margin-left: 0.16rem;
h1 {
font-size: 0.36rem;
line-height: 0.5rem;
font-weight: 500;
color: #333333;
}
ul {
display: flex;
justify-content: space-between;
li {
font-size: 0.2rem;
font-weight: 300;
line-height: 0.28rem;
span + span {
margin-left: 0.1rem;
}
}
.l1 {
color: #033974;
}
.l2 {
color: #999;
}
}
.star {
margin: 0.07rem 0;
p {
display: inline-block;
padding: 0 0.15rem;
height: 0.3rem;
font-size: 0.2rem;
line-height: 0.3rem;
border-radius: 0.15rem;
border: 0.01rem solid #80b0e5;
b {
color: #033974;
}
}
}
.lecturer {
h4 {
margin-bottom: 0.05rem;
font-size: 0.24rem;
line-height: 0.33rem;
font-weight: 500;
color: #333333;
}
p {
font-size: 0.22rem;
font-weight: 400;
line-height: 0.3rem;
color: #666666;
}
}
}
.course-desc {
margin-top: 0.15rem;
font-size: 0.24rem;
line-height: 0.3rem;
color: #333;
}
.course-bottom {
margin-top: 0.28rem;
background-color: #033974;
border-radius: 0.2rem;
}
.course-tips {
padding: 0.3rem;
font-size: 0.24rem;
color: #ffffff;
line-height: 0.36rem;
}
</style>
......@@ -2,5 +2,14 @@ import httpRequest from '@/utils/axios'
// 获取首页数据
export function getHomeData() {
return httpRequest.get('/api/prp/v1/index/index')
return httpRequest.get('/api/psp/v1/index/index')
}
// 获取导学视频列表
export function getVideoList(params?: { page_size: number; page: number }) {
return httpRequest.get('/api/psp/v1/learning/video-list', { params })
}
// 获取课程列表
export function getCourseList(params?: { page_size: number; page: number }) {
return httpRequest.get('/api/psp/v1/learning/course-list', { params })
}
<script setup lang="ts">
interface docItem {
id: string
title: string
pv: string
}
defineProps<{ docs: Array<docItem>; videos: object[] }>()
import type { IDocItem, IVideoItem } from '../types'
defineProps<{ docs: IDocItem[]; videos: IVideoItem[] }>()
</script>
<template>
......
<script setup lang="ts"></script>
<script setup lang="ts">
import { ref } from 'vue'
import type { IDocItem } from '../types'
import LearningMapVideo from './LearningMapVideo.vue'
import LearningMapCourse from './LearningMapCourse.vue'
defineProps<{ docs: IDocItem[] }>()
const active = ref<number>(0)
</script>
<template>
<AppCard title="学习地图"></AppCard>
<AppCard title="学习地图">
<template #header-aside>
<div class="button">去学习</div>
</template>
<van-tabs
v-model:active="active"
shrink
background="transparent"
title-active-color="#033974"
title-inactive-color="#4E4E4E"
line-height="0"
>
<van-tab title="解释文档">
<div class="learn-box learn-docs">
<ul>
<li v-for="item in docs" :key="item.id">
<p>{{ item.title }}</p>
<span>{{ item.pv }}</span>
<van-icon name="arrow" />
</li>
</ul>
</div>
</van-tab>
<van-tab title="学前测评">
<div class="learn-box learn-test">
<h2>查漏补缺 建立系统概念</h2>
<p>了解PRP学习前系统专业知识的情况</p>
<a class="button">去测评</a>
</div>
</van-tab>
<van-tab title="课程导学">
<div class="learn-box">
<LearningMapVideo></LearningMapVideo>
</div>
</van-tab>
<van-tab title="学习进度">
<div class="learn-box learn-course">
<LearningMapCourse></LearningMapCourse>
</div>
</van-tab>
</van-tabs>
<div class="learn-banner">
<img src="https://webapp-pub.ezijing.com/project/prp-h5/learning_map_banner.png" />
</div>
</AppCard>
</template>
<style lang="scss">
.learn-box {
height: 3.1rem;
padding: 0.3rem;
background: #fff;
border-radius: 0.2rem;
overflow: hidden;
box-sizing: border-box;
}
// 解释文档
.learn-docs {
background: url(https://webapp-pub.ezijing.com/project/prp-h5/learning_map_bg.png) no-repeat;
background-size: contain;
}
.learn-banner {
margin-top: 0.2rem;
margin-left: -0.3rem;
margin-right: -0.3rem;
img {
width: 100%;
}
}
// 学前测评
.learn-test {
background: #fff url(https://webapp-pub.ezijing.com/project/prp-h5/learning_map_test.png) no-repeat right 0.2rem
bottom 0.5rem;
background-size: 2.08rem;
h2 {
margin-top: 0.2rem;
margin-left: 0.3rem;
font-size: 0.32rem;
font-weight: 500;
line-height: 1.4;
color: #4e4e4e;
}
p {
margin-top: 0.3rem;
margin-left: 0.3rem;
font-size: 0.28rem;
font-weight: 400;
line-height: 1.4;
color: #666666;
}
.button {
margin-top: 0.4rem;
display: block;
height: 0.8rem;
font-size: 0.28rem;
line-height: 0.8rem;
color: #fff;
text-align: center;
background: linear-gradient(90deg, #f7c988 0%, #e5a448 100%);
border-radius: 0.4rem;
}
}
.learn-course {
background-color: #f4e6d3;
}
</style>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/css'
import type { ICourseItem } from '../types'
import { getCourseList } from '../api'
// 学习进度
const dataset = ref<{ total: number; list: ICourseItem[] }>({ total: 0, list: [] })
function fetchCourseList() {
getCourseList().then(res => {
dataset.value = res.data
})
}
onMounted(() => {
fetchCourseList()
})
</script>
<template>
<swiper slides-per-view="auto" :space-between="10">
<swiper-slide v-for="(item, index) in dataset.list" :key="index" class="course-item">
<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">{{ item.status }}</p>
</div>
</router-link>
</swiper-slide>
</swiper>
</template>
<style lang="scss">
.course-item {
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;
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, onMounted } from 'vue'
import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/css'
import type { IVideoItem } from '../types'
import { getVideoList } from '../api'
// 课程导学
const dataset = ref<{ total: number; list: IVideoItem[] }>({ total: 0, list: [] })
function fetchVideoList() {
getVideoList().then(res => {
dataset.value = res.data
})
}
onMounted(() => {
fetchVideoList()
})
</script>
<template>
<swiper slides-per-view="auto" :space-between="10">
<swiper-slide v-for="(item, index) in dataset.list" :key="index" class="video-item">
<img :src="item.cover_page" />
<h5>{{ item.course_name }}</h5>
<p>{{ item.pv }}播放</p>
</swiper-slide>
</swiper>
</template>
<style lang="scss">
.video-item {
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;
}
}
</style>
......@@ -18,7 +18,7 @@ const menus: Array<{
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/home_menu_2.png'
},
{
path: '/',
path: '/query',
name: '权益查看',
icon: 'https://webapp-pub.ezijing.com/project/prp-h5/home_menu_3.png'
},
......@@ -44,8 +44,10 @@ const menus: Array<{
<nav class="home-nav">
<swiper slides-per-view="auto" :space-between="12">
<swiper-slide v-for="(item, index) in menus" :key="index" class="nav-item">
<router-link :to="item.path">
<img :src="item.icon" />
<p>{{ item.name }}</p>
</router-link>
</swiper-slide>
</swiper>
</nav>
......
<script setup lang="ts"></script>
<template>
<AppCard title="陪伴问答">
<template #header-aside>
<div class="button">发表问答</div>
</template>
</AppCard>
</template>
<script setup lang="ts"></script>
<template>
<AppCard title="荣誉总榜"></AppCard>
<AppCard title="荣誉总榜">
<template #header-aside>
<div class="more">查看更多 <van-icon name="arrow" /></div>
</template>
</AppCard>
</template>
import type { IVideoItem, ICourseItem } from '@/types'
export interface HomeInfo {
banner: IBanner[]
admission_guide_docs: IDocItem[]
admission_guide_videos: IVideoItem[]
learning_map_docs: IDocItem[]
}
export interface IBanner {
id: string
title: string
pv: string
}
export interface IDocItem {
id: string
title: string
pv: string
}
export { IVideoItem, ICourseItem }
<script setup lang="ts">
import { ref } from 'vue'
import { ref, onMounted } from 'vue'
import type { HomeInfo } from '../types'
import * as api from '../api'
import HomeBanner from '../components/Banner.vue'
import HomeMenu from '../components/Menu.vue'
import Banner from '../components/Banner.vue'
import Menu from '../components/Menu.vue'
import AdmissionGuide from '../components/AdmissionGuide.vue'
import LearningMap from '../components/LearningMap.vue'
import ExamStrategy from '../components/ExamStrategy.vue'
import TeamRanking from '../components/TeamRanking.vue'
import Questions from '../components/Questions.vue'
const data = ref<{ banner: object[]; admission_guide_docs: object[]; admission_guide_videos: object[] }>({
const data = ref<HomeInfo>({
banner: [],
admission_guide_docs: [],
admission_guide_videos: []
admission_guide_videos: [],
learning_map_docs: []
})
// 获取首页数据
function fetchHomeData() {
......@@ -19,20 +22,23 @@ function fetchHomeData() {
data.value = res.data
})
}
fetchHomeData()
onMounted(() => {
fetchHomeData()
})
</script>
<template>
<HomeBanner :list="data.banner"></HomeBanner>
<HomeMenu></HomeMenu>
<Banner :list="data.banner"></Banner>
<Menu></Menu>
<!-- 入学指南 -->
<AdmissionGuide :docs="data.admission_guide_docs" :videos="data.admission_guide_videos"></AdmissionGuide>
<!-- 学习地图 -->
<LearningMap></LearningMap>
<LearningMap :docs="data.learning_map_docs"></LearningMap>
<!-- 权益查看 -->
<!-- 荣誉总榜 -->
<TeamRanking></TeamRanking>
<!-- 考试攻略 -->
<ExamStrategy></ExamStrategy>
<!-- 陪伴问答 -->
<Questions></Questions>
</template>
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/messages',
path: '/message',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
......
<script setup lang="ts"></script>
<template>
<div class="home"></div>
</template>
import httpRequest from '@/utils/axios'
// 获取我的信息
export function getMyInfo() {
return httpRequest.get('/api/psp/v1/my/info')
}
export interface MyType {
start: string
}
<script setup lang="ts"></script>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { getMyInfo } from '../api'
const info = ref()
const teamInfo = ref()
function fetchMyInfo() {
getMyInfo().then(res => {
info.value = res.data.info || {}
teamInfo.value = res.data.team_info || { star: 0 }
})
}
onMounted(() => {
fetchMyInfo()
})
const menus: Array<{
name: string
path: string
icon: string
}> = [
{
path: '/',
name: '我的课程',
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'
}
]
</script>
<template>
<div class="home"></div>
<div class="my" v-if="info">
<div class="user">
<img :src="info.avatar" />
<p>{{ info.name }}</p>
</div>
<div class="quantity">
<dl>
<dt>{{ info.star }}</dt>
<dd>我的星星</dd>
</dl>
<dl>
<dt>{{ teamInfo.star }}</dt>
<dd>我的积分</dd>
</dl>
</div>
<div class="box">
<nav class="menus">
<ul>
<li v-for="(item, index) in menus" :key="index">
<router-link :to="item.path">
<img :src="item.icon" />
<p>{{ item.name }}</p>
</router-link>
</li>
</ul>
</nav>
</div>
<div class="logout">退出登录</div>
</div>
</template>
<style lang="scss">
.my {
.user {
display: flex;
flex-direction: column;
align-items: center;
margin: 0 auto;
img {
width: 1.5rem;
height: 1.5rem;
background: #fff;
border-radius: 50%;
object-fit: cover;
overflow: hidden;
}
p {
margin-top: 0.25rem;
font-size: 0.32rem;
font-weight: 400;
color: #333;
}
}
.quantity {
display: flex;
margin-top: 0.4rem;
dl {
flex: 1;
text-align: center;
}
dl + dl {
border-left: 0.01rem solid #d3d3d3;
}
dt {
font-size: 0.42rem;
font-weight: 500;
line-height: 0.6rem;
color: #033974;
}
dd {
font-size: 0.3rem;
color: #666666;
line-height: 0.42rem;
}
}
.box {
margin: 0.4rem 0;
padding: 0.34rem;
background-color: #fff;
border-radius: 0.2rem;
}
.menus {
ul {
display: grid;
grid-template-columns: repeat(3, 1fr);
row-gap: 0.45rem;
}
li {
text-align: center;
img {
width: 0.76rem;
height: 0.76rem;
}
p {
margin-top: 0.13rem;
font-size: 0.28rem;
font-weight: 400;
color: #666666;
}
}
}
.logout {
margin-top: 0.6rem;
height: 0.8rem;
font-size: 0.28rem;
line-height: 0.8rem;
color: #666666;
text-align: center;
border-radius: 0.4rem;
border: 0.01rem solid #999999;
cursor: pointer;
}
}
</style>
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/qa',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
]
<script setup lang="ts"></script>
<template>
<div class="home"></div>
</template>
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/query',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
]
<script setup lang="ts">
import { ref } from 'vue'
const active = ref<number>(0)
</script>
<template>
<AppContainer title="权益查看">
<van-tabs
v-model:active="active"
shrink
background="transparent"
title-active-color="#033974"
title-inactive-color="#4E4E4E"
line-height="0"
>
<van-tab title="名片查询"> </van-tab>
<van-tab title="证书查询"> </van-tab>
<van-tab title="持证人查看"> </van-tab>
</van-tabs>
</AppContainer>
</template>
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/team',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
]
<script setup lang="ts"></script>
<template>
<div class="home"></div>
</template>
// 视频
export interface IVideoItem {
id: string
type: string
type_name: string
cover_page: string
course_name: string
aliyun_video_id: string
pv: string
play_info: object
}
// 课程
export interface ICourseItem {
id: string
curriculum_id: string
weight: string
status: string
pv: string
course_name: string
course_picture: string
course_represent: string
course_lectures: Array<ICourseLecturerItem>
records_total: number
course_chapters: ICourseChapters
star_total: number
progress: number
}
export interface ICourseChapters {
big_total: string
small_total: string
list: []
}
// 课程老师
export interface ICourseLecturerItem {
lecturer_name: string
lecturer_title: string
lecturer_office: string
}
......@@ -18,10 +18,10 @@ export default defineConfig(({ mode }) => {
cert: fs.readFileSync(path.join(__dirname, './https/dev.ezijing.com.pem'))
},
proxy: {
'/api/prp': {
target: 'http://localhost-sixiangxingqiu-frontend.ezijing.com',
'/api/psp': {
target: 'https://psp-api.ezijing.com',
changeOrigin: true,
rewrite: path => path.replace('/api/prp/', '/')
rewrite: path => path.replace('/api/psp/', '/')
},
'/api': 'https://learn-api.ezijing.com'
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论