优化前端结构,完成主页

main
abab2320 2 months ago
parent 1d05a6a2fd
commit 8bf952c8ad

@ -21,6 +21,7 @@
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue": "^5.2.1",
"@vue/tsconfig": "^0.7.0", "@vue/tsconfig": "^0.7.0",
"sass-embedded": "^1.88.0",
"typescript": "~5.7.2", "typescript": "~5.7.2",
"vite": "^6.2.0", "vite": "^6.2.0",
"vue-tsc": "^2.2.4" "vue-tsc": "^2.2.4"

@ -35,16 +35,19 @@ importers:
devDependencies: devDependencies:
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^5.2.1 specifier: ^5.2.1
version: 5.2.1(vite@6.2.2)(vue@3.5.13(typescript@5.7.3)) version: 5.2.1(vite@6.2.2(sass-embedded@1.88.0))(vue@3.5.13(typescript@5.7.3))
'@vue/tsconfig': '@vue/tsconfig':
specifier: ^0.7.0 specifier: ^0.7.0
version: 0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) version: 0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
sass-embedded:
specifier: ^1.88.0
version: 1.88.0
typescript: typescript:
specifier: ~5.7.2 specifier: ~5.7.2
version: 5.7.3 version: 5.7.3
vite: vite:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.2 version: 6.2.2(sass-embedded@1.88.0)
vue-tsc: vue-tsc:
specifier: ^2.2.4 specifier: ^2.2.4
version: 2.2.8(typescript@5.7.3) version: 2.2.8(typescript@5.7.3)
@ -68,6 +71,9 @@ packages:
resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@bufbuild/protobuf@2.4.0':
resolution: {integrity: sha512-RN9M76x7N11QRihKovEglEjjVCQEA9PRBVnDgk9xw8JHLrcUrp4FpAVSPSH91cNbcTft3u2vpLN4GMbiKY9PJw==}
'@ctrl/tinycolor@3.6.1': '@ctrl/tinycolor@3.6.1':
resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -458,10 +464,16 @@ packages:
brace-expansion@2.0.1: brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
buffer-builder@0.2.0:
resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==}
call-bind-apply-helpers@1.0.2: call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
colorjs.io@0.5.2:
resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
combined-stream@1.0.8: combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@ -556,6 +568,10 @@ packages:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
has-symbols@1.1.0: has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -575,6 +591,9 @@ packages:
hookable@5.5.3: hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
immutable@5.1.2:
resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==}
is-what@4.1.16: is-what@4.1.16:
resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
engines: {node: '>=12.13'} engines: {node: '>=12.13'}
@ -655,6 +674,134 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
sass-embedded-android-arm64@1.88.0:
resolution: {integrity: sha512-YVdxVywlbXH74uomIcRsYLHF1644V+0per6YrfZndWicjfYnWqgbGq1xixdOzLxe3vac90RlsRNxTEb0VWlhmA==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [android]
sass-embedded-android-arm@1.88.0:
resolution: {integrity: sha512-jveGkHhHxJ2+GnNxl3OyhZAxR8YXJCSuj7JYzoVuFTxlsaFqFQwtUrvZro61xOVOrwfe8xMk2HE3ZEw6dolhBA==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [android]
sass-embedded-android-ia32@1.88.0:
resolution: {integrity: sha512-6C4o+lGFsYcUPGtCvOdFhFLQl1rrcBUNuC4DILDayI4bZeh3Y2CjonzCT4VNKPsOm7LFGf0OKQAZm+3/oXVIKg==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [android]
sass-embedded-android-riscv64@1.88.0:
resolution: {integrity: sha512-zW1NmFHwPkBBg8wqVu8e5uCKeuTSk8vasB5BBEPvQubj4tWbgxrXGIVrQyseeGXJJQYSzjNiq3ua4qNoadBWJA==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [android]
sass-embedded-android-x64@1.88.0:
resolution: {integrity: sha512-b33Ja8sU67CcWCX9C3M+k8AcWXOb9uhyUJuKg/2hb/RhKUqBRCpMtQhsChpV7/DyXvyevLeosy28j673qNfnuQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [android]
sass-embedded-darwin-arm64@1.88.0:
resolution: {integrity: sha512-Zu+A4OzoFtZwTlcXn66ovZRTI9Ia610KJbtJBrpsXPfqR9QcCg7pPDB/zlPK5E5xFjsxGWaL0tICOifim1HCMg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [darwin]
sass-embedded-darwin-x64@1.88.0:
resolution: {integrity: sha512-nZ+/j5Z4llLejNyFcLUWJvbU3WNJDKiyZ7W+Hpn/52dDhzHiNWRVHH7humfzCEgLXZctPZlr56ubaNk/RsoSlA==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [darwin]
sass-embedded-linux-arm64@1.88.0:
resolution: {integrity: sha512-aphDl0Z4Y+YpPAqT0fEDDxZfrTXS/v36IRpGpVcbuRIua/iHd9L3wrZuwco1nbbY+sShFNiXPE1A9/k/ZGt8rw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
sass-embedded-linux-arm@1.88.0:
resolution: {integrity: sha512-bjiTZ4MNvArReXgwnA56mT3i+vHH3BgkLQT3qVwRv6fVTPQpYopK8D/QzQKbrVGYKgzWPYzZfksSQFC9lzM2yA==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
sass-embedded-linux-ia32@1.88.0:
resolution: {integrity: sha512-m+pQMD14JQeMlQ/J8vQxHXwAQPAcfLG034BQz05a8ahXmNrk9qJkrC7FLptDlhsJ6weldX54UvXceoSpw2VsxQ==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [linux]
sass-embedded-linux-musl-arm64@1.88.0:
resolution: {integrity: sha512-Wxo9qklXqw+eYFHLo+uE9r9sbK/xklMt6xPU/HXs+ikoJcGtmugE7KRyyWeSfvPTi8jZvgfkFfNDZD9elzxEFA==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
sass-embedded-linux-musl-arm@1.88.0:
resolution: {integrity: sha512-jGRZZYP8XOiE521Pep2u9ktx1FFkLHosjO7Dj/0pvjwUddBVT16jE40gv9pqtTynG0saD8jokqdkqJ+FM3NJzA==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
sass-embedded-linux-musl-ia32@1.88.0:
resolution: {integrity: sha512-utdTihiPCCP5HdKqwblQQWz864c7CqSplSGQ+p06GS+0ZfnuB/SKhtwe8fd11v4+IN8S2o0HAQ5KtWmRmk3eTA==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [linux]
sass-embedded-linux-musl-riscv64@1.88.0:
resolution: {integrity: sha512-P8XB7QVSU8KJry4oxegzAnuFVWjbHc/JCHgF2ktq2dURVyxcaKDfQZtzbUgiPOKP/R6MZIFhXaJVJIhppcruEQ==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
sass-embedded-linux-musl-x64@1.88.0:
resolution: {integrity: sha512-OGEfD6AAm68vZTazFkIN7Dsu0ZQY983GZU+mWE9zZPLTIBzvNrrEZrEE/mpM6LemkwbqR+GaFP6rxGrkDz0Mhw==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
sass-embedded-linux-riscv64@1.88.0:
resolution: {integrity: sha512-3hBlfq4bXx0RkkNxvw/FPZSmUC1GMU8NE1Ef+2dJowxAeneRotHy5WXZIMKvH7NGpskf7U8ButK05U3OxPzrTA==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
sass-embedded-linux-x64@1.88.0:
resolution: {integrity: sha512-FzM5mCxkFE20efDDSPO5N5o0ZKPqs51zowt2JAe5tdAzmy/jUQ0t515tph40dV2mfX0flBJgoou76gZKhylHGg==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
sass-embedded-win32-arm64@1.88.0:
resolution: {integrity: sha512-Zp3yNEzk/gCCBIClQx8ihAGZ1YqPbjWjTnLWtruS9FcVrkrSAIjhqaesoN1Hy61aaIoiRektOyeffHH54jiQ3g==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [win32]
sass-embedded-win32-ia32@1.88.0:
resolution: {integrity: sha512-yUmD6BLb01ngw/gy+FcTdsCMFaoONGFYJcy6FhMr2OOcCHNjPVD+HqTF4ZRsLNbwna8PlP6XxHFzjPKzVw18xw==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [win32]
sass-embedded-win32-x64@1.88.0:
resolution: {integrity: sha512-j4pOP/S9vD4enRqbfwno07Xx+j0RkfVYGV31ZxzAIF+a1+3dDBlsbwgDNP68XemJx5SjpP8yM8the6nHAnMUiQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [win32]
sass-embedded@1.88.0:
resolution: {integrity: sha512-GQUxgZFuej3NZ1TSPUHU8aebtYdnIeXqYsbNEEKBtE+SC7/Gr18KH1ijTAZHPw25OUfQCdtJaRy6Fo866dHmgw==}
engines: {node: '>=16.0.0'}
hasBin: true
source-map-js@1.2.1: source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -667,12 +814,27 @@ packages:
resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
engines: {node: '>=16'} engines: {node: '>=16'}
supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
sync-child-process@1.0.2:
resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
engines: {node: '>=16.0.0'}
sync-message-port@1.1.3:
resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==}
engines: {node: '>=16.0.0'}
tiny-case@1.0.3: tiny-case@1.0.3:
resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
toposort@2.0.2: toposort@2.0.2:
resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
type-fest@2.19.0: type-fest@2.19.0:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'} engines: {node: '>=12.20'}
@ -686,6 +848,9 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
vee-validate@4.15.0: vee-validate@4.15.0:
resolution: {integrity: sha512-PGJh1QCFwCBjbHu5aN6vB8macYVWrajbDvgo1Y/8fz9n/RVIkLmZCJDpUgu7+mUmCOPMxeyq7vXUOhbwAqdXcA==} resolution: {integrity: sha512-PGJh1QCFwCBjbHu5aN6vB8macYVWrajbDvgo1Y/8fz9n/RVIkLmZCJDpUgu7+mUmCOPMxeyq7vXUOhbwAqdXcA==}
peerDependencies: peerDependencies:
@ -782,6 +947,8 @@ snapshots:
'@babel/helper-string-parser': 7.25.9 '@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9 '@babel/helper-validator-identifier': 7.25.9
'@bufbuild/protobuf@2.4.0': {}
'@ctrl/tinycolor@3.6.1': {} '@ctrl/tinycolor@3.6.1': {}
'@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))': '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))':
@ -945,9 +1112,9 @@ snapshots:
'@types/web-bluetooth@0.0.16': {} '@types/web-bluetooth@0.0.16': {}
'@vitejs/plugin-vue@5.2.1(vite@6.2.2)(vue@3.5.13(typescript@5.7.3))': '@vitejs/plugin-vue@5.2.1(vite@6.2.2(sass-embedded@1.88.0))(vue@3.5.13(typescript@5.7.3))':
dependencies: dependencies:
vite: 6.2.2 vite: 6.2.2(sass-embedded@1.88.0)
vue: 3.5.13(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3)
'@volar/language-core@2.4.12': '@volar/language-core@2.4.12':
@ -1100,11 +1267,15 @@ snapshots:
dependencies: dependencies:
balanced-match: 1.0.2 balanced-match: 1.0.2
buffer-builder@0.2.0: {}
call-bind-apply-helpers@1.0.2: call-bind-apply-helpers@1.0.2:
dependencies: dependencies:
es-errors: 1.3.0 es-errors: 1.3.0
function-bind: 1.1.2 function-bind: 1.1.2
colorjs.io@0.5.2: {}
combined-stream@1.0.8: combined-stream@1.0.8:
dependencies: dependencies:
delayed-stream: 1.0.0 delayed-stream: 1.0.0
@ -1231,6 +1402,8 @@ snapshots:
gopd@1.2.0: {} gopd@1.2.0: {}
has-flag@4.0.0: {}
has-symbols@1.1.0: {} has-symbols@1.1.0: {}
has-tostringtag@1.0.2: has-tostringtag@1.0.2:
@ -1245,6 +1418,8 @@ snapshots:
hookable@5.5.3: {} hookable@5.5.3: {}
immutable@5.1.2: {}
is-what@4.1.16: {} is-what@4.1.16: {}
lodash-es@4.17.21: {} lodash-es@4.17.21: {}
@ -1326,6 +1501,102 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.35.0 '@rollup/rollup-win32-x64-msvc': 4.35.0
fsevents: 2.3.3 fsevents: 2.3.3
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
sass-embedded-android-arm64@1.88.0:
optional: true
sass-embedded-android-arm@1.88.0:
optional: true
sass-embedded-android-ia32@1.88.0:
optional: true
sass-embedded-android-riscv64@1.88.0:
optional: true
sass-embedded-android-x64@1.88.0:
optional: true
sass-embedded-darwin-arm64@1.88.0:
optional: true
sass-embedded-darwin-x64@1.88.0:
optional: true
sass-embedded-linux-arm64@1.88.0:
optional: true
sass-embedded-linux-arm@1.88.0:
optional: true
sass-embedded-linux-ia32@1.88.0:
optional: true
sass-embedded-linux-musl-arm64@1.88.0:
optional: true
sass-embedded-linux-musl-arm@1.88.0:
optional: true
sass-embedded-linux-musl-ia32@1.88.0:
optional: true
sass-embedded-linux-musl-riscv64@1.88.0:
optional: true
sass-embedded-linux-musl-x64@1.88.0:
optional: true
sass-embedded-linux-riscv64@1.88.0:
optional: true
sass-embedded-linux-x64@1.88.0:
optional: true
sass-embedded-win32-arm64@1.88.0:
optional: true
sass-embedded-win32-ia32@1.88.0:
optional: true
sass-embedded-win32-x64@1.88.0:
optional: true
sass-embedded@1.88.0:
dependencies:
'@bufbuild/protobuf': 2.4.0
buffer-builder: 0.2.0
colorjs.io: 0.5.2
immutable: 5.1.2
rxjs: 7.8.2
supports-color: 8.1.1
sync-child-process: 1.0.2
varint: 6.0.0
optionalDependencies:
sass-embedded-android-arm: 1.88.0
sass-embedded-android-arm64: 1.88.0
sass-embedded-android-ia32: 1.88.0
sass-embedded-android-riscv64: 1.88.0
sass-embedded-android-x64: 1.88.0
sass-embedded-darwin-arm64: 1.88.0
sass-embedded-darwin-x64: 1.88.0
sass-embedded-linux-arm: 1.88.0
sass-embedded-linux-arm64: 1.88.0
sass-embedded-linux-ia32: 1.88.0
sass-embedded-linux-musl-arm: 1.88.0
sass-embedded-linux-musl-arm64: 1.88.0
sass-embedded-linux-musl-ia32: 1.88.0
sass-embedded-linux-musl-riscv64: 1.88.0
sass-embedded-linux-musl-x64: 1.88.0
sass-embedded-linux-riscv64: 1.88.0
sass-embedded-linux-x64: 1.88.0
sass-embedded-win32-arm64: 1.88.0
sass-embedded-win32-ia32: 1.88.0
sass-embedded-win32-x64: 1.88.0
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
speakingurl@14.0.1: {} speakingurl@14.0.1: {}
@ -1334,29 +1605,44 @@ snapshots:
dependencies: dependencies:
copy-anything: 3.0.5 copy-anything: 3.0.5
supports-color@8.1.1:
dependencies:
has-flag: 4.0.0
sync-child-process@1.0.2:
dependencies:
sync-message-port: 1.1.3
sync-message-port@1.1.3: {}
tiny-case@1.0.3: {} tiny-case@1.0.3: {}
toposort@2.0.2: {} toposort@2.0.2: {}
tslib@2.8.1: {}
type-fest@2.19.0: {} type-fest@2.19.0: {}
type-fest@4.37.0: {} type-fest@4.37.0: {}
typescript@5.7.3: {} typescript@5.7.3: {}
varint@6.0.0: {}
vee-validate@4.15.0(vue@3.5.13(typescript@5.7.3)): vee-validate@4.15.0(vue@3.5.13(typescript@5.7.3)):
dependencies: dependencies:
'@vue/devtools-api': 7.7.2 '@vue/devtools-api': 7.7.2
type-fest: 4.37.0 type-fest: 4.37.0
vue: 3.5.13(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3)
vite@6.2.2: vite@6.2.2(sass-embedded@1.88.0):
dependencies: dependencies:
esbuild: 0.25.1 esbuild: 0.25.1
postcss: 8.5.3 postcss: 8.5.3
rollup: 4.35.0 rollup: 4.35.0
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
sass-embedded: 1.88.0
vscode-uri@3.1.0: {} vscode-uri@3.1.0: {}

@ -1,11 +1,23 @@
<script setup lang="ts">
</script>
<template> <template>
<HeaderBar/>
<router-view/> <router-view/>
</template> </template>
<style scoped> <script setup lang="ts">
import HeaderBar from './components/HeaderBar.vue'
</script>
<style>
/* 设置 body 背景渐变,清除异常布局设置 */
body{
height: 100%;
width:100%;
/*弹性布局,水平垂直居中*/
justify-content: center;
align-items: center;
/*渐变背景*/
background: linear-gradient(200deg, #f3e7e9, #e3eeff);
}
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

@ -0,0 +1,118 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border:none;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
cursor: pointer;
transition: border-color 0.25s;
}
/*除了LogPage以外的按钮尽量使用这里的样式*/
.btn {
outline:none;
padding: 10px 24px;
margin:10px;
border: none;
border-radius: 25px;
cursor: pointer;
font-size: 1rem;
font-weight: 500;
transition: all 0.3s ease;
background-color: #fff;
}
.btn-primary {
background-color: #9370DB;
color: white;
box-shadow: 0 4px 10px rgba(147, 112, 219, 0.3);
}
.btn-primary:hover {
background-color: #8a63d2;
transform: translateY(-2px);
}
.btn-secondary {
background-color: #e6e6fa;
color: #666;
box-shadow: 0 4px 10px rgba(230, 230, 250, 0.3);
}
.btn-secondary:hover {
background-color: #dcdcdc;
transform: translateY(-2px);
}
/*信息展示在card上*/
.card {
background-color: #fff;
border-radius: 20px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
}
#app {
width: 100vw;
height: 100vh;
min-height: 100vh;
min-width: 100vw;
position: relative;
display: flex;
justify-content:center;
align-items:center;
flex-direction: column;
box-sizing: border-box;
overflow:auto;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

@ -0,0 +1,25 @@
<script setup lang="ts">
const images = [
new URL('@/assets/logo-carousel/1.jpeg', import.meta.url).href,
new URL('@/assets/logo-carousel/2.png', import.meta.url).href,
new URL('@/assets/logo-carousel/3.jpg', import.meta.url).href
]
</script>
<template>
<el-carousel :interval="3000" height="300px" arrow="hover">
<el-carousel-item v-for="(img, i) in images" :key="i">
<img :src="img" class="carousel-img" />
</el-carousel-item>
</el-carousel>
</template>
<style scoped>
.carousel-img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 8px;
}
</style>

@ -0,0 +1,101 @@
<script setup>
import { House, Cloudy, User, Cpu, Message, HomeFilled, MessageBox, Calendar } from '@element-plus/icons-vue'
import {useRoute} from 'vue-router'
const route = useRoute();
</script>
<template>
<header class ="header-bar" >
<!-- 左侧图标组 -->
<div class="left-icons">
<router-link to="/unilifeHome" class="icon-btn" title="首页">
<el-icon class="icon-btn" :size="24">
<HomeFilled />
</el-icon>
</router-link>
<router-link to="/cloud" class="icon-btn" title="资料分享">
<el-icon class="icon-btn" :size="24">
<MessageBox />
</el-icon>
</router-link>
<router-link to="/self" class="icon-btn" title="日程">
<el-icon class = "icon-btn" :size="24">
<Calendar />
</el-icon>
</router-link>
<router-link to="/assistant" class="icon-btn" title="AI助手">
<el-icon class = "icon-btn" :size="24">
<Cpu />
</el-icon>
</router-link>
</div>
<!-- 右侧部分 -->
<div class="right-section">
<router-link to="/message" class="icon-btn" title="消息">
<Message size="24" />
</router-link>
<router-link to="/personal" class="user-entry" title="个人主页">
<span>个人主页</span>
</router-link>
<router-link to="/log" class="icon-btn" title="登录">
<el-icon class = "icon-btn" :size="24">
<User />
</el-icon>
</router-link>
</div>
</header>
</template>
<style scoped>
.header-bar {
height: 70px;
width: 100%;
background: #ead1fb;
position:absolute;
top: 0;
left:0;
padding:0;
margin:0;
display: flex;
align-items: center;
justify-content: space-between;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
z-index: 10000;
}
.header-bar--personal {
background: linear-gradient(to top, #c9e4ff, #fad0c4);
}
.left-icons,
.right-section {
padding:50px;
display: flex;
align-items: center;
}
.icon-btn {
margin: 0 10px;
color: #606266;
cursor: pointer;
transition: transform 0.2s;
}
.icon-btn:hover {
transform: scale(1.1);
color: #409EFF;
}
.user-entry {
margin-left: 12px;
font-weight: 600;
color: #303133;
cursor: pointer;
}
</style>

@ -0,0 +1,26 @@
<script setup lang="ts">
defineProps<{ title: string; link: string }>()
</script>
<template>
<router-link :to="link" class="hot-topic-item">
{{ title }}
</router-link>
</template>
<style lang="scss" scoped>
.hot-topic-item {
display: block;
background-color: #fbefff;
border-radius: 8px;
padding: 10px;
margin-bottom: 8px;
color: #333;
text-decoration: none;
&:hover {
background-color: #e4d4ff;
}
}
</style>

@ -1,24 +0,0 @@
<script lang="ts">
import Personal from './Personal/Personal.vue'
import { defineComponent } from "vue";
export default defineComponent({
name:'PersonalLayout',
components:{
Personal
}
});
</script>
<template>
<div>
<Personal/>
<div>
<router-view/>
</div>
</div>
</template>
<style scoped>
</style>

@ -1,12 +1,12 @@
<script set lang="ts"> <script set lang="ts">
import { defineComponent,ref } from 'vue'; import { defineComponent,ref } from 'vue';
import { useRouter } from 'vue-router'; import { useRouter,useRoute } from 'vue-router';
const router = useRouter();
export default defineComponent({ export default defineComponent({
name: 'Personal', name: 'Personal',
setup(){ setup(){
const router = useRouter();
const route = useRoute();
// `li` // `li`
const activeIndex = ref<number>(0); const activeIndex = ref<number>(0);
@ -17,7 +17,9 @@ export default defineComponent({
return { return {
activeIndex, activeIndex,
setActive router,
route,
setActive,
}; };
} }
}); });
@ -27,51 +29,51 @@ export default defineComponent({
<router-view/> <router-view/>
<div class = "shell"> <div class = "shell">
<ul class="nav"> <ul class="nav">
<li :class="{active: activeIndex == 0}" @click ="setActive(0)" id = "avatar"> <li :class="{active: route.name === 'Home'}" @click ="setActive(0)" id = "avatar">
<router-link :to="{name:'Home'}"> <router-link :to="{name:'Home'}">
<div class="icon"> <div class="icon">
<div class="imageBox"> <div class="imageBox">
<img src="../../../public/images/默认头像.jpg"> <img src="@/assets/images/默认头像.jpg">
</div> </div>
</div> </div>
<div class="text">测试样例</div> <div class="text">测试样例</div>
</router-link> </router-link>
</li> </li>
<li :class="{active:activeIndex === 1}" @click="setActive(1)"> <li :class="{active:route.name === 'Manager'}" @click="setActive(1)">
<router-link :to="{name:'Manager'}"> <router-link :to="{name:'Manager'}">
<div class="icon"> <div class="icon">
<div class="imageBox"> <div class="imageBox">
<img src="../../../public/images/个人.png"> <img src="@/assets/images/个人.png">
</div> </div>
</div> </div>
<div class="text">账号管理</div> <div class="text">账号管理</div>
</router-link> </router-link>
</li> </li>
<li :class="{active:activeIndex === 2}" @click="setActive(2)"> <li :class="{active:route.name === 'AiManger'}" @click="setActive(2)">
<router-link :to="{name:'Manager'}"> <router-link :to="{name:'Manager'}">
<div class="icon"> <div class="icon">
<div class="imageBox"> <div class="imageBox">
<img src="../../../public/images/个人.png"> <img src="@/assets/images/个人.png">
</div> </div>
</div> </div>
<div class="text">测试样例2</div> <div class="text">测试样例2</div>
</router-link> </router-link>
</li> </li>
<li :class="{active:activeIndex === 3}" @click="setActive(3)"> <li :class="{active:route.name === 'AiManager'}" @click="setActive(3)">
<router-link :to="{name:'Manager'}"> <router-link :to="{name:'Manager'}">
<div class="icon"> <div class="icon">
<div class="imageBox"> <div class="imageBox">
<img src="../../../public/images/个人.png"> <img src="@/assets/images/个人.png">
</div> </div>
</div> </div>
<div class="text">测试样例3</div> <div class="text">测试样例3</div>
</router-link> </router-link>
</li> </li>
<li :class="{active:activeIndex === 4}" @click="setActive(4)"> <li :class="{active:route.name === 'AiManager'}" @click="setActive(4)">
<router-link :to="{name:'Manager'}"> <router-link :to="{name:'Manager'}">
<div class="icon"> <div class="icon">
<div class="imageBox"> <div class="imageBox">
<img src="../../../public/images/个人.png"> <img src="@/assets/images/个人.png">
</div> </div>
</div> </div>
<div class="text">测试样例4</div> <div class="text">测试样例4</div>
@ -141,7 +143,7 @@ export default defineComponent({
.shell ul li{ .shell ul li{
position:relative; position:relative;
padding:5px; padding:7px;
} }
.active{ .active{
@ -175,7 +177,7 @@ export default defineComponent({
} }
#avatar{ #avatar{
margin:40px 0 100px 0; margin:100px 0 100px 0;
} }
.shell ul li a{ .shell ul li a{

@ -0,0 +1,41 @@
<script setup lang="ts">
defineProps<{
post: {
title: string
tags: string[]
excerpt: string
link: string
}
}>()
</script>
<template>
<router-link :to="post.link" class="post-card">
<h3>{{ post.title }}</h3>
<div class="tags">
<el-tag v-for="(tag, i) in post.tags" :key="i" type="info">{{ tag }}</el-tag>
</div>
<p>{{ post.excerpt }}</p>
</router-link>
</template>
<style lang="scss" scoped>
.post-card {
display: block;
padding: 16px;
background: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
transition: transform 0.2s;
color: inherit;
text-decoration: none;
&:hover {
transform: translateY(-2px);
}
.tags {
margin: 8px 0;
}
}
</style>

@ -0,0 +1,19 @@
<script setup lang="ts">
</script>
<template>
<div class="schedule-placeholder">
<p>此处预留今日行程组件位置</p>
</div>
</template>
<style scoped>
.schedule-placeholder {
background: #f5f0ff;
border-radius: 8px;
padding: 16px;
min-height: 200px;
text-align: center;
color: #999;
}
</style>

@ -1,9 +1,9 @@
import { createApp } from 'vue' import { createApp } from 'vue'
import './style.css' import '@/assets/style/style.css'
import App from './App.vue' import App from './App.vue'
import ElementPlus from 'element-plus' import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css' import 'element-plus/dist/index.css'
import router from './routers' import router from './routers/routers'
import * as ElementPlusIconsVue from '@element-plus/icons-vue' import * as ElementPlusIconsVue from '@element-plus/icons-vue'
const app = createApp(App) const app = createApp(App)

@ -1,12 +1,21 @@
import type { RouteRecord, RouteRecordRaw } from 'vue-router'; import type { RouteRecord, RouteRecordRaw } from 'vue-router';
import { createWebHashHistory, createRouter,createWebHistory } from 'vue-router'; import { createWebHashHistory, createRouter,createWebHistory } from 'vue-router';
import LogPage from './components/LogPage.vue'; import LogPage from '../views/LogPage.vue';
import Personal from './components/Personal/Personal.vue' import Personal from '@/components/Personal.vue';
import Manager from './components/Personal/AcountManager.vue'; import Manager from '@/views/AcountManager.vue';
import PersonalLayout from './components/PersonLayout.vue' import PersonalHome from '@/views/Home.vue';
import PersonalHome from './components/Personal/Home.vue' import ForumHome from '@/views/ForumHome.vue';
const routes:Array<RouteRecordRaw> = [ const routes:Array<RouteRecordRaw> = [
{
path: '/',
redirect: '/log',
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('@/views/404.vue'),
},
{ {
path:'/log', path:'/log',
name: 'LogPage', name: 'LogPage',
@ -27,12 +36,16 @@ const routes:Array<RouteRecordRaw> = [
name: 'Manager', name: 'Manager',
component:Manager, component:Manager,
}, },
{
path:'ai',
redirect: '/personal',
},
] ]
}, },
{ {
path:"/personalLayout", path:'/uniLifeHome',
name:'Personallayout', name: 'ForumHome',
component:PersonalLayout, component: ForumHome,
} }
]; ];

@ -1,79 +0,0 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

@ -0,0 +1,44 @@
<template>
<div class="not-found-container">
<el-icon class="not-found-icon"><Warning /></el-icon>
<h1>404 - 页面未找到</h1>
<p>你访问的页面不存在可能是链接失效或地址错误</p>
<button class = "btn btn-primary" @click="goHome"></button>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
import { Warning } from '@element-plus/icons-vue'
const router = useRouter()
const goHome = () => {
router.push('/') // '/log'
}
</script>
<style scoped>
.not-found-container {
height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
.not-found-icon {
font-size: 64px;
color: #b19cd9;
margin-bottom: 20px;
}
h1 {
margin-bottom: 10px;
}
p {
margin-bottom: 30px;
}
</style>

@ -2,9 +2,9 @@
import { defineComponent, ref, nextTick ,watch,onMounted} from 'vue'; import { defineComponent, ref, nextTick ,watch,onMounted} from 'vue';
import{useForm,useField,Form} from 'vee-validate'; import{useForm,useField,Form} from 'vee-validate';
import * as yup from 'yup'; import * as yup from 'yup';
import request from '../../utils/request'; import request from '@/utils/request';
import { useGetDerivedNamespace ,ElMessage} from 'element-plus'; import { useGetDerivedNamespace ,ElMessage} from 'element-plus';
import { useEmailCode } from '../useEmailCode'; import { useEmailCode } from '@/components/useEmailCode';
export default defineComponent({ export default defineComponent({
name: 'Manager', name: 'Manager',
@ -19,7 +19,7 @@ export default defineComponent({
setup() { setup() {
const originData = ref({ const originData = ref({
username:"测试员", username:"测试员",
avatarUrl:'/images/默认头像.jpg', avatarUrl:'@/assets/images/默认头像.jpg',
gender:2, gender:2,
introduction:'只要不出bug一切都好QAQ', introduction:'只要不出bug一切都好QAQ',
birthday:'2023-10-01', birthday:'2023-10-01',
@ -459,13 +459,6 @@ export default defineComponent({
<style scoped> <style scoped>
#app {
width: 100%;
max-width: none;
padding: 0;
margin: 0;
}
.error-msg{ .error-msg{
z-index: 1000; z-index: 1000;
height:50px; height:50px;
@ -575,19 +568,6 @@ export default defineComponent({
gap: 20px; gap: 20px;
} }
/* 信息卡片通用样式 */
.card {
background-color: #fff;
border-radius: 20px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
}
/* 左侧内容卡片 */ /* 左侧内容卡片 */
.profile-info-card { .profile-info-card {
@ -707,48 +687,7 @@ export default defineComponent({
} }
/* 按钮样式 */ /* 按钮样式 */
.btn {
outline:none;
padding: 10px 24px;
margin:10px;
border: none;
border-radius: 25px;
cursor: pointer;
font-size: 1rem;
font-weight: 500;
transition: all 0.3s ease;
background-color: #fff;
}
.btn-primary {
background-color: #9370DB;
color: white;
box-shadow: 0 4px 10px rgba(147, 112, 219, 0.3);
}
.btn-primary:hover {
background-color: #8a63d2;
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(147, 112, 219, 0.4);
}
.btn-save-container {
display: flex;
justify-content: center;
margin-top: 20px;
}
.btn-secondary {
background-color: #e6e6fa;
color: #666;
box-shadow: 0 4px 10px rgba(230, 230, 250, 0.3);
}
.btn-secondary:hover {
background-color: #dcdcdc;
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(230, 230, 250, 0.4);
}
/* 预览区样式 */ /* 预览区样式 */
.preview-section { .preview-section {

@ -0,0 +1,135 @@
<template>
<div class="forum-home">
<!-- 左侧主内容区 -->
<div class="left-section card">
<!-- 上半部分 -->
<div class="top-section">
<div class="carousel-wrapper">
<Carousel />
</div>
<div class="hot-topic-wrapper">
<h2>📍 今日热点</h2>
<HotTopic
v-for="(item, index) in hotTopics"
:key="index"
:title="item.title"
:link="item.link"
/>
</div>
</div>
<el-divider content-position="right">欢迎来到UniLife</el-divider>
<!-- 下半部分帖子 -->
<div class="posts-section">
<h2>帖子</h2>
<PostCard
v-for="(post, index) in posts"
:key="index"
:post="post"
/>
</div>
</div>
<!-- 右侧今日行程 -->
<div class="right-section">
<h2>📅 今日行程</h2>
<ScheduleCard />
</div>
</div>
</template>
<script setup lang="ts">
import Carousel from '@/components/Carousel.vue'
import PostCard from '@/components/PostCard.vue'
import HotTopic from '@/components/HotTopic.vue'
import ScheduleCard from '@/components/ScheduleCard.vue'
const hotTopics = [
{ title: '这是一个标题,一个热门帖子的标题', link: '/post/1' },
{ title: '这是一个标题,一个热门帖子的标题', link: '/post/2' },
{ title: '这是一个标题,一个热门帖子的标题', link: '/post/3' }
]
const posts = [
{
id: 1,
title: '蚂蚁金服设计平台简介',
tags: ['Ant Design', '设计语言', '蚂蚁金服'],
excerpt: '段落示意:这是帖子的部分具体内容……',
link: '/post/1'
},
{
id: 2,
title: '蚂蚁金服设计平台简介',
tags: ['Ant Design', '设计语言', '蚂蚁金服'],
excerpt: '段落示意:这是帖子的部分具体内容……',
link: '/post/2'
}
]
</script>
<style scoped lang="scss">
.forum-home {
display: flex;
width:92%;
height:98%;
padding-top:75px;
gap: 40px; // 🔧
.left-section {
flex: 3;
display: flex;
flex-direction: column;
gap: 30px; // 🔧
background: linear-gradient(to bottom right, #f7f1ff, #ffffff);
}
.top-section {
display: flex;
gap: 24px; // 🔧
height: 320px;
background-color:transparent;
.carousel-wrapper {
flex: 2;
border-radius: 8px;
overflow: hidden;
}
.hot-topic-wrapper {
flex: 1;
padding: 16px;
background-color: #fef6ff;
border-radius: 8px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
display: flex;
flex-direction: column;
gap: 12px;
}
}
.posts-section {
display: flex;
flex-direction: column;
gap: 20px;
h2 {
margin-bottom: 12px;
}
}
.right-section {
flex: 1;
min-width: 240px;
padding: 16px;
background-color: #f9f7ff;
border-radius: 8px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
background: linear-gradient(to bottom right, #f7f1ff, #ffffff);
h2 {
margin-bottom: 16px;
}
}
}
</style>

@ -86,6 +86,7 @@ const{value: login_vericode} = useField('login_vericode')
// //
const showErrors = ref(false) const showErrors = ref(false)
const ErrorsMessage = ref('') const ErrorsMessage = ref('')
//
const checkErrors = () => { const checkErrors = () => {
if(RegisterForm.errors.value.register_email || RegisterForm.errors.value.register_password || RegisterForm.errors.value.register_verifyPassword || RegisterForm.errors.value.register_vericode) { if(RegisterForm.errors.value.register_email || RegisterForm.errors.value.register_password || RegisterForm.errors.value.register_verifyPassword || RegisterForm.errors.value.register_vericode) {
showErrors.value = true showErrors.value = true
@ -173,6 +174,7 @@ const onLoginSubmit = () => {
//axios //axios
//
const email = computed(()=>register_email.value ?? login_password_email.value ?? login_vericode_email.value) const email = computed(()=>register_email.value ?? login_password_email.value ?? login_vericode_email.value)
const password = computed(()=>register_password.value ?? login_password.value) const password = computed(()=>register_password.value ?? login_password.value)
const vericode = computed(()=>register_vericode.value ?? login_vericode.value) const vericode = computed(()=>register_vericode.value ?? login_vericode.value)
@ -239,6 +241,7 @@ async function login(){
@close="showErrors = false" @close="showErrors = false"
show-icon = "true" show-icon = "true"
center/> center/>
<!-- 登录注册表单 --> <!-- 登录注册表单 -->
<div class = "container"> <div class = "container">
<div ref = "form_box" class = "form-box"> <div ref = "form_box" class = "form-box">
@ -304,7 +307,6 @@ async function login(){
body{ body{
height: 100vh;; height: 100vh;;
/*弹性布局,水平垂直居中*/ /*弹性布局,水平垂直居中*/
display:flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
/*渐变背景*/ /*渐变背景*/
@ -537,17 +539,4 @@ async function login(){
</style>
<style>
body{
height: 100%;
width:100%;
/*弹性布局,水平垂直居中*/
display:flex;
justify-content: center;
align-items: center;
/*渐变背景*/
background: linear-gradient(200deg, #f3e7e9, #e3eeff);
}
</style> </style>

@ -8,7 +8,12 @@
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true "noUncheckedSideEffectImports": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}, },
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
"exclude": [ "exclude": [

@ -1,4 +1,10 @@
{ {
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"files": [], "files": [],
"references": [ "references": [
{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.app.json" },

@ -4,5 +4,9 @@ import vue from '@vitejs/plugin-vue'
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [vue()], plugins: [vue()],
resolve: {
alias: {
'@': '/src',
}
}
}) })

@ -1,3 +1,4 @@
[TOC]
# 配置前端环境 # 配置前端环境
--- ---
@ -59,4 +60,10 @@ pnpm add vue-router@4
### 安装elementplus的icon库 ### 安装elementplus的icon库
``` ```
pnpm install @element-plus/icons-vue pnpm install @element-plus/icons-vue
```
### 安装scss依赖
```cmd
pnpm add -D sass-embedded
``` ```

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742889870113" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6198" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M501.824 32C303.552 32 141.504 176.992 141.504 357.76c0 23.712 2.816 47.104 8.32 69.856l-51.008 114.208a32 32 0 0 0 24.704 44.736c54.272 7.744 76.672 31.168 76.672 77.312v111.552a64 64 0 0 0 64 64h20.704a64 64 0 0 1 64 64V960a32 32 0 0 0 32 32h345.6a32 32 0 0 0 0-64h-313.6v-24.608a128 128 0 0 0-128-128h-20.736v-111.552c0-65.664-32.192-110.688-91.2-131.136l39.872-89.28a31.968 31.968 0 0 0 1.568-21.792 233.088 233.088 0 0 1-8.896-63.904c0-143.712 131.936-261.76 296.32-261.76s296.32 118.016 296.32 261.76a32 32 0 0 0 64 0C862.144 176.992 700.064 32 501.824 32zM904 448a32 32 0 0 0-32 32v360a32 32 0 0 0 64 0V480a32 32 0 0 0-32-32z" p-id="6199"></path><path d="M673.888 466.656c-11.744-25.568-48.416-24.64-58.816 1.536l-132.8 333.76a32 32 0 0 0 59.488 23.68l32.608-81.92c0.576 0.032 1.088 0.32 1.664 0.32h154.848l38.176 83.104a31.968 31.968 0 1 0 58.144-26.72l-153.312-333.76zM599.68 680l47.264-118.72 54.528 118.72H599.68z" p-id="6200"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742890464540" class="icon" viewBox="0 0 1070 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12795" xmlns:xlink="http://www.w3.org/1999/xlink" width="208.984375" height="200"><path d="M845.803922 820.705882H442.980392c-67.764706 0-122.980392-55.215686-122.980392-122.980392V250.980392c0-67.764706 55.215686-122.980392 122.980392-122.980392H476.862745c10.039216 0 18.823529 8.784314 18.82353 18.823529s-8.784314 18.823529-18.82353 18.82353h-33.882353c-47.686275 0-85.333333 38.901961-85.333333 85.333333v445.490196c0 47.686275 38.901961 85.333333 85.333333 85.333334h402.82353c47.686275 0 85.333333-38.901961 85.333333-85.333334V250.980392c0-47.686275-38.901961-85.333333-85.333333-85.333333H638.745098c-10.039216 0-18.823529-8.784314-18.823529-18.82353s8.784314-18.823529 18.823529-18.823529h207.058824c67.764706 0 122.980392 55.215686 122.980392 122.980392v445.490196c0 69.019608-55.215686 124.235294-122.980392 124.235294z" fill="#0B3155" p-id="12796"></path><path d="M564.705882 165.647059h-5.019607c-10.039216 0-18.823529-8.784314-18.82353-18.82353s8.784314-18.823529 18.82353-18.823529h5.019607c10.039216 0 18.823529 8.784314 18.82353 18.823529s-8.784314 18.823529-18.82353 18.82353zM707.764706 931.137255H304.941176c-67.764706 0-122.980392-55.215686-122.980392-122.980392V361.411765c0-67.764706 55.215686-122.980392 122.980392-122.980392 10.039216 0 18.823529 8.784314 18.82353 18.823529s-8.784314 18.823529-18.82353 18.823529c-47.686275 0-85.333333 38.901961-85.333333 85.333334v445.490196c0 47.686275 38.901961 85.333333 85.333333 85.333333h402.82353c47.686275 0 85.333333-38.901961 85.333333-85.333333 0-10.039216 8.784314-18.823529 18.82353-18.82353s18.823529 8.784314 18.823529 18.82353c0 67.764706-55.215686 124.235294-122.980392 124.235294zM680.156863 282.352941H448c-10.039216 0-18.823529-8.784314-18.823529-18.823529s8.784314-18.823529 18.823529-18.82353h232.156863c10.039216 0 18.823529 8.784314 18.823529 18.82353s-7.529412 18.823529-18.823529 18.823529z" fill="#0B3155" p-id="12797"></path><path d="M828.235294 382.745098H448c-10.039216 0-18.823529-8.784314-18.823529-18.823529s8.784314-18.823529 18.823529-18.82353H828.235294c10.039216 0 18.823529 8.784314 18.82353 18.82353s-7.529412 18.823529-18.82353 18.823529zM765.490196 569.72549H448c-10.039216 0-18.823529-8.784314-18.823529-18.823529s8.784314-18.823529 18.823529-18.82353H765.490196c10.039216 0 18.823529 8.784314 18.823529 18.82353s-8.784314 18.823529-18.823529 18.823529zM638.745098 479.372549H448c-10.039216 0-18.823529-8.784314-18.823529-18.823529s8.784314-18.823529 18.823529-18.82353h190.745098c10.039216 0 18.823529 8.784314 18.823529 18.82353s-8.784314 18.823529-18.823529 18.823529z" fill="#0B3155" p-id="12798"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742898782607" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2961" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M586.945923 513.581008c55.067176-27.962865 92.91211-85.125773 92.91211-150.998039 0-93.338828-75.937506-169.276335-169.277358-169.276335s-169.275311 75.937506-169.275311 169.276335c0 65.872267 37.844933 123.034151 92.911086 150.998039-95.652524 32.016181-164.778904 122.45496-164.778904 228.743728 0 11.31572 9.17394 20.491707 20.491707 20.491707s20.491707-9.174963 20.491707-20.491707c0-110.36869 89.791026-200.160739 200.160739-200.160739S710.741413 631.956046 710.741413 742.324736c0 11.31572 9.17394 20.491707 20.491707 20.491707s20.491707-9.174963 20.491707-20.491707C751.723803 636.035968 682.598446 545.598212 586.945923 513.581008zM382.287753 362.582969c0-70.742181 57.552787-128.293945 128.292921-128.293945 70.742181 0 128.293945 57.552787 128.293945 128.293945 0 70.741157-57.552787 128.292921-128.293945 128.292921C439.84054 490.876913 382.287753 433.324126 382.287753 362.582969z" fill="#272636" p-id="2962"></path><path d="M827.871087 196.127889C743.498468 111.757317 631.320573 65.290005 512 65.290005S280.500509 111.756293 196.128913 196.127889C111.756293 280.501532 65.291029 392.678404 65.291029 511.998977s46.465265 231.499491 130.837884 315.872111 196.550515 130.837884 315.871087 130.837884 231.498468-46.465265 315.871087-130.837884S958.708971 631.319549 958.708971 511.998977 912.243707 280.500509 827.871087 196.127889zM512 917.726581c-223.718271 0-405.726581-182.007287-405.726581-405.727605 0-223.718271 182.00831-405.726581 405.726581-405.726581s405.726581 182.007287 405.726581 405.726581C917.726581 735.719294 735.718271 917.726581 512 917.726581z" fill="#272636" p-id="2963"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742889758081" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2676" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M844.2 395.8m-20.6 0a20.6 20.6 0 1 0 41.2 0 20.6 20.6 0 1 0-41.2 0Z" fill="#3E3A39" p-id="2677"></path><path d="M264.9 390.5c-33.2 0-60.1 27-60.1 60.1s27 60.1 60.1 60.1 60.1-27 60.1-60.1-26.9-60.1-60.1-60.1z m0 78.7c-10.2 0-18.6-8.3-18.6-18.6s8.3-18.6 18.6-18.6 18.6 8.3 18.6 18.6-8.3 18.6-18.6 18.6zM540 249.2c-55.5 0-100.7 45.2-100.7 100.7S484.5 450.6 540 450.6s100.7-45.2 100.7-100.7S595.5 249.2 540 249.2z m0 159.9c-32.6 0-59.2-26.5-59.2-59.2s26.5-59.2 59.2-59.2c32.6 0 59.2 26.5 59.2 59.2s-26.6 59.2-59.2 59.2z" fill="#3E3A39" p-id="2678"></path><path d="M976.9 320.6c-9.4-22.1-20.2-43.4-32.5-63.8 12.3-30.8 20.6-59.3 24.9-85.5 4.3-25.9 4.4-49.3 0.4-69.4-4.4-22.2-13.9-40.7-28.1-55-19.9-19.9-57.8-27.8-112.4-23.3-40 3.3-87 13.5-127.4 27.4C643 27.8 581.1 16 517.3 16 450 16 384.7 29.2 323.2 55.2c-59.4 25.1-112.7 61.1-158.5 106.9-45.8 45.8-81.8 99.1-106.9 158.5-26 61.5-39.2 126.8-39.2 194.1s13.2 132.6 39.2 194.1c25.1 59.4 61.1 112.7 106.9 158.5 16.5 16.5 33.9 31.7 52.3 45.6-23.1 7.7-44.4 12.6-63.1 14.5-34.3 3.5-59.4-2.5-74.8-17.9-24.1-24.1-25.1-74-2.6-140.3 3.7-10.9-2.2-22.7-13-26.3-10.9-3.7-22.7 2.2-26.3 13-35.6 105.2-12.8 157.6 12.6 183 20.6 20.6 49.5 31 86.1 31 7.1 0 14.6-0.4 22.3-1.2 30.1-3.1 64-12.2 101.3-27.1 20.4 12.3 41.7 23.2 63.8 32.6 61.5 26 126.8 39.2 194.1 39.2s132.6-13.2 194.1-39.2c59.4-25.1 112.7-61.1 158.5-106.9 45.8-45.8 81.8-99.1 106.9-158.5 26-61.5 39.2-126.8 39.2-194.1s-13.2-132.6-39.2-194.1zM832.5 65.2c46.6-3.8 71.7 3.3 79.6 11.2 21.7 21.7 20.7 59.9 16.1 88.2-2.5 15.3-6.8 32-12.7 49.8-13.9-18.4-29.1-35.8-45.6-52.3-33.5-33.5-71-61.7-111.9-84.2 25.4-6.4 51.2-10.8 74.5-12.7zM517.3 971.9c-75.9 0-147.5-18.6-210.5-51.4 111-54.6 235.8-148.4 351.9-264.4 44.6-44.6 86.3-90.9 124-137.7 7.2-8.9 5.8-22-3.2-29.2-8.9-7.2-22-5.8-29.2 3.2-36.7 45.6-77.4 90.8-121 134.4-113.6 113.5-235.4 204.9-342.9 257.4-7.7 3.8-15.4 7.3-22.9 10.6C141 812.7 60.1 673 60.1 514.7c0-252.1 205.1-457.2 457.2-457.2 158.3 0 298 80.8 380.1 203.4-8.6 19.4-18.7 39.7-30.3 60.5-5.6 10-2 22.7 8.1 28.3 3.2 1.8 6.7 2.6 10.1 2.6 7.3 0 14.4-3.9 18.2-10.7 7.1-12.7 13.6-25.2 19.6-37.4 32.8 63 51.4 134.6 51.4 210.5 0 252.1-205.1 457.2-457.2 457.2z" fill="#3E3A39" p-id="2679"></path></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Loading…
Cancel
Save