diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..0987a66
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,25 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{js,jsx,ts,tsx,vue}]
+indent_size = 2
+
+[*.{md,markdown}]
+trim_trailing_whitespace = false
+
+[*.go]
+indent_style = tab
+indent_size = 4
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[Makefile]
+indent_style = tab
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..a0d66be
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,42 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: "[BUG] "
+labels: "bug"
+assignees: ""
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Environment (please complete the following information):**
+
+- OS: [e.g. macOS, Windows, Linux]
+- Browser [e.g. chrome, safari]
+- Version [e.g. 22]
+- Node.js version: [e.g. 18.x]
+- Package manager: [e.g. pnpm, npm, yarn]
+
+**Additional context**
+Add any other context about the problem here.
+
+**Logs**
+Please include any relevant logs:
+
+```
+paste logs here
+```
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..fb51721
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,31 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: "[FEATURE] "
+labels: "enhancement"
+assignees: ""
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
+
+**Implementation details (if applicable)**
+
+- Affected components:
+- Potential breaking changes:
+- Dependencies:
+
+**Would you like to work on this feature?**
+
+- [ ] Yes, I would like to implement this feature
+- [ ] I need help with implementation
+- [ ] I prefer someone else to implement this
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..c68fa62
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,58 @@
+---
+name: Pull Request
+about: Submit a pull request to contribute to the project
+title: ""
+labels: ""
+assignees: ""
+---
+
+## Description
+
+Please include a summary of the change and which issue is fixed. Include relevant motivation and context.
+
+Fixes # (issue)
+
+## Type of change
+
+Please select the relevant options:
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] This change requires a documentation update
+- [ ] Performance improvement
+- [ ] Code refactoring
+- [ ] Test updates
+
+## Testing
+
+Please describe the tests that you ran to verify your changes:
+
+- [ ] Unit tests pass
+- [ ] Integration tests pass
+- [ ] Manual testing completed
+
+Test Configuration:
+
+- Node.js version:
+- Browser(s):
+- OS:
+
+## Checklist
+
+- [ ] My code follows the style guidelines of this project
+- [ ] I have performed a self-review of my own code
+- [ ] I have commented my code, particularly in hard-to-understand areas
+- [ ] I have made corresponding changes to the documentation
+- [ ] My changes generate no new warnings
+- [ ] I have added tests that prove my fix is effective or that my feature works
+- [ ] New and existing unit tests pass locally with my changes
+- [ ] Any dependent changes have been merged and published
+
+## Screenshots (if applicable)
+
+Please add screenshots to help reviewers understand the changes.
+
+## Additional Notes
+
+Add any other notes or context about the pull request here.
diff --git a/.gitignore b/.gitignore
index 5468b82..8854d7e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -120,7 +120,6 @@ coverage
.vscode-test
# IDE files
-.vscode/
.idea/
*.swp
*.swo
@@ -191,7 +190,6 @@ tramp
.\#*
# VS Code
-.vscode/
*.code-workspace
# JetBrains IDEs
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..58bba50
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,49 @@
+{
+ "recommendations": [
+ // Vue 开发必备
+ "vue.volar",
+ "vue.vscode-typescript-vue-plugin",
+
+ // 代码格式化和质量
+ "esbenp.prettier-vscode",
+ "dbaeumer.vscode-eslint",
+
+ // TypeScript 支持
+ "ms-vscode.vscode-typescript-next",
+
+ // Git 增强
+ "eamodio.gitlens",
+ "mhutchie.git-graph",
+
+ // 开发体验增强
+ "christian-kohler.path-intellisense",
+ "visualstudioexptteam.vscodeintellicode",
+ "ms-vscode.vscode-json",
+
+ // 文件图标
+ "vscode-icons-team.vscode-icons",
+
+ // 自动重命名标签
+ "formulahendry.auto-rename-tag",
+
+ // TODO 高亮
+ "wayou.vscode-todo-highlight",
+
+ // 注释增强
+ "aaron-bond.better-comments",
+
+ // 代码片段
+ "hollowtree.vue-snippets",
+
+ // 错误镜头
+ "usernamehw.errorlens",
+
+ // 导入成本
+ "wix.vscode-import-cost"
+ ],
+ "unwantedRecommendations": [
+ "ms-vscode.vscode-typescript",
+ "hookyqr.beautify",
+ "coenraads.bracket-pair-colorizer-2"
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..cab37ef
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,87 @@
+{
+ // 编辑器设置
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": true,
+ "editor.formatOnType": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit",
+ "source.organizeImports": "explicit"
+ },
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.tabSize": 2,
+ "editor.insertSpaces": true,
+ "editor.detectIndentation": false,
+ "editor.trimAutoWhitespace": true,
+ "files.trimTrailingWhitespace": true,
+ "files.insertFinalNewline": true,
+ "files.trimFinalNewlines": true,
+
+ // 文件关联
+ "[vue]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[javascript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[jsonc]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[html]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[css]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[scss]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[markdown]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.wordWrap": "on"
+ },
+
+ // ESLint 设置
+ "eslint.workingDirectories": ["web"],
+ "eslint.validate": [
+ "javascript",
+ "javascriptreact",
+ "typescript",
+ "typescriptreact",
+ "vue"
+ ],
+
+ // TypeScript 设置
+ "typescript.preferences.importModuleSpecifier": "relative",
+ "typescript.suggest.autoImports": true,
+ "typescript.updateImportsOnFileMove.enabled": "always",
+
+ // 搜索排除
+ "search.exclude": {
+ "**/node_modules": true,
+ "**/dist": true,
+ "**/coverage": true,
+ "**/*.log": true,
+ "**/pnpm-lock.yaml": true,
+ "**/package-lock.json": true,
+ "**/yarn.lock": true
+ },
+
+ // 终端设置
+ "terminal.integrated.defaultProfile.osx": "zsh",
+
+ // Git 设置
+ "git.autofetch": true,
+ "git.confirmSync": false,
+ "git.enableSmartCommit": true,
+
+ // Emmet 设置
+ "emmet.includeLanguages": {
+ "vue": "html"
+ }
+}
diff --git a/Makefile b/Makefile
index 4194113..2389dbf 100644
--- a/Makefile
+++ b/Makefile
@@ -43,10 +43,9 @@ build-all: clean ## 为所有支持的平台构建二进制文件
.PHONY: run
run: ## 构建前端并运行服务器
@echo "--- Building frontend... ---"
- cd web && npm install && npm run build
- @echo "--- Preparing backend... ---"
@rm -rf cmd/gpt-load/dist
- @cp -r web/dist cmd/gpt-load/dist
+ cd web && pnpm install && pnpm run build
+ @echo "--- Preparing backend... ---"
@echo "--- Starting backend... ---"
go run $(MAIN_PATH)/main.go
diff --git a/fe/index.html b/fe/index.html
deleted file mode 100644
index dde16aa..0000000
--- a/fe/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- Vite + Vue + TS
-
-
-
-
-
-
diff --git a/fe/package-lock.json b/fe/package-lock.json
deleted file mode 100644
index 9300dec..0000000
--- a/fe/package-lock.json
+++ /dev/null
@@ -1,1804 +0,0 @@
-{
- "name": "tb-vite-demo",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "tb-vite-demo",
- "version": "0.0.0",
- "dependencies": {
- "axios": "^1.9.0",
- "naive-ui": "^2.41.0",
- "vue": "^3.5.13",
- "vue-router": "^4.5.1"
- },
- "devDependencies": {
- "@types/node": "^22.15.24",
- "@vitejs/plugin-vue": "^5.2.3",
- "@vue/tsconfig": "^0.7.0",
- "typescript": "~5.8.3",
- "vite": "^6.3.5",
- "vue-tsc": "^2.2.8"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
- "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz",
- "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==",
- "dependencies": {
- "@babel/types": "^7.27.3"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
- "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
- "dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@css-render/plugin-bem": {
- "version": "0.15.14",
- "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz",
- "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==",
- "peerDependencies": {
- "css-render": "~0.15.14"
- }
- },
- "node_modules/@css-render/vue3-ssr": {
- "version": "0.15.14",
- "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz",
- "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==",
- "peerDependencies": {
- "vue": "^3.0.11"
- }
- },
- "node_modules/@emotion/hash": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
- "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
- "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
- "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
- "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
- "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
- "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
- "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
- "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
- "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
- "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
- "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
- "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
- "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
- "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
- "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
- "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
- "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
- "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
- "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
- "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
- "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
- "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
- "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
- "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
- "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
- "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
- },
- "node_modules/@juggle/resize-observer": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
- "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz",
- "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz",
- "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz",
- "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz",
- "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz",
- "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz",
- "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz",
- "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz",
- "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz",
- "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz",
- "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz",
- "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz",
- "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz",
- "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz",
- "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz",
- "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz",
- "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz",
- "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz",
- "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz",
- "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz",
- "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
- "dev": true
- },
- "node_modules/@types/katex": {
- "version": "0.16.7",
- "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
- "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
- },
- "node_modules/@types/lodash": {
- "version": "4.17.17",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz",
- "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ=="
- },
- "node_modules/@types/lodash-es": {
- "version": "4.17.12",
- "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
- "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
- "dependencies": {
- "@types/lodash": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "22.15.24",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz",
- "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==",
- "dev": true,
- "dependencies": {
- "undici-types": "~6.21.0"
- }
- },
- "node_modules/@vitejs/plugin-vue": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
- "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
- "dev": true,
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "peerDependencies": {
- "vite": "^5.0.0 || ^6.0.0",
- "vue": "^3.2.25"
- }
- },
- "node_modules/@volar/language-core": {
- "version": "2.4.14",
- "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.14.tgz",
- "integrity": "sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==",
- "dev": true,
- "dependencies": {
- "@volar/source-map": "2.4.14"
- }
- },
- "node_modules/@volar/source-map": {
- "version": "2.4.14",
- "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.14.tgz",
- "integrity": "sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==",
- "dev": true
- },
- "node_modules/@volar/typescript": {
- "version": "2.4.14",
- "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.14.tgz",
- "integrity": "sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==",
- "dev": true,
- "dependencies": {
- "@volar/language-core": "2.4.14",
- "path-browserify": "^1.0.1",
- "vscode-uri": "^3.0.8"
- }
- },
- "node_modules/@vue/compiler-core": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz",
- "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==",
- "dependencies": {
- "@babel/parser": "^7.27.2",
- "@vue/shared": "3.5.16",
- "entities": "^4.5.0",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-dom": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz",
- "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==",
- "dependencies": {
- "@vue/compiler-core": "3.5.16",
- "@vue/shared": "3.5.16"
- }
- },
- "node_modules/@vue/compiler-sfc": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz",
- "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==",
- "dependencies": {
- "@babel/parser": "^7.27.2",
- "@vue/compiler-core": "3.5.16",
- "@vue/compiler-dom": "3.5.16",
- "@vue/compiler-ssr": "3.5.16",
- "@vue/shared": "3.5.16",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.17",
- "postcss": "^8.5.3",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-ssr": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz",
- "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==",
- "dependencies": {
- "@vue/compiler-dom": "3.5.16",
- "@vue/shared": "3.5.16"
- }
- },
- "node_modules/@vue/compiler-vue2": {
- "version": "2.7.16",
- "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
- "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
- "dev": true,
- "dependencies": {
- "de-indent": "^1.0.2",
- "he": "^1.2.0"
- }
- },
- "node_modules/@vue/devtools-api": {
- "version": "6.6.4",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
- "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
- },
- "node_modules/@vue/language-core": {
- "version": "2.2.10",
- "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.10.tgz",
- "integrity": "sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==",
- "dev": true,
- "dependencies": {
- "@volar/language-core": "~2.4.11",
- "@vue/compiler-dom": "^3.5.0",
- "@vue/compiler-vue2": "^2.7.16",
- "@vue/shared": "^3.5.0",
- "alien-signals": "^1.0.3",
- "minimatch": "^9.0.3",
- "muggle-string": "^0.4.1",
- "path-browserify": "^1.0.1"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@vue/reactivity": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz",
- "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==",
- "dependencies": {
- "@vue/shared": "3.5.16"
- }
- },
- "node_modules/@vue/runtime-core": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz",
- "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==",
- "dependencies": {
- "@vue/reactivity": "3.5.16",
- "@vue/shared": "3.5.16"
- }
- },
- "node_modules/@vue/runtime-dom": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz",
- "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==",
- "dependencies": {
- "@vue/reactivity": "3.5.16",
- "@vue/runtime-core": "3.5.16",
- "@vue/shared": "3.5.16",
- "csstype": "^3.1.3"
- }
- },
- "node_modules/@vue/server-renderer": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz",
- "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==",
- "dependencies": {
- "@vue/compiler-ssr": "3.5.16",
- "@vue/shared": "3.5.16"
- },
- "peerDependencies": {
- "vue": "3.5.16"
- }
- },
- "node_modules/@vue/shared": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz",
- "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg=="
- },
- "node_modules/@vue/tsconfig": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.7.0.tgz",
- "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==",
- "dev": true,
- "peerDependencies": {
- "typescript": "5.x",
- "vue": "^3.4.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- },
- "vue": {
- "optional": true
- }
- }
- },
- "node_modules/alien-signals": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz",
- "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==",
- "dev": true
- },
- "node_modules/async-validator": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
- "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/axios": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
- "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/css-render": {
- "version": "0.15.14",
- "resolved": "https://registry.npmjs.org/css-render/-/css-render-0.15.14.tgz",
- "integrity": "sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==",
- "dependencies": {
- "@emotion/hash": "~0.8.0",
- "csstype": "~3.0.5"
- }
- },
- "node_modules/css-render/node_modules/csstype": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
- "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
- },
- "node_modules/date-fns": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
- "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/kossnocorp"
- }
- },
- "node_modules/date-fns-tz": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz",
- "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==",
- "peerDependencies": {
- "date-fns": "^3.0.0 || ^4.0.0"
- }
- },
- "node_modules/de-indent": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
- "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
- "dev": true
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/esbuild": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
- "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.5",
- "@esbuild/android-arm": "0.25.5",
- "@esbuild/android-arm64": "0.25.5",
- "@esbuild/android-x64": "0.25.5",
- "@esbuild/darwin-arm64": "0.25.5",
- "@esbuild/darwin-x64": "0.25.5",
- "@esbuild/freebsd-arm64": "0.25.5",
- "@esbuild/freebsd-x64": "0.25.5",
- "@esbuild/linux-arm": "0.25.5",
- "@esbuild/linux-arm64": "0.25.5",
- "@esbuild/linux-ia32": "0.25.5",
- "@esbuild/linux-loong64": "0.25.5",
- "@esbuild/linux-mips64el": "0.25.5",
- "@esbuild/linux-ppc64": "0.25.5",
- "@esbuild/linux-riscv64": "0.25.5",
- "@esbuild/linux-s390x": "0.25.5",
- "@esbuild/linux-x64": "0.25.5",
- "@esbuild/netbsd-arm64": "0.25.5",
- "@esbuild/netbsd-x64": "0.25.5",
- "@esbuild/openbsd-arm64": "0.25.5",
- "@esbuild/openbsd-x64": "0.25.5",
- "@esbuild/sunos-x64": "0.25.5",
- "@esbuild/win32-arm64": "0.25.5",
- "@esbuild/win32-ia32": "0.25.5",
- "@esbuild/win32-x64": "0.25.5"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
- },
- "node_modules/evtd": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/evtd/-/evtd-0.2.4.tgz",
- "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw=="
- },
- "node_modules/fdir": {
- "version": "6.4.5",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz",
- "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==",
- "dev": true,
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
- "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "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",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true,
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/highlight.js": {
- "version": "11.11.1",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
- "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "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=="
- },
- "node_modules/magic-string": {
- "version": "0.30.17",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
- "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/muggle-string": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
- "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
- "dev": true
- },
- "node_modules/naive-ui": {
- "version": "2.41.0",
- "resolved": "https://registry.npmjs.org/naive-ui/-/naive-ui-2.41.0.tgz",
- "integrity": "sha512-KnmLg+xPLwXV8QVR7ZZ69eCjvel7R5vru8+eFe4VoAJHEgqAJgVph6Zno9K2IVQRpSF3GBGea3tjavslOR4FAA==",
- "dependencies": {
- "@css-render/plugin-bem": "^0.15.14",
- "@css-render/vue3-ssr": "^0.15.14",
- "@types/katex": "^0.16.2",
- "@types/lodash": "^4.14.198",
- "@types/lodash-es": "^4.17.9",
- "async-validator": "^4.2.5",
- "css-render": "^0.15.14",
- "csstype": "^3.1.3",
- "date-fns": "^3.6.0",
- "date-fns-tz": "^3.1.3",
- "evtd": "^0.2.4",
- "highlight.js": "^11.8.0",
- "lodash": "^4.17.21",
- "lodash-es": "^4.17.21",
- "seemly": "^0.3.8",
- "treemate": "^0.3.11",
- "vdirs": "^0.1.8",
- "vooks": "^0.2.12",
- "vueuc": "^0.4.63"
- },
- "peerDependencies": {
- "vue": "^3.0.0"
- }
- },
- "node_modules/nanoid": {
- "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"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/path-browserify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
- "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
- "dev": true
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
- },
- "node_modules/picomatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.4",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz",
- "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.11",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/rollup": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz",
- "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==",
- "dev": true,
- "dependencies": {
- "@types/estree": "1.0.7"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.41.1",
- "@rollup/rollup-android-arm64": "4.41.1",
- "@rollup/rollup-darwin-arm64": "4.41.1",
- "@rollup/rollup-darwin-x64": "4.41.1",
- "@rollup/rollup-freebsd-arm64": "4.41.1",
- "@rollup/rollup-freebsd-x64": "4.41.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.41.1",
- "@rollup/rollup-linux-arm-musleabihf": "4.41.1",
- "@rollup/rollup-linux-arm64-gnu": "4.41.1",
- "@rollup/rollup-linux-arm64-musl": "4.41.1",
- "@rollup/rollup-linux-loongarch64-gnu": "4.41.1",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.41.1",
- "@rollup/rollup-linux-riscv64-musl": "4.41.1",
- "@rollup/rollup-linux-s390x-gnu": "4.41.1",
- "@rollup/rollup-linux-x64-gnu": "4.41.1",
- "@rollup/rollup-linux-x64-musl": "4.41.1",
- "@rollup/rollup-win32-arm64-msvc": "4.41.1",
- "@rollup/rollup-win32-ia32-msvc": "4.41.1",
- "@rollup/rollup-win32-x64-msvc": "4.41.1",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/seemly": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.10.tgz",
- "integrity": "sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q=="
- },
- "node_modules/source-map-js": {
- "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==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
- "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
- "dev": true,
- "dependencies": {
- "fdir": "^6.4.4",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/treemate": {
- "version": "0.3.11",
- "resolved": "https://registry.npmjs.org/treemate/-/treemate-0.3.11.tgz",
- "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg=="
- },
- "node_modules/typescript": {
- "version": "5.8.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
- "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
- "devOptional": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "dev": true
- },
- "node_modules/vdirs": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/vdirs/-/vdirs-0.1.8.tgz",
- "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==",
- "dependencies": {
- "evtd": "^0.2.2"
- },
- "peerDependencies": {
- "vue": "^3.0.11"
- }
- },
- "node_modules/vite": {
- "version": "6.3.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
- "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
- "dev": true,
- "dependencies": {
- "esbuild": "^0.25.0",
- "fdir": "^6.4.4",
- "picomatch": "^4.0.2",
- "postcss": "^8.5.3",
- "rollup": "^4.34.9",
- "tinyglobby": "^0.2.13"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "jiti": ">=1.21.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/vooks": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz",
- "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==",
- "dependencies": {
- "evtd": "^0.2.2"
- },
- "peerDependencies": {
- "vue": "^3.0.0"
- }
- },
- "node_modules/vscode-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
- "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
- "dev": true
- },
- "node_modules/vue": {
- "version": "3.5.16",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz",
- "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==",
- "dependencies": {
- "@vue/compiler-dom": "3.5.16",
- "@vue/compiler-sfc": "3.5.16",
- "@vue/runtime-dom": "3.5.16",
- "@vue/server-renderer": "3.5.16",
- "@vue/shared": "3.5.16"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/vue-router": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
- "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
- "dependencies": {
- "@vue/devtools-api": "^6.6.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/posva"
- },
- "peerDependencies": {
- "vue": "^3.2.0"
- }
- },
- "node_modules/vue-tsc": {
- "version": "2.2.10",
- "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.10.tgz",
- "integrity": "sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==",
- "dev": true,
- "dependencies": {
- "@volar/typescript": "~2.4.11",
- "@vue/language-core": "2.2.10"
- },
- "bin": {
- "vue-tsc": "bin/vue-tsc.js"
- },
- "peerDependencies": {
- "typescript": ">=5.0.0"
- }
- },
- "node_modules/vueuc": {
- "version": "0.4.64",
- "resolved": "https://registry.npmjs.org/vueuc/-/vueuc-0.4.64.tgz",
- "integrity": "sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==",
- "dependencies": {
- "@css-render/vue3-ssr": "^0.15.10",
- "@juggle/resize-observer": "^3.3.1",
- "css-render": "^0.15.10",
- "evtd": "^0.2.4",
- "seemly": "^0.3.6",
- "vdirs": "^0.1.4",
- "vooks": "^0.2.4"
- },
- "peerDependencies": {
- "vue": "^3.0.11"
- }
- }
- }
-}
diff --git a/fe/package.json b/fe/package.json
deleted file mode 100644
index af5aae4..0000000
--- a/fe/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "tb-vite-demo",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vue-tsc -b && vite build",
- "preview": "vite preview"
- },
- "dependencies": {
- "axios": "^1.9.0",
- "naive-ui": "^2.41.0",
- "vue": "^3.5.13",
- "vue-router": "^4.5.1"
- },
- "devDependencies": {
- "@types/node": "^22.15.24",
- "@vitejs/plugin-vue": "^5.2.3",
- "@vue/tsconfig": "^0.7.0",
- "typescript": "~5.8.3",
- "vite": "^6.3.5",
- "vue-tsc": "^2.2.8"
- }
-}
diff --git a/fe/pnpm-lock.yaml b/fe/pnpm-lock.yaml
deleted file mode 100644
index 94ac2c6..0000000
--- a/fe/pnpm-lock.yaml
+++ /dev/null
@@ -1,1307 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- axios:
- specifier: ^1.9.0
- version: 1.10.0
- naive-ui:
- specifier: ^2.41.0
- version: 2.42.0(vue@3.5.17(typescript@5.8.3))
- vue:
- specifier: ^3.5.13
- version: 3.5.17(typescript@5.8.3)
- vue-router:
- specifier: ^4.5.1
- version: 4.5.1(vue@3.5.17(typescript@5.8.3))
- devDependencies:
- '@types/node':
- specifier: ^22.15.24
- version: 22.15.34
- '@vitejs/plugin-vue':
- specifier: ^5.2.3
- version: 5.2.4(vite@6.3.5(@types/node@22.15.34))(vue@3.5.17(typescript@5.8.3))
- '@vue/tsconfig':
- specifier: ^0.7.0
- version: 0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
- typescript:
- specifier: ~5.8.3
- version: 5.8.3
- vite:
- specifier: ^6.3.5
- version: 6.3.5(@types/node@22.15.34)
- vue-tsc:
- specifier: ^2.2.8
- version: 2.2.10(typescript@5.8.3)
-
-packages:
-
- '@babel/helper-string-parser@7.27.1':
- resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.27.7':
- resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/types@7.27.7':
- resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==}
- engines: {node: '>=6.9.0'}
-
- '@css-render/plugin-bem@0.15.14':
- resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==}
- peerDependencies:
- css-render: ~0.15.14
-
- '@css-render/vue3-ssr@0.15.14':
- resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==}
- peerDependencies:
- vue: ^3.0.11
-
- '@emotion/hash@0.8.0':
- resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
-
- '@esbuild/aix-ppc64@0.25.5':
- resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [aix]
-
- '@esbuild/android-arm64@0.25.5':
- resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm@0.25.5':
- resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-x64@0.25.5':
- resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/darwin-arm64@0.25.5':
- resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.25.5':
- resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/freebsd-arm64@0.25.5':
- resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.25.5':
- resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/linux-arm64@0.25.5':
- resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm@0.25.5':
- resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-ia32@0.25.5':
- resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-loong64@0.25.5':
- resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
- engines: {node: '>=18'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.25.5':
- resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
- engines: {node: '>=18'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.25.5':
- resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.25.5':
- resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
- engines: {node: '>=18'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-s390x@0.25.5':
- resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
- engines: {node: '>=18'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-x64@0.25.5':
- resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/netbsd-arm64@0.25.5':
- resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
- '@esbuild/netbsd-x64@0.25.5':
- resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/openbsd-arm64@0.25.5':
- resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openbsd]
-
- '@esbuild/openbsd-x64@0.25.5':
- resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/sunos-x64@0.25.5':
- resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/win32-arm64@0.25.5':
- resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-ia32@0.25.5':
- resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-x64@0.25.5':
- resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [win32]
-
- '@jridgewell/sourcemap-codec@1.5.2':
- resolution: {integrity: sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==}
-
- '@juggle/resize-observer@3.4.0':
- resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
-
- '@rollup/rollup-android-arm-eabi@4.44.1':
- resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm64@4.44.1':
- resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-darwin-arm64@4.44.1':
- resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-x64@4.44.1':
- resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.44.1':
- resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.44.1':
- resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==}
- cpu: [x64]
- os: [freebsd]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.44.1':
- resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==}
- cpu: [arm]
- os: [linux]
-
- '@rollup/rollup-linux-arm-musleabihf@4.44.1':
- resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==}
- cpu: [arm]
- os: [linux]
-
- '@rollup/rollup-linux-arm64-gnu@4.44.1':
- resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==}
- cpu: [arm64]
- os: [linux]
-
- '@rollup/rollup-linux-arm64-musl@4.44.1':
- resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==}
- cpu: [arm64]
- os: [linux]
-
- '@rollup/rollup-linux-loongarch64-gnu@4.44.1':
- resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==}
- cpu: [loong64]
- os: [linux]
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.44.1':
- resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==}
- cpu: [ppc64]
- os: [linux]
-
- '@rollup/rollup-linux-riscv64-gnu@4.44.1':
- resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==}
- cpu: [riscv64]
- os: [linux]
-
- '@rollup/rollup-linux-riscv64-musl@4.44.1':
- resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==}
- cpu: [riscv64]
- os: [linux]
-
- '@rollup/rollup-linux-s390x-gnu@4.44.1':
- resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==}
- cpu: [s390x]
- os: [linux]
-
- '@rollup/rollup-linux-x64-gnu@4.44.1':
- resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==}
- cpu: [x64]
- os: [linux]
-
- '@rollup/rollup-linux-x64-musl@4.44.1':
- resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==}
- cpu: [x64]
- os: [linux]
-
- '@rollup/rollup-win32-arm64-msvc@4.44.1':
- resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.44.1':
- resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.44.1':
- resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==}
- cpu: [x64]
- os: [win32]
-
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
-
- '@types/katex@0.16.7':
- resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
-
- '@types/lodash-es@4.17.12':
- resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
-
- '@types/lodash@4.17.19':
- resolution: {integrity: sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ==}
-
- '@types/node@22.15.34':
- resolution: {integrity: sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==}
-
- '@vitejs/plugin-vue@5.2.4':
- resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- peerDependencies:
- vite: ^5.0.0 || ^6.0.0
- vue: ^3.2.25
-
- '@volar/language-core@2.4.15':
- resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==}
-
- '@volar/source-map@2.4.15':
- resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==}
-
- '@volar/typescript@2.4.15':
- resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==}
-
- '@vue/compiler-core@3.5.17':
- resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==}
-
- '@vue/compiler-dom@3.5.17':
- resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==}
-
- '@vue/compiler-sfc@3.5.17':
- resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==}
-
- '@vue/compiler-ssr@3.5.17':
- resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==}
-
- '@vue/compiler-vue2@2.7.16':
- resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
-
- '@vue/devtools-api@6.6.4':
- resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
-
- '@vue/language-core@2.2.10':
- resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@vue/reactivity@3.5.17':
- resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==}
-
- '@vue/runtime-core@3.5.17':
- resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==}
-
- '@vue/runtime-dom@3.5.17':
- resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==}
-
- '@vue/server-renderer@3.5.17':
- resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==}
- peerDependencies:
- vue: 3.5.17
-
- '@vue/shared@3.5.17':
- resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==}
-
- '@vue/tsconfig@0.7.0':
- resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==}
- peerDependencies:
- typescript: 5.x
- vue: ^3.4.0
- peerDependenciesMeta:
- typescript:
- optional: true
- vue:
- optional: true
-
- alien-signals@1.0.13:
- resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==}
-
- async-validator@4.2.5:
- resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
-
- asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-
- axios@1.10.0:
- resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==}
-
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- brace-expansion@2.0.2:
- resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
-
- call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
- engines: {node: '>= 0.4'}
-
- combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
-
- css-render@0.15.14:
- resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==}
-
- csstype@3.0.11:
- resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
-
- csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-
- date-fns-tz@3.2.0:
- resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==}
- peerDependencies:
- date-fns: ^3.0.0 || ^4.0.0
-
- date-fns@3.6.0:
- resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
-
- de-indent@1.0.2:
- resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
-
- delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
-
- dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
-
- entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
-
- es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
-
- es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
-
- es-object-atoms@1.1.1:
- resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
- engines: {node: '>= 0.4'}
-
- es-set-tostringtag@2.1.0:
- resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
- engines: {node: '>= 0.4'}
-
- esbuild@0.25.5:
- resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
- engines: {node: '>=18'}
- hasBin: true
-
- estree-walker@2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-
- evtd@0.2.4:
- resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==}
-
- fdir@6.4.6:
- resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
- peerDependencies:
- picomatch: ^3 || ^4
- peerDependenciesMeta:
- picomatch:
- optional: true
-
- follow-redirects@1.15.9:
- resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
-
- form-data@4.0.3:
- resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==}
- engines: {node: '>= 6'}
-
- fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
-
- function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
-
- get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
-
- gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
-
- has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
-
- has-tostringtag@1.0.2:
- resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
- engines: {node: '>= 0.4'}
-
- hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
- engines: {node: '>= 0.4'}
-
- he@1.2.0:
- resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
- hasBin: true
-
- highlight.js@11.11.1:
- resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
- engines: {node: '>=12.0.0'}
-
- lodash-es@4.17.21:
- resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
-
- lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-
- magic-string@0.30.17:
- resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
-
- math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
-
- mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
-
- mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
-
- minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- muggle-string@0.4.1:
- resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
-
- naive-ui@2.42.0:
- resolution: {integrity: sha512-c7cXR2YgOjgtBadXHwiWL4Y0tpGLAI5W5QzzHksOi22iuHXoSGMAzdkVTGVPE/PM0MSGQ/JtUIzCx2Y0hU0vTQ==}
- peerDependencies:
- vue: ^3.0.0
-
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
- path-browserify@1.0.1:
- resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
-
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
- picomatch@4.0.2:
- resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
- engines: {node: '>=12'}
-
- postcss@8.5.6:
- resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
- engines: {node: ^10 || ^12 || >=14}
-
- proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
-
- rollup@4.44.1:
- resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
- seemly@0.3.10:
- resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==}
-
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
-
- tinyglobby@0.2.14:
- resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
- engines: {node: '>=12.0.0'}
-
- treemate@0.3.11:
- resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
-
- typescript@5.8.3:
- resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
- vdirs@0.1.8:
- resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
- peerDependencies:
- vue: ^3.0.11
-
- vite@6.3.5:
- resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
- jiti: '>=1.21.0'
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.16.0
- tsx: ^4.8.1
- yaml: ^2.4.2
- peerDependenciesMeta:
- '@types/node':
- optional: true
- jiti:
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- tsx:
- optional: true
- yaml:
- optional: true
-
- vooks@0.2.12:
- resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
- peerDependencies:
- vue: ^3.0.0
-
- vscode-uri@3.1.0:
- resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
-
- vue-router@4.5.1:
- resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==}
- peerDependencies:
- vue: ^3.2.0
-
- vue-tsc@2.2.10:
- resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==}
- hasBin: true
- peerDependencies:
- typescript: '>=5.0.0'
-
- vue@3.5.17:
- resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- vueuc@0.4.64:
- resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==}
- peerDependencies:
- vue: ^3.0.11
-
-snapshots:
-
- '@babel/helper-string-parser@7.27.1': {}
-
- '@babel/helper-validator-identifier@7.27.1': {}
-
- '@babel/parser@7.27.7':
- dependencies:
- '@babel/types': 7.27.7
-
- '@babel/types@7.27.7':
- dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
-
- '@css-render/plugin-bem@0.15.14(css-render@0.15.14)':
- dependencies:
- css-render: 0.15.14
-
- '@css-render/vue3-ssr@0.15.14(vue@3.5.17(typescript@5.8.3))':
- dependencies:
- vue: 3.5.17(typescript@5.8.3)
-
- '@emotion/hash@0.8.0': {}
-
- '@esbuild/aix-ppc64@0.25.5':
- optional: true
-
- '@esbuild/android-arm64@0.25.5':
- optional: true
-
- '@esbuild/android-arm@0.25.5':
- optional: true
-
- '@esbuild/android-x64@0.25.5':
- optional: true
-
- '@esbuild/darwin-arm64@0.25.5':
- optional: true
-
- '@esbuild/darwin-x64@0.25.5':
- optional: true
-
- '@esbuild/freebsd-arm64@0.25.5':
- optional: true
-
- '@esbuild/freebsd-x64@0.25.5':
- optional: true
-
- '@esbuild/linux-arm64@0.25.5':
- optional: true
-
- '@esbuild/linux-arm@0.25.5':
- optional: true
-
- '@esbuild/linux-ia32@0.25.5':
- optional: true
-
- '@esbuild/linux-loong64@0.25.5':
- optional: true
-
- '@esbuild/linux-mips64el@0.25.5':
- optional: true
-
- '@esbuild/linux-ppc64@0.25.5':
- optional: true
-
- '@esbuild/linux-riscv64@0.25.5':
- optional: true
-
- '@esbuild/linux-s390x@0.25.5':
- optional: true
-
- '@esbuild/linux-x64@0.25.5':
- optional: true
-
- '@esbuild/netbsd-arm64@0.25.5':
- optional: true
-
- '@esbuild/netbsd-x64@0.25.5':
- optional: true
-
- '@esbuild/openbsd-arm64@0.25.5':
- optional: true
-
- '@esbuild/openbsd-x64@0.25.5':
- optional: true
-
- '@esbuild/sunos-x64@0.25.5':
- optional: true
-
- '@esbuild/win32-arm64@0.25.5':
- optional: true
-
- '@esbuild/win32-ia32@0.25.5':
- optional: true
-
- '@esbuild/win32-x64@0.25.5':
- optional: true
-
- '@jridgewell/sourcemap-codec@1.5.2': {}
-
- '@juggle/resize-observer@3.4.0': {}
-
- '@rollup/rollup-android-arm-eabi@4.44.1':
- optional: true
-
- '@rollup/rollup-android-arm64@4.44.1':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.44.1':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.44.1':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.44.1':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-arm64-gnu@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-arm64-musl@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-loongarch64-gnu@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-riscv64-gnu@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-riscv64-musl@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-s390x-gnu@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-x64-gnu@4.44.1':
- optional: true
-
- '@rollup/rollup-linux-x64-musl@4.44.1':
- optional: true
-
- '@rollup/rollup-win32-arm64-msvc@4.44.1':
- optional: true
-
- '@rollup/rollup-win32-ia32-msvc@4.44.1':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.44.1':
- optional: true
-
- '@types/estree@1.0.8': {}
-
- '@types/katex@0.16.7': {}
-
- '@types/lodash-es@4.17.12':
- dependencies:
- '@types/lodash': 4.17.19
-
- '@types/lodash@4.17.19': {}
-
- '@types/node@22.15.34':
- dependencies:
- undici-types: 6.21.0
-
- '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.34))(vue@3.5.17(typescript@5.8.3))':
- dependencies:
- vite: 6.3.5(@types/node@22.15.34)
- vue: 3.5.17(typescript@5.8.3)
-
- '@volar/language-core@2.4.15':
- dependencies:
- '@volar/source-map': 2.4.15
-
- '@volar/source-map@2.4.15': {}
-
- '@volar/typescript@2.4.15':
- dependencies:
- '@volar/language-core': 2.4.15
- path-browserify: 1.0.1
- vscode-uri: 3.1.0
-
- '@vue/compiler-core@3.5.17':
- dependencies:
- '@babel/parser': 7.27.7
- '@vue/shared': 3.5.17
- entities: 4.5.0
- estree-walker: 2.0.2
- source-map-js: 1.2.1
-
- '@vue/compiler-dom@3.5.17':
- dependencies:
- '@vue/compiler-core': 3.5.17
- '@vue/shared': 3.5.17
-
- '@vue/compiler-sfc@3.5.17':
- dependencies:
- '@babel/parser': 7.27.7
- '@vue/compiler-core': 3.5.17
- '@vue/compiler-dom': 3.5.17
- '@vue/compiler-ssr': 3.5.17
- '@vue/shared': 3.5.17
- estree-walker: 2.0.2
- magic-string: 0.30.17
- postcss: 8.5.6
- source-map-js: 1.2.1
-
- '@vue/compiler-ssr@3.5.17':
- dependencies:
- '@vue/compiler-dom': 3.5.17
- '@vue/shared': 3.5.17
-
- '@vue/compiler-vue2@2.7.16':
- dependencies:
- de-indent: 1.0.2
- he: 1.2.0
-
- '@vue/devtools-api@6.6.4': {}
-
- '@vue/language-core@2.2.10(typescript@5.8.3)':
- dependencies:
- '@volar/language-core': 2.4.15
- '@vue/compiler-dom': 3.5.17
- '@vue/compiler-vue2': 2.7.16
- '@vue/shared': 3.5.17
- alien-signals: 1.0.13
- minimatch: 9.0.5
- muggle-string: 0.4.1
- path-browserify: 1.0.1
- optionalDependencies:
- typescript: 5.8.3
-
- '@vue/reactivity@3.5.17':
- dependencies:
- '@vue/shared': 3.5.17
-
- '@vue/runtime-core@3.5.17':
- dependencies:
- '@vue/reactivity': 3.5.17
- '@vue/shared': 3.5.17
-
- '@vue/runtime-dom@3.5.17':
- dependencies:
- '@vue/reactivity': 3.5.17
- '@vue/runtime-core': 3.5.17
- '@vue/shared': 3.5.17
- csstype: 3.1.3
-
- '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))':
- dependencies:
- '@vue/compiler-ssr': 3.5.17
- '@vue/shared': 3.5.17
- vue: 3.5.17(typescript@5.8.3)
-
- '@vue/shared@3.5.17': {}
-
- '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))':
- optionalDependencies:
- typescript: 5.8.3
- vue: 3.5.17(typescript@5.8.3)
-
- alien-signals@1.0.13: {}
-
- async-validator@4.2.5: {}
-
- asynckit@0.4.0: {}
-
- axios@1.10.0:
- dependencies:
- follow-redirects: 1.15.9
- form-data: 4.0.3
- proxy-from-env: 1.1.0
- transitivePeerDependencies:
- - debug
-
- balanced-match@1.0.2: {}
-
- brace-expansion@2.0.2:
- dependencies:
- balanced-match: 1.0.2
-
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
-
- combined-stream@1.0.8:
- dependencies:
- delayed-stream: 1.0.0
-
- css-render@0.15.14:
- dependencies:
- '@emotion/hash': 0.8.0
- csstype: 3.0.11
-
- csstype@3.0.11: {}
-
- csstype@3.1.3: {}
-
- date-fns-tz@3.2.0(date-fns@3.6.0):
- dependencies:
- date-fns: 3.6.0
-
- date-fns@3.6.0: {}
-
- de-indent@1.0.2: {}
-
- delayed-stream@1.0.0: {}
-
- dunder-proto@1.0.1:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-errors: 1.3.0
- gopd: 1.2.0
-
- entities@4.5.0: {}
-
- es-define-property@1.0.1: {}
-
- es-errors@1.3.0: {}
-
- es-object-atoms@1.1.1:
- dependencies:
- es-errors: 1.3.0
-
- es-set-tostringtag@2.1.0:
- dependencies:
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- esbuild@0.25.5:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.5
- '@esbuild/android-arm': 0.25.5
- '@esbuild/android-arm64': 0.25.5
- '@esbuild/android-x64': 0.25.5
- '@esbuild/darwin-arm64': 0.25.5
- '@esbuild/darwin-x64': 0.25.5
- '@esbuild/freebsd-arm64': 0.25.5
- '@esbuild/freebsd-x64': 0.25.5
- '@esbuild/linux-arm': 0.25.5
- '@esbuild/linux-arm64': 0.25.5
- '@esbuild/linux-ia32': 0.25.5
- '@esbuild/linux-loong64': 0.25.5
- '@esbuild/linux-mips64el': 0.25.5
- '@esbuild/linux-ppc64': 0.25.5
- '@esbuild/linux-riscv64': 0.25.5
- '@esbuild/linux-s390x': 0.25.5
- '@esbuild/linux-x64': 0.25.5
- '@esbuild/netbsd-arm64': 0.25.5
- '@esbuild/netbsd-x64': 0.25.5
- '@esbuild/openbsd-arm64': 0.25.5
- '@esbuild/openbsd-x64': 0.25.5
- '@esbuild/sunos-x64': 0.25.5
- '@esbuild/win32-arm64': 0.25.5
- '@esbuild/win32-ia32': 0.25.5
- '@esbuild/win32-x64': 0.25.5
-
- estree-walker@2.0.2: {}
-
- evtd@0.2.4: {}
-
- fdir@6.4.6(picomatch@4.0.2):
- optionalDependencies:
- picomatch: 4.0.2
-
- follow-redirects@1.15.9: {}
-
- form-data@4.0.3:
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- es-set-tostringtag: 2.1.0
- hasown: 2.0.2
- mime-types: 2.1.35
-
- fsevents@2.3.3:
- optional: true
-
- function-bind@1.1.2: {}
-
- get-intrinsic@1.3.0:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- function-bind: 1.1.2
- get-proto: 1.0.1
- gopd: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.2
- math-intrinsics: 1.1.0
-
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.1
-
- gopd@1.2.0: {}
-
- has-symbols@1.1.0: {}
-
- has-tostringtag@1.0.2:
- dependencies:
- has-symbols: 1.1.0
-
- hasown@2.0.2:
- dependencies:
- function-bind: 1.1.2
-
- he@1.2.0: {}
-
- highlight.js@11.11.1: {}
-
- lodash-es@4.17.21: {}
-
- lodash@4.17.21: {}
-
- magic-string@0.30.17:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.2
-
- math-intrinsics@1.1.0: {}
-
- mime-db@1.52.0: {}
-
- mime-types@2.1.35:
- dependencies:
- mime-db: 1.52.0
-
- minimatch@9.0.5:
- dependencies:
- brace-expansion: 2.0.2
-
- muggle-string@0.4.1: {}
-
- naive-ui@2.42.0(vue@3.5.17(typescript@5.8.3)):
- dependencies:
- '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
- '@css-render/vue3-ssr': 0.15.14(vue@3.5.17(typescript@5.8.3))
- '@types/katex': 0.16.7
- '@types/lodash': 4.17.19
- '@types/lodash-es': 4.17.12
- async-validator: 4.2.5
- css-render: 0.15.14
- csstype: 3.1.3
- date-fns: 3.6.0
- date-fns-tz: 3.2.0(date-fns@3.6.0)
- evtd: 0.2.4
- highlight.js: 11.11.1
- lodash: 4.17.21
- lodash-es: 4.17.21
- seemly: 0.3.10
- treemate: 0.3.11
- vdirs: 0.1.8(vue@3.5.17(typescript@5.8.3))
- vooks: 0.2.12(vue@3.5.17(typescript@5.8.3))
- vue: 3.5.17(typescript@5.8.3)
- vueuc: 0.4.64(vue@3.5.17(typescript@5.8.3))
-
- nanoid@3.3.11: {}
-
- path-browserify@1.0.1: {}
-
- picocolors@1.1.1: {}
-
- picomatch@4.0.2: {}
-
- postcss@8.5.6:
- dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- proxy-from-env@1.1.0: {}
-
- rollup@4.44.1:
- dependencies:
- '@types/estree': 1.0.8
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.44.1
- '@rollup/rollup-android-arm64': 4.44.1
- '@rollup/rollup-darwin-arm64': 4.44.1
- '@rollup/rollup-darwin-x64': 4.44.1
- '@rollup/rollup-freebsd-arm64': 4.44.1
- '@rollup/rollup-freebsd-x64': 4.44.1
- '@rollup/rollup-linux-arm-gnueabihf': 4.44.1
- '@rollup/rollup-linux-arm-musleabihf': 4.44.1
- '@rollup/rollup-linux-arm64-gnu': 4.44.1
- '@rollup/rollup-linux-arm64-musl': 4.44.1
- '@rollup/rollup-linux-loongarch64-gnu': 4.44.1
- '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1
- '@rollup/rollup-linux-riscv64-gnu': 4.44.1
- '@rollup/rollup-linux-riscv64-musl': 4.44.1
- '@rollup/rollup-linux-s390x-gnu': 4.44.1
- '@rollup/rollup-linux-x64-gnu': 4.44.1
- '@rollup/rollup-linux-x64-musl': 4.44.1
- '@rollup/rollup-win32-arm64-msvc': 4.44.1
- '@rollup/rollup-win32-ia32-msvc': 4.44.1
- '@rollup/rollup-win32-x64-msvc': 4.44.1
- fsevents: 2.3.3
-
- seemly@0.3.10: {}
-
- source-map-js@1.2.1: {}
-
- tinyglobby@0.2.14:
- dependencies:
- fdir: 6.4.6(picomatch@4.0.2)
- picomatch: 4.0.2
-
- treemate@0.3.11: {}
-
- typescript@5.8.3: {}
-
- undici-types@6.21.0: {}
-
- vdirs@0.1.8(vue@3.5.17(typescript@5.8.3)):
- dependencies:
- evtd: 0.2.4
- vue: 3.5.17(typescript@5.8.3)
-
- vite@6.3.5(@types/node@22.15.34):
- dependencies:
- esbuild: 0.25.5
- fdir: 6.4.6(picomatch@4.0.2)
- picomatch: 4.0.2
- postcss: 8.5.6
- rollup: 4.44.1
- tinyglobby: 0.2.14
- optionalDependencies:
- '@types/node': 22.15.34
- fsevents: 2.3.3
-
- vooks@0.2.12(vue@3.5.17(typescript@5.8.3)):
- dependencies:
- evtd: 0.2.4
- vue: 3.5.17(typescript@5.8.3)
-
- vscode-uri@3.1.0: {}
-
- vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)):
- dependencies:
- '@vue/devtools-api': 6.6.4
- vue: 3.5.17(typescript@5.8.3)
-
- vue-tsc@2.2.10(typescript@5.8.3):
- dependencies:
- '@volar/typescript': 2.4.15
- '@vue/language-core': 2.2.10(typescript@5.8.3)
- typescript: 5.8.3
-
- vue@3.5.17(typescript@5.8.3):
- dependencies:
- '@vue/compiler-dom': 3.5.17
- '@vue/compiler-sfc': 3.5.17
- '@vue/runtime-dom': 3.5.17
- '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3))
- '@vue/shared': 3.5.17
- optionalDependencies:
- typescript: 5.8.3
-
- vueuc@0.4.64(vue@3.5.17(typescript@5.8.3)):
- dependencies:
- '@css-render/vue3-ssr': 0.15.14(vue@3.5.17(typescript@5.8.3))
- '@juggle/resize-observer': 3.4.0
- css-render: 0.15.14
- evtd: 0.2.4
- seemly: 0.3.10
- vdirs: 0.1.8(vue@3.5.17(typescript@5.8.3))
- vooks: 0.2.12(vue@3.5.17(typescript@5.8.3))
- vue: 3.5.17(typescript@5.8.3)
diff --git a/fe/src/App.vue b/fe/src/App.vue
deleted file mode 100644
index c8067b5..0000000
--- a/fe/src/App.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/fe/src/assets/vue.svg b/fe/src/assets/vue.svg
deleted file mode 100644
index 770e9d3..0000000
--- a/fe/src/assets/vue.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/fe/src/components/Logout.vue b/fe/src/components/Logout.vue
deleted file mode 100644
index 7433244..0000000
--- a/fe/src/components/Logout.vue
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- 退出
-
-
diff --git a/fe/src/main.ts b/fe/src/main.ts
deleted file mode 100644
index 0ae79f1..0000000
--- a/fe/src/main.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createApp } from 'vue'
-import './style.css'
-import App from './App.vue'
-import router from './utils/router'
-import naive from 'naive-ui'
-
-createApp(App)
- .use(router)
- .use(naive)
- .mount('#app')
diff --git a/fe/src/style.css b/fe/src/style.css
deleted file mode 100644
index c038d7e..0000000
--- a/fe/src/style.css
+++ /dev/null
@@ -1,82 +0,0 @@
-:root {
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
- line-height: 1.5;
- font-weight: 400;
-
- 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;
-}
-
-#app {
- max-width: 1280px;
- width: 100%;
- margin: 0 auto;
- padding: 2rem;
- min-height: 100vh;
-}
-
-.flex {
- display: flex;
-}
-
-.flex-row {
- flex-direction: row;
-}
-
-.flex-col {
- flex-direction: column;
-}
-
-.justify-start {
- justify-content: flex-start;
-}
-
-.justify-center {
- justify-content: center;
-}
-
-.justify-end {
- justify-content: flex-end;
-}
-
-.justify-between {
- justify-content: space-between;
-}
-
-.items-start {
- align-items: flex-start;
-}
-
-.items-center {
- align-items: center;
-}
-
-.items-end {
- align-items: flex-end;
-}
-
-.flex-wrap {
- flex-wrap: wrap;
-}
-
-.flex-nowrap {
- flex-wrap: nowrap;
-}
-
-.grow {
- flex-grow: 1;
-}
-
-.shrink {
- flex-shrink: 1;
-}
diff --git a/fe/src/views/Dashboard.vue b/fe/src/views/Dashboard.vue
deleted file mode 100644
index 3f1a307..0000000
--- a/fe/src/views/Dashboard.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/fe/src/views/Login.vue b/fe/src/views/Login.vue
deleted file mode 100644
index 7537bb0..0000000
--- a/fe/src/views/Login.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Login
-
diff --git a/fe/src/views/Logs.vue b/fe/src/views/Logs.vue
deleted file mode 100644
index d27c933..0000000
--- a/fe/src/views/Logs.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
- logs
-
diff --git a/fe/src/views/Settings.vue b/fe/src/views/Settings.vue
deleted file mode 100644
index f395f53..0000000
--- a/fe/src/views/Settings.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
- settings
-
diff --git a/fe/src/vite-env.d.ts b/fe/src/vite-env.d.ts
deleted file mode 100644
index 11f02fe..0000000
--- a/fe/src/vite-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/fe/tsconfig.app.json b/fe/tsconfig.app.json
deleted file mode 100644
index 36f23ab..0000000
--- a/fe/tsconfig.app.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "extends": "@vue/tsconfig/tsconfig.dom.json",
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "baseUrl": ".",
- "paths": {
- "@/*": ["src/*"],
- },
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
- },
- "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
-}
diff --git a/fe/tsconfig.json b/fe/tsconfig.json
deleted file mode 100644
index 1ffef60..0000000
--- a/fe/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
-}
diff --git a/fe/tsconfig.node.json b/fe/tsconfig.node.json
deleted file mode 100644
index 9728af2..0000000
--- a/fe/tsconfig.node.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "target": "ES2022",
- "lib": ["ES2023"],
- "module": "ESNext",
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "moduleDetection": "force",
- "noEmit": true,
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/fe/vite.config.ts b/fe/vite.config.ts
deleted file mode 100644
index 4451734..0000000
--- a/fe/vite.config.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import path from 'path'
-
-// https://vite.dev/config/
-export default defineConfig({
- plugins: [vue()],
- // 解析配置
- resolve: {
- // 配置路径别名
- alias: {
- '@': path.resolve(__dirname, './src')
- }
- },
- // 开发服务器配置
- server: {
- // 代理配置示例
- proxy: {
- '/api': {
- target: 'http://api.example.com',
- changeOrigin: true,
- rewrite: (path) => path.replace(/^\/api/, '')
- }
- }
- },
- // 构建配置
- build: {
- outDir: 'dist',
- assetsDir: 'assets'
- }
-})
diff --git a/web/.browserslistrc b/web/.browserslistrc
new file mode 100644
index 0000000..8a6f52c
--- /dev/null
+++ b/web/.browserslistrc
@@ -0,0 +1,10 @@
+# Browsers that we support
+> 1%
+last 2 versions
+not dead
+not ie 11
+not op_mini all
+Chrome >= 87
+Firefox >= 78
+Safari >= 14
+Edge >= 88
diff --git a/web/.gitignore b/web/.gitignore
index a547bf3..e69de29 100644
--- a/web/.gitignore
+++ b/web/.gitignore
@@ -1,24 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/web/.lintstagedrc b/web/.lintstagedrc
new file mode 100644
index 0000000..8a4a416
--- /dev/null
+++ b/web/.lintstagedrc
@@ -0,0 +1,7 @@
+{
+ "*.{js,jsx,ts,tsx,vue}": ["eslint --fix", "prettier --write"],
+ "*.{json,jsonc}": ["prettier --write"],
+ "*.{css,scss,less}": ["prettier --write"],
+ "*.{md,markdown}": ["prettier --write"],
+ "*.{yaml,yml}": ["prettier --write"]
+}
diff --git a/web/.npmrc b/web/.npmrc
new file mode 100644
index 0000000..910cac9
--- /dev/null
+++ b/web/.npmrc
@@ -0,0 +1,30 @@
+# Use pnpm as package manager
+package-manager=pnpm
+
+# Registry configuration
+registry=https://registry.npmjs.org/
+
+# Install configuration
+prefer-offline=true
+prefer-frozen-lockfile=true
+strict-peer-dependencies=false
+
+# Hoisting configuration
+shamefully-hoist=false
+public-hoist-pattern[]=*eslint*
+public-hoist-pattern[]=*prettier*
+
+# Workspace configuration
+link-workspace-packages=true
+
+# Node.js configuration
+node-version=18
+
+# Store configuration
+store-dir=~/.pnpm-store
+
+# Logging
+loglevel=info
+
+# Security
+audit-level=moderate
diff --git a/web/.prettierignore b/web/.prettierignore
new file mode 100644
index 0000000..dd24109
--- /dev/null
+++ b/web/.prettierignore
@@ -0,0 +1,43 @@
+# Build outputs
+dist
+dist-ssr
+coverage
+
+# Dependencies
+node_modules
+
+# Logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+# Environment files
+.env
+.env.*
+!.env.example
+
+# IDE files
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.swp
+*.swo
+
+# OS generated files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# Lock files
+package-lock.json
+yarn.lock
+pnpm-lock.yaml
diff --git a/web/.prettierrc b/web/.prettierrc
new file mode 100644
index 0000000..e9ed359
--- /dev/null
+++ b/web/.prettierrc
@@ -0,0 +1,48 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": false,
+ "singleQuote": true,
+ "tabWidth": 2,
+ "useTabs": false,
+ "printWidth": 100,
+ "endOfLine": "lf",
+ "trailingComma": "es5",
+ "bracketSpacing": true,
+ "bracketSameLine": false,
+ "arrowParens": "avoid",
+ "vueIndentScriptAndStyle": false,
+ "htmlWhitespaceSensitivity": "ignore",
+ "embeddedLanguageFormatting": "auto",
+ "overrides": [
+ {
+ "files": ["*.vue"],
+ "options": {
+ "parser": "vue",
+ "vueIndentScriptAndStyle": false
+ }
+ },
+ {
+ "files": ["*.json", "*.jsonc"],
+ "options": {
+ "parser": "json",
+ "trailingComma": "none"
+ }
+ },
+ {
+ "files": ["*.md", "*.markdown"],
+ "options": {
+ "parser": "markdown",
+ "printWidth": 80,
+ "proseWrap": "preserve",
+ "tabWidth": 2
+ }
+ },
+ {
+ "files": ["*.yaml", "*.yml"],
+ "options": {
+ "parser": "yaml",
+ "tabWidth": 2
+ }
+ }
+ ]
+}
diff --git a/web/README.md b/web/README.md
deleted file mode 100644
index 33895ab..0000000
--- a/web/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Vue 3 + TypeScript + Vite
-
-This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `
-
+
+
+
diff --git a/web/src/api/auth.ts b/web/src/api/auth.ts
deleted file mode 100644
index f9f2b94..0000000
--- a/web/src/api/auth.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import apiClient from './index';
-
-export interface LoginRequest {
- auth_key: string;
-}
-
-export interface LoginResponse {
- success: boolean;
- message: string;
-}
-
-export const login = async (authKey: string): Promise => {
- const response = await apiClient.post('/auth/login', {
- auth_key: authKey
- });
- return response.data;
-};
\ No newline at end of file
diff --git a/web/src/api/dashboard.ts b/web/src/api/dashboard.ts
deleted file mode 100644
index e2ebd74..0000000
--- a/web/src/api/dashboard.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import request from './index';
-import type { DashboardStats } from '@/types/models';
-
-export const getDashboardData = (timeRange: string, groupId: number | null): Promise => {
- const params = new URLSearchParams();
- params.append('time_range', timeRange);
- if (groupId) {
- params.append('group_id', groupId.toString());
- }
- return request.get(`/dashboard/data?${params.toString()}`);
-};
\ No newline at end of file
diff --git a/web/src/api/groups.ts b/web/src/api/groups.ts
deleted file mode 100644
index 963ab93..0000000
--- a/web/src/api/groups.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import apiClient from "./index";
-import type { Group } from "../types/models";
-
-/**
- * 获取所有分组列表
- */
-export const fetchGroups = (): Promise => {
- return apiClient.get("/groups").then((res) => {
- const groups = res.data.data;
- // 将后端返回的 config 字符串解析为对象
- return groups.map((group: any) => ({
- ...group,
- config:
- typeof group.config === "string"
- ? JSON.parse(group.config)
- : group.config,
- }));
- });
-};
-
-/**
- * 获取单个分组的详细信息
- * @param id 分组ID
- */
-export const fetchGroup = (id: string): Promise => {
- return apiClient.get(`/groups/${id}`).then((res) => {
- const group = res.data.data;
- // 将后端返回的 config 字符串解析为对象
- return {
- ...group,
- config:
- typeof group.config === "string"
- ? JSON.parse(group.config)
- : group.config,
- };
- });
-};
-
-/**
- * 创建一个新的分组
- * @param groupData 新分组的数据
- */
-export const createGroup = (
- groupData: Omit
-): Promise => {
- // 将 config 对象转换为 JSON 字符串,匹配后端期望的格式
- const requestData = {
- ...groupData,
- config:
- typeof groupData.config === "object"
- ? JSON.stringify(groupData.config)
- : groupData.config,
- };
-
- console.log("createGroup - Original data:", groupData);
- console.log("createGroup - Request data:", requestData);
- console.log("createGroup - Config type:", typeof requestData.config);
-
- return apiClient.post("/groups", requestData).then((res) => res.data.data);
-};
-
-/**
- * 更新一个已存在的分组
- * @param id 分组ID
- * @param groupData 要更新的数据
- */
-export const updateGroup = (
- id: string,
- groupData: Partial<
- Omit
- >
-): Promise => {
- // 将 config 对象转换为 JSON 字符串,匹配后端期望的格式
- const requestData = {
- ...groupData,
- config:
- groupData.config && typeof groupData.config === "object"
- ? JSON.stringify(groupData.config)
- : groupData.config,
- };
- return apiClient
- .put(`/groups/${id}`, requestData)
- .then((res) => res.data.data);
-};
-
-/**
- * 删除一个分组
- * @param id 分组ID
- */
-export const deleteGroup = (id: string): Promise => {
- return apiClient.delete(`/groups/${id}`).then((res) => res.data);
-};
diff --git a/web/src/api/index.ts b/web/src/api/index.ts
deleted file mode 100644
index 1a8e347..0000000
--- a/web/src/api/index.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import axios from "axios";
-import { useAuthStore } from "@/stores/authStore";
-import router from "@/router";
-
-const apiClient = axios.create({
- baseURL: "/api",
- headers: {
- "Content-Type": "application/json",
- },
-});
-
-// 请求拦截器:自动添加认证头
-apiClient.interceptors.request.use(
- (config) => {
- const authStore = useAuthStore();
- const authKey = authStore.getAuthKey();
-
- if (authKey) {
- config.headers.Authorization = `Bearer ${authKey}`;
- }
-
- return config;
- },
- (error) => {
- return Promise.reject(error);
- }
-);
-
-// 响应拦截器:处理401认证失败
-apiClient.interceptors.response.use(
- (response) => {
- return response;
- },
- (error) => {
- if (error.response?.status === 401) {
- // 认证失败,清除登录状态并跳转到登录页
- const authStore = useAuthStore();
- authStore.logout();
-
- // 跳转到登录页(如果不在登录页的话)
- if (router.currentRoute.value.path !== '/login') {
- router.push('/login');
- }
- }
-
- return Promise.reject(error);
- }
-);
-
-export default apiClient;
diff --git a/web/src/api/keys.ts b/web/src/api/keys.ts
deleted file mode 100644
index da70eac..0000000
--- a/web/src/api/keys.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import apiClient from "./index";
-import type { Key } from "../types/models";
-
-/**
- * 获取指定分组下的所有密钥列表
- * @param groupId 分组ID
- */
-export const fetchKeysInGroup = (groupId: string): Promise => {
- return apiClient.get(`/groups/${groupId}/keys`).then((res) => res.data.data);
-};
-
-/**
- * 在指定分组下创建一个新的密钥
- * @param groupId 分组ID
- * @param keyData 新密钥的数据
- */
-export const createKey = (
- groupId: string,
- keyData: Omit<
- Key,
- | "id"
- | "group_id"
- | "created_at"
- | "updated_at"
- | "request_count"
- | "failure_count"
- >
-): Promise => {
- return apiClient
- .post(`/groups/${groupId}/keys`, keyData)
- .then((res) => res.data.data);
-};
-
-/**
- * 更新一个已存在的密钥
- * @param id 密钥ID
- * @param keyData 要更新的数据
- */
-export const updateKey = (id: string, keyData: Partial): Promise => {
- return apiClient.put(`/keys/${id}`, keyData).then((res) => res.data.data);
-};
-
-/**
- * 删除一个密钥
- * @param id 密钥ID
- */
-export const deleteKey = (id: string): Promise => {
- return apiClient.delete(`/keys/${id}`).then((res) => res.data);
-};
-
-/**
- * 批量更新密钥
- * @param ids 密钥ID列表
- * @param data 要更新的数据
- */
-export const batchUpdateKeys = (
- ids: string[],
- data: Partial
-): Promise => {
- return apiClient
- .post("/keys/batch-update", { ids, data })
- .then((res) => res.data);
-};
-
-/**
- * 批量删除密钥
- * @param ids 密钥ID列表
- */
-export const batchDeleteKeys = (ids: string[]): Promise => {
- return apiClient.post("/keys/batch-delete", { ids }).then((res) => res.data);
-};
diff --git a/web/src/api/logs.ts b/web/src/api/logs.ts
deleted file mode 100644
index 5d3dc3e..0000000
--- a/web/src/api/logs.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import request from './index';
-import type { RequestLog } from '@/types/models';
-
-export type { RequestLog };
-
-export interface LogQuery {
- page?: number;
- size?: number;
- group_id?: number;
- start_time?: string;
- end_time?: string;
- status_code?: number;
-}
-
-export interface PaginatedLogs {
- total: number;
- page: number;
- size: number;
- data: RequestLog[];
-}
-
-export const getLogs = (query: LogQuery): Promise => {
- return request.get('/logs', { params: query });
-};
\ No newline at end of file
diff --git a/web/src/api/settings.ts b/web/src/api/settings.ts
deleted file mode 100644
index 4dcab4d..0000000
--- a/web/src/api/settings.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import request from './index';
-import type { SettingCategory, SystemSettings } from '@/types/models';
-
-// A generic function to get settings for a specific category
-export function getSettings(category: SettingCategory) {
- // The backend API would need to support this, e.g., /api/settings/system
- return request.get(`/settings/${category}`);
-}
-
-// A generic function to update settings for a specific category
-export function updateSettings(category: SettingCategory, settings: T) {
- return request.put(`/settings/${category}`, settings);
-}
-
-// Specific functions for system settings as an example
-export function getSystemSettings() {
- return getSettings('system');
-}
-
-export function updateSystemSettings(settings: SystemSettings) {
- return updateSettings('system', settings);
-}
\ No newline at end of file
diff --git a/fe/src/components/BaseInfoCard.vue b/web/src/components/BaseInfoCard.vue
similarity index 100%
rename from fe/src/components/BaseInfoCard.vue
rename to web/src/components/BaseInfoCard.vue
diff --git a/web/src/components/GroupConfigForm.vue b/web/src/components/GroupConfigForm.vue
deleted file mode 100644
index 1a8b85a..0000000
--- a/web/src/components/GroupConfigForm.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/GroupList.vue b/web/src/components/GroupList.vue
deleted file mode 100644
index 1a7c75a..0000000
--- a/web/src/components/GroupList.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
- {{ group.name }}
- 默认
-
-
-
-
- 暂无分组
-
-
-
-
-
-
-
diff --git a/fe/src/components/Layout.vue b/web/src/components/Layout.vue
similarity index 100%
rename from fe/src/components/Layout.vue
rename to web/src/components/Layout.vue
diff --git a/fe/src/components/LineChart.vue b/web/src/components/LineChart.vue
similarity index 100%
rename from fe/src/components/LineChart.vue
rename to web/src/components/LineChart.vue
diff --git a/web/src/components/LogFilter.vue b/web/src/components/LogFilter.vue
deleted file mode 100644
index 78daa20..0000000
--- a/web/src/components/LogFilter.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/Logout.vue b/web/src/components/Logout.vue
new file mode 100644
index 0000000..da4e421
--- /dev/null
+++ b/web/src/components/Logout.vue
@@ -0,0 +1,3 @@
+
+ 退出
+
diff --git a/fe/src/components/NavBar.vue b/web/src/components/NavBar.vue
similarity index 69%
rename from fe/src/components/NavBar.vue
rename to web/src/components/NavBar.vue
index 65a1118..2a85373 100644
--- a/fe/src/components/NavBar.vue
+++ b/web/src/components/NavBar.vue
@@ -1,10 +1,5 @@
-
+
\ No newline at end of file
diff --git a/web/src/components/business/dashboard/QuickActions.vue b/web/src/components/business/dashboard/QuickActions.vue
deleted file mode 100644
index b945102..0000000
--- a/web/src/components/business/dashboard/QuickActions.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
快捷操作
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/business/dashboard/RequestChart.vue b/web/src/components/business/dashboard/RequestChart.vue
deleted file mode 100644
index 558ed59..0000000
--- a/web/src/components/business/dashboard/RequestChart.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
-
diff --git a/web/src/components/business/dashboard/StatsCards.vue b/web/src/components/business/dashboard/StatsCards.vue
deleted file mode 100644
index dc534fa..0000000
--- a/web/src/components/business/dashboard/StatsCards.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
-
-
-
- -
- {{ stat.name }}
-
- -
-
- {{ stat.value }}
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/groups/GroupForm.vue b/web/src/components/business/groups/GroupForm.vue
deleted file mode 100644
index 0172dbf..0000000
--- a/web/src/components/business/groups/GroupForm.vue
+++ /dev/null
@@ -1,486 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- OpenAI
- 支持 GPT-3.5、GPT-4 等模型
-
-
-
-
- Gemini
- Google 的 Gemini 模型
-
-
-
-
-
- 配置设置
-
-
-
-
- 例如:https://api.openai.com 或
- https://generativelanguage.googleapis.com
-
-
-
-
-
- 毫秒
- 请求超时时间,范围:1秒 - 5分钟,默认30秒
-
-
-
-
- 单次请求最大令牌数,留空使用模型默认值
-
-
-
-
-
-
-
-
-
- 格式:{"Authorization": "Bearer token", "Custom-Header":
- "value"}
-
-
-
-
-
-
-
-
其他自定义配置参数,将合并到分组配置中
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/groups/GroupList.vue b/web/src/components/business/groups/GroupList.vue
deleted file mode 100644
index 1262a13..0000000
--- a/web/src/components/business/groups/GroupList.vue
+++ /dev/null
@@ -1,233 +0,0 @@
-
-
-
-
-
-
-
- -
-
-
{{ group.name }}
-
-
- {{ getChannelTypeName(group.channel_type) }}
-
- {{ (group.api_keys || []).length }} 密钥
-
-
-
-
- 编辑
-
-
- 删除
-
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/groups/GroupStats.vue b/web/src/components/business/groups/GroupStats.vue
deleted file mode 100644
index eb7611f..0000000
--- a/web/src/components/business/groups/GroupStats.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
-
-
-
{{ selectedGroup.description || '暂无描述' }}
-
-
-
-
-
{{ keyStore.keys.length }}
-
密钥总数
-
-
-
-
-
-
-
{{ activeKeysCount }}
-
已启用
-
-
-
-
-
-
-
{{ disabledKeysCount }}
-
已禁用
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/business/keys/KeyBatchOps.vue b/web/src/components/business/keys/KeyBatchOps.vue
deleted file mode 100644
index 9cea6ba..0000000
--- a/web/src/components/business/keys/KeyBatchOps.vue
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
- 批量启用
-
-
- 批量禁用
-
-
- 批量删除
-
-
-
- 添加密钥
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/keys/KeyForm.vue b/web/src/components/business/keys/KeyForm.vue
deleted file mode 100644
index 09cd3aa..0000000
--- a/web/src/components/business/keys/KeyForm.vue
+++ /dev/null
@@ -1,368 +0,0 @@
-
-
-
-
-
-
- 编辑时无法修改密钥值
- 请输入完整的API密钥,支持粘贴多行文本
-
-
-
-
-
- 启用
- 禁用
-
-
-
-
-
-
-
-
-
-
-
-
-
- 每行一个密钥,系统会自动分割并创建多个密钥记录
- 支持以下格式:
-
-
-
-
-
-
-
- 检测到 {{ parsedBatchKeys.length }} 个密钥
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/keys/KeyTable.vue b/web/src/components/business/keys/KeyTable.vue
deleted file mode 100644
index 47914da..0000000
--- a/web/src/components/business/keys/KeyTable.vue
+++ /dev/null
@@ -1,328 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ row.showKey ? row.key_value : maskKey(row.key_value) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ formatNumber(row.request_count) }}
-
-
- 失败: {{ formatNumber(row.failure_count) }}
-
-
-
- 总请求: {{ row.request_count }}
- 失败次数: {{ row.failure_count }}
-
- 最后使用: {{ formatTime(row.last_used_at) }}
-
-
-
-
-
-
-
-
- 编辑
-
- {{ row.status === "active" ? "禁用" : "启用" }}
-
-
- 删除
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/keys/KeyTableNew.vue b/web/src/components/business/keys/KeyTableNew.vue
deleted file mode 100644
index e69de29..0000000
diff --git a/web/src/components/business/settings/GroupSettings.vue b/web/src/components/business/settings/GroupSettings.vue
deleted file mode 100644
index a2efb7b..0000000
--- a/web/src/components/business/settings/GroupSettings.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
分组设置
-
-
-
-
-
-
-
- 为
- {{ selectedGroupName }}
- 分组设置覆盖配置。这些配置将优先于系统默认配置。
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/business/settings/SettingItem.vue b/web/src/components/business/settings/SettingItem.vue
deleted file mode 100644
index 95e1e05..0000000
--- a/web/src/components/business/settings/SettingItem.vue
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
{{ description }}
-
{{ error }}
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/business/settings/SystemSettings.vue b/web/src/components/business/settings/SystemSettings.vue
deleted file mode 100644
index c64b6aa..0000000
--- a/web/src/components/business/settings/SystemSettings.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/ConfirmDialog.vue b/web/src/components/common/ConfirmDialog.vue
deleted file mode 100644
index 846f57b..0000000
--- a/web/src/components/common/ConfirmDialog.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
- {{ content }}
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/DataTable.vue b/web/src/components/common/DataTable.vue
deleted file mode 100644
index 0a64ee8..0000000
--- a/web/src/components/common/DataTable.vue
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
-
-
-
- {{ row[column.prop] }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/DateRangePicker.vue b/web/src/components/common/DateRangePicker.vue
deleted file mode 100644
index 8cb1d69..0000000
--- a/web/src/components/common/DateRangePicker.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/EmptyState.vue b/web/src/components/common/EmptyState.vue
deleted file mode 100644
index ace54bf..0000000
--- a/web/src/components/common/EmptyState.vue
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ actionText }}
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/LoadingSpinner.vue b/web/src/components/common/LoadingSpinner.vue
deleted file mode 100644
index ad4b83b..0000000
--- a/web/src/components/common/LoadingSpinner.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/SearchInput.vue b/web/src/components/common/SearchInput.vue
deleted file mode 100644
index 0b1234d..0000000
--- a/web/src/components/common/SearchInput.vue
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/components/common/StatusBadge.vue b/web/src/components/common/StatusBadge.vue
deleted file mode 100644
index 79e08d1..0000000
--- a/web/src/components/common/StatusBadge.vue
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
- {{ statusText }}
-
-
-
-
-
-
diff --git a/web/src/layouts/Footer.vue b/web/src/layouts/Footer.vue
deleted file mode 100644
index 215af7d..0000000
--- a/web/src/layouts/Footer.vue
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/layouts/HeaderNav.vue b/web/src/layouts/HeaderNav.vue
deleted file mode 100644
index 89e70fa..0000000
--- a/web/src/layouts/HeaderNav.vue
+++ /dev/null
@@ -1,260 +0,0 @@
-
-
-
-
-
-
-
diff --git a/web/src/layouts/MainLayout.vue b/web/src/layouts/MainLayout.vue
deleted file mode 100644
index 0b14fea..0000000
--- a/web/src/layouts/MainLayout.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/web/src/main.ts b/web/src/main.ts
index cfbe296..820b425 100644
--- a/web/src/main.ts
+++ b/web/src/main.ts
@@ -1,20 +1,7 @@
+import naive from 'naive-ui'
import { createApp } from 'vue'
-import { createPinia } from 'pinia'
import App from './App.vue'
-import router from './router'
import './style.css'
-import ElementPlus from 'element-plus'
-import 'element-plus/dist/index.css'
-import { useAuthStore } from './stores/authStore'
+import router from './utils/router'
-const app = createApp(App)
-
-app.use(createPinia())
-app.use(router)
-app.use(ElementPlus)
-
-// 确保认证状态在应用启动时初始化
-const authStore = useAuthStore()
-authStore.initializeAuth()
-
-app.mount('#app')
+createApp(App).use(router).use(naive).mount('#app')
diff --git a/web/src/router/index.ts b/web/src/router/index.ts
deleted file mode 100644
index 8d7ed07..0000000
--- a/web/src/router/index.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { createRouter, createWebHistory } from "vue-router";
-import { useAuthStore } from "../stores/authStore";
-import Dashboard from "../views/Dashboard.vue";
-import Login from "../views/Login.vue";
-import MainLayout from "../layouts/MainLayout.vue";
-
-const routes = [
- {
- path: "/login",
- name: "Login",
- component: Login,
- meta: { requiresAuth: false },
- },
- {
- path: "/",
- component: MainLayout,
- meta: { requiresAuth: true },
- children: [
- {
- path: "",
- redirect: "/dashboard",
- },
- {
- path: "/dashboard",
- name: "Dashboard",
- component: Dashboard,
- meta: { requiresAuth: true },
- },
- {
- path: "/groups",
- name: "Groups",
- component: () => import("../views/Groups.vue"),
- meta: { requiresAuth: true },
- },
- {
- path: "/logs",
- name: "Logs",
- component: () => import("../views/Logs.vue"),
- meta: { requiresAuth: true },
- },
- {
- path: "/settings",
- name: "Settings",
- component: () => import("../views/Settings.vue"),
- meta: { requiresAuth: true },
- },
- ],
- },
-];
-
-const router = createRouter({
- history: createWebHistory(import.meta.env.BASE_URL),
- routes,
-});
-
-// 路由守卫
-router.beforeEach((to, _from, next) => {
- const authStore = useAuthStore();
- const isAuthenticated = authStore.isAuthenticated;
- const requiresAuth = to.matched.some(
- (record) => record.meta.requiresAuth !== false
- );
-
- if (requiresAuth && !isAuthenticated) {
- // 临时测试:自动登录
- console.log("Auto-login for development testing");
- authStore.login("test-key");
- next();
- } else if (to.name === "Login" && isAuthenticated) {
- // 已登录用户访问登录页,重定向到仪表盘
- next({ name: "Dashboard" });
- } else {
- // 正常访问
- next();
- }
-});
-
-export default router;
diff --git a/web/src/stores/authStore.ts b/web/src/stores/authStore.ts
deleted file mode 100644
index 507aa97..0000000
--- a/web/src/stores/authStore.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { defineStore } from 'pinia';
-import { ref, computed } from 'vue';
-import type { User } from '@/types/models';
-
-const AUTH_KEY_STORAGE = 'gpt-load-auth-key';
-
-export const useAuthStore = defineStore('auth', () => {
- // State
- const authKey = ref('');
- const user = ref(null);
-
- // Computed
- const isAuthenticated = computed(() => !!authKey.value);
-
- // Actions
- function login(key: string) {
- authKey.value = key;
- // For now, we'll just mock a user object.
- // In a real app, you'd fetch this from an API.
- user.value = { id: '1', username: 'admin' };
- localStorage.setItem(AUTH_KEY_STORAGE, key);
- }
-
- function logout() {
- authKey.value = '';
- user.value = null;
- localStorage.removeItem(AUTH_KEY_STORAGE);
- }
-
- function getAuthKey(): string {
- return authKey.value;
- }
-
- function initializeAuth() {
- const storedKey = localStorage.getItem(AUTH_KEY_STORAGE);
- if (storedKey) {
- authKey.value = storedKey;
- // If auth key exists, we can assume the user is logged in.
- // You might want to verify the key with the server here.
- user.value = { id: '1', username: 'admin' };
- }
- }
-
- // 在store初始化时自动恢复认证状态
- initializeAuth();
-
- return {
- // State
- authKey,
- user,
- // Computed
- isAuthenticated,
- // Actions
- login,
- logout,
- getAuthKey,
- initializeAuth,
- };
-});
\ No newline at end of file
diff --git a/web/src/stores/dashboardStore.ts b/web/src/stores/dashboardStore.ts
deleted file mode 100644
index 8144f5d..0000000
--- a/web/src/stores/dashboardStore.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { ref, computed } from "vue";
-import { defineStore } from "pinia";
-import { getDashboardData } from "@/api/dashboard";
-import type { DashboardStats } from "@/types/models";
-
-export const useDashboardStore = defineStore("dashboard", () => {
- const stats = ref({
- total_requests: 0,
- success_requests: 0,
- success_rate: 0,
- group_stats: [],
- // 前端扩展字段
- total_keys: 0,
- active_keys: 0,
- inactive_keys: 0,
- error_keys: 0,
- });
- const loading = ref(false);
- const filters = ref({
- timeRange: "7d",
- groupId: null as number | null,
- });
-
- let pollingInterval: number | undefined;
-
- const chartData = computed(() => {
- // 基于group_stats生成图表数据
- return {
- labels: stats.value.group_stats.map((g) => g.group_name),
- data: stats.value.group_stats.map((g) => g.request_count),
- };
- });
-
- const fetchDashboardData = async () => {
- loading.value = true;
- try {
- const response = await getDashboardData(
- filters.value.timeRange,
- filters.value.groupId
- );
- stats.value = response;
- } catch (error) {
- console.error("Failed to fetch dashboard data:", error);
- } finally {
- loading.value = false;
- }
- };
-
- const startPolling = () => {
- fetchDashboardData();
- pollingInterval = window.setInterval(fetchDashboardData, 30000); // 30 seconds
- };
-
- const stopPolling = () => {
- if (pollingInterval) {
- clearInterval(pollingInterval);
- pollingInterval = undefined;
- }
- };
-
- return {
- stats,
- loading,
- filters,
- chartData,
- fetchDashboardData,
- startPolling,
- stopPolling,
- };
-});
diff --git a/web/src/stores/groupStore.ts b/web/src/stores/groupStore.ts
deleted file mode 100644
index 1e12683..0000000
--- a/web/src/stores/groupStore.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-import { defineStore } from "pinia";
-import { ref, computed } from "vue";
-import * as groupApi from "@/api/groups";
-import type { Group } from "@/types/models";
-import { useKeyStore } from "./keyStore";
-
-export const useGroupStore = defineStore("group", () => {
- // State
- const groups = ref([]);
- const selectedGroupId = ref(null);
- const isLoading = ref(false);
-
- // Getters
- const selectedGroupDetails = computed(() => {
- if (!selectedGroupId.value) {
- return null;
- }
- return groups.value.find((g) => g.id === selectedGroupId.value) || null;
- });
-
- // Actions
- async function fetchGroups() {
- isLoading.value = true;
- try {
- groups.value = await groupApi.fetchGroups();
- // 如果没有选中的分组,或者选中的分组已不存在,则默认选中第一个
- const selectedExists = groups.value.some(
- (g) => g.id === selectedGroupId.value
- );
- if (groups.value.length > 0 && !selectedExists) {
- selectGroup(groups.value[0].id);
- }
- } catch (error) {
- console.error("Failed to fetch groups:", error);
- } finally {
- isLoading.value = false;
- }
- }
-
- function selectGroup(id: number | null) {
- selectedGroupId.value = id;
- const keyStore = useKeyStore();
- if (id) {
- keyStore.fetchKeys(id.toString()); // 暂时转换为string以兼容现有API
- } else {
- keyStore.clearKeys();
- }
- }
-
- async function fetchGroupKeys(groupId: number) {
- // TODO: 实现获取特定分组的密钥
- console.log("fetchGroupKeys not implemented yet, groupId:", groupId);
- /*
- const group = groups.value.find(g => g.id === groupId);
- if (group) {
- try {
- const keys = await groupApi.fetchGroupKeys(groupId);
- group.api_keys = keys;
- } catch (error) {
- console.error('Failed to fetch group keys:', error);
- throw error;
- }
- }
- */
- }
-
- async function createGroup(
- groupData: Omit
- ) {
- try {
- const newGroup = await groupApi.createGroup(groupData);
- await fetchGroups(); // Re-fetch to get the full list
- selectGroup(newGroup.id);
- } catch (error) {
- console.error("Failed to create group:", error);
- throw error;
- }
- }
-
- async function updateGroup(id: number, groupData: Partial) {
- try {
- await groupApi.updateGroup(id.toString(), groupData); // 暂时转换为string
- await fetchGroups(); // Re-fetch to update the list
- } catch (error) {
- console.error("Failed to update group:", error);
- throw error;
- }
- }
-
- async function deleteGroup(id: number) {
- try {
- await groupApi.deleteGroup(id.toString()); // 暂时转换为string
- await fetchGroups(); // Re-fetch to update the list
- if (selectedGroupId.value === id) {
- selectedGroupId.value = null;
- }
- } catch (error) {
- console.error("Failed to delete group:", error);
- throw error;
- }
- }
-
- return {
- // State
- groups,
- selectedGroupId,
- isLoading,
- // Getters
- selectedGroupDetails,
- // Actions
- fetchGroups,
- selectGroup,
- fetchGroupKeys,
- createGroup,
- updateGroup,
- deleteGroup,
- };
-});
diff --git a/web/src/stores/keyStore.ts b/web/src/stores/keyStore.ts
deleted file mode 100644
index 1370849..0000000
--- a/web/src/stores/keyStore.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { defineStore } from "pinia";
-import { ref } from "vue";
-import * as keyApi from "@/api/keys";
-import type { APIKey } from "@/types/models";
-import { useGroupStore } from "./groupStore";
-
-export const useKeyStore = defineStore("key", () => {
- // State
- const keys = ref([]);
- const selectedKeyIds = ref([]);
- const isLoading = ref(false);
-
- // Actions
- async function fetchKeys(groupId: string) {
- if (!groupId) {
- keys.value = [];
- return;
- }
- isLoading.value = true;
- try {
- keys.value = await keyApi.fetchKeysInGroup(groupId);
- } catch (error) {
- console.error(`Failed to fetch keys for group ${groupId}:`, error);
- keys.value = [];
- } finally {
- isLoading.value = false;
- }
- }
-
- function setSelectedKeys(ids: number[]) {
- selectedKeyIds.value = ids;
- }
-
- function clearKeys() {
- keys.value = [];
- selectedKeyIds.value = [];
- }
-
- async function createKey(
- groupId: string,
- keyData: Omit<
- APIKey,
- | "id"
- | "group_id"
- | "created_at"
- | "updated_at"
- | "request_count"
- | "failure_count"
- >
- ) {
- try {
- await keyApi.createKey(groupId, keyData);
- await fetchKeys(groupId);
- } catch (error) {
- console.error("Failed to create key:", error);
- throw error;
- }
- }
-
- async function updateKey(id: string, keyData: Partial) {
- const groupStore = useGroupStore();
- try {
- await keyApi.updateKey(id, keyData);
- if (groupStore.selectedGroupId) {
- await fetchKeys(groupStore.selectedGroupId.toString());
- }
- } catch (error) {
- console.error(`Failed to update key ${id}:`, error);
- throw error;
- }
- }
-
- async function deleteKey(id: string) {
- const groupStore = useGroupStore();
- try {
- await keyApi.deleteKey(id);
- if (groupStore.selectedGroupId) {
- await fetchKeys(groupStore.selectedGroupId.toString());
- }
- } catch (error) {
- console.error(`Failed to delete key ${id}:`, error);
- throw error;
- }
- }
-
- // 新增方法:更新密钥状态
- async function updateKeyStatus(
- id: number,
- status: "active" | "inactive" | "error"
- ) {
- try {
- await keyApi.updateKey(id.toString(), { status });
- const groupStore = useGroupStore();
- if (groupStore.selectedGroupId) {
- await fetchKeys(groupStore.selectedGroupId.toString());
- }
- } catch (error) {
- console.error(`Failed to update key status ${id}:`, error);
- throw error;
- }
- }
-
- async function batchUpdateStatus(
- ids: number[],
- status: "active" | "inactive" | "error"
- ) {
- const groupStore = useGroupStore();
- try {
- await keyApi.batchUpdateKeys(
- ids.map((id) => id.toString()),
- { status }
- );
- if (groupStore.selectedGroupId) {
- await fetchKeys(groupStore.selectedGroupId.toString());
- selectedKeyIds.value = []; // Clear selection after batch operation
- }
- } catch (error) {
- console.error("Failed to batch update key status:", error);
- throw error;
- }
- }
-
- // 新增方法:批量删除
- async function batchDelete(ids: number[]) {
- const groupStore = useGroupStore();
- try {
- await keyApi.batchDeleteKeys(ids.map((id) => id.toString()));
- if (groupStore.selectedGroupId) {
- await fetchKeys(groupStore.selectedGroupId.toString());
- selectedKeyIds.value = []; // Clear selection after batch operation
- }
- } catch (error) {
- console.error("Failed to batch delete keys:", error);
- throw error;
- }
- }
-
- async function batchDeleteKeys(ids: string[]) {
- const groupStore = useGroupStore();
- try {
- await keyApi.batchDeleteKeys(ids);
- if (groupStore.selectedGroupId) {
- await fetchKeys(groupStore.selectedGroupId.toString());
- selectedKeyIds.value = []; // Clear selection after batch operation
- }
- } catch (error) {
- console.error("Failed to batch delete keys:", error);
- throw error;
- }
- }
-
- return {
- // State
- keys,
- selectedKeyIds,
- isLoading,
- // Actions
- fetchKeys,
- setSelectedKeys,
- clearKeys,
- createKey,
- updateKey,
- deleteKey,
- updateKeyStatus,
- batchUpdateStatus,
- batchDelete,
- batchDeleteKeys,
- };
-});
diff --git a/web/src/stores/logStore.ts b/web/src/stores/logStore.ts
deleted file mode 100644
index fb3a333..0000000
--- a/web/src/stores/logStore.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { defineStore } from 'pinia';
-import { ref, reactive } from 'vue';
-import { getLogs } from '@/api/logs';
-import type { RequestLog, LogQuery, PaginatedLogs } from '@/api/logs';
-
-export const useLogStore = defineStore('logs', () => {
- const logs = ref([]);
- const loading = ref(false);
- const pagination = reactive({
- page: 1,
- size: 10,
- total: 0,
- });
- const filters = reactive({});
-
- const fetchLogs = async () => {
- loading.value = true;
- try {
- const query: LogQuery = {
- ...filters,
- page: pagination.page,
- size: pagination.size,
- };
- const response: PaginatedLogs = await getLogs(query);
- logs.value = response.data;
- pagination.total = response.total;
- } catch (error) {
- console.error('Failed to fetch logs:', error);
- } finally {
- loading.value = false;
- }
- };
-
- const setFilters = (newFilters: LogQuery) => {
- Object.assign(filters, newFilters);
- pagination.page = 1;
- fetchLogs();
- };
-
- const setPage = (page: number) => {
- pagination.page = page;
- fetchLogs();
- };
-
- const setSize = (size: number) => {
- pagination.size = size;
- pagination.page = 1;
- fetchLogs();
- };
-
- return {
- logs,
- loading,
- pagination,
- filters,
- fetchLogs,
- setFilters,
- setPage,
- setSize,
- };
-});
\ No newline at end of file
diff --git a/web/src/stores/settingStore.ts b/web/src/stores/settingStore.ts
deleted file mode 100644
index b29eeb5..0000000
--- a/web/src/stores/settingStore.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { defineStore } from 'pinia';
-import { getSystemSettings, updateSystemSettings } from '@/api/settings';
-import type { SystemSettings } from '@/types/models';
-import { ElMessage } from 'element-plus';
-
-interface SettingsState {
- systemSettings: SystemSettings | null;
- loading: boolean;
- error: any;
- errors: Record; // For field-specific validation errors
-}
-
-export const useSettingStore = defineStore('setting', {
- state: (): SettingsState => ({
- systemSettings: null,
- loading: false,
- error: null,
- errors: {},
- }),
- actions: {
- async fetchSystemSettings() {
- this.loading = true;
- this.error = null;
- try {
- const response = await getSystemSettings();
- this.systemSettings = response.data;
- } catch (error) {
- this.error = error;
- ElMessage.error('Failed to fetch system settings.');
- } finally {
- this.loading = false;
- }
- },
- async saveSystemSettings() {
- if (!this.systemSettings) return;
-
- this.loading = true;
- this.error = null;
- this.errors = {};
-
- // Basic validation example
- if (this.systemSettings.port < 1 || this.systemSettings.port > 65535) {
- this.errors['port'] = 'Port must be between 1 and 65535.';
- }
- if (Object.keys(this.errors).length > 0) {
- this.loading = false;
- ElMessage.error('Please correct the errors before saving.');
- return;
- }
-
- try {
- await updateSystemSettings(this.systemSettings);
- await this.fetchSystemSettings(); // Refresh state
- ElMessage.success('System settings updated successfully.');
- } catch (error) {
- this.error = error;
- ElMessage.error('Failed to update system settings.');
- } finally {
- this.loading = false;
- }
- },
- // Action to reset settings to their original state (fetched from server)
- async resetSystemSettings() {
- await this.fetchSystemSettings();
- },
- },
-});
\ No newline at end of file
diff --git a/web/src/style.css b/web/src/style.css
index 9acc368..c038d7e 100644
--- a/web/src/style.css
+++ b/web/src/style.css
@@ -1,136 +1,82 @@
-/* 全局样式重置和基础设置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
:root {
- font-family: "Inter", "SF Pro Display", system-ui, -apple-system, sans-serif;
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
- /* 使用亮色主题 */
- color-scheme: light;
- color: #1f2937;
- background-color: #ffffff;
-
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
-html,
-body {
- height: 100%;
- margin: 0;
- padding: 0;
- background-color: #f9fafb;
-}
-
body {
margin: 0;
- width: 100%;
- height: 100vh;
- overflow-x: hidden;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
}
#app {
+ max-width: 1280px;
width: 100%;
- height: 100vh;
+ margin: 0 auto;
+ padding: 2rem;
+ min-height: 100vh;
+}
+
+.flex {
display: flex;
+}
+
+.flex-row {
+ flex-direction: row;
+}
+
+.flex-col {
flex-direction: column;
}
-/* 链接样式 */
-a {
- font-weight: 500;
- color: #3b82f6;
- text-decoration: none;
- transition: color 0.2s;
+.justify-start {
+ justify-content: flex-start;
}
-a:hover {
- color: #1d4ed8;
+.justify-center {
+ justify-content: center;
}
-/* 标题样式 */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- color: #1f2937;
- font-weight: 600;
- line-height: 1.2;
- margin: 0;
+.justify-end {
+ justify-content: flex-end;
}
-h1 {
- font-size: 2.5rem;
+.justify-between {
+ justify-content: space-between;
}
-h2 {
- font-size: 2rem;
+.items-start {
+ align-items: flex-start;
}
-h3 {
- font-size: 1.5rem;
+.items-center {
+ align-items: center;
}
-/* 按钮基础样式重置 */
-button {
- border: none;
- background: none;
- padding: 0;
- cursor: pointer;
- font-family: inherit;
+.items-end {
+ align-items: flex-end;
}
-/* 表单元素样式 */
-input,
-textarea,
-select {
- font-family: inherit;
+.flex-wrap {
+ flex-wrap: wrap;
}
-/* 滚动条样式 */
-::-webkit-scrollbar {
- width: 6px;
- height: 6px;
+.flex-nowrap {
+ flex-wrap: nowrap;
}
-::-webkit-scrollbar-track {
- background: #f1f5f9;
- border-radius: 3px;
+.grow {
+ flex-grow: 1;
}
-::-webkit-scrollbar-thumb {
- background: #cbd5e1;
- border-radius: 3px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: #94a3b8;
-}
-
-/* 工具类 */
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border: 0;
-}
-
-.truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
+.shrink {
+ flex-shrink: 1;
}
diff --git a/web/src/types/models.ts b/web/src/types/models.ts
deleted file mode 100644
index ed82dc8..0000000
--- a/web/src/types/models.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-// Based on internal/models/types.go
-
-// Corresponds to the APIKey struct in Go - 修正版本
-export interface APIKey {
- id: number; // uint -> number
- group_id: number; // uint -> number
- key_value: string; // 对应后端key_value字段
- status: "active" | "inactive" | "error"; // 对应后端status字段
- request_count: number; // int64 -> number
- failure_count: number; // int64 -> number
- last_used_at?: string; // *time.Time -> optional string
- created_at: string; // time.Time -> string
- updated_at: string; // time.Time -> string
-}
-
-// 为了兼容,保留Key别名
-export type Key = APIKey;
-
-// Corresponds to the Group struct in Go - 修正版本
-export interface Group {
- id: number; // uint -> number
- name: string;
- description: string;
- channel_type: "openai" | "gemini"; // 明确的渠道类型
- is_default?: boolean; // 添加默认分组标识
- config: GroupConfig; // 解析后的配置对象
- api_keys?: APIKey[]; // 关联的API密钥,可选
- created_at: string;
- updated_at: string;
-}
-
-// 分组配置结构
-export interface GroupConfig {
- upstream_url: string;
- timeout?: number;
- max_tokens?: number;
- [key: string]: any;
-}
-
-// 分组请求统计
-export interface GroupRequestStat {
- group_name: string;
- request_count: number;
-}
-
-// 仪表盘统计数据 - 根据后端DashboardStats修正
-export interface DashboardStats {
- total_requests: number; // 对应后端total_requests
- success_requests: number; // 对应后端success_requests
- success_rate: number; // 对应后端success_rate
- group_stats: GroupRequestStat[]; // 对应后端group_stats
- // 前端扩展字段
- total_keys?: number;
- active_keys?: number;
- inactive_keys?: number;
- error_keys?: number;
-}
-
-// 请求日志
-export interface RequestLog {
- id: string;
- timestamp: string;
- group_id: number; // uint -> number
- key_id: number; // uint -> number
- source_ip: string;
- status_code: number;
- request_path: string;
- request_body_snippet: string;
-}
-
-// Corresponds to the SystemSetting struct in Go
-export interface SystemSetting {
- id: number;
- setting_key: string;
- setting_value: string;
- description: string;
- created_at: string;
- updated_at: string;
-}
-
-export interface AuthUser {
- key: string;
- isAuthenticated: boolean;
-}
-
-export interface User {
- id: string;
- username: string;
-}
-
-// Represents a simplified setting for frontend forms
-export interface Setting {
- key: string;
- value: string;
-}
-
-// Corresponds to the structured system settings
-export interface CorsSettings {
- allowed_origins: string;
-}
-
-export interface TimeoutSettings {
- read: number;
- write: number;
-}
-
-export interface SystemSettings {
- port: number;
- cors: CorsSettings;
- timeout: TimeoutSettings;
-}
-
-// A generic type for different setting categories
-export type SettingCategory =
- | "system"
- | "auth"
- | "performance"
- | "logs"
- | "group";
-
-// 数据转换适配器 - 兼容旧数据格式
-export const adaptLegacyKey = (legacyKey: any): APIKey => ({
- id: Number(legacyKey.id),
- group_id: Number(legacyKey.group_id),
- key_value: legacyKey.api_key || legacyKey.key_value,
- status: legacyKey.is_active ? "active" : "inactive",
- request_count: legacyKey.usage || legacyKey.request_count || 0,
- failure_count: legacyKey.failure_count || 0,
- last_used_at: legacyKey.last_used_at,
- created_at: legacyKey.created_at,
- updated_at: legacyKey.updated_at,
-});
-
-export const adaptLegacyGroup = (legacyGroup: any): Group => ({
- id: Number(legacyGroup.id),
- name: legacyGroup.name,
- description: legacyGroup.description,
- channel_type: legacyGroup.channel_type || "openai",
- config:
- typeof legacyGroup.config === "string"
- ? JSON.parse(legacyGroup.config || "{}")
- : legacyGroup.config || {},
- api_keys: legacyGroup.api_keys?.map(adaptLegacyKey),
- created_at: legacyGroup.created_at,
- updated_at: legacyGroup.updated_at,
-});
-
-// 工具函数
-export const maskKey = (key: string): string => {
- if (!key || key.length < 8) return "****";
- return key.substring(0, 4) + "****" + key.substring(key.length - 4);
-};
-
-export const getStatusColor = (status: string): string => {
- switch (status) {
- case "active":
- return "success";
- case "inactive":
- return "warning";
- case "error":
- return "danger";
- default:
- return "info";
- }
-};
-
-export const formatNumber = (num: number): string => {
- if (num >= 1000000) {
- return (num / 1000000).toFixed(1) + "M";
- }
- if (num >= 1000) {
- return (num / 1000).toFixed(1) + "K";
- }
- return num.toString();
-};
diff --git a/fe/src/utils/http.ts b/web/src/utils/http.ts
similarity index 90%
rename from fe/src/utils/http.ts
rename to web/src/utils/http.ts
index b98f853..2a2ccc3 100644
--- a/fe/src/utils/http.ts
+++ b/web/src/utils/http.ts
@@ -3,7 +3,7 @@ import axios from 'axios'
const http = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 10000,
- headers: { 'Content-Type': 'application/json' }
+ headers: { 'Content-Type': 'application/json' },
})
// 请求拦截器
diff --git a/fe/src/utils/router.ts b/web/src/utils/router.ts
similarity index 52%
rename from fe/src/utils/router.ts
rename to web/src/utils/router.ts
index a416085..4608242 100644
--- a/fe/src/utils/router.ts
+++ b/web/src/utils/router.ts
@@ -1,32 +1,31 @@
-import { createRouter, createWebHistory } from 'vue-router'
-import type { RouteRecordRaw } from 'vue-router'
+import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
const routes: Array = [
{
path: '/',
name: 'dashboard',
- component: () => import('@/views/Dashboard.vue')
+ component: () => import('@/views/Dashboard.vue'),
},
{
path: '/keys',
name: 'keys',
- component: () => import('@/views/Keys.vue')
+ component: () => import('@/views/Keys.vue'),
},
{
path: '/logs',
name: 'logs',
- component: () => import('@/views/Logs.vue')
+ component: () => import('@/views/Logs.vue'),
},
{
path: '/settings',
name: 'settings',
- component: () => import('@/views/Settings.vue')
+ component: () => import('@/views/Settings.vue'),
},
]
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
- routes
+ routes,
})
export default router
diff --git a/fe/src/utils/state.ts b/web/src/utils/state.ts
similarity index 78%
rename from fe/src/utils/state.ts
rename to web/src/utils/state.ts
index a20cb59..7bbba7f 100644
--- a/fe/src/utils/state.ts
+++ b/web/src/utils/state.ts
@@ -1,8 +1,8 @@
-import { reactive, toRef, isRef } from 'vue'
-import type { Ref } from 'vue'
+import { isRef, reactive, toRef, type Ref } from 'vue'
-type IntializeFunc = (() => T | Ref)
+type IntializeFunc = () => T | Ref
type InitializeValue = T | Ref | IntializeFunc
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
type GlobalState = Record
const globalState = reactive({})
diff --git a/web/src/views/Dashboard.vue b/web/src/views/Dashboard.vue
index b82207f..3f1a307 100644
--- a/web/src/views/Dashboard.vue
+++ b/web/src/views/Dashboard.vue
@@ -1,163 +1,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 筛选图表
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/web/src/views/Groups.vue b/web/src/views/Groups.vue
deleted file mode 100644
index c065fea..0000000
--- a/web/src/views/Groups.vue
+++ /dev/null
@@ -1,525 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ selectedGroup.description || "暂无描述" }}
-
-
-
- 密钥总数
- {{ groupKeys.length }}
-
-
- 有效密钥
- {{ activeKeysCount }}
-
-
- 总请求数
- {{ totalRequests }}
-
-
-
-
配置信息
-
- 上游地址:
- {{
- selectedGroup.config.upstream_url
- }}
-
-
- 超时时间:
- {{ selectedGroup.config.timeout }}ms
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 创建新分组
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/fe/src/views/Keys.vue b/web/src/views/Keys.vue
similarity index 100%
rename from fe/src/views/Keys.vue
rename to web/src/views/Keys.vue
diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue
index 1850645..7537bb0 100644
--- a/web/src/views/Login.vue
+++ b/web/src/views/Login.vue
@@ -1,192 +1,3 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ loading ? '登录中...' : '登录' }}
-
-
-
-
-
-
-
+ Login
-
-
-
-
\ No newline at end of file
diff --git a/web/src/views/Logs.vue b/web/src/views/Logs.vue
index e4505b6..d27c933 100644
--- a/web/src/views/Logs.vue
+++ b/web/src/views/Logs.vue
@@ -1,481 +1,3 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 重置
- 应用筛选
-
-
-
-
-
-
-
-
-
-
-
- {{ formatTimestamp(row.timestamp) }}
-
-
-
-
-
-
- {{ row.status_code }}
-
-
-
-
-
-
- {{ getGroupName(row.group_id) }}
-
-
-
-
-
-
-
- {{ truncateText(row.request_path, 50) }}
-
-
-
-
-
-
- {{ row.source_ip }}
-
-
-
-
-
- 查看详情
-
- 无内容
-
-
-
-
-
-
-
-
-
基本信息
-
-
- {{ formatTimestamp(selectedLog.timestamp) }}
-
-
-
- {{ selectedLog.status_code }}
-
-
-
- {{ selectedLog.source_ip }}
-
-
- {{ getGroupName(selectedLog.group_id) }}
-
-
- {{ selectedLog.request_path }}
-
-
-
-
-
-
请求内容
-
-
{{
- selectedLog.request_body_snippet
- }}
-
-
-
-
-
- 关闭
-
-
-
+ logs
-
-
-
-
diff --git a/web/src/views/Logs_new.vue b/web/src/views/Logs_new.vue
deleted file mode 100644
index e69de29..0000000
diff --git a/web/src/views/Logs_old.vue b/web/src/views/Logs_old.vue
deleted file mode 100644
index 173d885..0000000
--- a/web/src/views/Logs_old.vue
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
日志查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/web/src/views/Settings.vue b/web/src/views/Settings.vue
index 1e936f9..f395f53 100644
--- a/web/src/views/Settings.vue
+++ b/web/src/views/Settings.vue
@@ -1,113 +1,3 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ settings
-
-
-
-
\ No newline at end of file
diff --git a/web/tsconfig.json b/web/tsconfig.json
index 1ffef60..d32ff68 100644
--- a/web/tsconfig.json
+++ b/web/tsconfig.json
@@ -1,7 +1,4 @@
{
"files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
+ "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }]
}
diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json
index f85a399..9728af2 100644
--- a/web/tsconfig.node.json
+++ b/web/tsconfig.node.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "target": "ES2023",
+ "target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
diff --git a/web/vite.config.ts b/web/vite.config.ts
index 6f046ba..5707b67 100644
--- a/web/vite.config.ts
+++ b/web/vite.config.ts
@@ -1,26 +1,31 @@
-import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
-import { fileURLToPath, URL } from 'url'
+import path from 'path'
+import { defineConfig } from 'vite'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
+ // 解析配置
resolve: {
+ // 配置路径别名
alias: {
- '@': fileURLToPath(new URL('./src', import.meta.url))
- }
+ '@': path.resolve(__dirname, './src'),
+ },
},
- build: {
- outDir: 'dist'
- },
- base: './',
+ // 开发服务器配置
server: {
+ // 代理配置示例
proxy: {
'/api': {
- target: 'http://localhost:3000',
+ target: 'http://api.example.com',
changeOrigin: true,
- secure: false
- }
- }
- }
+ rewrite: path => path.replace(/^\/api/, ''),
+ },
+ },
+ },
+ // 构建配置
+ build: {
+ outDir: '../cmd/gpt-load/dist',
+ assetsDir: 'assets',
+ },
})