diff --git a/package.json b/package.json index 9a897c7..e24f186 100644 --- a/package.json +++ b/package.json @@ -9,17 +9,19 @@ "preview": "vite preview" }, "dependencies": { - "tailwindcss": "^4.1.4", - "vue": "^3.5.13", "@ant-design-vue/pro-layout": "^3.2.5", "@ant-design/icons-vue": "^7.0.1", + "@element-plus/icons-vue": "^2.3.1", "@tailwindcss/vite": "^4.1.4", "@vueuse/head": "^2.0.0", "ant-design-vue": "^4.1.1", "axios": "^1.6.2", + "element-plus": "^2.9.11", "lucide-vue-next": "^0.507.0", "pinia": "^2.1.7", "swiper": "^11.0.5", + "tailwindcss": "^4.1.4", + "vue": "^3.5.13", "vue-router": "^4.2.5" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 061cee9..e411901 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@ant-design/icons-vue': specifier: ^7.0.1 version: 7.0.1(vue@3.5.13) + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.1(vue@3.5.13) '@tailwindcss/vite': specifier: ^4.1.4 version: 4.1.4(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.88.0)) @@ -23,12 +26,12 @@ importers: ant-design-vue: specifier: ^4.1.1 version: 4.2.6(vue@3.5.13) - aos: - specifier: ^2.3.4 - version: 2.3.4 axios: specifier: ^1.6.2 version: 1.9.0 + element-plus: + specifier: ^2.9.11 + version: 2.9.11(vue@3.5.13) lucide-vue-next: specifier: ^0.507.0 version: 0.507.0(vue@3.5.13) @@ -107,6 +110,11 @@ packages: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -263,6 +271,15 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.7.0': + resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} + + '@floating-ui/dom@1.7.0': + resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -295,42 +312,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.1': resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} @@ -388,67 +399,56 @@ packages: resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.40.0': resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.40.0': resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.40.0': resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.40.0': resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.40.0': resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.40.0': resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.40.0': resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.40.0': resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.40.0': resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.40.0': resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} @@ -468,6 +468,9 @@ packages: '@simonwep/pickr@1.8.2': resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + '@tailwindcss/node@4.1.4': resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} @@ -506,28 +509,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.4': resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.4': resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.4': resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.4': resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} @@ -565,6 +564,15 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.17': + resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + '@unhead/dom@1.11.20': resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} @@ -621,20 +629,26 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + '@vueuse/head@2.0.0': resolution: {integrity: sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==} peerDependencies: vue: '>=2.7 || >=3' + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + ant-design-vue@4.2.6: resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} engines: {node: '>=12.22.0'} peerDependencies: vue: '>=3.2.0' - aos@2.3.4: - resolution: {integrity: sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==} - array-tree-filter@2.1.0: resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} @@ -659,9 +673,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - classlist-polyfill@1.2.0: - resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -701,6 +712,11 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + element-plus@2.9.11: + resolution: {integrity: sha512-x4L/6YC8de4JtuE3vpaEugJdQIeHQaHtIYKyk67IeF6dTIiVax45aX4nWOygnh+xX+0gTvL6xO+9BZhPA3G82w==} + peerDependencies: + vue: ^3.2.0 + enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} @@ -730,6 +746,9 @@ packages: engines: {node: '>=18'} hasBin: true + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -851,28 +870,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.29.2: resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.29.2: resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.29.2: resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.29.2: resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} @@ -893,11 +908,12 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -918,6 +934,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -941,6 +960,9 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + omit.js@2.0.2: resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} @@ -1150,6 +1172,10 @@ snapshots: '@ctrl/tinycolor@3.6.1': {} + '@element-plus/icons-vue@2.3.1(vue@3.5.13)': + dependencies: + vue: 3.5.13 + '@emotion/hash@0.9.2': {} '@emotion/unitless@0.8.1': {} @@ -1229,6 +1255,17 @@ snapshots: '@esbuild/win32-x64@0.25.3': optional: true + '@floating-ui/core@1.7.0': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.7.0': + dependencies: + '@floating-ui/core': 1.7.0 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@parcel/watcher-android-arm64@2.5.1': @@ -1357,6 +1394,8 @@ snapshots: core-js: 3.42.0 nanopop: 2.4.2 + '@sxzz/popperjs-es@2.11.7': {} + '@tailwindcss/node@4.1.4': dependencies: enhanced-resolve: 5.18.1 @@ -1424,6 +1463,14 @@ snapshots: '@types/estree@1.0.7': {} + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.17 + + '@types/lodash@4.17.17': {} + + '@types/web-bluetooth@0.0.16': {} + '@unhead/dom@1.11.20': dependencies: '@unhead/schema': 1.11.20 @@ -1513,6 +1560,16 @@ snapshots: '@vue/shared@3.5.13': {} + '@vueuse/core@9.13.0(vue@3.5.13)': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.13) + vue-demi: 0.14.10(vue@3.5.13) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/head@2.0.0(vue@3.5.13)': dependencies: '@unhead/dom': 1.11.20 @@ -1521,6 +1578,15 @@ snapshots: '@unhead/vue': 1.11.20(vue@3.5.13) vue: 3.5.13 + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@9.13.0(vue@3.5.13)': + dependencies: + vue-demi: 0.14.10(vue@3.5.13) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + ant-design-vue@4.2.6(vue@3.5.13): dependencies: '@ant-design/colors': 6.0.0 @@ -1547,12 +1613,6 @@ snapshots: vue-types: 3.0.2(vue@3.5.13) warning: 4.0.3 - aos@2.3.4: - dependencies: - classlist-polyfill: 1.2.0 - lodash.debounce: 4.0.8 - lodash.throttle: 4.1.1 - array-tree-filter@2.1.0: {} async-validator@4.2.5: {} @@ -1581,8 +1641,6 @@ snapshots: dependencies: readdirp: 4.1.2 - classlist-polyfill@1.2.0: {} - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -1612,6 +1670,27 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + element-plus@2.9.11(vue@3.5.13): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13) + '@floating-ui/dom': 1.7.0 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.17 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.13) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.13 + transitivePeerDependencies: + - '@vue/composition-api' + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 @@ -1662,6 +1741,8 @@ snapshots: '@esbuild/win32-ia32': 0.25.3 '@esbuild/win32-x64': 0.25.3 + escape-html@1.0.3: {} + estree-walker@2.0.2: {} fdir@6.4.4(picomatch@4.0.2): @@ -1787,9 +1868,11 @@ snapshots: lodash-es@4.17.21: {} - lodash.debounce@4.0.8: {} - - lodash.throttle@4.1.1: {} + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 lodash@4.17.21: {} @@ -1807,6 +1890,8 @@ snapshots: math-intrinsics@1.1.0: {} + memoize-one@6.0.0: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -1826,6 +1911,8 @@ snapshots: node-addon-api@7.1.1: optional: true + normalize-wheel-es@1.2.0: {} + omit.js@2.0.2: {} packrup@0.1.2: {} diff --git a/public/demo-img/1.jpg b/public/demo-img/1.jpg new file mode 100644 index 0000000..3fb3bcd Binary files /dev/null and b/public/demo-img/1.jpg differ diff --git a/public/demo-img/2.jpg b/public/demo-img/2.jpg new file mode 100644 index 0000000..cb9fc9d Binary files /dev/null and b/public/demo-img/2.jpg differ diff --git a/src/App.vue b/src/App.vue index 3602e60..c8e6bf7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,10 +1,274 @@ - - - +const router = useRouter(); + +// 全局状态 +const globalState = reactive({ + currentUser: JSON.parse(localStorage.getItem('currentUser') || 'null'), + cartItems: JSON.parse(localStorage.getItem('cart') || '[]'), + favorites: JSON.parse(localStorage.getItem('favorites') || '[]'), + + // 弹窗状态 + paymentModalVisible: false, + productDetailVisible: false, + cartVisible: false, + successModalVisible: false, + rechargeModalVisible: false, + registerModalVisible: false, + + // 弹窗数据 + selectedProduct: null, + paymentAmount: 0, + orderNumber: '', + + // 全局方法 + showPaymentModal: (amount) => { + globalState.paymentAmount = amount + globalState.paymentModalVisible = true + }, + + showProductDetail: (product) => { + globalState.selectedProduct = product + globalState.productDetailVisible = true + }, + + showCart: () => { + globalState.cartVisible = true + }, + + showRechargeModal: () => { + globalState.rechargeModalVisible = true + }, + + showRegisterModal: () => { + globalState.registerModalVisible = true + }, + + updateUser: (user) => { + globalState.currentUser = user + localStorage.setItem('currentUser', JSON.stringify(user)) + }, + + logout: () => { + globalState.currentUser = null + localStorage.removeItem('currentUser') + localStorage.removeItem('userToken') + ElMessage.success('已退出登录') + router.push('/') + } +}) + +// 购物车相关方法 +const handleAddToCart = (item) => { + const existingItem = globalState.cartItems.find(cartItem => + cartItem.productId === item.productId && + cartItem.color === item.color && + cartItem.size === item.size + ) + + if (existingItem) { + existingItem.quantity += item.quantity + } else { + globalState.cartItems.push(item) + } + + localStorage.setItem('cart', JSON.stringify(globalState.cartItems)) + ElMessage.success('已加入购物车') + globalState.cartVisible = true +} + +const handleBuyNow = (amount) => { + if (!globalState.currentUser) { + ElMessage.warning('请先登录') + router.push('/login') + return + } + globalState.showPaymentModal(amount) +} + +const handleCheckout = () => { + if (!globalState.currentUser) { + ElMessage.warning('请先登录') + router.push('/login') + return + } + const total = globalState.cartItems.reduce((sum, item) => sum + item.price * item.quantity, 0) + globalState.showPaymentModal(total) +} + +const handlePaymentConfirm = (paymentData) => { + setTimeout(() => { + globalState.orderNumber = 'TB' + Date.now() + + // 创建订单 + const order = { + id: globalState.orderNumber, + orderNumber: globalState.orderNumber, + items: [...globalState.cartItems], + totalAmount: globalState.paymentAmount, + paymentMethod: paymentData.method, + status: '已支付', + createTime: new Date().toISOString(), + userId: globalState.currentUser?.id + } + + let orders = JSON.parse(localStorage.getItem('orders') || '[]') + orders.unshift(order) + localStorage.setItem('orders', JSON.stringify(orders)) + + // 清空购物车 + globalState.cartItems = [] + localStorage.setItem('cart', JSON.stringify(globalState.cartItems)) + + globalState.paymentModalVisible = false + globalState.successModalVisible = true + + ElMessage.success('支付成功!') + // 新标签页前往 /result/success + window.open('/result/success', '_blank') + + }, 1000) +} + +const handleUpdateQuantity = (index, quantity) => { + if (quantity <= 0) { + globalState.cartItems.splice(index, 1) + } else { + globalState.cartItems[index].quantity = quantity + } + localStorage.setItem('cart', JSON.stringify(globalState.cartItems)) +} + +const handleRemoveItem = (index) => { + globalState.cartItems.splice(index, 1) + localStorage.setItem('cart', JSON.stringify(globalState.cartItems)) +} + +const handleViewOrder = () => { + globalState.successModalVisible = false + router.push('/orders') +} + +const handleRechargeConfirm = (amount) => { + if (globalState.currentUser) { + globalState.currentUser.balance = (parseFloat(globalState.currentUser.balance) + amount).toFixed(2) + globalState.updateUser(globalState.currentUser) + ElMessage.success('充值成功!') + } + globalState.rechargeModalVisible = false +} + +const handleRegisterConfirm = (userData) => { + const newUser = { + id: Date.now(), + username: userData.username, + email: userData.email, + avatar: 'https://cdn.seovx.com/ha/?mom=302&w=100&h=100', + balance: 100, + joinDate: new Date().toISOString(), + level: '新用户' + } + + globalState.updateUser(newUser) + globalState.registerModalVisible = false + ElMessage.success('注册成功!') +} + +// 提供全局状态 +provide('globalState', globalState) + + + \ No newline at end of file diff --git a/src/components/BannerCarousel.vue b/src/components/BannerCarousel.vue new file mode 100644 index 0000000..d44b2a8 --- /dev/null +++ b/src/components/BannerCarousel.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/src/components/CategoryMenu.vue b/src/components/CategoryMenu.vue new file mode 100644 index 0000000..46d8515 --- /dev/null +++ b/src/components/CategoryMenu.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/src/components/FlashSaleSection.vue b/src/components/FlashSaleSection.vue new file mode 100644 index 0000000..3a4b365 --- /dev/null +++ b/src/components/FlashSaleSection.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/components/PaymentModal.vue b/src/components/PaymentModal.vue new file mode 100644 index 0000000..82750cc --- /dev/null +++ b/src/components/PaymentModal.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/src/components/ProductCard.vue b/src/components/ProductCard.vue new file mode 100644 index 0000000..4f0baa2 --- /dev/null +++ b/src/components/ProductCard.vue @@ -0,0 +1,98 @@ + + + + + \ No newline at end of file diff --git a/src/components/ProductDetailModal.vue b/src/components/ProductDetailModal.vue new file mode 100644 index 0000000..b715438 --- /dev/null +++ b/src/components/ProductDetailModal.vue @@ -0,0 +1,721 @@ + + + + + diff --git a/src/components/ProductSection.vue b/src/components/ProductSection.vue new file mode 100644 index 0000000..f202c93 --- /dev/null +++ b/src/components/ProductSection.vue @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/src/components/RechargeModal.vue b/src/components/RechargeModal.vue new file mode 100644 index 0000000..96c0baf --- /dev/null +++ b/src/components/RechargeModal.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/components/RegisterModal.vue b/src/components/RegisterModal.vue new file mode 100644 index 0000000..e6cf5ed --- /dev/null +++ b/src/components/RegisterModal.vue @@ -0,0 +1,135 @@ + + + \ No newline at end of file diff --git a/src/components/ShoppingCartDrawer.vue b/src/components/ShoppingCartDrawer.vue new file mode 100644 index 0000000..c234b64 --- /dev/null +++ b/src/components/ShoppingCartDrawer.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/src/components/SuccessModal.vue b/src/components/SuccessModal.vue new file mode 100644 index 0000000..96c0baf --- /dev/null +++ b/src/components/SuccessModal.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/layouts/Footer.vue b/src/layouts/Footer.vue new file mode 100644 index 0000000..68d574b --- /dev/null +++ b/src/layouts/Footer.vue @@ -0,0 +1,56 @@ + + + \ No newline at end of file diff --git a/src/layouts/Header.vue b/src/layouts/Header.vue index 5dfaf00..82050ea 100644 --- a/src/layouts/Header.vue +++ b/src/layouts/Header.vue @@ -1,32 +1,260 @@ - - - +const router = useRouter() +const globalState = inject('globalState') + +const searchKeyword = ref('') +const showMobileMenu = ref(false) + +// const cartCount = computed(() => { +// return globalState.cartItems.reduce((total, item) => total + item.quantity, 0) +// }) +const cartCount = 1; +const mainNav = [ + { name: '首页', link: '/' }, + { name: '天猫超市', link: '/products?category=supermarket' }, + { name: '电器城', link: '/products?category=electronics' }, + { name: '美妆', link: '/products?category=beauty' }, + { name: '女装', link: '/products?category=women' }, + { name: '男装', link: '/products?category=men' }, + { name: '母婴', link: '/products?category=baby' }, + { name: '运动户外', link: '/products?category=sports' }, + { name: '数码家电', link: '/products?category=digital' } +] + +const mobileMenuItems = [ + { name: '首页', link: '/', icon: House }, + { name: '个人中心', link: '/profile', icon: User }, + { name: '我的订单', link: '/orders', icon: List }, + { name: '我的收藏', link: '/favorites', icon: Star }, + { name: '我的钱包', link: '/wallet', icon: Wallet } +] + +const performSearch = () => { + if (searchKeyword.value.trim()) { + router.push(`/products?search=${encodeURIComponent(searchKeyword.value)}`) + searchKeyword.value = '' + } +} + +const handleUserCommand = (command) => { + switch (command) { + case 'profile': + router.push('/profile') + break + case 'orders': + router.push('/orders') + break + case 'favorites': + router.push('/favorites') + break + case 'logout': + handleLogout() + break + } +} + +const handleLogout = () => { + globalState.logout() + showMobileMenu.value = false +} + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index efadd61..c78363c 100644 --- a/src/main.js +++ b/src/main.js @@ -5,6 +5,8 @@ import './style.css' import App from './App.vue' // 注册路由 import router from './router' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' const app = createApp(App) @@ -13,4 +15,5 @@ const app = createApp(App) app.use(createPinia()) app.use(router) app.use(Antd) +app.use(ElementPlus) app.mount('#app') diff --git a/src/router/index.js b/src/router/index.js index 796771d..a4b2cfe 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,15 +1,52 @@ -import { createRouter, createWebHistory } from 'vue-router' -import { useUserStore } from '@/stores/user' -import MainLayout from '@/layouts/Header.vue' +import { createRouter, createWebHistory } from "vue-router" +import HomePage from "@/views/index/index.vue" +import LoginPage from "@/views/login/LoginPage.vue" +import ProductListPage from "@/views/product/ProductListPage.vue" +import OrderListPage from "@/views/order/OrderListPage.vue" +import ProfilePage from "@/views/profile/ProfilePage.vue" -// 在路由配置中添加个人中心路由 const routes = [ { - path: '/', - component: MainLayout, - children: [ - { path: '', name: 'Home', component: () => import('@/views/index/index.vue') }, - ] + path: "/", + name: "Home", + component: HomePage, + meta: { title: "奶酪商城 - 首页" }, + }, + { + path: "/login", + name: "Login", + component: LoginPage, + meta: { title: "用户登录 - 奶酪商城" }, + }, + { + path: "/products", + name: "ProductList", + component: ProductListPage, + meta: { title: "商品列表 - 奶酪商城" }, + }, + { + path: "/orders", + name: "OrderList", + component: OrderListPage, + meta: { title: "我的订单 - 奶酪商城", requiresAuth: true }, + }, + { + path: "/profile", + name: "Profile", + component: ProfilePage, + meta: { title: "个人中心 - 奶酪商城", requiresAuth: true }, + }, + { + path: "/product/:id", + name: "ProductDetail", + component: () => import("@/views/product/ProductDetailPage.vue"), + meta: { title: "商品详情 - 奶酪商城" }, + }, + { + path: "/result/success", + name: "ResultSuccess", + component: () => import("@/views/result/Success.vue"), + meta: { title: "成功页面 - 奶酪商城" }, }, ] @@ -17,22 +54,31 @@ const router = createRouter({ history: createWebHistory(), routes, scrollBehavior(to, from, savedPosition) { - return savedPosition || { top: 0 } - } + if (savedPosition) { + return savedPosition + } else { + return { top: 0 } + } + }, }) -router.beforeEach((to, from) => { - const userStore = useUserStore() - if (to.meta.requiresAuth && !userStore.user) { - return { name: 'Login', query: { redirect: to.fullPath } } +// 路由守卫 +router.beforeEach((to, from, next) => { + // 设置页面标题 + if (to.meta.title) { + document.title = to.meta.title } + + // 检查是否需要登录 + if (to.meta.requiresAuth) { + const currentUser = JSON.parse(localStorage.getItem("currentUser") || "null") + if (!currentUser) { + next("/login") + return + } + } + + next() }) export default router - -router.beforeEach((to, from) => { - const userStore = useUserStore() - if (to.meta.requiresAuth && !userStore.user) { - return { name: 'Login', query: { redirect: to.fullPath } } - } -}) diff --git a/src/views/index/index.vue b/src/views/index/index.vue index 38bc235..88beb08 100644 --- a/src/views/index/index.vue +++ b/src/views/index/index.vue @@ -1,11 +1,275 @@ - - - +import CategoryMenu from '@/components/CategoryMenu.vue' +import BannerCarousel from '@/components/BannerCarousel.vue' +import FlashSaleSection from '@/components/FlashSaleSection.vue' +import ProductSection from '@/components/ProductSection.vue' + +const globalState = inject('globalState') + +// 倒计时状态 +const countdown = reactive({ + hours: '01', + minutes: '30', + seconds: '45' +}) + +let countdownInterval = null + +// 分类数据 +const categories = [ + { + id: 1, + name: '女装/男装', + subcategories: [ + { + name: '女装', + subItems: [ + { name: '连衣裙', id: 101 }, + { name: '女装T恤', id: 102 }, + { name: '女装外套', id: 103 }, + { name: '女装裤装', id: 104 } + ] + }, + { + name: '男装', + subItems: [ + { name: '男装衬衫', id: 201 }, + { name: '男装T恤', id: 202 }, + { name: '男装外套', id: 203 }, + { name: '男装裤装', id: 204 } + ] + } + ] + }, + { + id: 2, + name: '手机数码', + subcategories: [ + { + name: '手机通讯', + subItems: [ + { name: '手机', id: 301 }, + { name: '对讲机', id: 302 } + ] + }, + { + name: '数码配件', + subItems: [ + { name: '耳机', id: 401 }, + { name: '手表', id: 402 }, + { name: '充电器', id: 403 } + ] + } + ] + }, + { + id: 3, + name: '家用电器', + subcategories: [ + { + name: '大家电', + subItems: [ + { name: '电视', id: 501 }, + { name: '冰箱', id: 502 }, + { name: '洗衣机', id: 503 } + ] + }, + { + name: '小家电', + subItems: [ + { name: '电饭煲', id: 601 }, + { name: '微波炉', id: 602 }, + { name: '豆浆机', id: 603 } + ] + } + ] + } +] + +// 轮播图数据 +const banners = [ + 'https://cdn.seovx.com/ha/?mom=302&w=1200&h=400&_=1', + 'https://cdn.seovx.com/ha/?mom=302&w=1200&h=400&_=2', + 'https://cdn.seovx.com/ha/?mom=302&w=1200&h=400&_=3' +] + +// 商品数据 +const flashSaleProducts = ref([]) +const hotProducts = ref([]) +const newProducts = ref([]) +const premiumProducts = ref([]) +const recommendedProducts = ref([]) + +// 生成商品数据 +const generateProducts = (count) => { + const products = [] + const brands = ['时尚品牌', '优质品牌', '知名品牌', '国际品牌', '其他品牌'] + + for (let i = 0; i < count; i++) { + const basePrice = Math.floor(Math.random() * 500) + 20 + const randSum = (Math.random() * 10 + 1).toFixed(2) + const finalPrice = (basePrice + parseFloat(randSum)).toFixed(2) + + products.push({ + id: Math.floor(Math.random() * 10000) + i, + title: '夏季爆款连衣裙时尚修身显瘦新款女装', + price: finalPrice, + cover: `https://cdn.seovx.com/ha/?mom=302&w=800&h=800&_=${i}`, + images: [ + `https://cdn.seovx.com/ha/?mom=302&w=800&h=800&_=${i}1`, + `https://cdn.seovx.com/ha/?mom=302&w=800&h=800&_=${i}2` + ], + desc: '夏季爆款连衣裙时尚修身显瘦新款女装,采用优质面料,舒适透气', + sold: Math.floor(Math.random() * 9999) + 10, + brand: brands[Math.floor(Math.random() * brands.length)] + }) + } + return products +} + +// 处理商品点击 +const handleProductClick = (product) => { + // 添加到浏览历史 + if (globalState?.currentUser) { + addToBrowsingHistory(product) + } + globalState.showProductDetail(product) +} + +// 添加到浏览历史 +const addToBrowsingHistory = (product) => { + let history = JSON.parse(localStorage.getItem('browsingHistory') || '[]') + + // 移除已存在的相同商品 + history = history.filter(item => item.id !== product.id) + + // 添加到开头 + history.unshift({ + id: product.id, + title: product.title, + price: product.price, + cover: product.cover, + viewTime: new Date().toISOString() + }) + + // 保持最多50条记录 + if (history.length > 50) { + history = history.slice(0, 50) + } + + localStorage.setItem('browsingHistory', JSON.stringify(history)) +} + +// 启动倒计时 +const startCountdown = () => { + let totalSeconds = 1 * 3600 + 30 * 60 + 45 // 1小时30分45秒 + + countdownInterval = setInterval(() => { + if (totalSeconds <= 0) { + totalSeconds = 2 * 3600 // 重置为2小时 + } + + const hours = Math.floor(totalSeconds / 3600) + const minutes = Math.floor((totalSeconds % 3600) / 60) + const seconds = totalSeconds % 60 + + countdown.hours = String(hours).padStart(2, '0') + countdown.minutes = String(minutes).padStart(2, '0') + countdown.seconds = String(seconds).padStart(2, '0') + + totalSeconds-- + }, 1000) +} + +onMounted(() => { + // 生成商品数据 + flashSaleProducts.value = generateProducts(4) + hotProducts.value = generateProducts(5) + newProducts.value = generateProducts(5) + premiumProducts.value = generateProducts(5) + recommendedProducts.value = generateProducts(10) + + // 启动倒计时 + startCountdown() +}) + +onUnmounted(() => { + if (countdownInterval) { + clearInterval(countdownInterval) + } +}) + \ No newline at end of file diff --git a/src/views/login/LoginPage.vue b/src/views/login/LoginPage.vue new file mode 100644 index 0000000..e86a087 --- /dev/null +++ b/src/views/login/LoginPage.vue @@ -0,0 +1,253 @@ + + + + + \ No newline at end of file diff --git a/src/views/order/OrderListPage.vue b/src/views/order/OrderListPage.vue new file mode 100644 index 0000000..07b3e9b --- /dev/null +++ b/src/views/order/OrderListPage.vue @@ -0,0 +1,588 @@ + + + + + diff --git a/src/views/product/ProductDetailPage-dev.vue b/src/views/product/ProductDetailPage-dev.vue new file mode 100644 index 0000000..8a5fe8a --- /dev/null +++ b/src/views/product/ProductDetailPage-dev.vue @@ -0,0 +1,841 @@ + + + + + diff --git a/src/views/product/ProductDetailPage-old.vue b/src/views/product/ProductDetailPage-old.vue new file mode 100644 index 0000000..6c23795 --- /dev/null +++ b/src/views/product/ProductDetailPage-old.vue @@ -0,0 +1,761 @@ + + + + + diff --git a/src/views/product/ProductDetailPage.vue b/src/views/product/ProductDetailPage.vue new file mode 100644 index 0000000..2af1964 --- /dev/null +++ b/src/views/product/ProductDetailPage.vue @@ -0,0 +1,922 @@ + + + + + diff --git a/src/views/product/ProductListPage.vue b/src/views/product/ProductListPage.vue new file mode 100644 index 0000000..a152f2f --- /dev/null +++ b/src/views/product/ProductListPage.vue @@ -0,0 +1,414 @@ + + + + + diff --git a/src/views/profile/ProfilePage.vue b/src/views/profile/ProfilePage.vue new file mode 100644 index 0000000..02d7ebd --- /dev/null +++ b/src/views/profile/ProfilePage.vue @@ -0,0 +1,489 @@ + + + + + diff --git a/src/views/result/Success.vue b/src/views/result/Success.vue new file mode 100644 index 0000000..9577c78 --- /dev/null +++ b/src/views/result/Success.vue @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index df31b24..be94915 100644 --- a/vite.config.js +++ b/vite.config.js @@ -15,7 +15,7 @@ export default defineConfig({ } }, server: { - port: 8888, + port: 8000, proxy: { '/api': { // target: 'http://127.0.0.1:18007/api/',