Compare commits

...

26 Commits
master ... ec

Author SHA1 Message Date
bakaECC
c9e8dd286a 配置Vite监听所有接口 2025-12-10 18:06:34 +08:00
bakaECC
d242217686 优化登录页样式布局和动画效果 2025-12-10 18:06:31 +08:00
bakaECC
f14ebb9f0c 优化滚动条显示逻辑与样式限制 2025-12-10 18:06:25 +08:00
bakaECC
a6d5c25e1c 将代理目标地址修改为局域网IP 2025-12-10 16:28:18 +08:00
bakaECC
906b5f37a7 优化登录页面布局和动画效果 2025-12-10 16:28:16 +08:00
bakaECC
2fe89ff491 重用重构的聊天布局 2025-12-10 16:28:14 +08:00
bakaECC
2916e2c667 注释更改请求基础URL 2025-12-10 16:28:12 +08:00
bakaECC
0d48c90334 引入设计系统样式 2025-12-10 16:28:10 +08:00
bakaECC
f4ab164585 添加动态Blob背景效果 2025-12-10 16:28:08 +08:00
bakaECC
1a727325d5 优化顶部栏样式与视觉效果 2025-12-10 16:28:06 +08:00
bakaECC
08a1e5d6cb 添加系统设置跳转功能 2025-12-10 16:28:04 +08:00
bakaECC
4654e4c5ec 注释掉语言列表与切换逻辑 2025-12-10 16:28:02 +08:00
bakaECC
223ff203ec 增强Sidebar样式和模态背景模糊效果 2025-12-10 16:28:00 +08:00
bakaECC
a029e2f569 更新logo图片路径 2025-12-10 16:27:57 +08:00
bakaECC
e8a6d634c1 优化界面布局与交互,增强用户体验 2025-12-10 16:27:55 +08:00
bakaECC
5120895094 完善空间代理UI布局样式和动画 2025-12-10 16:27:51 +08:00
bakaECC
ff3dcc0297 更新ai_tu图片资源 2025-12-10 16:27:47 +08:00
bakaECC
5c4f74c111 更新网站ico文件 2025-12-10 16:27:45 +08:00
bakaECC
460737be43 更新 ai_tu.png 图像 2025-12-10 16:27:43 +08:00
bakaECC
ec4a2f1bf2 添加 Tailwind CSS 插件 2025-12-10 16:27:40 +08:00
bakaECC
3c5a641bcd 提交package更改 2025-12-10 16:27:20 +08:00
bakaECC
93fdb36d74 添加Tailwind自定义配置 2025-12-10 16:26:45 +08:00
bakaECC
68421e20be 添加设计系统CSS变量和动画定义 2025-12-10 16:26:43 +08:00
bakaECC
4fc632e1f7 删除logo.svg文件 2025-12-10 16:26:40 +08:00
bakaECC
75f530b916 添加logo图片文件 2025-12-10 16:26:38 +08:00
bakaECC
aa7bec34a6 添加按钮和切换组件样式 2025-12-10 16:26:26 +08:00
24 changed files with 5865 additions and 1231 deletions

613
package-lock.json generated
View File

@ -30,14 +30,29 @@
"husky": "^1.3.1",
"lint-staged": "^9.5.0",
"mockjs": "^1.1.0",
"postcss": "^8.4.31",
"prettier": "^1.19.1",
"sass": "^1.41.1",
"tailwindcss": "^3.3.5",
"vite": "^2.3.7",
"vite-plugin-mock": "^2.3.0",
"vite-plugin-svg-icons": "^0.4.0",
"vue-i18n": "^9.0.0"
}
},
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@babel/code-frame": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
@ -678,7 +693,6 @@
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz",
"integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
"dev": true,
"peer": true,
"dependencies": {
"@types/lodash": "*"
}
@ -896,7 +910,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true,
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@ -1008,6 +1021,13 @@
"node": ">=6"
}
},
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
"dev": true,
"license": "MIT"
},
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
@ -1021,6 +1041,13 @@
"node": ">= 8"
}
},
"node_modules/arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true,
"license": "MIT"
},
"node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@ -1256,12 +1283,13 @@
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.0.1"
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@ -1282,7 +1310,6 @@
"url": "https://tidelift.com/funding/github/npm/browserslist"
}
],
"peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001400",
"electron-to-chromium": "^1.4.251",
@ -1370,6 +1397,16 @@
"node": ">=6"
}
},
"node_modules/camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001410",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz",
@ -1463,16 +1500,11 @@
"dev": true
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@ -1485,6 +1517,9 @@
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
@ -1886,6 +1921,19 @@
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true,
"license": "MIT",
"bin": {
"cssesc": "bin/cssesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/csso": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
@ -2051,6 +2099,13 @@
"node": ">=8"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@ -2063,6 +2118,13 @@
"node": ">=8"
}
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true,
"license": "MIT"
},
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@ -2627,7 +2689,6 @@
"integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"ajv": "^6.10.0",
@ -2697,7 +2758,6 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
"integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
"dev": true,
"peer": true,
"dependencies": {
"prettier-linter-helpers": "^1.0.0"
},
@ -3436,16 +3496,17 @@
"dev": true
},
"node_modules/fast-glob": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
"micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
@ -3509,10 +3570,11 @@
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@ -3673,10 +3735,14 @@
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/functional-red-black-tree": {
"version": "1.0.1",
@ -3811,18 +3877,6 @@
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
"dev": true
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
@ -3916,6 +3970,19 @@
"node": ">=0.10.0"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@ -4161,12 +4228,16 @@
}
},
"node_modules/is-core-module": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
"integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true,
"license": "MIT",
"dependencies": {
"has": "^1.0.3"
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@ -4270,6 +4341,7 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
@ -4388,6 +4460,16 @@
"node": ">=0.10.0"
}
},
"node_modules/jiti": {
"version": "1.21.7",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
"dev": true,
"license": "MIT",
"bin": {
"jiti": "bin/jiti.js"
}
},
"node_modules/js-base64": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
@ -4489,6 +4571,26 @@
"node": ">= 0.8.0"
}
},
"node_modules/lilconfig": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/antonk52"
}
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true,
"license": "MIT"
},
"node_modules/lint-staged": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz",
@ -4610,7 +4712,6 @@
"resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
"integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
"dev": true,
"peer": true,
"dependencies": {
"@samverschueren/stream-to-observable": "^0.3.0",
"is-observable": "^1.1.0",
@ -4891,15 +4992,13 @@
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true,
"peer": true
"dev": true
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"dev": true,
"peer": true
"dev": true
},
"node_modules/lodash-unified": {
"version": "1.0.2",
@ -5109,12 +5208,13 @@
}
},
"node_modules/micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.2",
"braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@ -5190,7 +5290,6 @@
"resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz",
"integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
"dev": true,
"peer": true,
"dependencies": {
"commander": "*"
},
@ -5210,10 +5309,29 @@
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
"dev": true
},
"node_modules/mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
"thenify-all": "^1.0.0"
}
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@ -5482,6 +5600,16 @@
"node": ">=0.10.0"
}
},
"node_modules/object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/object-visit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
@ -5717,9 +5845,10 @@
}
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
@ -5767,6 +5896,16 @@
}
}
},
"node_modules/pirates": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
"integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/pkg-dir": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
@ -5798,9 +5937,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.16",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
"integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"funding": [
{
"type": "opencollective",
@ -5809,18 +5948,135 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-import": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-js": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
"integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"peerDependencies": {
"postcss": "^8.4.21"
}
},
"node_modules/postcss-load-config": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
"integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"lilconfig": "^3.1.1"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"jiti": ">=1.21.0",
"postcss": ">=8.0.9",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"jiti": {
"optional": true
},
"postcss": {
"optional": true
},
"tsx": {
"optional": true
},
"yaml": {
"optional": true
}
}
},
"node_modules/postcss-nested": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.1.1"
},
"engines": {
"node": ">=12.0"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-prefix-selector": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz",
@ -5830,6 +6086,20 @@
"postcss": ">4 <9"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
@ -5924,7 +6194,6 @@
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
"integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
"dev": true,
"peer": true,
"bin": {
"prettier": "bin-prettier.js"
},
@ -6005,6 +6274,26 @@
}
]
},
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"pify": "^2.3.0"
}
},
"node_modules/read-cache/node_modules/pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/read-pkg": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz",
@ -6123,18 +6412,22 @@
}
},
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
"integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-core-module": "^2.9.0",
"is-core-module": "^2.16.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@ -6208,7 +6501,6 @@
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
"integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
"dev": true,
"peer": true,
"bin": {
"rollup": "dist/bin/rollup"
},
@ -6315,7 +6607,6 @@
"resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz",
"integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==",
"dev": true,
"peer": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
@ -6552,9 +6843,10 @@
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
@ -6799,6 +7091,39 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/sucrase": {
"version": "3.35.1",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
"integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
"lines-and-columns": "^1.1.6",
"mz": "^2.7.0",
"pirates": "^4.0.1",
"tinyglobby": "^0.2.11",
"ts-interface-checker": "^0.1.9"
},
"bin": {
"sucrase": "bin/sucrase",
"sucrase-node": "bin/sucrase-node"
},
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/sucrase/node_modules/commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@ -7127,18 +7452,140 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/tailwindcss": {
"version": "3.4.18",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz",
"integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
"chokidar": "^3.6.0",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.3.2",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.21.7",
"lilconfig": "^3.1.3",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.1.1",
"postcss": "^8.4.47",
"postcss-import": "^15.1.0",
"postcss-js": "^4.0.1",
"postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
"postcss-nested": "^6.2.0",
"postcss-selector-parser": "^6.1.2",
"resolve": "^1.22.8",
"sucrase": "^3.35.0"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/tailwindcss/node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
}
},
"node_modules/thenify-all": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"dev": true,
"license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"dev": true
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/tinyglobby/node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@ -7204,6 +7651,7 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@ -7304,6 +7752,13 @@
"integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==",
"dev": true
},
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
@ -7502,7 +7957,6 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
"integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
"dev": true,
"peer": true,
"dependencies": {
"esbuild": "^0.14.27",
"postcss": "^8.4.13",
@ -7590,7 +8044,6 @@
"version": "3.2.33",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.33.tgz",
"integrity": "sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ==",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.2.33",
"@vue/compiler-sfc": "3.2.33",

View File

@ -42,8 +42,10 @@
"husky": "^1.3.1",
"lint-staged": "^9.5.0",
"mockjs": "^1.1.0",
"postcss": "^8.4.31",
"prettier": "^1.19.1",
"sass": "^1.41.1",
"tailwindcss": "^3.3.5",
"vite": "^2.3.7",
"vite-plugin-mock": "^2.3.0",
"vite-plugin-svg-icons": "^0.4.0"

View File

@ -1,5 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

92
prototype.tsx Normal file
View File

@ -0,0 +1,92 @@
<template>
}
/* 通用按钮 */
.ghost-btn {
border-radius: 999px;
border: 1px solid rgba(143, 154, 183, 0.5);
background: transparent;
font-size: 12px;
padding: 4px 10px;
cursor: pointer;
color: #4b536c;
}
.ghost-btn-xs {
padding: 2px 8px;
font-size: 11px;
}
.primary-btn {
border-radius: 999px;
border: none;
background: #2f7cf6;
color: #ffffff;
font-size: 12px;
padding: 5px 12px;
cursor: pointer;
}
.primary-chip {
border-radius: 999px;
border: none;
background: var(--primary-soft);
color: var(--primary);
font-size: 12px;
padding: 5px 10px;
cursor: pointer;
}
/* toggle */
.toggle {
position: relative;
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 12px;
color: var(--text-sub);
}
.toggle input {
display: none;
}
.toggle-slider {
position: relative;
width: 32px;
height: 18px;
border-radius: 999px;
background: #d3d8e6;
}
.toggle-slider::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 14px;
height: 14px;
border-radius: 999px;
background: #ffffff;
box-shadow: 0 2px 6px rgba(15, 23, 42, 0.2);
transition: transform 0.18s ease;
}
.toggle input:checked + .toggle-slider {
background: #2f7cf6;
}
.toggle input:checked + .toggle-slider::after {
transform: translateX(14px);
}
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 KiB

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1 +0,0 @@
<?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="1618380288923" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1997" data-spm-anchor-id="a313x.7781069.0.i9" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M651.6 85l-137 137L372.9 84.7c-10-9.7-3.2-26.6 10.7-26.7l256.4-0.8c14.6 0 21.9 17.5 11.6 27.8z" fill="#e81c56" p-id="1998" data-spm-anchor-id="a313x.7781069.0.i10" class=""></path><path d="M844.1 71.2L717.8 197.5v364.3c0 2.1-0.9 4.2-2.4 5.7L522.7 760.1c14.8 14 72.2 62.7 157.4 67.4l204.3-204.3c7.6-7.6 11.8-17.8 11.8-28.5V92.8c0.1-27.3-32.8-40.9-52.1-21.6z" fill="#41b883" p-id="1999" data-spm-anchor-id="a313x.7781069.0.i5" class=""></path><path d="M522.7 760.1l-2.1 2.1-202.7-202.7V202.8c0-8.3-3.3-16.3-9.2-22.2L194.5 67.3c-20.7-20.5-55.9-5.9-55.9 23.3V638l334 334c17.4 17.4 45.6 17.4 63 0l144.5-144.5c-85.2-4.7-142.5-53.3-157.4-67.4z" fill="#1296db" p-id="2000" data-spm-anchor-id="a313x.7781069.0.i6" class=""></path></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,246 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Definition of the design system. All colors, gradients, fonts, etc should be defined here.
All colors MUST be HSL.
*/
@layer base {
:root {
/* Premium aerospace light theme - $2M experience */
--background: 220 25% 97%;
--foreground: 222 47% 11%;
/* Glassmorphism card - slightly blue-gray white */
--card: 220 20% 99%;
--card-foreground: 222 47% 11%;
--glass: 220 25% 98%;
--glass-border: 220 30% 90%;
--popover: 220 20% 99%;
--popover-foreground: 222 47% 11%;
/* Soft blue-gray white for components */
--white-soft: 220 25% 99%;
/* Aerospace blue primary */
--primary: 217 91% 60%;
--primary-foreground: 0 0% 100%;
--primary-glow: 217 91% 75%;
--primary-light: 217 91% 95%;
/* Tech purple secondary */
--secondary: 262 83% 58%;
--secondary-foreground: 0 0% 100%;
/* Muted backgrounds */
--muted: 217 25% 96%;
--muted-foreground: 222 47% 45%;
/* Accent cyan */
--accent: 189 94% 43%;
--accent-foreground: 0 0% 100%;
--destructive: 0 84% 60%;
--destructive-foreground: 0 0% 100%;
--border: 217 20% 90%;
--input: 220 20% 96%;
--ring: 217 91% 60%;
--radius: 1rem;
/* Department colors with glow variants */
--dept-structure: 217 91% 60%;
--dept-structure-light: 217 91% 95%;
--dept-structure-glow: 217 91% 75%;
--dept-thermal: 30 90% 55%;
--dept-thermal-light: 30 90% 95%;
--dept-thermal-glow: 30 90% 70%;
--dept-control: 270 75% 60%;
--dept-control-light: 270 75% 95%;
--dept-control-glow: 270 75% 75%;
/* Premium gradients */
--gradient-primary: linear-gradient(135deg, hsl(217 91% 60%) 0%, hsl(189 94% 50%) 100%);
--gradient-glow: linear-gradient(180deg, hsl(217 91% 96%) 0%, hsl(220 30% 99%) 100%);
--gradient-card: linear-gradient(135deg, hsl(217 91% 65%) 0%, hsl(189 94% 50%) 100%);
--gradient-success: linear-gradient(135deg, hsl(142 76% 45%) 0%, hsl(142 76% 60%) 100%);
--gradient-thermal: linear-gradient(135deg, hsl(30 90% 60%) 0%, hsl(35 90% 65%) 100%);
--gradient-control: linear-gradient(135deg, hsl(270 75% 65%) 0%, hsl(260 75% 70%) 100%);
--gradient-structure: linear-gradient(135deg, hsl(217 91% 65%) 0%, hsl(205 91% 70%) 100%);
--gradient-sidebar: linear-gradient(180deg, hsl(220 30% 99%) 0%, hsl(217 30% 97%) 100%);
--gradient-glass: linear-gradient(135deg, hsla(220 30% 100% / 0.8) 0%, hsla(220 30% 100% / 0.5) 100%);
/* Premium shadows with glow - Neumorphism style - lighter */
--shadow-sm: 0 2px 8px hsla(217 20% 20% / 0.02);
--shadow-md: 0 4px 16px hsla(217 20% 20% / 0.03);
--shadow-lg: 0 8px 32px hsla(217 20% 20% / 0.04);
--shadow-xl: 0 16px 48px hsla(217 20% 20% / 0.05);
--shadow-glow: 0 0 40px hsla(217 91% 75% / 0.2);
--shadow-glow-structure: 0 0 30px hsla(217 91% 75% / 0.15);
--shadow-glow-thermal: 0 0 30px hsla(30 90% 70% / 0.15);
--shadow-glow-control: 0 0 30px hsla(270 75% 75% / 0.15);
--shadow-card: 0 4px 24px hsla(217 20% 20% / 0.03);
--shadow-elevated: 0 8px 40px hsla(217 20% 20% / 0.05);
--shadow-glass: 0 8px 32px hsla(217 20% 20% / 0.02), inset 0 1px 0 hsla(0 0% 100% / 0.7);
/* Neumorphism shadows - lighter and softer */
--shadow-neumorphic:
12px 12px 24px hsla(217 20% 20% / 0.03),
-12px -12px 24px hsla(0 0% 100% / 0.9),
inset 2px 2px 4px hsla(0 0% 100% / 0.5);
--shadow-neumorphic-hover:
16px 16px 32px hsla(217 20% 20% / 0.04),
-16px -16px 32px hsla(0 0% 100% / 1),
inset 2px 2px 6px hsla(0 0% 100% / 0.6);
--shadow-neumorphic-inset:
inset 6px 6px 12px hsla(217 20% 20% / 0.02),
inset -6px -6px 12px hsla(0 0% 100% / 0.8);
/* Lighter neumorphic shadows for subtle effects */
--shadow-neumorphic-light:
8px 8px 16px hsla(217 20% 20% / 0.02),
-8px -8px 16px hsla(0 0% 100% / 0.8),
inset 1px 1px 2px hsla(0 0% 100% / 0.4);
--shadow-neumorphic-raised:
20px 20px 40px hsla(217 20% 20% / 0.05),
-20px -20px 40px hsla(0 0% 100% / 1),
inset 3px 3px 8px hsla(0 0% 100% / 0.7);
/* Enhanced glass effects */
--backdrop-blur-sm: blur(8px);
--backdrop-blur-md: blur(12px);
--backdrop-blur-lg: blur(16px);
--backdrop-blur-xl: blur(24px);
/* Glass border highlights */
--glass-border-highlight: 0 1px 2px hsla(0 0% 100% / 0.8);
--glass-internal-reflection: linear-gradient(180deg, hsla(0 0% 100% / 0.4) 0%, transparent 50%);
/* Liquid glass shadows - lighter */
--shadow-liquid:
0 8px 32px hsla(217 91% 60% / 0.06),
0 2px 8px hsla(217 91% 60% / 0.04),
inset 0 1px 2px hsla(0 0% 100% / 0.8);
--shadow-liquid-hover:
0 12px 48px hsla(217 91% 60% / 0.09),
0 4px 12px hsla(217 91% 60% / 0.06),
inset 0 1px 3px hsla(0 0% 100% / 0.9);
/* Animations - premium easing */
--transition-smooth: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
--transition-spring: all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
--transition-drawer: all 0.4s cubic-bezier(0.32, 0.72, 0, 1);
--transition-liquid: all 0.6s cubic-bezier(0.23, 1, 0.32, 1);
--transition-bounce: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
/* Borders */
--border-glass: hsla(220 30% 90% / 0.5);
/* Sidebar */
--sidebar-width: 280px;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
}
}
/* Blob floating animation with subtle movement and transform */
@keyframes blob-float {
0%, 100% {
transform: translate(0, 0) scale(1) rotate(0deg);
}
25% {
transform: translate(20px, -30px) scale(1.05) rotate(2deg);
}
50% {
transform: translate(-15px, 25px) scale(0.95) rotate(-1deg);
}
75% {
transform: translate(30px, 15px) scale(1.02) rotate(1deg);
}
}
@keyframes blob-float-2 {
0%, 100% {
transform: translate(0, 0) scale(1) rotate(0deg);
}
33% {
transform: translate(-25px, 20px) scale(0.98) rotate(-2deg);
}
66% {
transform: translate(15px, -20px) scale(1.03) rotate(1deg);
}
}
@keyframes blob-float-3 {
0%, 100% {
transform: translate(0, 0) scale(1) rotate(0deg);
}
20% {
transform: translate(25px, 30px) scale(1.04) rotate(1.5deg);
}
40% {
transform: translate(-20px, -15px) scale(0.96) rotate(-1.5deg);
}
60% {
transform: translate(-10px, 25px) scale(1.01) rotate(0.5deg);
}
80% {
transform: translate(20px, -10px) scale(0.99) rotate(-0.5deg);
}
}
@layer utilities {
.animate-blob-float {
animation: blob-float 20s ease-in-out infinite;
}
.animate-blob-float-2 {
animation: blob-float-2 25s ease-in-out infinite;
}
.animate-blob-float-3 {
animation: blob-float-3 30s ease-in-out infinite;
}
/* Custom scrollbar - elegant and minimal */
.scrollbar-custom::-webkit-scrollbar {
width: 6px;
}
.scrollbar-custom::-webkit-scrollbar-track {
background: transparent;
border-radius: 10px;
}
.scrollbar-custom::-webkit-scrollbar-thumb {
background: hsla(217, 20%, 60%, 0.3);
border-radius: 10px;
transition: background 0.2s ease;
}
.scrollbar-custom::-webkit-scrollbar-thumb:hover {
background: hsla(217, 20%, 50%, 0.5);
}
/* Firefox scrollbar */
.scrollbar-custom {
scrollbar-width: thin;
scrollbar-color: hsla(217, 20%, 60%, 0.3) transparent;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -34,7 +34,7 @@
<template>
<div class="brand">
<!-- <img class="logo" src="~@/assets/logo.svg" @click="goHome" />-->
<!-- <img class="logo" src="~@/assets/logo.png" @click="goHome" />-->
<img class="logo" src="~@/assets/ai_tu.png" @click="goHome" />
<div class="title">凌空天行</div>
</div>

View File

@ -76,18 +76,38 @@ export default defineComponent({
<style lang="scss" scoped>
.left {
position: relative;
z-index: 10;
width: 210px;
background: $menuBg;
transition: all 0.3s;
background: rgba(255, 255, 255, 0.3);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-right: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 4px 0 16px rgba(0, 0, 0, 0.03);
//
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent);
pointer-events: none;
}
&.collapse {
width: 64px;
::v-deep(.brand .title) {
display: none;
}
}
&.mobile {
height: 100%;
position: fixed;
@ -101,6 +121,7 @@ export default defineComponent({
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(4px);
z-index: 9;
}
&.collapse {
@ -111,4 +132,9 @@ export default defineComponent({
}
}
}
.mask {
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
</style>

View File

@ -64,17 +64,17 @@
</template>
<script setup>
import useLang from '@/i18n/useLang'
const langlist = [
{
name: '简体中文',
value: 'zh-cn',
},
{
name: 'English',
value: 'en',
},
]
const { changeLang } = useLang()
// const langlist = [
// {
// name: '',
// value: 'zh-cn',
// },
// {
// name: 'English',
// value: 'en',
// },
// ]
// const { changeLang } = useLang()
</script>
<style lang="scss" scoped>

View File

@ -58,10 +58,8 @@
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>{{ $t('topbar.center') }}</el-dropdown-item>
<el-dropdown-item>{{ $t('topbar.password') }}</el-dropdown-item>
<lock-modal />
<el-dropdown-item @click="logout">
<el-dropdown-item @click="goSettings">系统设置</el-dropdown-item>
<el-dropdown-item divided @click="logout">
{{ $t('topbar.logout') }}
</el-dropdown-item>
</el-dropdown-menu>
@ -84,6 +82,11 @@ export default defineComponent({
const { userinfo } = useUserinfo()
const goSettings = () => {
// vue-admin
router.push('/')
}
// 退
const logout = () => {
// token
@ -93,6 +96,7 @@ export default defineComponent({
return {
userinfo,
goSettings,
logout,
}
},

View File

@ -114,23 +114,47 @@ export default defineComponent({
</script>
<style lang="scss" scoped>
.header {
position: relative;
height: 48px;
border-bottom: 1px solid #e0e4ef;
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
display: flex;
justify-content: space-between;
background: transparent;
//
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent);
pointer-events: none;
}
&.no-border {
border: none;
&::after {
display: none;
}
}
.navigation {
display: flex;
align-items: center;
overflow: hidden;
padding: 0 16px;
}
.action {
display: flex;
align-items: center;
padding: 0 16px;
gap: 8px;
}
}
.mobile {
padding-right: 0;
::v-deep(.logo) {
@ -141,10 +165,12 @@ export default defineComponent({
display: none;
}
}
.show-title {
::v-deep(.title) {
display: block;
color: #333;
color: hsl(var(--foreground));
font-weight: 600;
}
}
</style>

View File

@ -36,6 +36,13 @@
<template>
<div class="wrapper" :class="{ fluid: isFluid }">
<!-- 动态 Blob 背景 -->
<div class="blob-container">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
</div>
<sidebar v-if="isMenusShow && !isHorizontalMenu" />
<div class="right" :class="{ flex: isTopbarFixed }">
<div class="top">
@ -106,30 +113,94 @@ export default defineComponent({
<style lang="scss" scoped>
.wrapper {
position: relative;
display: flex;
margin: 0 auto;
width: 1440px;
height: 100%;
height: 100vh;
overflow: hidden;
background: hsl(var(--background));
&.fluid {
width: 100%;
}
// Blob
.blob-container {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
z-index: 0;
}
.blob {
position: absolute;
border-radius: 50%;
filter: blur(100px);
opacity: 0.4;
pointer-events: none;
}
.blob-1 {
width: 800px;
height: 800px;
background: linear-gradient(135deg, rgba(56, 189, 248, 0.25), rgba(34, 211, 238, 0.2));
top: -300px;
right: -300px;
animation: blob-float 20s ease-in-out infinite;
}
.blob-2 {
width: 700px;
height: 700px;
background: linear-gradient(135deg, rgba(139, 92, 246, 0.2), rgba(168, 85, 247, 0.25));
bottom: -250px;
left: -250px;
animation: blob-float-2 25s ease-in-out infinite;
}
.blob-3 {
width: 600px;
height: 600px;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.22), rgba(96, 165, 250, 0.18));
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
animation: blob-float-3 30s ease-in-out infinite;
}
.right {
position: relative;
z-index: 1;
flex: 1;
overflow: auto;
background: transparent;
&.flex {
overflow: hidden;
display: flex;
flex-direction: column;
}
.top {
background: #fff;
position: relative;
z-index: 10;
background: rgba(255, 255, 255, 0.4);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 2px 16px rgba(0, 0, 0, 0.03);
}
.main {
position: relative;
z-index: 1;
flex: 1;
background: #f5f5f5;
background: transparent;
padding: 16px;
overflow: auto;
&.pt0 {
padding-top: 0;
}

View File

@ -39,6 +39,9 @@ import App from './App.vue'
const app = createApp(App)
// 引入设计系统Tailwind CSS + 设计变量)
import './assets/style/design-system.css'
// 引入element-plus
import ElementPlus from 'element-plus'
import './assets/style/element-variables.scss'

View File

@ -36,7 +36,7 @@ import { useApp } from '@/pinia/modules/app'
const service = axios.create({
baseURL: '',
// baseURL: 'http://localhost:8501',
// baseURL: 'http://192.168.0.240:8501',
timeout: 10000,
withCredentials: true,
})

View File

@ -1,6 +1,8 @@
<!-- first.vue -->
<template>
<el-radio-button label="chat_view" size="default">
知识库
</el-radio-button>
<!-- 完整聊天页面直接复用已重构的 chat_layout -->
<ChatLayout />
</template>
<script setup>
import ChatLayout from '@/layout/chat_layout.vue'
</script>

View File

@ -11,54 +11,82 @@
-->
<template>
<div class="login">
<el-form class="form" :model="model" :rules="rules" ref="loginForm">
<!-- <h1 class="title">Vue3 Element Admin</h1>-->
<h1 class="title">凌空天行 AI大模型 应用系统</h1>
<el-form-item prop="userName">
<el-input
class="text"
v-model="model.userName"
prefix-icon="User"
clearable
:placeholder="$t('login.username')"
/>
</el-form-item>
<el-form-item prop="password">
<el-input
class="text"
v-model="model.password"
prefix-icon="Lock"
show-password
clearable
:placeholder="$t('login.password')"
/>
</el-form-item>
<!-- 动态 Blob 背景 -->
<div class="blob-container">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
</div>
<!-- 页面结构 -->
<el-form-item prop="captcha">
<div class="captcha">
<div class="shell">
<el-form class="form" :model="model" :rules="rules" ref="loginForm">
<div class="form-meta">
<div>
<p class="eyebrow">LOGIN</p>
<h2 class="title">登录工作台</h2>
<p class="title-desc">使用企业账户或SSO登录</p>
</div>
<!-- <div class="tag gradient">凌能空间</div> -->
</div>
<el-form-item prop="userName">
<el-input
class="text"
v-model="model.captcha"
prefix-icon="Picture"
placeholder="请输入验证码"
></el-input>
<img :src="captchaSrc" @click="refreshCaptcha" />
</div>
</el-form-item>
v-model="model.userName"
prefix-icon="User"
clearable
:placeholder="$t('login.username')"
/>
</el-form-item>
<el-form-item prop="password">
<el-input
class="text"
v-model="model.password"
prefix-icon="Lock"
show-password
clearable
:placeholder="$t('login.password')"
/>
</el-form-item>
<el-form-item prop="captcha">
<div class="captcha">
<el-input
class="text"
v-model="model.captcha"
prefix-icon="Picture"
placeholder="请输入验证码"
/>
<img :src="captchaSrc" @click="refreshCaptcha" />
</div>
</el-form-item>
<el-form-item>
<el-button
:loading="loading"
type="primary"
class="btn"
size="large"
@click="submit"
>
{{ btnText }}
</el-button>
</el-form-item>
<div class="divider">
<span></span>
</div>
<el-form-item>
<el-button
:loading="loading"
type="primary"
class="btn"
class="btn-sso"
size="large"
@click="submit"
plain
@click="handleSsoLogin"
>
{{ btnText }}
企业SSO 一键登录
</el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
<div class="change-lang">
<change-lang />
@ -140,6 +168,13 @@ export default defineComponent({
state.loading ? ctx.$t('login.logining') : ctx.$t('login.login')
),
loginForm: ref(null),
ssoEndpoint: import.meta.env.VITE_SSO_URL || '/sso/login',
handleSsoLogin: () => {
const redirect = route.query.redirect || window.location.href
window.location.href = `${state.ssoEndpoint}?redirect=${encodeURIComponent(
redirect
)}`
},
submit: () => {
if (state.loading) {
return
@ -188,32 +223,216 @@ export default defineComponent({
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
gap: 12px;
}
.captcha img {
cursor: pointer;
margin-left: 20px;
border-radius: 8px;
transition: transform 0.3s ease;
&:hover {
transform: scale(1.05);
}
}
// end
.login {
transition: transform 1s;
transform: scale(1);
position: relative;
width: 100%;
height: 100%;
min-height: 100vh;
overflow: hidden;
background: #2d3a4b;
.form {
padding: 72px 28px;
display: flex;
align-items: center;
background: radial-gradient(circle at 18% 22%, rgba(104, 173, 255, 0.2), transparent 30%),
radial-gradient(circle at 80% 14%, rgba(139, 92, 246, 0.12), transparent 26%),
radial-gradient(circle at 28% 82%, rgba(94, 234, 212, 0.12), transparent 24%),
linear-gradient(145deg, #f5f7fb 0%, #edf0f6 45%, #e7ebf2 100%);
&::before,
&::after {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
mix-blend-mode: soft-light;
background: repeating-linear-gradient(
90deg,
rgba(255, 255, 255, 0.04) 0,
rgba(255, 255, 255, 0.04) 1px,
transparent 1px,
transparent 22px
),
repeating-linear-gradient(
0deg,
rgba(255, 255, 255, 0.04) 0,
rgba(255, 255, 255, 0.04) 1px,
transparent 1px,
transparent 22px
);
}
&::after {
background: radial-gradient(circle at 40% 30%, rgba(255, 255, 255, 0.08), transparent 35%),
radial-gradient(circle at 65% 70%, rgba(255, 255, 255, 0.08), transparent 30%);
filter: blur(36px);
}
// Blob
.blob-container {
position: absolute;
inset: -12%;
overflow: hidden;
pointer-events: none;
z-index: 0;
}
.blob {
position: absolute;
border-radius: 50%;
filter: blur(100px);
opacity: 0.46;
pointer-events: none;
mix-blend-mode: screen;
}
.blob-1 {
width: 520px;
max-width: 100%;
padding: 0 24px;
height: 520px;
background: linear-gradient(135deg, rgba(93, 156, 255, 0.32), rgba(141, 198, 255, 0.24));
top: -140px;
right: -160px;
animation: blob-float 18s ease-in-out infinite;
}
.blob-2 {
width: 500px;
height: 500px;
background: linear-gradient(135deg, rgba(126, 211, 180, 0.26), rgba(121, 189, 255, 0.22));
bottom: -140px;
left: -120px;
animation: blob-float-2 22s ease-in-out infinite;
}
.blob-3 {
width: 420px;
height: 420px;
background: linear-gradient(135deg, rgba(255, 214, 165, 0.28), rgba(161, 196, 253, 0.22));
top: 48%;
left: 50%;
transform: translate(-50%, -50%);
animation: blob-float-3 26s ease-in-out infinite;
}
.shell {
position: relative;
z-index: 10;
width: min(520px, 100%);
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
}
.brand-chip {
display: inline-flex;
align-items: center;
padding: 6px 12px;
border-radius: 999px;
font-size: 12px;
letter-spacing: 0.06em;
text-transform: uppercase;
background: #eef3ff;
border: 1px solid #dce6f7;
color: #2e4b82;
}
.headline {
margin: 0;
font-size: 0;
}
.subline {
display: none;
}
.form {
position: relative;
z-index: 10;
width: 100%;
padding: 40px 36px;
box-sizing: border-box;
margin: 160px auto 0;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.94) 100%);
border: 1px solid rgba(120, 149, 203, 0.18);
border-radius: 26px;
box-shadow:
0 24px 80px rgba(88, 112, 156, 0.22),
inset 0 1px 0 rgba(255, 255, 255, 0.8);
transition: all 0.35s ease;
overflow: hidden;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
&::before {
content: '';
position: absolute;
inset: -36%;
background: conic-gradient(from 140deg, rgba(99, 102, 241, 0.12), rgba(34, 211, 238, 0.16), rgba(45, 212, 191, 0.12), rgba(99, 102, 241, 0.12));
transform: translate3d(0, 0, 0);
filter: blur(38px);
z-index: 0;
animation: form-glow 12s ease-in-out infinite;
opacity: 0.8;
}
&:hover {
transform: translateY(-2px);
box-shadow:
0 28px 96px rgba(88, 112, 156, 0.26),
inset 0 1px 0 rgba(255, 255, 255, 0.88);
}
:deep {
.el-input__wrapper {
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1) inset;
background: rgba(0, 0, 0, 0.1);
background: rgba(255, 255, 255, 0.72);
border: 1px solid rgba(120, 149, 203, 0.25);
border-radius: 14px;
box-shadow:
0 6px 18px rgba(36, 79, 140, 0.12),
inset 0 1px 0 rgba(255, 255, 255, 0.8);
transition: all 0.25s ease;
backdrop-filter: blur(8px);
&:hover {
border-color: rgba(120, 149, 203, 0.36);
background: rgba(255, 255, 255, 0.86);
}
&.is-focus {
background: rgba(255, 255, 255, 0.96);
border-color: #6aa6ff;
box-shadow:
0 12px 28px rgba(106, 166, 255, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.94),
0 0 0 4px rgba(106, 166, 255, 0.22);
}
}
.el-input__inner {
color: #0f172a;
font-weight: 600;
&::placeholder {
color: #6b7280;
}
}
.el-input__prefix {
.el-icon {
color: #6b7280;
}
}
.el-input-group--append > .el-input__wrapper {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
@ -223,38 +442,218 @@ export default defineComponent({
border-bottom-left-radius: 0;
}
}
.title {
color: #fff;
text-align: center;
font-size: 24px;
margin: 0 0 24px;
.form-meta {
position: relative;
z-index: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
margin-bottom: 18px;
}
.eyebrow {
margin: 0;
color: #6b7280;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.title {
color: #0f172a;
font-size: 26px;
font-weight: 800;
margin: 4px 0 6px;
text-shadow: 0 10px 18px rgba(74, 88, 126, 0.2);
}
.title-desc {
margin: 0;
color: #4b5563;
font-size: 13px;
}
.tag {
height: 28px;
padding: 0 12px;
border-radius: 999px;
display: inline-flex;
align-items: center;
justify-content: center;
color: #0b1628;
font-weight: 700;
font-size: 12px;
}
.gradient {
background: linear-gradient(120deg, #34d399 0%, #22d3ee 50%, #60a5fa 100%);
box-shadow: 0 10px 25px rgba(52, 211, 153, 0.4);
}
.text {
font-size: 16px;
position: relative;
z-index: 1;
:deep(.el-input__inner) {
color: #fff;
color: #0f172a;
height: 48px;
line-height: 48px;
&::placeholder {
color: rgba(255, 255, 255, 0.2);
color: #6b7280;
}
}
}
.btn {
position: relative;
z-index: 1;
width: 100%;
height: 50px;
font-size: 16px;
font-weight: 750;
border-radius: 14px;
background: linear-gradient(135deg, #7bb6ff 0%, #6fe0c0 50%, #6ad5f3 100%);
border: none;
box-shadow:
0 10px 28px rgba(111, 224, 192, 0.35),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
transition: all 0.3s ease;
&:hover:not(:disabled) {
transform: translateY(-2px) scale(1.01);
box-shadow:
0 16px 38px rgba(111, 224, 192, 0.42),
inset 0 1px 0 rgba(255, 255, 255, 0.4);
}
&:active:not(:disabled) {
transform: translateY(0);
}
}
.divider {
position: relative;
z-index: 1;
display: flex;
align-items: center;
gap: 12px;
color: rgba(9, 8, 8, 0.7);
font-size: 12px;
margin: 10px 0 14px;
&::before,
&::after {
content: '';
flex: 1;
height: 1px;
background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0));
}
}
.btn-sso {
position: relative;
z-index: 1;
width: 100%;
height: 48px;
border-radius: 14px;
border: 1px solid rgba(120, 149, 203, 0.28);
color: #0f172a;
font-weight: 700;
letter-spacing: 0.02em;
background: linear-gradient(120deg, rgba(255, 255, 255, 0.92), rgba(255, 255, 255, 0.82));
box-shadow: 0 10px 28px rgba(88, 112, 156, 0.18);
transition: all 0.25s ease;
&:hover {
background: rgba(255, 255, 255, 0.96);
border-color: rgba(120, 149, 203, 0.42);
transform: translateY(-2px);
}
}
}
}
@keyframes blob-float {
0% {
transform: translate3d(0, 0, 0) scale(1);
}
50% {
transform: translate3d(-20px, 20px, 0) scale(1.05);
}
100% {
transform: translate3d(0, 0, 0) scale(1);
}
}
@keyframes blob-float-2 {
0% {
transform: translate3d(0, 0, 0) scale(1);
}
50% {
transform: translate3d(24px, -16px, 0) scale(1.08);
}
100% {
transform: translate3d(0, 0, 0) scale(1);
}
}
@keyframes blob-float-3 {
0% {
transform: translate(-50%, -50%) scale(1);
}
50% {
transform: translate(-48%, -52%) scale(1.06);
}
100% {
transform: translate(-50%, -50%) scale(1);
}
}
@keyframes form-glow {
0% {
transform: rotate(0deg) scale(1);
opacity: 0.9;
}
50% {
transform: rotate(180deg) scale(1.06);
opacity: 1;
}
100% {
transform: rotate(360deg) scale(1);
opacity: 0.9;
}
}
@media (max-width: 1080px) {
.login {
padding: 60px 22px;
.shell {
width: min(520px, 100%);
}
}
}
.change-lang {
position: fixed;
right: 20px;
top: 20px;
z-index: 100;
:deep {
.change-lang {
height: 24px;
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 8px;
padding: 4px 8px;
transition: all 0.3s ease;
&:hover {
background: none;
background: rgba(255, 255, 255, 0.3);
border-color: rgba(255, 255, 255, 0.4);
}
.icon {
color: #fff;
}

143
tailwind.config.js Normal file
View File

@ -0,0 +1,143 @@
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {
colors: {
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))',
},
popover: {
DEFAULT: 'hsl(var(--popover))',
foreground: 'hsl(var(--popover-foreground))',
},
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))',
glow: 'hsl(var(--primary-glow))',
light: 'hsl(var(--primary-light))',
},
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))',
},
muted: {
DEFAULT: 'hsl(var(--muted))',
foreground: 'hsl(var(--muted-foreground))',
},
accent: {
DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))',
},
destructive: {
DEFAULT: 'hsl(var(--destructive))',
foreground: 'hsl(var(--destructive-foreground))',
},
border: 'hsl(var(--border))',
input: 'hsl(var(--input))',
ring: 'hsl(var(--ring))',
glass: 'hsl(var(--glass))',
'glass-border': 'hsl(var(--glass-border))',
'white-soft': 'hsl(var(--white-soft))',
'dept-structure': {
DEFAULT: 'hsl(var(--dept-structure))',
light: 'hsl(var(--dept-structure-light))',
glow: 'hsl(var(--dept-structure-glow))',
},
'dept-thermal': {
DEFAULT: 'hsl(var(--dept-thermal))',
light: 'hsl(var(--dept-thermal-light))',
glow: 'hsl(var(--dept-thermal-glow))',
},
'dept-control': {
DEFAULT: 'hsl(var(--dept-control))',
light: 'hsl(var(--dept-control-light))',
glow: 'hsl(var(--dept-control-glow))',
},
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
backgroundImage: {
'gradient-primary': 'var(--gradient-primary)',
'gradient-glow': 'var(--gradient-glow)',
'gradient-card': 'var(--gradient-card)',
'gradient-success': 'var(--gradient-success)',
'gradient-thermal': 'var(--gradient-thermal)',
'gradient-control': 'var(--gradient-control)',
'gradient-structure': 'var(--gradient-structure)',
'gradient-sidebar': 'var(--gradient-sidebar)',
'gradient-glass': 'var(--gradient-glass)',
},
boxShadow: {
'sm': 'var(--shadow-sm)',
'md': 'var(--shadow-md)',
'lg': 'var(--shadow-lg)',
'xl': 'var(--shadow-xl)',
'glow': 'var(--shadow-glow)',
'glow-structure': 'var(--shadow-glow-structure)',
'glow-thermal': 'var(--shadow-glow-thermal)',
'glow-control': 'var(--shadow-glow-control)',
'card': 'var(--shadow-card)',
'elevated': 'var(--shadow-elevated)',
'glass': 'var(--shadow-glass)',
'neumorphic': 'var(--shadow-neumorphic)',
'neumorphic-hover': 'var(--shadow-neumorphic-hover)',
'neumorphic-inset': 'var(--shadow-neumorphic-inset)',
'neumorphic-light': 'var(--shadow-neumorphic-light)',
'neumorphic-raised': 'var(--shadow-neumorphic-raised)',
'liquid': 'var(--shadow-liquid)',
'liquid-hover': 'var(--shadow-liquid-hover)',
},
backdropBlur: {
sm: 'var(--backdrop-blur-sm)',
md: 'var(--backdrop-blur-md)',
lg: 'var(--backdrop-blur-lg)',
xl: 'var(--backdrop-blur-xl)',
},
transitionDuration: {
smooth: 'var(--transition-smooth)',
spring: 'var(--transition-spring)',
drawer: 'var(--transition-drawer)',
liquid: 'var(--transition-liquid)',
bounce: 'var(--transition-bounce)',
},
animation: {
'blob-float': 'blob-float 20s ease-in-out infinite',
'blob-float-2': 'blob-float-2 25s ease-in-out infinite',
'blob-float-3': 'blob-float-3 30s ease-in-out infinite',
},
keyframes: {
'blob-float': {
'0%, 100%': { transform: 'translate(0, 0) scale(1) rotate(0deg)' },
'25%': { transform: 'translate(20px, -30px) scale(1.05) rotate(2deg)' },
'50%': { transform: 'translate(-15px, 25px) scale(0.95) rotate(-1deg)' },
'75%': { transform: 'translate(30px, 15px) scale(1.02) rotate(1deg)' },
},
'blob-float-2': {
'0%, 100%': { transform: 'translate(0, 0) scale(1) rotate(0deg)' },
'33%': { transform: 'translate(-25px, 20px) scale(0.98) rotate(-2deg)' },
'66%': { transform: 'translate(15px, -20px) scale(1.03) rotate(1deg)' },
},
'blob-float-3': {
'0%, 100%': { transform: 'translate(0, 0) scale(1) rotate(0deg)' },
'20%': { transform: 'translate(25px, 30px) scale(1.04) rotate(1.5deg)' },
'40%': { transform: 'translate(-20px, -15px) scale(0.96) rotate(-1.5deg)' },
'60%': { transform: 'translate(-10px, 25px) scale(1.01) rotate(0.5deg)' },
'80%': { transform: 'translate(20px, -10px) scale(0.99) rotate(-0.5deg)' },
},
},
},
},
plugins: [],
}

View File

@ -73,16 +73,17 @@ export default env => {
},
},
server: {
host: '0.0.0.0', // listen on all interfaces so LAN IP works
port: 3001,
open: true,
proxy: {
'/api': {
target: 'http://localhost:8501', // 后端接口的域名
target: 'http://192.168.0.240:8501', // 后端接口的域名
changeOrigin: true,
},
'/admin': {
target: 'http://localhost:8501', // 后端接口的域名
target: 'http://192.168.0.240:8501', // 后端接口的域名
changeOrigin: true,
},
@ -95,7 +96,7 @@ export default env => {
// 强度计算模块
'/strength-api': {
target: 'http://localhost:8501',
target: 'http://192.168.0.240:8501',
changeOrigin: true,
rewrite: path => path.replace(/^\/strength-api/, '')
}