diff --git a/apps/frontend-vue/.env.development b/apps/frontend-vue/.env.development
deleted file mode 100644
index 97235773..00000000
--- a/apps/frontend-vue/.env.development
+++ /dev/null
@@ -1 +0,0 @@
-VITE_API_TARGET=http://127.0.0.1:3000
diff --git a/apps/frontend-vue/.env.example b/apps/frontend-vue/.env.example
deleted file mode 100644
index 97235773..00000000
--- a/apps/frontend-vue/.env.example
+++ /dev/null
@@ -1 +0,0 @@
-VITE_API_TARGET=http://127.0.0.1:3000
diff --git a/apps/frontend-vue/.gitignore b/apps/frontend-vue/.gitignore
deleted file mode 100644
index db98efbd..00000000
--- a/apps/frontend-vue/.gitignore
+++ /dev/null
@@ -1,25 +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?
-.ace-tool/
diff --git a/apps/frontend-vue/.prettierignore b/apps/frontend-vue/.prettierignore
deleted file mode 100644
index bdf2bb93..00000000
--- a/apps/frontend-vue/.prettierignore
+++ /dev/null
@@ -1,4 +0,0 @@
-dist
-node_modules
-src/auto-imports.d.ts
-src/components.d.ts
diff --git a/apps/frontend-vue/.prettierrc.json b/apps/frontend-vue/.prettierrc.json
deleted file mode 100644
index 3ee2d113..00000000
--- a/apps/frontend-vue/.prettierrc.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "semi": false,
- "singleQuote": true,
- "printWidth": 100,
- "trailingComma": "all"
-}
diff --git a/apps/frontend-vue/.vscode/extensions.json b/apps/frontend-vue/.vscode/extensions.json
deleted file mode 100644
index a7cea0b0..00000000
--- a/apps/frontend-vue/.vscode/extensions.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "recommendations": ["Vue.volar"]
-}
diff --git a/apps/frontend-vue/README.md b/apps/frontend-vue/README.md
deleted file mode 100644
index 16b0db47..00000000
--- a/apps/frontend-vue/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# 快手轻量前端
-
-这是快手自动发货拆分后的 Vue 3 前端,只保留快手领取和运营后台相关入口。
-
-## 功能范围
-
-- `/claim/:token` 快手 Cloud 领取页
-- `/admin` 运营后台
-- 91 卡券订单补全与任务生成
-- 快手小店核销配置
-- Cloudtentacles 履约配置与调试
-- 内部通知和定时任务配置
-
-## 本地开发
-
-```bash
-npm install
-npm run dev
-```
-
-开发环境默认通过 `VITE_API_TARGET` 代理后端:
-
-```bash
-VITE_API_TARGET=http://localhost:3000 npm run dev
-```
-
-## 验证
-
-```bash
-npm run typecheck
-npm run build
-```
diff --git a/apps/frontend-vue/eslint.config.js b/apps/frontend-vue/eslint.config.js
deleted file mode 100644
index 6c034421..00000000
--- a/apps/frontend-vue/eslint.config.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import js from '@eslint/js'
-import prettier from 'eslint-config-prettier'
-import pluginVue from 'eslint-plugin-vue'
-import globals from 'globals'
-import tseslint from 'typescript-eslint'
-
-export default tseslint.config(
- {
- ignores: ['dist/**', 'node_modules/**', 'src/auto-imports.d.ts', 'src/components.d.ts'],
- },
- js.configs.recommended,
- ...tseslint.configs.recommended,
- ...pluginVue.configs['flat/recommended'],
- prettier,
- {
- files: ['**/*.{ts,vue}'],
- languageOptions: {
- ecmaVersion: 'latest',
- sourceType: 'module',
- globals: {
- ...globals.browser,
- },
- parserOptions: {
- parser: tseslint.parser,
- extraFileExtensions: ['.vue'],
- },
- },
- rules: {
- 'vue/attributes-order': 'off',
- 'vue/multi-word-component-names': 'off',
- 'vue/no-mutating-props': ['error', { shallowOnly: true }],
- },
- },
-)
diff --git a/apps/frontend-vue/index.html b/apps/frontend-vue/index.html
deleted file mode 100644
index 3dfc7eba..00000000
--- a/apps/frontend-vue/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- 自动兑换前端
-
-
-
-
-
-
diff --git a/apps/frontend-vue/package-lock.json b/apps/frontend-vue/package-lock.json
deleted file mode 100644
index 913dee90..00000000
--- a/apps/frontend-vue/package-lock.json
+++ /dev/null
@@ -1,4211 +0,0 @@
-{
- "name": "order-site-rewrite",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "order-site-rewrite",
- "version": "0.0.0",
- "dependencies": {
- "@types/qrcode": "^1.5.6",
- "axios": "^1.9.0",
- "element-plus": "^2.10.2",
- "qrcode": "^1.5.4",
- "vue": "^3.5.30",
- "vue-router": "^4.5.1"
- },
- "devDependencies": {
- "@eslint/js": "^10.0.1",
- "@types/node": "^24.12.0",
- "@vitejs/plugin-vue": "^6.0.5",
- "@vue/tsconfig": "^0.9.0",
- "eslint": "^10.3.0",
- "eslint-config-prettier": "^10.1.8",
- "eslint-plugin-vue": "^10.9.1",
- "globals": "^17.6.0",
- "prettier": "^3.8.3",
- "sass": "^1.99.0",
- "typescript": "~5.9.3",
- "typescript-eslint": "^8.59.3",
- "unplugin-auto-import": "^21.0.0",
- "unplugin-vue-components": "^32.0.0",
- "vite": "^8.0.7",
- "vue-tsc": "^3.2.5"
- }
- },
- "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==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
- "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.29.2",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
- "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.29.0"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
- "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.28.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@ctrl/tinycolor": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz",
- "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==",
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@element-plus/icons-vue": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
- "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
- "license": "MIT",
- "peerDependencies": {
- "vue": "^3.2.0"
- }
- },
- "node_modules/@emnapi/core": {
- "version": "1.9.2",
- "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.9.2.tgz",
- "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.1",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "1.9.2",
- "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.9.2.tgz",
- "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/wasi-threads": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
- "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
- "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.23.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
- "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^3.0.5",
- "debug": "^4.3.1",
- "minimatch": "^10.2.4"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
- "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/core": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
- "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/js": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
- "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "eslint": "^10.0.0"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
- "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
- "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz",
- "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.11"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.7.6",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz",
- "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.7.5",
- "@floating-ui/utils": "^0.2.11"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.11",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz",
- "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
- "license": "MIT"
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
- "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/types": "^0.15.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
- "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.2",
- "@humanfs/types": "^0.15.0",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/types": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
- "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz",
- "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@tybys/wasm-util": "^0.10.1"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- },
- "peerDependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1"
- }
- },
- "node_modules/@oxc-project/types": {
- "version": "0.123.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.123.0.tgz",
- "integrity": "sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/Boshen"
- }
- },
- "node_modules/@parcel/watcher": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz",
- "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "detect-libc": "^2.0.3",
- "is-glob": "^4.0.3",
- "node-addon-api": "^7.0.0",
- "picomatch": "^4.0.3"
- },
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "@parcel/watcher-android-arm64": "2.5.6",
- "@parcel/watcher-darwin-arm64": "2.5.6",
- "@parcel/watcher-darwin-x64": "2.5.6",
- "@parcel/watcher-freebsd-x64": "2.5.6",
- "@parcel/watcher-linux-arm-glibc": "2.5.6",
- "@parcel/watcher-linux-arm-musl": "2.5.6",
- "@parcel/watcher-linux-arm64-glibc": "2.5.6",
- "@parcel/watcher-linux-arm64-musl": "2.5.6",
- "@parcel/watcher-linux-x64-glibc": "2.5.6",
- "@parcel/watcher-linux-x64-musl": "2.5.6",
- "@parcel/watcher-win32-arm64": "2.5.6",
- "@parcel/watcher-win32-ia32": "2.5.6",
- "@parcel/watcher-win32-x64": "2.5.6"
- }
- },
- "node_modules/@parcel/watcher-android-arm64": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz",
- "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-darwin-arm64": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz",
- "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-darwin-x64": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz",
- "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-freebsd-x64": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz",
- "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm-glibc": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz",
- "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm-musl": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz",
- "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm64-glibc": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz",
- "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm64-musl": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz",
- "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-x64-glibc": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz",
- "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-x64-musl": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz",
- "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-win32-arm64": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz",
- "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-win32-ia32": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz",
- "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-win32-x64": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz",
- "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@popperjs/core": {
- "name": "@sxzz/popperjs-es",
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz",
- "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.13.tgz",
- "integrity": "sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.13.tgz",
- "integrity": "sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.13.tgz",
- "integrity": "sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.13.tgz",
- "integrity": "sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.13.tgz",
- "integrity": "sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.13.tgz",
- "integrity": "sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.13.tgz",
- "integrity": "sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.13.tgz",
- "integrity": "sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.13.tgz",
- "integrity": "sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.13.tgz",
- "integrity": "sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.13.tgz",
- "integrity": "sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.13.tgz",
- "integrity": "sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.13.tgz",
- "integrity": "sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==",
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "1.9.1",
- "@emnapi/runtime": "1.9.1",
- "@napi-rs/wasm-runtime": "^1.1.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz",
- "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.0",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz",
- "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz",
- "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.13.tgz",
- "integrity": "sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.13.tgz",
- "integrity": "sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-rc.2",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz",
- "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@tybys/wasm-util": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
- "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@types/esrecurse": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
- "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/lodash": {
- "version": "4.17.24",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
- "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
- "dependencies": {
- "@types/lodash": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "24.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
- "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
- "license": "MIT",
- "dependencies": {
- "undici-types": "~7.16.0"
- }
- },
- "node_modules/@types/qrcode": {
- "version": "1.5.6",
- "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz",
- "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/web-bluetooth": {
- "version": "0.0.20",
- "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
- "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
- "license": "MIT"
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz",
- "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.59.3",
- "@typescript-eslint/type-utils": "8.59.3",
- "@typescript-eslint/utils": "8.59.3",
- "@typescript-eslint/visitor-keys": "8.59.3",
- "ignore": "^7.0.5",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.59.3",
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz",
- "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.59.3",
- "@typescript-eslint/types": "8.59.3",
- "@typescript-eslint/typescript-estree": "8.59.3",
- "@typescript-eslint/visitor-keys": "8.59.3",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/project-service": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz",
- "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.59.3",
- "@typescript-eslint/types": "^8.59.3",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz",
- "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.59.3",
- "@typescript-eslint/visitor-keys": "8.59.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz",
- "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz",
- "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.59.3",
- "@typescript-eslint/typescript-estree": "8.59.3",
- "@typescript-eslint/utils": "8.59.3",
- "debug": "^4.4.3",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz",
- "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz",
- "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/project-service": "8.59.3",
- "@typescript-eslint/tsconfig-utils": "8.59.3",
- "@typescript-eslint/types": "8.59.3",
- "@typescript-eslint/visitor-keys": "8.59.3",
- "debug": "^4.4.3",
- "minimatch": "^10.2.2",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz",
- "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.59.3",
- "@typescript-eslint/types": "8.59.3",
- "@typescript-eslint/typescript-estree": "8.59.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz",
- "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.59.3",
- "eslint-visitor-keys": "^5.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@vitejs/plugin-vue": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz",
- "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rolldown/pluginutils": "1.0.0-rc.2"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "peerDependencies": {
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
- "vue": "^3.2.25"
- }
- },
- "node_modules/@volar/language-core": {
- "version": "2.4.28",
- "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz",
- "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@volar/source-map": "2.4.28"
- }
- },
- "node_modules/@volar/source-map": {
- "version": "2.4.28",
- "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz",
- "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@volar/typescript": {
- "version": "2.4.28",
- "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz",
- "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@volar/language-core": "2.4.28",
- "path-browserify": "^1.0.1",
- "vscode-uri": "^3.0.8"
- }
- },
- "node_modules/@vue/compiler-core": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz",
- "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.29.2",
- "@vue/shared": "3.5.32",
- "entities": "^7.0.1",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-dom": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz",
- "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==",
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-core": "3.5.32",
- "@vue/shared": "3.5.32"
- }
- },
- "node_modules/@vue/compiler-sfc": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz",
- "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.29.2",
- "@vue/compiler-core": "3.5.32",
- "@vue/compiler-dom": "3.5.32",
- "@vue/compiler-ssr": "3.5.32",
- "@vue/shared": "3.5.32",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.21",
- "postcss": "^8.5.8",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-ssr": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz",
- "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==",
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-dom": "3.5.32",
- "@vue/shared": "3.5.32"
- }
- },
- "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==",
- "license": "MIT"
- },
- "node_modules/@vue/language-core": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.6.tgz",
- "integrity": "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@volar/language-core": "2.4.28",
- "@vue/compiler-dom": "^3.5.0",
- "@vue/shared": "^3.5.0",
- "alien-signals": "^3.0.0",
- "muggle-string": "^0.4.1",
- "path-browserify": "^1.0.1",
- "picomatch": "^4.0.2"
- }
- },
- "node_modules/@vue/reactivity": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz",
- "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==",
- "license": "MIT",
- "dependencies": {
- "@vue/shared": "3.5.32"
- }
- },
- "node_modules/@vue/runtime-core": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz",
- "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==",
- "license": "MIT",
- "dependencies": {
- "@vue/reactivity": "3.5.32",
- "@vue/shared": "3.5.32"
- }
- },
- "node_modules/@vue/runtime-dom": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz",
- "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==",
- "license": "MIT",
- "dependencies": {
- "@vue/reactivity": "3.5.32",
- "@vue/runtime-core": "3.5.32",
- "@vue/shared": "3.5.32",
- "csstype": "^3.2.3"
- }
- },
- "node_modules/@vue/server-renderer": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz",
- "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==",
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-ssr": "3.5.32",
- "@vue/shared": "3.5.32"
- },
- "peerDependencies": {
- "vue": "3.5.32"
- }
- },
- "node_modules/@vue/shared": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz",
- "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==",
- "license": "MIT"
- },
- "node_modules/@vue/tsconfig": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.9.1.tgz",
- "integrity": "sha512-buvjm+9NzLCJL29KY1j1991YYJ5e6275OiK+G4jtmfIb+z4POywbdm0wXusT9adVWqe0xqg70TbI7+mRx4uU9w==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "typescript": ">= 5.8",
- "vue": "^3.4.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- },
- "vue": {
- "optional": true
- }
- }
- },
- "node_modules/@vueuse/core": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz",
- "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==",
- "license": "MIT",
- "dependencies": {
- "@types/web-bluetooth": "^0.0.20",
- "@vueuse/metadata": "12.0.0",
- "@vueuse/shared": "12.0.0",
- "vue": "^3.5.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/metadata": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz",
- "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/shared": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz",
- "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==",
- "license": "MIT",
- "dependencies": {
- "vue": "^3.5.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/alien-signals": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz",
- "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "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==",
- "license": "MIT"
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "license": "MIT"
- },
- "node_modules/axios": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz",
- "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.16.0",
- "form-data": "^4.0.5",
- "https-proxy-agent": "^5.0.1",
- "proxy-from-env": "^2.1.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/brace-expansion": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
- "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "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==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/confbox": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
- "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/csstype": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "license": "MIT"
- },
- "node_modules/dayjs": {
- "version": "1.11.20",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
- "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
- "license": "MIT"
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dijkstrajs": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
- "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/element-plus": {
- "version": "2.13.6",
- "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.6.tgz",
- "integrity": "sha512-XHgwXr8Fjz6i+6BaqFhAbae/dJbG7bBAAlHrY3pWL7dpj+JcqcOyKYt4Oy5KP86FQwS1k4uIZDjCx2FyUR5lDg==",
- "license": "MIT",
- "dependencies": {
- "@ctrl/tinycolor": "^4.2.0",
- "@element-plus/icons-vue": "^2.3.2",
- "@floating-ui/dom": "^1.0.1",
- "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
- "@types/lodash": "^4.17.20",
- "@types/lodash-es": "^4.17.12",
- "@vueuse/core": "12.0.0",
- "async-validator": "^4.2.5",
- "dayjs": "^1.11.19",
- "lodash": "^4.17.23",
- "lodash-es": "^4.17.23",
- "lodash-unified": "^1.0.3",
- "memoize-one": "^6.0.0",
- "normalize-wheel-es": "^1.2.0",
- "vue-component-type-helpers": "^3.2.4"
- },
- "peerDependencies": {
- "vue": "^3.3.0"
- }
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "license": "MIT"
- },
- "node_modules/entities": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
- "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
- "license": "BSD-2-Clause",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz",
- "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.8.0",
- "@eslint-community/regexpp": "^4.12.2",
- "@eslint/config-array": "^0.23.5",
- "@eslint/config-helpers": "^0.5.5",
- "@eslint/core": "^1.2.1",
- "@eslint/plugin-kit": "^0.7.1",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "ajv": "^6.14.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^9.1.2",
- "eslint-visitor-keys": "^5.0.1",
- "espree": "^11.2.0",
- "esquery": "^1.7.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "minimatch": "^10.2.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-config-prettier": {
- "version": "10.1.8",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
- "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-config-prettier"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
- "node_modules/eslint-plugin-vue": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.1.tgz",
- "integrity": "sha512-cHB0Tf4Duvzwecwd/AqWzZvF/QszE13BhjVUpVXWCy9AeMR5GjkAjP3i85vqgLgOuTmkHR1OJ5oMeqLHtuw8zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "natural-compare": "^1.4.0",
- "nth-check": "^2.1.1",
- "postcss-selector-parser": "^7.1.0",
- "semver": "^7.6.3",
- "xml-name-validator": "^4.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "peerDependencies": {
- "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
- "@typescript-eslint/parser": "^7.0.0 || ^8.0.0",
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "vue-eslint-parser": "^10.3.0"
- },
- "peerDependenciesMeta": {
- "@stylistic/eslint-plugin": {
- "optional": true
- },
- "@typescript-eslint/parser": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-scope": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
- "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@types/esrecurse": "^4.3.1",
- "@types/estree": "^1.0.8",
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/espree": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
- "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.16.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^5.0.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
- "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "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==",
- "license": "MIT"
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/exsolve": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
- "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/flatted": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
- "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/follow-redirects": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
- "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
- "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
- "license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "hasown": "^2.0.2",
- "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,
- "license": "MIT",
- "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==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "17.6.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
- "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immutable": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
- "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/js-tokens": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
- "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lightningcss": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.32.0",
- "lightningcss-darwin-arm64": "1.32.0",
- "lightningcss-darwin-x64": "1.32.0",
- "lightningcss-freebsd-x64": "1.32.0",
- "lightningcss-linux-arm-gnueabihf": "1.32.0",
- "lightningcss-linux-arm64-gnu": "1.32.0",
- "lightningcss-linux-arm64-musl": "1.32.0",
- "lightningcss-linux-x64-gnu": "1.32.0",
- "lightningcss-linux-x64-musl": "1.32.0",
- "lightningcss-win32-arm64-msvc": "1.32.0",
- "lightningcss-win32-x64-msvc": "1.32.0"
- }
- },
- "node_modules/lightningcss-android-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
- "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
- "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
- "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
- "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
- "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
- "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
- "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
- "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
- "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
- "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/local-pkg": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz",
- "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mlly": "^1.7.4",
- "pkg-types": "^2.3.0",
- "quansync": "^0.2.11"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
- "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
- "license": "MIT"
- },
- "node_modules/lodash-es": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
- "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
- "license": "MIT"
- },
- "node_modules/lodash-unified": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
- "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/lodash-es": "*",
- "lodash": "*",
- "lodash-es": "*"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.21",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.5"
- }
- },
- "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==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/memoize-one": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
- "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "10.2.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
- "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.5"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
- "node_modules/mlly/node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mlly/node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "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,
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-addon-api": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
- "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/normalize-wheel-es": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
- "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
- "license": "BSD-3-Clause"
- },
- "node_modules/nth-check": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
- "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "boolbase": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/fb55/nth-check?sponsor=1"
- }
- },
- "node_modules/obug": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
- "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
- "dev": true,
- "funding": [
- "https://github.com/sponsors/sxzz",
- "https://opencollective.com/debug"
- ],
- "license": "MIT"
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "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,
- "license": "MIT"
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pathe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pkg-types": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
- "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.2.2",
- "exsolve": "^1.0.7",
- "pathe": "^2.0.3"
- }
- },
- "node_modules/pngjs": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
- "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.15",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
- "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
- "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"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.12",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
- "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prettier": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
- "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/proxy-from-env": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
- "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qrcode": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz",
- "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
- "license": "MIT",
- "dependencies": {
- "dijkstrajs": "^1.0.1",
- "pngjs": "^5.0.0",
- "yargs": "^15.3.1"
- },
- "bin": {
- "qrcode": "bin/qrcode"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/quansync": {
- "version": "0.2.11",
- "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
- "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/antfu"
- },
- {
- "type": "individual",
- "url": "https://github.com/sponsors/sxzz"
- }
- ],
- "license": "MIT"
- },
- "node_modules/readdirp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
- "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "license": "ISC"
- },
- "node_modules/rolldown": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.13.tgz",
- "integrity": "sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@oxc-project/types": "=0.123.0",
- "@rolldown/pluginutils": "1.0.0-rc.13"
- },
- "bin": {
- "rolldown": "bin/cli.mjs"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "optionalDependencies": {
- "@rolldown/binding-android-arm64": "1.0.0-rc.13",
- "@rolldown/binding-darwin-arm64": "1.0.0-rc.13",
- "@rolldown/binding-darwin-x64": "1.0.0-rc.13",
- "@rolldown/binding-freebsd-x64": "1.0.0-rc.13",
- "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.13",
- "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.13",
- "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.13",
- "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.13",
- "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.13",
- "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.13",
- "@rolldown/binding-linux-x64-musl": "1.0.0-rc.13",
- "@rolldown/binding-openharmony-arm64": "1.0.0-rc.13",
- "@rolldown/binding-wasm32-wasi": "1.0.0-rc.13",
- "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.13",
- "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.13"
- }
- },
- "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz",
- "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/sass": {
- "version": "1.99.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz",
- "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chokidar": "^4.0.0",
- "immutable": "^5.1.5",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "optionalDependencies": {
- "@parcel/watcher": "^2.4.1"
- }
- },
- "node_modules/sass/node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/sass/node_modules/readdirp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
- "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/scule": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
- "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/semver": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
- "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "license": "ISC"
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-literal": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
- "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^9.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.3"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/ts-api-utils": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
- "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD",
- "optional": true
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "devOptional": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-eslint": {
- "version": "8.59.3",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz",
- "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.59.3",
- "@typescript-eslint/parser": "8.59.3",
- "@typescript-eslint/typescript-estree": "8.59.3",
- "@typescript-eslint/utils": "8.59.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/ufo": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
- "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
- "license": "MIT"
- },
- "node_modules/unimport": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.7.0.tgz",
- "integrity": "sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "escape-string-regexp": "^5.0.0",
- "estree-walker": "^3.0.3",
- "local-pkg": "^1.1.2",
- "magic-string": "^0.30.21",
- "mlly": "^1.8.0",
- "pathe": "^2.0.3",
- "picomatch": "^4.0.3",
- "pkg-types": "^2.3.0",
- "scule": "^1.3.0",
- "strip-literal": "^3.1.0",
- "tinyglobby": "^0.2.15",
- "unplugin": "^2.3.11",
- "unplugin-utils": "^0.3.1"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
- "node_modules/unimport/node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/unplugin": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
- "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "acorn": "^8.15.0",
- "picomatch": "^4.0.3",
- "webpack-virtual-modules": "^0.6.2"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
- "node_modules/unplugin-auto-import": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-21.0.0.tgz",
- "integrity": "sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "local-pkg": "^1.1.2",
- "magic-string": "^0.30.21",
- "picomatch": "^4.0.3",
- "unimport": "^5.6.0",
- "unplugin": "^2.3.11",
- "unplugin-utils": "^0.3.1"
- },
- "engines": {
- "node": ">=20.19.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "@nuxt/kit": "^4.0.0",
- "@vueuse/core": "*"
- },
- "peerDependenciesMeta": {
- "@nuxt/kit": {
- "optional": true
- },
- "@vueuse/core": {
- "optional": true
- }
- }
- },
- "node_modules/unplugin-utils": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz",
- "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pathe": "^2.0.3",
- "picomatch": "^4.0.3"
- },
- "engines": {
- "node": ">=20.19.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sxzz"
- }
- },
- "node_modules/unplugin-vue-components": {
- "version": "32.0.0",
- "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-32.0.0.tgz",
- "integrity": "sha512-uLdccgS7mf3pv1bCCP20y/hm+u1eOjAmygVkh+Oa70MPkzgl1eQv1L0CwdHNM3gscO8/GDMGIET98Ja47CBbZg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chokidar": "^5.0.0",
- "local-pkg": "^1.1.2",
- "magic-string": "^0.30.21",
- "mlly": "^1.8.2",
- "obug": "^2.1.1",
- "picomatch": "^4.0.3",
- "tinyglobby": "^0.2.15",
- "unplugin": "^3.0.0",
- "unplugin-utils": "^0.3.1"
- },
- "engines": {
- "node": ">=20.19.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "@nuxt/kit": "^3.2.2 || ^4.0.0",
- "vue": "^3.0.0"
- },
- "peerDependenciesMeta": {
- "@nuxt/kit": {
- "optional": true
- }
- }
- },
- "node_modules/unplugin-vue-components/node_modules/unplugin": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz",
- "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "picomatch": "^4.0.3",
- "webpack-virtual-modules": "^0.6.2"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/vite": {
- "version": "8.0.7",
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.7.tgz",
- "integrity": "sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lightningcss": "^1.32.0",
- "picomatch": "^4.0.4",
- "postcss": "^8.5.8",
- "rolldown": "1.0.0-rc.13",
- "tinyglobby": "^0.2.15"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^20.19.0 || >=22.12.0",
- "@vitejs/devtools": "^0.1.0",
- "esbuild": "^0.27.0 || ^0.28.0",
- "jiti": ">=1.21.0",
- "less": "^4.0.0",
- "sass": "^1.70.0",
- "sass-embedded": "^1.70.0",
- "stylus": ">=0.54.8",
- "sugarss": "^5.0.0",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "@vitejs/devtools": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "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/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,
- "license": "MIT"
- },
- "node_modules/vue": {
- "version": "3.5.32",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz",
- "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==",
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-dom": "3.5.32",
- "@vue/compiler-sfc": "3.5.32",
- "@vue/runtime-dom": "3.5.32",
- "@vue/server-renderer": "3.5.32",
- "@vue/shared": "3.5.32"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/vue-component-type-helpers": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.2.6.tgz",
- "integrity": "sha512-O02tnvIfOQVmnvoWwuSydwRoHjZVt8UEBR+2p4rT35p8GAy5VTlWP8o5qXfJR/GWCN0nVZoYWsVUvx2jwgdBmQ==",
- "license": "MIT"
- },
- "node_modules/vue-eslint-parser": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz",
- "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "debug": "^4.4.0",
- "eslint-scope": "^8.2.0 || ^9.0.0",
- "eslint-visitor-keys": "^4.2.0 || ^5.0.0",
- "espree": "^10.3.0 || ^11.0.0",
- "esquery": "^1.6.0",
- "semver": "^7.6.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0"
- }
- },
- "node_modules/vue-router": {
- "version": "4.6.4",
- "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz",
- "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
- "license": "MIT",
- "dependencies": {
- "@vue/devtools-api": "^6.6.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/posva"
- },
- "peerDependencies": {
- "vue": "^3.5.0"
- }
- },
- "node_modules/vue-tsc": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.6.tgz",
- "integrity": "sha512-gYW/kWI0XrwGzd0PKc7tVB/qpdeAkIZLNZb10/InizkQjHjnT8weZ/vBarZoj4kHKbUTZT/bAVgoOr8x4NsQ/Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@volar/typescript": "2.4.28",
- "@vue/language-core": "3.2.6"
- },
- "bin": {
- "vue-tsc": "bin/vue-tsc.js"
- },
- "peerDependencies": {
- "typescript": ">=5.0.0"
- }
- },
- "node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-module": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
- "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "license": "ISC"
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/xml-name-validator": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
- "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "license": "ISC"
- },
- "node_modules/yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "license": "ISC",
- "dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
-}
diff --git a/apps/frontend-vue/package.json b/apps/frontend-vue/package.json
deleted file mode 100644
index ba58d4d3..00000000
--- a/apps/frontend-vue/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "order-site-rewrite",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vue-tsc -b && vite build",
- "preview": "vite preview",
- "typecheck": "vue-tsc --noEmit -p tsconfig.app.json",
- "lint": "eslint .",
- "format": "prettier --write .",
- "format:check": "prettier --check ."
- },
- "dependencies": {
- "@types/qrcode": "^1.5.6",
- "axios": "^1.9.0",
- "element-plus": "^2.10.2",
- "qrcode": "^1.5.4",
- "vue": "^3.5.30",
- "vue-router": "^4.5.1"
- },
- "devDependencies": {
- "@eslint/js": "^10.0.1",
- "@types/node": "^24.12.0",
- "@vitejs/plugin-vue": "^6.0.5",
- "@vue/tsconfig": "^0.9.0",
- "eslint": "^10.3.0",
- "eslint-config-prettier": "^10.1.8",
- "eslint-plugin-vue": "^10.9.1",
- "globals": "^17.6.0",
- "prettier": "^3.8.3",
- "sass": "^1.99.0",
- "typescript": "~5.9.3",
- "typescript-eslint": "^8.59.3",
- "unplugin-auto-import": "^21.0.0",
- "unplugin-vue-components": "^32.0.0",
- "vite": "^8.0.7",
- "vue-tsc": "^3.2.5"
- }
-}
diff --git a/apps/frontend-vue/public/favicon.svg b/apps/frontend-vue/public/favicon.svg
deleted file mode 100644
index 6893eb13..00000000
--- a/apps/frontend-vue/public/favicon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/1.png b/apps/frontend-vue/public/kuaishou-cloud-guide/1.png
deleted file mode 100644
index 6fb49bd6..00000000
Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/1.png and /dev/null differ
diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/2.png b/apps/frontend-vue/public/kuaishou-cloud-guide/2.png
deleted file mode 100644
index 5c839ae7..00000000
Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/2.png and /dev/null differ
diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/3.png b/apps/frontend-vue/public/kuaishou-cloud-guide/3.png
deleted file mode 100644
index e01e0b80..00000000
Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/3.png and /dev/null differ
diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/4.jpg b/apps/frontend-vue/public/kuaishou-cloud-guide/4.jpg
deleted file mode 100644
index bcec284c..00000000
Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/4.jpg and /dev/null differ
diff --git a/apps/frontend-vue/src/App.vue b/apps/frontend-vue/src/App.vue
deleted file mode 100644
index 1210025e..00000000
--- a/apps/frontend-vue/src/App.vue
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/auto-imports.d.ts b/apps/frontend-vue/src/auto-imports.d.ts
deleted file mode 100644
index 72370df8..00000000
--- a/apps/frontend-vue/src/auto-imports.d.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-/* eslint-disable */
-/* prettier-ignore */
-// @ts-nocheck
-// noinspection JSUnusedGlobalSymbols
-// Generated by unplugin-auto-import
-// biome-ignore lint: disable
-export {}
-declare global {
- const EffectScope: typeof import('vue').EffectScope
- const computed: typeof import('vue').computed
- const createApp: typeof import('vue').createApp
- const customRef: typeof import('vue').customRef
- const defineAsyncComponent: typeof import('vue').defineAsyncComponent
- const defineComponent: typeof import('vue').defineComponent
- const effectScope: typeof import('vue').effectScope
- const getCurrentInstance: typeof import('vue').getCurrentInstance
- const getCurrentScope: typeof import('vue').getCurrentScope
- const getCurrentWatcher: typeof import('vue').getCurrentWatcher
- const h: typeof import('vue').h
- const inject: typeof import('vue').inject
- const isProxy: typeof import('vue').isProxy
- const isReactive: typeof import('vue').isReactive
- const isReadonly: typeof import('vue').isReadonly
- const isRef: typeof import('vue').isRef
- const isShallow: typeof import('vue').isShallow
- const markRaw: typeof import('vue').markRaw
- const nextTick: typeof import('vue').nextTick
- const onActivated: typeof import('vue').onActivated
- const onBeforeMount: typeof import('vue').onBeforeMount
- const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
- const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
- const onBeforeUnmount: typeof import('vue').onBeforeUnmount
- const onBeforeUpdate: typeof import('vue').onBeforeUpdate
- const onDeactivated: typeof import('vue').onDeactivated
- const onErrorCaptured: typeof import('vue').onErrorCaptured
- const onMounted: typeof import('vue').onMounted
- const onRenderTracked: typeof import('vue').onRenderTracked
- const onRenderTriggered: typeof import('vue').onRenderTriggered
- const onScopeDispose: typeof import('vue').onScopeDispose
- const onServerPrefetch: typeof import('vue').onServerPrefetch
- const onUnmounted: typeof import('vue').onUnmounted
- const onUpdated: typeof import('vue').onUpdated
- const onWatcherCleanup: typeof import('vue').onWatcherCleanup
- const provide: typeof import('vue').provide
- const reactive: typeof import('vue').reactive
- const readonly: typeof import('vue').readonly
- const ref: typeof import('vue').ref
- const resolveComponent: typeof import('vue').resolveComponent
- const shallowReactive: typeof import('vue').shallowReactive
- const shallowReadonly: typeof import('vue').shallowReadonly
- const shallowRef: typeof import('vue').shallowRef
- const toRaw: typeof import('vue').toRaw
- const toRef: typeof import('vue').toRef
- const toRefs: typeof import('vue').toRefs
- const toValue: typeof import('vue').toValue
- const triggerRef: typeof import('vue').triggerRef
- const unref: typeof import('vue').unref
- const useAttrs: typeof import('vue').useAttrs
- const useCssModule: typeof import('vue').useCssModule
- const useCssVars: typeof import('vue').useCssVars
- const useId: typeof import('vue').useId
- const useLink: typeof import('vue-router').useLink
- const useModel: typeof import('vue').useModel
- const useRoute: typeof import('vue-router').useRoute
- const useRouter: typeof import('vue-router').useRouter
- const useSlots: typeof import('vue').useSlots
- const useTemplateRef: typeof import('vue').useTemplateRef
- const watch: typeof import('vue').watch
- const watchEffect: typeof import('vue').watchEffect
- const watchPostEffect: typeof import('vue').watchPostEffect
- const watchSyncEffect: typeof import('vue').watchSyncEffect
-}
-// for type re-export
-declare global {
- // @ts-ignore
- export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
- import('vue')
-}
diff --git a/apps/frontend-vue/src/components.d.ts b/apps/frontend-vue/src/components.d.ts
deleted file mode 100644
index 86fba41d..00000000
--- a/apps/frontend-vue/src/components.d.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/* eslint-disable */
-// @ts-nocheck
-// biome-ignore lint: disable
-// oxlint-disable
-// ------
-// Generated by unplugin-vue-components
-// Read more: https://github.com/vuejs/core/pull/3399
-
-export {}
-
-/* prettier-ignore */
-declare module 'vue' {
- export interface GlobalComponents {
- AdminPageHeader: typeof import('./components/admin/AdminPageHeader.vue')['default']
- AdminResultCard: typeof import('./components/admin/AdminResultCard.vue')['default']
- AdminStatusTag: typeof import('./components/admin/AdminStatusTag.vue')['default']
- ElAlert: typeof import('element-plus/es')['ElAlert']
- ElButton: typeof import('element-plus/es')['ElButton']
- ElCard: typeof import('element-plus/es')['ElCard']
- ElCol: typeof import('element-plus/es')['ElCol']
- ElCollapse: typeof import('element-plus/es')['ElCollapse']
- ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
- ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
- ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
- ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
- ElDialog: typeof import('element-plus/es')['ElDialog']
- ElDropdown: typeof import('element-plus/es')['ElDropdown']
- ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
- ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
- ElEmpty: typeof import('element-plus/es')['ElEmpty']
- ElForm: typeof import('element-plus/es')['ElForm']
- ElFormItem: typeof import('element-plus/es')['ElFormItem']
- ElIcon: typeof import('element-plus/es')['ElIcon']
- ElInput: typeof import('element-plus/es')['ElInput']
- ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
- ElLink: typeof import('element-plus/es')['ElLink']
- ElMenu: typeof import('element-plus/es')['ElMenu']
- ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
- ElOption: typeof import('element-plus/es')['ElOption']
- ElPagination: typeof import('element-plus/es')['ElPagination']
- ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
- ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
- ElResult: typeof import('element-plus/es')['ElResult']
- ElRow: typeof import('element-plus/es')['ElRow']
- ElSelect: typeof import('element-plus/es')['ElSelect']
- ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
- ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
- ElSwitch: typeof import('element-plus/es')['ElSwitch']
- ElTable: typeof import('element-plus/es')['ElTable']
- ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
- ElTabPane: typeof import('element-plus/es')['ElTabPane']
- ElTabs: typeof import('element-plus/es')['ElTabs']
- ElTag: typeof import('element-plus/es')['ElTag']
- ElTooltip: typeof import('element-plus/es')['ElTooltip']
- RouterLink: typeof import('vue-router')['RouterLink']
- RouterView: typeof import('vue-router')['RouterView']
- }
- export interface GlobalDirectives {
- vLoading: typeof import('element-plus/es')['ElLoadingDirective']
- }
-}
diff --git a/apps/frontend-vue/src/components/admin/AdminPageHeader.vue b/apps/frontend-vue/src/components/admin/AdminPageHeader.vue
deleted file mode 100644
index f79b1fcc..00000000
--- a/apps/frontend-vue/src/components/admin/AdminPageHeader.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/components/admin/AdminResultCard.vue b/apps/frontend-vue/src/components/admin/AdminResultCard.vue
deleted file mode 100644
index eedd256e..00000000
--- a/apps/frontend-vue/src/components/admin/AdminResultCard.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- {{ label }}
- {{ value }}
-
-
-
-
-
diff --git a/apps/frontend-vue/src/components/admin/AdminStatusTag.vue b/apps/frontend-vue/src/components/admin/AdminStatusTag.vue
deleted file mode 100644
index 134fb47d..00000000
--- a/apps/frontend-vue/src/components/admin/AdminStatusTag.vue
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
- {{ resolveLabel(props.status) }}
-
-
diff --git a/apps/frontend-vue/src/composables/useAdminAction.ts b/apps/frontend-vue/src/composables/useAdminAction.ts
deleted file mode 100644
index 2bcb9321..00000000
--- a/apps/frontend-vue/src/composables/useAdminAction.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { ref } from 'vue'
-
-import { isFeedbackDismissed, showConfirm, showError, showSuccess } from '@/lib/feedback'
-
-export interface RunActionOptions {
- id: number | string
- action: () => Promise
- successMessage: string
- confirmText: string
- onAfterAction?: () => Promise | void
-}
-
-export function useAdminAction() {
- const actionLoadingId = ref(null)
-
- async function runAction(options: RunActionOptions) {
- try {
- await showConfirm(options.confirmText, '确认操作', {
- type: 'warning',
- confirmButtonText: '继续执行',
- cancelButtonText: '取消',
- })
- } catch (error) {
- if (isFeedbackDismissed(error)) return
- throw error
- }
-
- actionLoadingId.value = options.id
-
- try {
- await options.action()
- showSuccess(options.successMessage)
- if (options.onAfterAction) await options.onAfterAction()
- } catch (error) {
- showError(error instanceof Error ? error.message : '操作失败')
- } finally {
- actionLoadingId.value = null
- }
- }
-
- return { actionLoadingId, runAction }
-}
diff --git a/apps/frontend-vue/src/composables/useAdminListPage.ts b/apps/frontend-vue/src/composables/useAdminListPage.ts
deleted file mode 100644
index f9838368..00000000
--- a/apps/frontend-vue/src/composables/useAdminListPage.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { ref } from 'vue'
-
-import type { ApiEnvelope } from '@/lib/http'
-import type { AdminPagination } from '@/types/admin'
-
-export interface AdminListPageData {
- items: TItem[]
- pagination: AdminPagination
-}
-
-export interface UseAdminListPageOptions {
- defaultErrorMessage: string
- pageSize?: number
- fetchPage: (page: number, pageSize: number) => Promise>>
-}
-
-export function useAdminListPage(options: UseAdminListPageOptions) {
- const loading = ref(true)
- const errorMessage = ref('')
- const items = ref([])
- const pagination = ref({
- page: 1,
- pageSize: options.pageSize ?? 20,
- total: 0,
- })
- let latestRequestId = 0
-
- async function loadPage(page = pagination.value.page) {
- const requestId = ++latestRequestId
- loading.value = true
- errorMessage.value = ''
-
- try {
- const response = await options.fetchPage(page, pagination.value.pageSize)
-
- if (requestId !== latestRequestId) {
- return
- }
-
- items.value = response.data.items
- pagination.value = response.data.pagination
- } catch (error) {
- if (requestId !== latestRequestId) {
- return
- }
-
- errorMessage.value = error instanceof Error ? error.message : options.defaultErrorMessage
- } finally {
- if (requestId === latestRequestId) {
- loading.value = false
- }
- }
- }
-
- return {
- loading,
- errorMessage,
- items,
- pagination,
- loadPage,
- }
-}
diff --git a/apps/frontend-vue/src/composables/useAdminListQuerySync.ts b/apps/frontend-vue/src/composables/useAdminListQuerySync.ts
deleted file mode 100644
index de0227f7..00000000
--- a/apps/frontend-vue/src/composables/useAdminListQuerySync.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import type { RouteLocationNormalizedLoaded, Router } from 'vue-router'
-
-export interface ListQueryFilters {
- [key: string]: string | string[] | undefined
-}
-
-export function useAdminListQuerySync(route: RouteLocationNormalizedLoaded, router: Router) {
- function readQueryString(key: string): string {
- const value = route.query[key]
- const rawValue = Array.isArray(value) ? value[0] : value
- return typeof rawValue === 'string' ? rawValue.trim() : ''
- }
-
- function readQueryPage(): number {
- const page = Number(readQueryString('page'))
- return Number.isInteger(page) && page > 0 ? page : 1
- }
-
- async function syncRouteQuery(page: number, filters: ListQueryFilters = {}) {
- const query: Record = {}
- if (page > 1) { query.page = String(page) }
- for (const [key, value] of Object.entries(filters)) {
- const trimmed = (Array.isArray(value) ? value.join(',') : value)?.trim()
- if (trimmed) { query[key] = trimmed }
- }
- await router.replace({ path: route.path, query })
- }
-
- return { readQueryString, readQueryPage, syncRouteQuery }
-}
diff --git a/apps/frontend-vue/src/domain/task-status.ts b/apps/frontend-vue/src/domain/task-status.ts
deleted file mode 100644
index 796e27da..00000000
--- a/apps/frontend-vue/src/domain/task-status.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-export const TASK_STATUS = {
- PENDING_PAYMENT: "pending_payment",
- PAID: "paid",
- LINK_GENERATED: "link_generated",
- CLAIMED: "claimed",
- PENDING_BINDING_PREPARE: "pending_binding_prepare",
- WAITING_BINDING: "waiting_binding",
- ROLE_CONFIRMED: "role_confirmed",
- REDEEMING: "redeeming",
- DISPATCHED_PENDING_RETURN: "dispatched_pending_return",
- COMPLETED: "completed",
- REDEEMED: "redeemed",
- RETRY_PENDING: "retry_pending",
- MANUAL_REVIEW: "manual_review",
- FAILED: "failed",
- EXPIRED: "expired",
- CLOSED: "closed",
-} as const;
-
-export type KnownTaskStatus = (typeof TASK_STATUS)[keyof typeof TASK_STATUS];
-export type TaskStatus = KnownTaskStatus | (string & {});
-
-const CLAIM_INACTIVE_STATUSES = new Set([
- TASK_STATUS.COMPLETED,
- TASK_STATUS.REDEEMED,
- TASK_STATUS.MANUAL_REVIEW,
- TASK_STATUS.FAILED,
- TASK_STATUS.EXPIRED,
- TASK_STATUS.CLOSED,
-]);
-
-const KUAISHOU_CLOUD_RESULT_STATUSES = new Set([
- TASK_STATUS.DISPATCHED_PENDING_RETURN,
- TASK_STATUS.COMPLETED,
- TASK_STATUS.REDEEMED,
- TASK_STATUS.MANUAL_REVIEW,
- TASK_STATUS.FAILED,
-]);
-
-export function normalizeTaskStatus(value: unknown): TaskStatus {
- return String(value || "").trim() as TaskStatus;
-}
-
-export function isClaimInactiveTaskStatus(status: unknown): boolean {
- return CLAIM_INACTIVE_STATUSES.has(normalizeTaskStatus(status));
-}
-
-export function isKuaishouCloudRoleConfirmedStatus(status: unknown): boolean {
- return normalizeTaskStatus(status) === TASK_STATUS.ROLE_CONFIRMED;
-}
-
-export function isKuaishouCloudCompletedStatus(status: unknown): boolean {
- const normalized = normalizeTaskStatus(status);
- return normalized === TASK_STATUS.COMPLETED || normalized === TASK_STATUS.REDEEMED;
-}
-
-export function hasKuaishouCloudRedeemResultStatus(status: unknown): boolean {
- return KUAISHOU_CLOUD_RESULT_STATUSES.has(normalizeTaskStatus(status));
-}
diff --git a/apps/frontend-vue/src/lib/feedback.ts b/apps/frontend-vue/src/lib/feedback.ts
deleted file mode 100644
index b19cf838..00000000
--- a/apps/frontend-vue/src/lib/feedback.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { ElMessage, ElMessageBox } from 'element-plus'
-import type { ElMessageBoxOptions, MessageOptions } from 'element-plus'
-
-import 'element-plus/theme-chalk/el-message.css'
-import 'element-plus/theme-chalk/el-overlay.css'
-import 'element-plus/theme-chalk/el-message-box.css'
-
-const baseMessageOptions: Partial = {
- grouping: true,
-}
-
-const baseConfirmOptions: ElMessageBoxOptions = {
- type: 'warning',
- confirmButtonText: '继续执行',
- cancelButtonText: '取消',
- closeOnClickModal: false,
- closeOnPressEscape: false,
- autofocus: false,
- distinguishCancelAndClose: true,
-}
-
-const basePromptOptions: ElMessageBoxOptions = {
- confirmButtonText: '提交',
- cancelButtonText: '取消',
- closeOnClickModal: false,
- closeOnPressEscape: false,
- autofocus: false,
- distinguishCancelAndClose: true,
-}
-
-export function showSuccess(message: string, options: Partial = {}) {
- return ElMessage.success({
- ...baseMessageOptions,
- ...options,
- message,
- })
-}
-
-export function showError(message: string, options: Partial = {}) {
- return ElMessage.error({
- ...baseMessageOptions,
- ...options,
- message,
- })
-}
-
-export function showConfirm(
- message: string,
- title = '确认操作',
- options: ElMessageBoxOptions = {},
-) {
- return ElMessageBox.confirm(message, title, {
- ...baseConfirmOptions,
- ...options,
- })
-}
-
-export function showPrompt(message: string, title: string, options: ElMessageBoxOptions = {}) {
- return ElMessageBox.prompt(message, title, {
- ...basePromptOptions,
- ...options,
- })
-}
-
-export function isFeedbackDismissed(error: unknown) {
- return error === 'cancel' || error === 'close'
-}
diff --git a/apps/frontend-vue/src/lib/http.ts b/apps/frontend-vue/src/lib/http.ts
deleted file mode 100644
index dfb08252..00000000
--- a/apps/frontend-vue/src/lib/http.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import axios from 'axios'
-import { clearAdminSession, getAdminToken } from '@/utils/admin-auth'
-
-export interface ApiEnvelope {
- code: number
- msg: string
- data: T
- errorCode?: string
-}
-
-const http = axios.create({
- baseURL: '/',
- timeout: 50_000,
- headers: {
- 'Content-Type': 'application/json',
- },
-})
-
-http.interceptors.response.use(
- (response) => {
- const data = response.data as ApiEnvelope
-
- // Business-level error: HTTP 200 but code !== 0
- if (typeof data?.code === 'number' && data.code !== 0) {
- const error = new Error(data.msg || '操作失败') as Error & {
- errorCode?: string
- code?: number
- }
- error.errorCode = data.errorCode
- error.code = data.code
- return Promise.reject(error)
- }
-
- return response.data
- },
- (error) => {
- const responseMessage =
- typeof error?.response?.data?.msg === 'string' ? error.response.data.msg.trim() : ''
- const fallbackMessage = resolveFallbackHttpMessage(error)
- const normalizedError = new Error(responseMessage || fallbackMessage) as Error & {
- errorCode?: string
- status?: number
- }
-
- if (error?.response?.data?.errorCode) {
- normalizedError.errorCode = String(error.response.data.errorCode)
- }
-
- if (typeof error?.response?.status === 'number') {
- normalizedError.status = error.response.status
- }
-
- if (error?.config?.url && String(error.config.url).startsWith('/api/v1/admin')) {
- const status = Number(error?.response?.status || 0)
- const errorCode = String(error?.response?.data?.errorCode || '').trim()
-
- if (status === 401 && shouldClearAdminSession(errorCode)) {
- clearAdminSession()
-
- if (
- window.location.hash.startsWith('#/admin') &&
- !window.location.hash.startsWith('#/admin/login')
- ) {
- window.location.hash = '#/admin/login'
- }
- }
- }
-
- return Promise.reject(normalizedError)
- },
-)
-
-http.interceptors.request.use((config) => {
- if (String(config.url || '').startsWith('/api/v1/admin')) {
- const token = getAdminToken()
-
- if (token) {
- config.headers.Authorization = `Bearer ${token}`
- }
- }
-
- return config
-})
-
-function resolveFallbackHttpMessage(error: unknown) {
- const message = String((error as { message?: string })?.message ?? '')
-
- if (message.includes('timeout')) {
- return '网络超时'
- }
-
- if (message === 'Network Error') {
- return '网络连接错误'
- }
-
- if (typeof (error as { response?: { statusText?: string } })?.response?.statusText === 'string') {
- return String((error as { response: { statusText: string } }).response.statusText).trim()
- }
-
- return '接口请求失败'
-}
-
-function shouldClearAdminSession(errorCode: string) {
- return [
- 'admin_auth_required',
- 'admin_auth_invalid',
- 'admin_auth_expired',
- 'admin_auth_user_invalid',
- 'admin_auth_stale',
- ].includes(errorCode)
-}
-
-function request(config: Parameters>>[0]) {
- return http.request, ApiEnvelope>(config)
-}
-
-export function apiGet(url: string, params?: Record) {
- return request({ method: 'GET', url, params })
-}
-
-export function apiGetBlob(url: string, params?: Record) {
- return http.request({
- method: 'GET',
- url,
- params,
- responseType: 'blob',
- })
-}
-
-export function apiPost(url: string, data?: unknown) {
- return request({ method: 'POST', url, data: data as Record })
-}
-
-export function apiDelete(url: string) {
- return request({ method: 'DELETE', url })
-}
diff --git a/apps/frontend-vue/src/main.ts b/apps/frontend-vue/src/main.ts
deleted file mode 100644
index 28483c5f..00000000
--- a/apps/frontend-vue/src/main.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { createApp } from 'vue'
-
-import App from './App.vue'
-import router from './router'
-import './styles/tokens.css'
-import './styles/main.css'
-import './styles/element-overrides.css'
-
-const app = createApp(App)
-
-app.use(router)
-
-app.mount('#app')
diff --git a/apps/frontend-vue/src/router/index.ts b/apps/frontend-vue/src/router/index.ts
deleted file mode 100644
index 09f9c0f9..00000000
--- a/apps/frontend-vue/src/router/index.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-import { createRouter, createWebHashHistory } from 'vue-router'
-import { getAdminRole, hasAdminSession } from '@/utils/admin-auth'
-
-const router = createRouter({
- history: createWebHashHistory(),
- routes: [
- {
- path: '/',
- redirect: '/admin/dashboard',
- },
- {
- path: '/claim/:token',
- component: () => import('@/views/claim/ClaimView.vue'),
- },
- {
- path: '/admin',
- redirect: '/admin/dashboard',
- },
- {
- path: '/admin/login',
- component: () => import('@/views/admin/auth/AdminLoginView.vue'),
- },
- {
- path: '/admin',
- component: () => import('@/views/admin/layout/AdminLayout.vue'),
- children: [
- {
- path: '',
- redirect: '/admin/dashboard',
- },
- {
- path: 'dashboard',
- component: () => import('@/views/admin/dashboard/AdminDashboardView.vue'),
- },
- {
- path: 'users',
- meta: { allowedRoles: ['admin'] },
- component: () => import('@/views/admin/users/AdminUsersView.vue'),
- },
- {
- path: 'orders',
- component: () => import('@/views/admin/orders/AdminOrdersView.vue'),
- },
- {
- path: 'orders/:orderId',
- component: () => import('@/views/admin/orders/AdminOrderDetailView.vue'),
- },
- {
- path: 'tasks',
- component: () => import('@/views/admin/tasks/AdminTasksView.vue'),
- },
- {
- path: 'tasks/:taskId',
- component: () => import('@/views/admin/tasks/AdminTaskDetailView.vue'),
- },
- {
- path: 'cloudtentacles-records',
- component: () =>
- import('@/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue'),
- },
- {
- path: 'platform-shops',
- meta: { allowedRoles: ['admin'] },
- component: () => import('@/views/admin/platform-shops/AdminPlatformShopsView.vue'),
- },
- {
- path: 'platform-fulfillment',
- meta: { allowedRoles: ['admin'] },
- component: () => import('@/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue'),
- },
- {
- path: 'audit-logs',
- meta: { allowedRoles: ['admin'] },
- component: () => import('@/views/admin/audit-logs/AdminAuditLogsView.vue'),
- },
- ],
- },
- {
- path: '/:pathMatch(.*)*',
- component: () => import('@/views/NotFoundView.vue'),
- },
- ],
-})
-
-router.beforeEach((to) => {
- if (!to.path.startsWith('/admin')) {
- return true
- }
-
- if (to.path === '/admin/login') {
- if (hasAdminSession()) {
- return '/admin/dashboard'
- }
-
- return true
- }
-
- if (!hasAdminSession()) {
- return '/admin/login'
- }
-
- const allowedRoles = to.matched
- .map((record) => (record.meta?.allowedRoles as string[] | undefined) || [])
- .find((roles) => Array.isArray(roles) && roles.length > 0)
-
- if (allowedRoles && !allowedRoles.includes(getAdminRole())) {
- return '/admin/dashboard'
- }
-
- return true
-})
-
-export default router
diff --git a/apps/frontend-vue/src/services/admin/audit-logs.ts b/apps/frontend-vue/src/services/admin/audit-logs.ts
deleted file mode 100644
index 66030ebe..00000000
--- a/apps/frontend-vue/src/services/admin/audit-logs.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { apiGet } from '@/lib/http'
-import type { AdminAuditLogItem, AdminPagination } from '@/types/admin'
-
-export function fetchAdminAuditLogs(params?: Record) {
- return apiGet<{ items: AdminAuditLogItem[]; pagination: AdminPagination }>(
- '/api/v1/admin/audit-logs',
- params,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/auth.ts b/apps/frontend-vue/src/services/admin/auth.ts
deleted file mode 100644
index aab2ddd1..00000000
--- a/apps/frontend-vue/src/services/admin/auth.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type { AdminLoginResponse, AdminSessionSummary } from '@/types/admin'
-
-export function loginAdmin(payload: { username: string; password: string }) {
- return apiPost('/api/v1/admin/auth/login', payload)
-}
-
-export function fetchAdminSession() {
- return apiGet('/api/v1/admin/auth/session')
-}
-
-export function logoutAdmin() {
- return apiPost<{ success: boolean }>('/api/v1/admin/auth/logout', {})
-}
diff --git a/apps/frontend-vue/src/services/admin/dashboard.ts b/apps/frontend-vue/src/services/admin/dashboard.ts
deleted file mode 100644
index 518d3902..00000000
--- a/apps/frontend-vue/src/services/admin/dashboard.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { apiGet } from '@/lib/http'
-import type { AdminDashboardSummary } from '@/types/admin'
-
-export function fetchAdminDashboardSummary() {
- return apiGet('/api/v1/admin/dashboard/summary')
-}
diff --git a/apps/frontend-vue/src/services/admin/index.ts b/apps/frontend-vue/src/services/admin/index.ts
deleted file mode 100644
index 99c97f94..00000000
--- a/apps/frontend-vue/src/services/admin/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './auth'
-export * from './dashboard'
-export * from './users'
-export * from './audit-logs'
-export * from './platform-config'
-export * from './orders'
-export * from './tasks'
diff --git a/apps/frontend-vue/src/services/admin/orders.ts b/apps/frontend-vue/src/services/admin/orders.ts
deleted file mode 100644
index 90fdc551..00000000
--- a/apps/frontend-vue/src/services/admin/orders.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type { AdminOrderDetail, AdminOrderListItem, AdminPagination } from '@/types/admin'
-
-export function fetchAdminOrders(params?: Record) {
- return apiGet<{ items: AdminOrderListItem[]; pagination: AdminPagination }>(
- '/api/v1/admin/orders',
- params,
- )
-}
-
-export function fetchAdminOrderDetail(orderId: number | string) {
- return apiGet(`/api/v1/admin/orders/${orderId}`)
-}
-
-export function resendAdminOrderKuaishouIndustryVoucherCode(orderId: number | string) {
- return apiPost<{
- success: boolean
- resentCount: number
- failedCount: number
- errorMessage: string
- }>(`/api/v1/admin/orders/${orderId}/kuaishou-industry/resend-code`, {})
-}
diff --git a/apps/frontend-vue/src/services/admin/platform-config/cloudtentacles.ts b/apps/frontend-vue/src/services/admin/platform-config/cloudtentacles.ts
deleted file mode 100644
index 30e5890a..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/cloudtentacles.ts
+++ /dev/null
@@ -1,336 +0,0 @@
-import { apiDelete, apiGet, apiPost } from '@/lib/http'
-import type {
- AdminCloudtentaclesLoginTestResult,
- AdminCloudtentaclesDeliveryRecordListResult,
- AdminCloudtentaclesOverrideRuleConfig,
- AdminCloudtentaclesSkuListResult,
- AdminCloudtentaclesSendSmsResult,
- AdminCloudtentaclesSourceConfigResponse,
- AdminCloudtentaclesSourceItem,
- AdminCloudtentaclesSourcesConfig,
- AdminCloudtentaclesValidateSessionResult,
-} from '@/types/admin'
-
-export function fetchAdminCloudtentaclesSourceConfig() {
- return apiGet(
- '/api/v1/admin/platform-config/cloudtentacles-source',
- )
-}
-
-export function saveAdminCloudtentaclesSourceConfig(
- payload:
- | AdminCloudtentaclesSourcesConfig
- | ({ sourceKey: string } & Partial),
-) {
- return apiPost(
- '/api/v1/admin/platform-config/cloudtentacles-source',
- payload,
- )
-}
-
-export function deleteAdminCloudtentaclesSource(sourceKey: string) {
- return apiDelete<{ success: boolean }>(
- `/api/v1/admin/platform-config/cloudtentacles-source/${sourceKey}`,
- )
-}
-
-export function fetchAdminCloudtentaclesOverrideRules() {
- return apiGet(
- '/api/v1/admin/platform-config/cloudtentacles/override-rules',
- )
-}
-
-export function saveAdminCloudtentaclesOverrideRules(
- payload: {
- enabled: boolean
- rules: Array<{
- id?: string
- enabled?: boolean
- productName?: string
- sourceKey?: string
- deliveryItems?: Array<{
- cloudSkuId?: number
- cloudSkuName?: string
- quantity?: number
- }>
- notes?: string
- }>
- },
-) {
- return apiPost(
- '/api/v1/admin/platform-config/cloudtentacles/override-rules',
- payload,
- )
-}
-
-export function sendAdminCloudtentaclesSmsCode(payload: {
- baseUrl?: string
- username?: string
- phone?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/cloudtentacles/send-sms-code',
- payload,
- )
-}
-
-export function testAdminCloudtentaclesLogin(payload: {
- baseUrl?: string
- username?: string
- password?: string
- phone?: string
- code?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/cloudtentacles/test-login',
- payload,
- )
-}
-
-export function validateAdminCloudtentaclesSession(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/cloudtentacles/validate-session',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesAsset(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/asset',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesCategories(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/categories',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesSkuList(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/cloudtentacles/sku/list',
- payload,
- )
-}
-
-export function buyAdminCloudtentaclesSku(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- id?: number
- count?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/sku/buy',
- payload,
- )
-}
-
-export function useAdminCloudtentaclesSku(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- id?: number
- virtualNumberId?: number
- phone?: string
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/sku/use',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesKnapsack(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/knapsack',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesDeliveryRecords(payload: {
- sourceKey?: string
- page?: number
- size?: number
- startDate?: string
- endDate?: string
- platformOrderId?: string
-}) {
- return apiPost(
- '/api/v1/admin/cloudtentacles-records',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesRecordSources() {
- return apiGet<{
- sources: Array<{
- key: string
- label: string
- enabled: boolean
- hasToken: boolean
- loggedInAt: string
- }>
- }>('/api/v1/admin/cloudtentacles-records/sources')
-}
-
-export function fetchAdminCloudtentaclesVnList(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/list',
- payload,
- )
-}
-
-export function appointAdminCloudtentaclesVn(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/appoint',
- payload,
- )
-}
-
-export function generateAdminCloudtentaclesVnLoginCode(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- id?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/generate-login-code',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesVnCode(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- phone?: string
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/fetch-code',
- payload,
- )
-}
-
-export function verifyAdminCloudtentaclesVnCode(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- id?: number
- code?: string
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/verify-code',
- payload,
- )
-}
-
-export function fetchAdminCloudtentaclesBindUrl(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- id?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/bind-url',
- payload,
- )
-}
-
-export function backAdminCloudtentaclesVn(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- key?: string
- id?: number
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/vn/back',
- payload,
- )
-}
-
-export function runAdminCloudtentaclesFullFlow(payload: {
- baseUrl?: string
- token?: string
- deviceId?: string
- deviceType?: number
- skuId?: number
- skuCount?: number
- vnKey?: string
- sourceKey?: string
-}) {
- return apiPost>(
- '/api/v1/admin/platform-config/cloudtentacles/debug/full-flow',
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/platform-config/index.ts b/apps/frontend-vue/src/services/admin/platform-config/index.ts
deleted file mode 100644
index 9f73f850..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export * from './notifications'
-export * from './scheduled-jobs'
-export * from './ninetyone'
-export * from './kuaishou-eticket'
-export * from './kuaishou-feifei'
-export * from './cloudtentacles'
diff --git a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-eticket.ts b/apps/frontend-vue/src/services/admin/platform-config/kuaishou-eticket.ts
deleted file mode 100644
index cd324b2e..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-eticket.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type {
- AdminKuaishouEticketConsumeResult,
- AdminKuaishouEticketDetailResult,
- AdminKuaishouEticketShopInfoResult,
- AdminKuaishouEticketSourceConfig,
-} from '@/types/admin'
-
-export function fetchAdminKuaishouEticketSourceConfig() {
- return apiGet<{
- filePath: string
- source: AdminKuaishouEticketSourceConfig
- }>('/api/v1/admin/platform-config/kuaishou-eticket-source')
-}
-
-export function saveAdminKuaishouEticketSourceConfig(payload: AdminKuaishouEticketSourceConfig) {
- return apiPost<{
- filePath: string
- source: AdminKuaishouEticketSourceConfig
- }>('/api/v1/admin/platform-config/kuaishou-eticket-source', payload)
-}
-
-export function queryAdminKuaishouEticketDetail(payload: {
- baseUrl?: string
- shopId?: string
- cookie?: string
- eTicketId: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-eticket/query-detail',
- payload,
- )
-}
-
-export function queryAdminKuaishouEticketShopInfo(payload: {
- baseUrl?: string
- shopId?: string
- cookie?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-eticket/query-shop-info',
- payload,
- )
-}
-
-export function consumeAdminKuaishouEticket(payload: {
- baseUrl?: string
- shopId?: string
- cookie?: string
- eTicketId: string
- oid?: string
- formToken?: string
- num?: number
- storeId?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-eticket/consume',
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-feifei.ts b/apps/frontend-vue/src/services/admin/platform-config/kuaishou-feifei.ts
deleted file mode 100644
index b5324f95..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-feifei.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type {
- AdminKuaishouFeifeiConfig,
- AdminKuaishouFeifeiConfigResponse,
- AdminKuaishouFeifeiMatchResult,
- AdminKuaishouFeifeiOrderResult,
- AdminKuaishouFeifeiProductListResult,
- AdminKuaishouFeifeiProductSyncResult,
-} from '@/types/admin'
-
-export function fetchAdminKuaishouFeifeiConfig() {
- return apiGet(
- '/api/v1/admin/platform-config/kuaishou-feifei',
- )
-}
-
-export function saveAdminKuaishouFeifeiConfig(payload: AdminKuaishouFeifeiConfig) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-feifei',
- payload,
- )
-}
-
-export function matchAdminKuaishouFeifeiProduct(productName: string) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-feifei/match',
- { productName },
- )
-}
-
-export function fetchAdminKuaishouFeifeiProducts(payload: {
- page?: number
- perPage?: number
- status?: string
- supplyProductName?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-feifei/products',
- payload,
- )
-}
-
-export function syncAdminKuaishouFeifeiProducts(payload: {
- status?: string
- supplyProductName?: string
-} = {}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-feifei/sync-products',
- payload,
- )
-}
-
-export function createAdminKuaishouFeifeiTestOrder(payload: {
- platformOrderNo: string
- productCode: string
- platformBuyNum?: number
- platformAmount?: number | null
- playerAccount?: string
- playerGameRegion?: string
- playerGameSrv?: string
- playerGameRole?: string
- submitPlayer?: boolean
- notifyUrl?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-feifei/test-order',
- payload,
- )
-}
-
-export function queryAdminKuaishouFeifeiOrder(payload: {
- platformOrderNo?: string
- orderNo?: string
-}) {
- return apiPost(
- '/api/v1/admin/platform-config/kuaishou-feifei/query-order',
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/platform-config/ninetyone.ts b/apps/frontend-vue/src/services/admin/platform-config/ninetyone.ts
deleted file mode 100644
index c5ef2aeb..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/ninetyone.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type {
- AdminNinetyoneOrderActionResult,
- AdminNinetyoneOrderListResult,
-} from '@/types/admin'
-
-export function fetchAdminNinetyoneOrders(
- params: {
- page?: number
- pageSize?: number
- status?: string
- } = {},
-) {
- const searchParams = new URLSearchParams()
- if (params.page) {
- searchParams.set('page', String(params.page))
- }
- if (params.pageSize) {
- searchParams.set('pageSize', String(params.pageSize))
- }
- if (params.status) {
- searchParams.set('status', params.status)
- }
- const queryString = searchParams.toString()
- return apiGet(
- `/api/v1/admin/platform-config/ninetyone/orders${queryString ? `?${queryString}` : ''}`,
- )
-}
-
-export function retryAdminNinetyoneOrder(orderId: number | string) {
- return apiPost(
- `/api/v1/admin/platform-config/ninetyone/orders/${orderId}/retry`,
- {},
- )
-}
-
-export function failAdminNinetyoneOrder(orderId: number | string, payload: { reason?: string }) {
- return apiPost(
- `/api/v1/admin/platform-config/ninetyone/orders/${orderId}/fail`,
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/platform-config/notifications.ts b/apps/frontend-vue/src/services/admin/platform-config/notifications.ts
deleted file mode 100644
index f5056037..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/notifications.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type { AdminNotificationConfig, AdminNotificationTestResult } from '@/types/admin'
-
-export function fetchAdminNotificationConfig() {
- return apiGet<{
- filePath: string
- source: AdminNotificationConfig
- }>('/api/v1/admin/platform-config/notifications')
-}
-
-export function saveAdminNotificationConfig(payload: AdminNotificationConfig) {
- return apiPost<{
- filePath: string
- source: AdminNotificationConfig
- }>('/api/v1/admin/platform-config/notifications', payload)
-}
-
-export function testAdminNotification(payload: { title?: string; body?: string; url?: string }) {
- return apiPost(
- '/api/v1/admin/platform-config/notifications/test',
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/platform-config/scheduled-jobs.ts b/apps/frontend-vue/src/services/admin/platform-config/scheduled-jobs.ts
deleted file mode 100644
index 55089011..00000000
--- a/apps/frontend-vue/src/services/admin/platform-config/scheduled-jobs.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type { AdminScheduledJobsConfig, AdminScheduledJobsResponse } from '@/types/admin'
-
-export function fetchAdminScheduledJobsConfig() {
- return apiGet('/api/v1/admin/platform-config/scheduled-jobs')
-}
-
-export function saveAdminScheduledJobsConfig(payload: AdminScheduledJobsConfig) {
- return apiPost(
- '/api/v1/admin/platform-config/scheduled-jobs',
- payload,
- )
-}
-
-export function runAdminScheduledJob(jobId: string) {
- return apiPost<{
- result: Record
- runtime: AdminScheduledJobsResponse['runtime']
- }>(`/api/v1/admin/platform-config/scheduled-jobs/${jobId}/run`, {})
-}
diff --git a/apps/frontend-vue/src/services/admin/tasks.ts b/apps/frontend-vue/src/services/admin/tasks.ts
deleted file mode 100644
index eb643e0d..00000000
--- a/apps/frontend-vue/src/services/admin/tasks.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import { apiGet, apiGetBlob, apiPost } from '@/lib/http'
-import type {
- AdminPagination,
- AdminTaskActionResponse,
- AdminTaskDetail,
- AdminTaskListItem,
-} from '@/types/admin'
-
-export function fetchAdminTasks(params?: Record) {
- return apiGet<{ items: AdminTaskListItem[]; pagination: AdminPagination }>(
- '/api/v1/admin/tasks',
- params,
- )
-}
-
-export function fetchAdminTaskDetail(taskId: number | string) {
- return apiGet(`/api/v1/admin/tasks/${taskId}`)
-}
-
-export function fetchAdminTaskScreenshot(taskId: number | string) {
- return apiGetBlob(`/api/v1/admin/tasks/${taskId}/screenshot`)
-}
-
-export function retryAdminTask(taskId: number | string) {
- return apiPost(`/api/v1/admin/tasks/${taskId}/retry`, {})
-}
-
-export function regenerateAdminTaskClaimLink(taskId: number | string) {
- return apiPost(`/api/v1/admin/tasks/${taskId}/regenerate-claim-link`, {})
-}
-
-export function closeAdminTask(taskId: number | string) {
- return apiPost(`/api/v1/admin/tasks/${taskId}/close`, {})
-}
-
-export function markAdminTaskManualReview(taskId: number | string) {
- return apiPost(`/api/v1/admin/tasks/${taskId}/mark-manual-review`, {})
-}
-
-export function completeAdminTaskManualDispatch(
- taskId: number | string,
- payload: {
- outcome: 'delivered' | 'failed'
- resultMessage?: string
- deliveryReference?: string
- deliveredCredential?: string
- },
-) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/complete-manual-dispatch`,
- payload,
- )
-}
-
-export function prepareAdminTaskKuaishouCloudFulfillment(taskId: number | string) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/prepare`,
- {},
- )
-}
-
-export function refreshAdminTaskKuaishouCloudRoleInfo(taskId: number | string) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/refresh-role-info`,
- {},
- )
-}
-
-export function rebindAdminTaskKuaishouCloudRole(taskId: number | string) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/rebind-role`,
- {},
- )
-}
-
-export function dispatchAdminTaskKuaishouCloudFulfillment(
- taskId: number | string,
- payload: {
- ticketCode?: string
- } = {},
-) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/dispatch`,
- payload,
- )
-}
-
-export function returnNumberAdminTaskKuaishouCloudFulfillment(taskId: number | string) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/return-number`,
- {},
- )
-}
-
-export function resendAdminTaskKuaishouIndustryVoucherCode(taskId: number | string) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-industry/resend-code`,
- {},
- )
-}
-
-export function consumeAdminTaskKuaishouIndustryVoucher(
- taskId: number | string,
- payload: {
- consumeType?: string
- storeName?: string
- storeAddress?: string
- expressCode?: string
- expressNo?: string
- } = {},
-) {
- return apiPost(
- `/api/v1/admin/tasks/${taskId}/kuaishou-industry/consume`,
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/admin/users.ts b/apps/frontend-vue/src/services/admin/users.ts
deleted file mode 100644
index 039a1ddb..00000000
--- a/apps/frontend-vue/src/services/admin/users.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type { AdminPagination, AdminUserListItem } from '@/types/admin'
-
-export function fetchAdminUsers(params?: Record) {
- return apiGet<{ items: AdminUserListItem[]; pagination: AdminPagination }>(
- '/api/v1/admin/users',
- params,
- )
-}
-
-export function createAdminUser(payload: {
- username: string
- password: string
- role: string
- status?: string
-}) {
- return apiPost<{ user: AdminUserListItem }>('/api/v1/admin/users', payload)
-}
-
-export function updateAdminUserRole(userId: number | string, payload: { role: string }) {
- return apiPost<{ user: AdminUserListItem }>(`/api/v1/admin/users/${userId}/role`, payload)
-}
-
-export function updateAdminUserStatus(userId: number | string, payload: { status: string }) {
- return apiPost<{ user: AdminUserListItem }>(`/api/v1/admin/users/${userId}/status`, payload)
-}
-
-export function resetAdminUserPassword(userId: number | string, payload: { password: string }) {
- return apiPost<{ user: AdminUserListItem }>(
- `/api/v1/admin/users/${userId}/reset-password`,
- payload,
- )
-}
diff --git a/apps/frontend-vue/src/services/claim.ts b/apps/frontend-vue/src/services/claim.ts
deleted file mode 100644
index e5b508c2..00000000
--- a/apps/frontend-vue/src/services/claim.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { apiGet, apiPost } from '@/lib/http'
-import type { ClaimDetailData } from '@/types/claim'
-
-export function fetchClaimDetail(token: string) {
- return apiGet(`/api/v1/claim/${token}`)
-}
-
-export function verifyKuaishouCloudClaimTicket(
- token: string,
- payload: {
- ticketCode: string
- },
-) {
- return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/verify-ticket`, payload)
-}
-
-export function confirmKuaishouCloudClaimRole(token: string) {
- return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/confirm-role`, {})
-}
-
-export function rebindKuaishouCloudClaimRole(token: string) {
- return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/rebind-role`, {})
-}
-
-export function redeemKuaishouCloudClaim(token: string) {
- return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/redeem`, {})
-}
diff --git a/apps/frontend-vue/src/styles/admin-config-pages.css b/apps/frontend-vue/src/styles/admin-config-pages.css
deleted file mode 100644
index 80a06eca..00000000
--- a/apps/frontend-vue/src/styles/admin-config-pages.css
+++ /dev/null
@@ -1,238 +0,0 @@
-/* ============================================================
- 管理员配置页面共享结构样式
- 引入: AdminKuaishouCloudFulfillment.css
- 各页面自行覆盖颜色、圆角、主题属性
- ============================================================ */
-
-/* ---------- 分区标题 ---------- */
-.section-title-row {
- display: flex;
- justify-content: space-between;
- gap: 16px;
- align-items: flex-start;
-}
-
-.section-title-row h3 {
- margin: 0;
-}
-
-.section-title-row p {
- margin: 6px 0 0;
-}
-
-/* ---------- 头部工具 ---------- */
-.section-header-tools,
-.section-mini-stats,
-.section-action-group {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- align-items: center;
-}
-
-.section-header-tools {
- justify-content: flex-end;
-}
-
-/* ---------- 卡片容器 ---------- */
-.overview-card,
-.table-card,
-.empty-block,
-.error-copy {
- padding: 16px;
- background: rgba(255, 255, 255, 0.94);
- border: 1px solid rgba(86, 108, 138, 0.1);
-}
-
-.table-card--dense {
- padding: 14px 16px 16px;
-}
-
-.overview-card {
- display: grid;
- gap: 12px;
-}
-
-/* ---------- 概览文件 & 统计 ---------- */
-.overview-file {
- display: grid;
- gap: 6px;
-}
-
-.overview-file code {
- display: inline-flex;
- width: 100%;
- max-width: 100%;
- padding: 8px 12px;
- border-radius: 14px;
- word-break: break-all;
-}
-
-.overview-stats {
- display: grid;
- grid-template-columns: repeat(5, minmax(0, 1fr));
- gap: 10px;
-}
-
-.overview-stat {
- display: grid;
- gap: 4px;
- padding: 12px 14px;
- background: #f8fafc;
- border: 1px solid rgba(148, 163, 184, 0.14);
-}
-
-.overview-stat span {
- font-size: var(--text-xs);
- font-weight: 700;
-}
-
-.overview-stat strong {
- line-height: 1.1;
-}
-
-.overview-notes {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
-}
-
-/* ---------- 分区工具 ---------- */
-.section-title-row--tight {
- align-items: center;
-}
-
-/* ---------- 字段块 ---------- */
-.field-block {
- min-width: 0;
- display: grid;
- gap: 6px;
-}
-
-.field-block span {
- font-size: var(--text-xs);
- font-weight: 700;
-}
-
-.field-block--action {
- align-content: end;
-}
-
-.field-block--action :deep(.el-button) {
- width: 100%;
-}
-
-.field-help {
- font-size: var(--text-xs);
- line-height: 1.5;
-}
-
-/* ---------- 文本输入 ---------- */
-.text-input {
- width: 100%;
- border-radius: 14px;
-}
-
-/* ---------- 校验 & 错误 ---------- */
-.validation-banner,
-.binding-inline-error {
- margin: 10px 0 0;
- padding: 10px 12px;
- border-radius: 14px;
- font-weight: 600;
-}
-
-.binding-inline-error {
- font-size: var(--text-sm);
-}
-
-/* ---------- 数据表 (用于 el-table,具体单元格样式见各页面 :deep() 规则) ---------- */
-.data-table--config {
- width: 100%;
- margin-top: 12px;
-}
-
-.cell-stack--config {
- display: grid;
- gap: 4px;
-}
-
-.cell-subtle {
- font-size: var(--text-xs);
-}
-
-/* ---------- 绑定卡片 ---------- */
-.binding-card {
- margin-top: 12px;
- padding: 14px;
- background: #f8fafc;
- border: 1px solid rgba(148, 163, 184, 0.18);
-}
-
-.binding-card--invalid {
- border-color: rgba(220, 38, 38, 0.3);
- box-shadow: 0 0 0 4px rgba(254, 226, 226, 0.85);
-}
-
-.binding-header {
- display: flex;
- justify-content: space-between;
- gap: 12px;
- align-items: flex-start;
- margin-bottom: 10px;
-}
-
-.binding-summary {
- display: grid;
- gap: 4px;
-}
-
-.binding-title-row {
- display: flex;
- gap: 10px;
- align-items: center;
- flex-wrap: wrap;
-}
-
-.binding-subtle {
- font-size: var(--text-sm);
-}
-
-/* ---------- 状态标签 ---------- */
-.binding-status-chip {
- display: inline-flex;
- align-items: center;
- border-radius: var(--radius-full);
- padding: 2px 10px;
- background: #fff1f2;
- color: #be123c;
- font-size: var(--text-xs);
- font-weight: 700;
-}
-
-.binding-status-chip--done {
- background: #ecfdf3;
- color: #027a48;
-}
-
-.binding-collapsed-preview {
- display: grid;
- gap: 6px;
-}
-
-/* ---------- 操作栏 ---------- */
-.binding-actions {
- display: flex;
- justify-content: space-between;
- gap: 12px;
- align-items: center;
-}
-
-/* ---------- 工具栏提示 ---------- */
-.toolbar-hint {
- margin: 10px 0 0;
- font-size: var(--text-xs);
-}
-.mt-4 {
- margin-top: 16px;
-}
diff --git a/apps/frontend-vue/src/styles/admin-list-pages.css b/apps/frontend-vue/src/styles/admin-list-pages.css
deleted file mode 100644
index fda6e0d9..00000000
--- a/apps/frontend-vue/src/styles/admin-list-pages.css
+++ /dev/null
@@ -1,302 +0,0 @@
-/* ============================================================
- 管理员列表页共享样式
- 引入: AdminOrdersView, AdminTasksView, AdminUsersView
- 各页面自行覆盖 grid-template-columns 等布局差异
- ============================================================ */
-
-/* ---------- 页面包裹 ---------- */
-.list-page {
- display: grid;
- gap: 0;
-}
-
-/* ---------- 总量标签 ---------- */
-.total-badge {
- display: inline-flex;
- align-items: center;
- min-height: 32px;
- padding: 0 12px;
- border: 1px solid rgba(37, 89, 167, 0.14);
- border-radius: var(--radius-full);
- background: rgba(37, 89, 167, 0.08);
- color: #2559a7;
- font-size: var(--text-xs);
- font-weight: 700;
-}
-
-/* ---------- 卡片区域 ---------- */
-.section-card {
- margin-top: var(--space-4);
-}
-
-/* ---------- 筛选网格 ---------- */
-.filter-grid {
- display: grid;
- gap: var(--space-3);
- align-items: center;
-}
-
-.filter-control {
- width: 100%;
- min-width: 0;
-}
-
-.filter-buttons {
- display: flex;
- gap: 10px;
- min-width: 156px;
- justify-content: flex-end;
-}
-
-/* ---------- 摘要条 ---------- */
-.summary-strip {
- display: flex;
- align-items: center;
- gap: var(--space-2);
- min-height: 38px;
- padding: 0;
- margin-top: var(--space-4);
- flex-wrap: wrap;
-}
-
-.summary-title {
- color: var(--text-secondary);
- font-size: var(--text-xs);
- font-weight: 700;
- margin-right: 2px;
-}
-
-.summary-metric {
- display: inline-flex;
- align-items: center;
- gap: 5px;
- min-height: 28px;
- padding: 0 10px;
- border-radius: var(--radius-full);
- border: 1px solid transparent;
- color: var(--text-secondary);
- background: #f8fafc;
- font-size: var(--text-xs);
- font-weight: 700;
-}
-
-.summary-metric strong {
- color: var(--text-primary);
- font-size: var(--text-base);
- line-height: 1;
-}
-
-.summary-metric[data-tone='success'] {
- color: var(--color-success-dark);
- background: var(--color-success-light);
- border-color: #bbf7d0;
-}
-.summary-metric[data-tone='danger'] {
- color: var(--color-danger-dark);
- background: var(--color-danger-light);
- border-color: #fecaca;
-}
-.summary-metric[data-tone='primary'] {
- color: var(--color-primary-dark);
- background: var(--color-primary-light);
- border-color: #bfdbfe;
-}
-.summary-metric[data-tone='warning'] {
- color: var(--color-warning-dark);
- background: var(--color-warning-light);
- border-color: #fed7aa;
-}
-.summary-metric[data-tone='muted'] {
- color: var(--text-secondary);
- background: #f8fafc;
- border-color: var(--border-default);
-}
-
-/* ---------- 表格工具栏 ---------- */
-.table-toolbar {
- margin-bottom: var(--space-3);
-}
-
-.table-toolbar strong {
- display: block;
- color: var(--text-primary);
- font-size: var(--text-base);
-}
-
-.table-toolbar span {
- display: block;
- margin-top: 4px;
- color: var(--text-secondary);
- font-size: var(--text-xs);
-}
-
-/* ---------- el-table 统一主题变量 ---------- */
-.data-table {
- width: 100%;
- overflow: hidden;
- border: 1px solid var(--border-default);
- border-radius: var(--radius-sm);
- --el-table-bg-color: transparent;
- --el-table-tr-bg-color: transparent;
- --el-table-header-bg-color: rgba(239, 246, 255, 0.72);
- --el-table-row-hover-bg-color: rgba(239, 246, 255, 0.72);
- --el-table-border-color: rgba(86, 108, 138, 0.1);
-}
-
-.data-table :deep(.el-table__inner-wrapper::before) {
- display: none;
-}
-
-.data-table :deep(th.el-table__cell) {
- height: 42px;
- background: var(--el-table-header-bg-color);
- color: var(--text-secondary);
- font-weight: 700;
-}
-
-/* ---------- 单元格通用 ---------- */
-.cell-stack {
- display: grid;
- gap: 5px;
-}
-
-.cell-meta-row {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
-}
-
-.compact-chip {
- display: inline-flex;
- align-items: center;
- min-height: 24px;
- max-width: 240px;
- padding: 0 9px;
- border-radius: var(--radius-full);
- background: #f4f7fb;
- border: 1px solid var(--border-default);
- color: var(--text-secondary);
- font-size: var(--text-xs);
- font-weight: 600;
-}
-
-.compact-chip--muted {
- color: var(--text-muted);
-}
-
-.cell-title {
- display: block;
- min-width: 0;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: var(--text-primary);
- font-weight: 700;
-}
-
-.cell-subline {
- min-width: 0;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: #475467;
- font-size: var(--text-xs);
-}
-
-/* ---------- ID 链接 ---------- */
-.id-link {
- display: inline-block;
- max-width: 100%;
- font-size: var(--text-base);
- font-weight: 800;
- color: var(--text-primary);
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- text-decoration: none;
-}
-
-.id-link:hover {
- color: var(--color-primary-dark);
-}
-
-/* ---------- 详情链接按钮 ---------- */
-.detail-link {
- display: inline-flex;
- align-items: center;
- min-height: 28px;
- padding: 0 10px;
- border-radius: var(--radius-full);
- border: 1px solid var(--border-default);
- color: var(--color-primary-dark);
- background: var(--color-primary-light);
- font-size: var(--text-xs);
- font-weight: 700;
- text-decoration: none;
-}
-
-.detail-link:hover {
- border-color: var(--border-hover);
- background: #dbeafe;
-}
-
-/* ---------- 操作 & 状态容器 ---------- */
-.action-stack {
- display: flex;
- flex-wrap: wrap;
- gap: 6px;
- align-items: center;
-}
-.action-stack--nowrap {
- flex-wrap: nowrap;
- white-space: nowrap;
-}
-.action-stack--vertical {
- flex-direction: column;
- align-items: center;
-}
-.action-stack--tight {
- gap: var(--space-2);
-}
-
-.status-stack {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
- align-items: center;
-}
-
-.status-stack :deep(.el-tag) {
- max-width: 100%;
-}
-
-/* ---------- 响应式 ---------- */
-@media (max-width: 1200px) {
- .filter-grid {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
-}
-
-@media (max-width: 900px) {
- .filter-grid {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
- .filter-buttons {
- justify-content: flex-start;
- }
-}
-
-@media (max-width: 640px) {
- .filter-grid {
- grid-template-columns: 1fr;
- }
- .filter-buttons {
- width: 100%;
- }
- .filter-buttons :deep(.el-button) {
- flex: 1 1 auto;
- }
-}
-.mt-4 {
- margin-top: 16px;
-}
diff --git a/apps/frontend-vue/src/styles/element-overrides.css b/apps/frontend-vue/src/styles/element-overrides.css
deleted file mode 100644
index 3c3b365b..00000000
--- a/apps/frontend-vue/src/styles/element-overrides.css
+++ /dev/null
@@ -1,180 +0,0 @@
-/* ===== Element Plus Global Overrides =====
- Single place for all Element Plus style normalization.
- Eliminates the need for scattered :deep() overrides in components.
-*/
-
-/* ---- Buttons ---- */
-.el-button {
- border-radius: var(--radius-md);
- font-weight: 500;
-}
-
-.el-button--primary {
- --el-button-bg-color: var(--color-primary);
- --el-button-border-color: var(--color-primary);
- --el-button-hover-bg-color: var(--color-primary-dark);
- --el-button-hover-border-color: var(--color-primary-dark);
-}
-
-/* ---- Dialogs ---- */
-.el-dialog {
- border-radius: var(--radius-xl);
-}
-
-.el-message-box {
- border-radius: var(--radius-xl);
-}
-
-/* ---- Cards ---- */
-.el-card {
- border-radius: var(--radius-lg);
- border: 1px solid var(--border-default);
- background: var(--bg-surface);
- box-shadow: var(--shadow-md);
-}
-
-/* ---- Tables ---- */
-.el-table {
- border-radius: var(--radius-lg);
- overflow: hidden;
-}
-
-.el-table th.el-table__cell {
- background: var(--bg-subtle);
- color: var(--text-secondary);
- font-size: var(--text-sm);
- font-weight: 600;
-}
-
-/* ---- Tags ---- */
-.el-tag {
- border-radius: var(--radius-full);
- font-weight: 600;
-}
-
-/* ---- Menus ---- */
-.el-menu {
- border-right: none;
- background: transparent;
-}
-
-/* ---- Inputs & Selects ---- */
-.el-input .el-input__wrapper,
-.el-select .el-select__wrapper,
-.el-date-editor.el-input__wrapper {
- border-radius: var(--radius-md);
- box-shadow: none;
- border: 1px solid var(--border-default);
-}
-
-.el-date-editor.el-input__wrapper {
- border: 0;
- box-shadow: 0 0 0 1px var(--border-default) inset;
-}
-
-.el-input .el-input__wrapper:hover,
-.el-select .el-select__wrapper:hover,
-.el-date-editor.el-input__wrapper:hover {
- border-color: var(--border-hover);
-}
-
-.el-date-editor.el-input__wrapper:hover {
- box-shadow: 0 0 0 1px var(--border-hover) inset;
-}
-
-.el-input.is-focus .el-input__wrapper,
-.el-select.is-focus .el-select__wrapper,
-.el-date-editor.el-input__wrapper.is-active {
- border-color: var(--color-primary);
- box-shadow: 0 0 0 1px var(--color-primary) inset;
-}
-
-/* ---- Pagination ---- */
-.el-pagination {
- justify-content: center;
- margin-top: var(--space-4);
-}
-
-/* ---- Tabs ---- */
-.el-tabs__header {
- margin-bottom: var(--space-4);
-}
-
-/* ---- Switch ---- */
-.el-switch.is-checked .el-switch__core {
- background-color: var(--color-primary);
- border-color: var(--color-primary);
-}
-
-/* ---- Skeleton ---- */
-.el-skeleton {
- --el-skeleton-color: var(--bg-subtle);
-}
-
-/* ---- Empty ---- */
-.el-empty__description {
- color: var(--text-muted);
-}
-
-/* ---- 通用工具类 ---- */
-.mt-4 {
- margin-top: var(--space-4);
-}
-.mb-4 {
- margin-bottom: var(--space-4);
-}
-.w-full {
- width: 100%;
-}
-.text-muted-xs {
- font-size: var(--text-xs);
- color: var(--text-muted);
-}
-.text-muted-xs.mt-1 {
- margin-top: var(--space-1);
-}
-.fw-600 {
- font-weight: 600;
-}
-.text-danger {
- color: var(--color-danger);
-}
-.ml-2 {
- margin-left: var(--space-2);
-}
-.pagination-center {
- margin-top: var(--space-4);
- display: flex;
- justify-content: center;
-}
-.card-header {
- display: flex;
- justify-content: space-between;
- gap: var(--space-3);
- align-items: flex-end;
-}
-.card-header--split {
- align-items: center;
-}
-.card-title {
- display: block;
- color: var(--text-primary);
- font-size: var(--text-lg);
- font-weight: 600;
-}
-.card-desc {
- display: block;
- margin-top: 4px;
- color: var(--text-secondary);
- font-size: var(--text-sm);
- line-height: 1.6;
-}
-.card-actions {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
- align-items: center;
-}
-.filter-col-160 {
- width: 160px;
-}
diff --git a/apps/frontend-vue/src/styles/main.css b/apps/frontend-vue/src/styles/main.css
deleted file mode 100644
index f2c7b0a4..00000000
--- a/apps/frontend-vue/src/styles/main.css
+++ /dev/null
@@ -1,57 +0,0 @@
-:root {
- color: var(--text-primary);
- background:
- radial-gradient(circle at top left, rgba(44, 133, 247, 0.22), transparent 32%),
- radial-gradient(circle at top right, rgba(114, 184, 255, 0.18), transparent 26%),
- linear-gradient(180deg, var(--bg-page) 0%, #f7fbff 100%);
- font-family: var(--font-sans);
- line-height: 1.5;
- font-weight: 400;
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-html,
-body,
-#app {
- min-height: 100%;
-}
-
-body {
- margin: 0;
-}
-
-body::before {
- content: '';
- position: fixed;
- inset: 0;
- pointer-events: none;
- background-image:
- linear-gradient(rgba(20, 47, 95, 0.02) 1px, transparent 1px),
- linear-gradient(90deg, rgba(20, 47, 95, 0.02) 1px, transparent 1px);
- background-size: 24px 24px;
- mask-image: radial-gradient(circle at center, black, transparent 75%);
-}
-
-img {
- max-width: 100%;
-}
-
-button,
-input,
-select,
-textarea {
- font: inherit;
-}
-
-a {
- color: inherit;
-}
diff --git a/apps/frontend-vue/src/styles/tokens.css b/apps/frontend-vue/src/styles/tokens.css
deleted file mode 100644
index bacbb5a6..00000000
--- a/apps/frontend-vue/src/styles/tokens.css
+++ /dev/null
@@ -1,76 +0,0 @@
-/* ===== Design Tokens =====
- Single source of truth for all visual values.
- Every component/view must reference these variables instead of hardcoded values.
-*/
-
-:root {
- /* ---- Color Palette ---- */
- --color-primary: #3b82f6;
- --color-primary-light: #eff6ff;
- --color-primary-dark: #1d4ed8;
-
- --color-success: #22c55e;
- --color-success-light: #f0fdf4;
- --color-success-dark: #15803d;
-
- --color-warning: #f59e0b;
- --color-warning-light: #fffbeb;
- --color-warning-dark: #b45309;
-
- --color-danger: #ef4444;
- --color-danger-light: #fef2f2;
- --color-danger-dark: #b91c1c;
-
- /* ---- Surfaces & Backgrounds ---- */
- --bg-page: #f3f7fc;
- --bg-surface: rgba(255, 255, 255, 0.94);
- --bg-sidebar: rgba(255, 255, 255, 0.92);
- --bg-subtle: rgba(15, 93, 216, 0.06);
-
- /* ---- Text ---- */
- --text-primary: #1e293b;
- --text-secondary: #64748b;
- --text-muted: #94a3b8;
-
- /* ---- Borders ---- */
- --border-default: rgba(86, 108, 138, 0.12);
- --border-hover: rgba(37, 99, 235, 0.28);
-
- /* ---- Spacing (4px base) ---- */
- --space-1: 4px;
- --space-2: 8px;
- --space-3: 12px;
- --space-4: 16px;
- --space-5: 20px;
- --space-6: 24px;
- --space-8: 32px;
-
- /* ---- Border Radius ---- */
- --radius-sm: 8px;
- --radius-md: 12px;
- --radius-lg: 16px;
- --radius-xl: 20px;
- --radius-full: 999px;
-
- /* ---- Shadows ---- */
- --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
- --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.07);
- --shadow-lg: 0 10px 30px rgba(30, 49, 78, 0.08);
-
- /* ---- Typography ---- */
- --font-sans: 'PingFang SC', 'SF Pro Display', 'Segoe UI', sans-serif;
- --font-mono: 'JetBrains Mono', 'SFMono-Regular', ui-monospace, monospace;
-
- --text-xs: 12px;
- --text-sm: 13px;
- --text-base: 14px;
- --text-lg: 16px;
- --text-xl: 20px;
- --text-2xl: 24px;
- --text-3xl: 28px;
-
- /* ---- Breakpoints (for reference, not used as CSS variables directly) ---- */
- --bp-lg: 1200px;
- --bp-md: 900px;
- --bp-sm: 640px;
-}
diff --git a/apps/frontend-vue/src/types/admin/audit-logs.ts b/apps/frontend-vue/src/types/admin/audit-logs.ts
deleted file mode 100644
index d54fc10b..00000000
--- a/apps/frontend-vue/src/types/admin/audit-logs.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import type { AdminRole } from './auth'
-
-export interface AdminAuditLogItem {
- logId: number
- actorUserId: number
- actorUsername: string
- actorRole: AdminRole
- action: string
- targetType: string
- targetId: string
- payload: Record
- createdAt: string
-}
diff --git a/apps/frontend-vue/src/types/admin/auth.ts b/apps/frontend-vue/src/types/admin/auth.ts
deleted file mode 100644
index d9d23fc7..00000000
--- a/apps/frontend-vue/src/types/admin/auth.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export type AdminRole = 'admin' | 'operator' | 'support'
-export type AdminUserStatus = 'active' | 'disabled'
-
-export interface AdminLoginResponse {
- token: string
- expiresAt: string
- user: {
- userId: number
- username: string
- role: AdminRole
- }
-}
-
-export interface AdminSessionSummary {
- authenticated: boolean
- expiresAt: string
- user: {
- userId: number
- username: string
- role: AdminRole
- }
-}
diff --git a/apps/frontend-vue/src/types/admin/common.ts b/apps/frontend-vue/src/types/admin/common.ts
deleted file mode 100644
index 29821fba..00000000
--- a/apps/frontend-vue/src/types/admin/common.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export interface AdminPagination {
- page: number
- pageSize: number
- total: number
-}
diff --git a/apps/frontend-vue/src/types/admin/dashboard.ts b/apps/frontend-vue/src/types/admin/dashboard.ts
deleted file mode 100644
index 7d666bf0..00000000
--- a/apps/frontend-vue/src/types/admin/dashboard.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export interface AdminDashboardSummary {
- todayOrders: number
- paidPendingClaim: number
- claimingTasks: number
- redeemedToday: number
- abnormalTasks: number
-}
diff --git a/apps/frontend-vue/src/types/admin/index.ts b/apps/frontend-vue/src/types/admin/index.ts
deleted file mode 100644
index db08037a..00000000
--- a/apps/frontend-vue/src/types/admin/index.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-// Common types
-export type { AdminPagination } from './common'
-
-// Auth types
-export type { AdminRole, AdminUserStatus, AdminLoginResponse, AdminSessionSummary } from './auth'
-
-// Users types
-export type { AdminUserListItem } from './users'
-
-// Audit logs types
-export type { AdminAuditLogItem } from './audit-logs'
-
-// Dashboard types
-export type { AdminDashboardSummary } from './dashboard'
-
-// Orders types
-export type {
- AdminOrderFulfillmentProgress,
- AdminOrderListItem,
- AdminOrderDetail,
-} from './orders'
-
-// Tasks types
-export type {
- AdminTaskListItem,
- AdminTaskOperations,
- AdminTaskActionResponse,
- AdminTaskDetail,
-} from './tasks'
-
-// Platform config types
-export type {
- AdminNotificationBarkRecipient,
- AdminNotificationWpushRecipient,
- AdminNotificationConfig,
- AdminNotificationSendResult,
- AdminNotificationTestResult,
- AdminCloudtentaclesMonitorAccount,
- AdminScheduledJobAccountRuntime,
- AdminScheduledJobCloudtentaclesAccount,
- AdminScheduledJobItem,
- AdminScheduledJobsConfig,
- AdminScheduledJobRuntimeState,
- AdminScheduledJobsResponse,
- AdminNinetyoneOrderItem,
- AdminNinetyoneOrderListResult,
- AdminNinetyoneOrderActionResult,
- AdminKuaishouEticketSourceConfig,
- AdminKuaishouEticketShopConfigItem,
- AdminKuaishouEticketShopInfoResult,
- AdminKuaishouEticketDetailResult,
- AdminKuaishouEticketConsumeResult,
- AdminKuaishouFeifeiProductRule,
- AdminKuaishouFeifeiConfig,
- AdminKuaishouFeifeiEffectiveConfig,
- AdminKuaishouFeifeiConfigResponse,
- AdminKuaishouFeifeiProductSyncResult,
- AdminKuaishouFeifeiProductMatch,
- AdminKuaishouFeifeiMatchResult,
- AdminKuaishouFeifeiProductItem,
- AdminKuaishouFeifeiProductListResult,
- AdminKuaishouFeifeiOrderResult,
- AdminCloudtentaclesSourceItem,
- AdminCloudtentaclesSourcesConfig,
- AdminCloudtentaclesSourceConfigResponse,
- AdminCloudtentaclesOverrideDeliveryItem,
- AdminCloudtentaclesOverrideRule,
- AdminCloudtentaclesOverrideRuleConfig,
- AdminCloudtentaclesSessionsMap,
- AdminCloudtentaclesSourceConfig,
- AdminCloudtentaclesPersistedSession,
- AdminCloudtentaclesSessionItem,
- AdminCloudtentaclesSendSmsResult,
- AdminCloudtentaclesSessionSummary,
- AdminCloudtentaclesLoginTestResult,
- AdminCloudtentaclesValidateSessionResult,
- AdminCloudtentaclesSkuItem,
- AdminCloudtentaclesSkuListResult,
- AdminCloudtentaclesDeliveryRecordItem,
- AdminCloudtentaclesDeliveryRecordListResult,
-} from './platform-config'
diff --git a/apps/frontend-vue/src/types/admin/orders.ts b/apps/frontend-vue/src/types/admin/orders.ts
deleted file mode 100644
index 77c5e1a0..00000000
--- a/apps/frontend-vue/src/types/admin/orders.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import type { AdminTaskListItem } from './tasks'
-
-export interface AdminOrderFulfillmentProgress {
- totalTaskCount: number
- preparedTaskCount: number
- completedTaskCount: number
- resourceStatus: string
- customerStatus: string
-}
-
-export interface AdminOrderListItem {
- orderId: number
- provider: string
- platform: string
- shopId: string
- shopName: string
- platformOrderId: string
- orderStatus: string
- payStatus: string
- buyerId: string
- buyerName: string
- receiverContact: string
- totalAmount: string
- totalAmountFen: number
- currency: string
- paidAt: string | null
- createdAt: string
- updatedAt: string
- itemCount: number
- totalQuantity: number
- itemSummary: string
- taskCount: number
- resourceStatus: string
- customerStatus: string
- preparedTaskCount: number
- completedTaskCount: number
-}
-
-export interface AdminOrderDetail {
- order: {
- orderId: number
- provider: string
- platform: string
- shopId: string
- shopName: string
- platformOrderId: string
- orderStatus: string
- payStatus: string
- buyerId: string
- buyerName: string
- receiverContact: string
- totalAmount: string
- totalAmountFen: number
- currency: string
- paidAt: string | null
- createdAt: string
- updatedAt: string
- itemSummary: string
- rawPayload: Record
- fulfillmentProgress: AdminOrderFulfillmentProgress
- }
- items: Array<{
- orderItemId: number
- skuCode: string
- skuName: string
- itemTitle: string
- quantity: number
- deliveryMode: string
- spec: Record
- }>
- tasks: AdminTaskListItem[]
- kuaishouIndustryVouchers: Array<{
- oid: string
- voucherCode: string
- unitIndex: number
- status: string
- sendCallbackStatus: string
- sendCallbackAttemptCount: number
- sendCallbackLastError: string
- sendCallbackSentAt: string | null
- consumedAt: string | null
- destroyedAt: string | null
- }>
- operations: {
- canResendKuaishouIndustryVoucherCode: boolean
- }
-}
diff --git a/apps/frontend-vue/src/types/admin/platform-config/cloudtentacles.ts b/apps/frontend-vue/src/types/admin/platform-config/cloudtentacles.ts
deleted file mode 100644
index 6442d35f..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/cloudtentacles.ts
+++ /dev/null
@@ -1,181 +0,0 @@
-export interface AdminCloudtentaclesSourceItem {
- key: string
- label: string
- enabled: boolean
- baseUrl: string
- username: string
- password: string
- phone: string
- deviceId: string
- deviceType: number
-}
-
-export interface AdminCloudtentaclesSourcesConfig {
- enabled: boolean
- sources: AdminCloudtentaclesSourceItem[]
-}
-
-export interface AdminCloudtentaclesPersistedSession {
- token: string
- tokenMasked: string
- baseUrl: string
- username: string
- phoneMasked: string
- loggedInAt: string
- deviceId: string
- deviceType: number
- hasToken: boolean
-}
-
-export type AdminCloudtentaclesSessionItem = AdminCloudtentaclesPersistedSession
-
-export interface AdminCloudtentaclesSessionsMap {
- [sourceKey: string]: AdminCloudtentaclesPersistedSession
-}
-
-export interface AdminCloudtentaclesSourceConfigResponse {
- filePath: string
- sessionFilePath: string
- enabled: boolean
- sources: AdminCloudtentaclesSourceItem[]
- sessions: AdminCloudtentaclesSessionsMap
-}
-
-export interface AdminCloudtentaclesOverrideDeliveryItem {
- cloudSkuId: number
- cloudSkuName: string
- quantity: number
-}
-
-export interface AdminCloudtentaclesOverrideRule {
- id: string
- enabled: boolean
- productName: string
- normalizedProductName: string
- sourceKey: string
- deliveryItems: AdminCloudtentaclesOverrideDeliveryItem[]
- notes: string
-}
-
-export interface AdminCloudtentaclesOverrideRuleConfig {
- filePath: string
- enabled: boolean
- rules: AdminCloudtentaclesOverrideRule[]
-}
-
-export interface AdminCloudtentaclesSendSmsResult {
- baseUrl: string
- username: string
- phone: string
- phoneMasked: string
- sentAt: string
- responseMessage: string
-}
-
-export interface AdminCloudtentaclesSessionSummary {
- tokenMasked: string
- permissionCount: number
- permissions: string[]
- persisted?: boolean
-}
-
-export interface AdminCloudtentaclesLoginTestResult {
- baseUrl: string
- username: string
- phoneMasked: string
- loggedInAt: string
- responseMessage: string
- token: string
- session: AdminCloudtentaclesSessionSummary
- userInfo: Record
- asset: number
-}
-
-export interface AdminCloudtentaclesValidateSessionResult {
- baseUrl: string
- loggedInAt: string
- session: AdminCloudtentaclesSessionSummary
- userInfo: Record
- asset: number
-}
-
-export interface AdminCloudtentaclesSkuItem {
- id: number
- categoriesId: number
- name: string
- description: string
- image: string
- inventory: number
- price: number
- listingTime: string
- delistingTime: string
- buyLimitMin: number
- buyLimitMax: number
- raw: Record
-}
-
-export interface AdminCloudtentaclesSkuListResult {
- baseUrl: string
- itemCount: number
- items: AdminCloudtentaclesSkuItem[]
- rawItems: Record[]
-}
-
-export interface AdminCloudtentaclesDeliveryRecordItem {
- createdAt: string
- recordId: string
- virtualNumberId: number
- userId: number
- count: number
- cdk: string
- exchangeUrl: string
- name: string
- skuId: number
- skuName: string
- skuImage: string
- phone: string
- status: number
- fulfillUser: string
- operatorName: string
- platformOrderId: string
- taskId: number
- taskNo: string
- orderShopId: string
- orderShopName: string
- consumeShopId: string
- consumeShopName: string
- roleName: string
- roleId: string
- localTaskStatus: string
- localDeliveryStatus: string
- localDispatchStatus: string
- localDispatchAt: string
- localResultCode: string
- localResultMessage: string
- matchConfidence: string
- raw: Record
-}
-
-export interface AdminCloudtentaclesDeliveryRecordListResult {
- baseUrl: string
- page: number
- size: number
- total: number
- sourceKey?: string
- queryStartDate?: string
- queryEndDate?: string
- localOrderMatched?: boolean
- items: AdminCloudtentaclesDeliveryRecordItem[]
- raw: Record
-}
-
-/** @deprecated Use AdminCloudtentaclesSourceItem + AdminCloudtentaclesSourcesConfig instead */
-export interface AdminCloudtentaclesSourceConfig {
- enabled: boolean
- baseUrl: string
- username: string
- password: string
- phone: string
- deviceId: string
- deviceType: number
-}
diff --git a/apps/frontend-vue/src/types/admin/platform-config/index.ts b/apps/frontend-vue/src/types/admin/platform-config/index.ts
deleted file mode 100644
index 560c4c6d..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/index.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-export type {
- AdminNotificationBarkRecipient,
- AdminNotificationWpushRecipient,
- AdminNotificationConfig,
- AdminNotificationSendResult,
- AdminNotificationTestResult,
-} from './notifications'
-
-export type {
- AdminCloudtentaclesMonitorAccount,
- AdminScheduledJobAccountRuntime,
- AdminScheduledJobCloudtentaclesAccount,
- AdminScheduledJobItem,
- AdminScheduledJobsConfig,
- AdminScheduledJobRuntimeState,
- AdminScheduledJobsResponse,
-} from './scheduled-jobs'
-
-export type {
- AdminNinetyoneOrderItem,
- AdminNinetyoneOrderListResult,
- AdminNinetyoneOrderActionResult,
-} from './ninetyone'
-
-export type {
- AdminKuaishouEticketSourceConfig,
- AdminKuaishouEticketShopConfigItem,
- AdminKuaishouEticketShopInfoResult,
- AdminKuaishouEticketDetailResult,
- AdminKuaishouEticketConsumeResult,
-} from './kuaishou-eticket'
-
-export type {
- AdminKuaishouFeifeiProductRule,
- AdminKuaishouFeifeiConfig,
- AdminKuaishouFeifeiEffectiveConfig,
- AdminKuaishouFeifeiConfigResponse,
- AdminKuaishouFeifeiProductSyncResult,
- AdminKuaishouFeifeiProductMatch,
- AdminKuaishouFeifeiMatchResult,
- AdminKuaishouFeifeiProductItem,
- AdminKuaishouFeifeiProductListResult,
- AdminKuaishouFeifeiOrderResult,
-} from './kuaishou-feifei'
-
-export type {
- AdminCloudtentaclesSourceItem,
- AdminCloudtentaclesSourcesConfig,
- AdminCloudtentaclesSourceConfigResponse,
- AdminCloudtentaclesOverrideDeliveryItem,
- AdminCloudtentaclesOverrideRule,
- AdminCloudtentaclesOverrideRuleConfig,
- AdminCloudtentaclesSessionsMap,
- AdminCloudtentaclesSourceConfig,
- AdminCloudtentaclesPersistedSession,
- AdminCloudtentaclesSessionItem,
- AdminCloudtentaclesSendSmsResult,
- AdminCloudtentaclesSessionSummary,
- AdminCloudtentaclesLoginTestResult,
- AdminCloudtentaclesValidateSessionResult,
- AdminCloudtentaclesSkuItem,
- AdminCloudtentaclesSkuListResult,
- AdminCloudtentaclesDeliveryRecordItem,
- AdminCloudtentaclesDeliveryRecordListResult,
-} from './cloudtentacles'
diff --git a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-eticket.ts b/apps/frontend-vue/src/types/admin/platform-config/kuaishou-eticket.ts
deleted file mode 100644
index 046bca9c..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-eticket.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-export interface AdminKuaishouEticketShopConfigItem {
- shopId: string
- kshopName: string
- cookie: string
- cookieMasked: string
- hasCookie: boolean
- userAvatar: string
- enabled: boolean
-}
-
-export interface AdminKuaishouEticketSourceConfig {
- enabled: boolean
- baseUrl: string
- shops: AdminKuaishouEticketShopConfigItem[]
-}
-
-export interface AdminKuaishouEticketShopInfoResult {
- baseUrl: string
- ok: boolean
- result: number
- errorMessage: string
- requestId: string
- shop: {
- shopId: string
- kshopName: string
- userAvatar: string
- settleStatus: number
- hasCookie: boolean
- }
- raw: Record
-}
-
-export interface AdminKuaishouEticketDetailResult {
- baseUrl: string
- eTicketId: string
- ok: boolean
- alreadyConsumed: boolean
- result: number
- errorMessage: string
- requestId: string
- serverTimestamp: string
- detail: {
- uid: string
- fulfillDetailId: string
- sellerId: string
- formToken: string
- validEndTime: string
- validStartTime: string
- leftReverseCount: number
- eTicketId: string
- oid: string
- totalCount: number
- leftCount: number
- status: string
- } | null
- goods: {
- itemId: string
- itemPicUrl: string
- itemTitle: string
- price: string
- skuDesc: string
- skuId: string
- } | null
- raw: Record
-}
-
-export interface AdminKuaishouEticketConsumeResult {
- baseUrl: string
- eTicketId: string
- oid: string
- formToken: string
- num: number
- storeId: string
- ok: boolean
- consumed: boolean
- alreadyConsumed: boolean
- result: number
- errorMessage: string
- requestId: string
- serverTimestamp: string
- detail: AdminKuaishouEticketDetailResult['detail']
- raw: Record
-}
diff --git a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-feifei.ts b/apps/frontend-vue/src/types/admin/platform-config/kuaishou-feifei.ts
deleted file mode 100644
index ecea64ef..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-feifei.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-export interface AdminKuaishouFeifeiProductRule {
- id: string
- enabled: boolean
- productName: string
- normalizedProductName: string
- productCode: string
- skuName: string
- notes: string
-}
-
-export interface AdminKuaishouFeifeiConfig {
- enabled: boolean
- baseUrl: string
- appKey: string
- appSecret: string
- timeoutMs: number
- notifyUrl: string
- productRules: AdminKuaishouFeifeiProductRule[]
-}
-
-export interface AdminKuaishouFeifeiEffectiveConfig {
- enabled: boolean
- baseUrl: string
- timeoutMs: number
- notifyUrl: string
- hasAppKey: boolean
- hasAppSecret: boolean
- productRuleCount: number
-}
-
-export interface AdminKuaishouFeifeiConfigResponse {
- filePath: string
- source: AdminKuaishouFeifeiConfig
- effective: AdminKuaishouFeifeiEffectiveConfig
-}
-
-export interface AdminKuaishouFeifeiProductSyncResult extends AdminKuaishouFeifeiConfigResponse {
- sync: {
- productCount: number
- ruleCount: number
- status: string
- supplyProductName: string
- }
-}
-
-export interface AdminKuaishouFeifeiProductMatch {
- matchMode: string
- productName: string
- normalizedProductName: string
- productCode: string
- skuName: string
-}
-
-export interface AdminKuaishouFeifeiMatchResult {
- productName: string
- normalizedProductName: string
- matched: boolean
- match: AdminKuaishouFeifeiProductMatch | null
-}
-
-export interface AdminKuaishouFeifeiProductItem {
- productCode: string
- name: string
- channel: string
- externalProductId: string
- imageUrl: string
- status: string
- supplyStatus: string
- supplyPricePoints: number
- feePoints: number
- unitCostPoints: number
- maxOrderQuantity: number
- salePricePoints: number | null
- raw: Record
-}
-
-export interface AdminKuaishouFeifeiProductListResult {
- items: AdminKuaishouFeifeiProductItem[]
- total: number
- page: number
- perPage: number
- raw: Record
-}
-
-export interface AdminKuaishouFeifeiOrderResult {
- orderNo: string
- platformOrderNo: string
- productCode: string
- productName: string
- rechargeStatus: number
- rechargeStatusLabel: string
- pointsCharged: number
- playerAccount: string
- platformBuyNum: number
- rechargeResultMessage: string
- createdAt: string
- updatedAt: string
- rechargeFinishAt: string
- h5: {
- entryUrl: string
- rechargeUrl: string
- }
- raw: Record
-}
diff --git a/apps/frontend-vue/src/types/admin/platform-config/ninetyone.ts b/apps/frontend-vue/src/types/admin/platform-config/ninetyone.ts
deleted file mode 100644
index 19df7c49..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/ninetyone.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-export interface AdminNinetyoneOrderItem {
- orderId: number
- orderNo: string
- outTradeNo: string
- orderStatus: string
- payStatus: string
- shopId: string
- shopName: string
- productNo: string
- productName: string
- buyNum: number
- taskCount: number
- failReason: string
- createdAt: string
- updatedAt: string
- items: Array>
-}
-
-export interface AdminNinetyoneOrderListResult {
- page: number
- pageSize: number
- total: number
- items: AdminNinetyoneOrderItem[]
-}
-
-export interface AdminNinetyoneOrderActionResult {
- orderId: number
- orderNo: string
- orderStatus: string
- orderItemCount: number
- taskCount: number
-}
diff --git a/apps/frontend-vue/src/types/admin/platform-config/notifications.ts b/apps/frontend-vue/src/types/admin/platform-config/notifications.ts
deleted file mode 100644
index 1a847acb..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/notifications.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-export interface AdminNotificationBarkRecipient {
- id: string
- name: string
- deviceKey: string
- deviceKeyMasked: string
- enabled: boolean
-}
-
-export interface AdminNotificationWpushRecipient {
- id: string
- name: string
- apiKey: string
- apiKeyMasked: string
- enabled: boolean
-}
-
-export interface AdminNotificationConfig {
- enabled: boolean
- channels: {
- bark: {
- enabled: boolean
- serverUrl: string
- recipients: AdminNotificationBarkRecipient[]
- }
- wpush: {
- enabled: boolean
- recipients: AdminNotificationWpushRecipient[]
- }
- }
-}
-
-export interface AdminNotificationSendResult {
- channel: string
- recipientId: string
- recipientName: string
- recipientKeyMasked: string
- ok: boolean
- status: number
- errorMessage: string
- response: unknown
-}
-
-export interface AdminNotificationTestResult {
- enabled: boolean
- channel: string
- successCount: number
- failedCount: number
- skippedCount: number
- results: AdminNotificationSendResult[]
-}
diff --git a/apps/frontend-vue/src/types/admin/platform-config/scheduled-jobs.ts b/apps/frontend-vue/src/types/admin/platform-config/scheduled-jobs.ts
deleted file mode 100644
index 5a0d82b1..00000000
--- a/apps/frontend-vue/src/types/admin/platform-config/scheduled-jobs.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-export interface AdminScheduledJobCloudtentaclesAccount {
- sourceKey: string
- label: string
- enabled: boolean
- assetThreshold: number
-}
-
-export interface AdminScheduledJobItem {
- id: string
- type: string
- enabled: boolean
- intervalSeconds: number
- cooldownSeconds: number
- config: {
- assetThreshold: number
- accounts: AdminScheduledJobCloudtentaclesAccount[]
- }
-}
-
-export interface AdminScheduledJobsConfig {
- enabled: boolean
- jobs: AdminScheduledJobItem[]
-}
-
-export interface AdminScheduledJobRuntimeState {
- id: string
- enabled: boolean
- running: boolean
- lastRunAt: string
- lastFinishedAt: string
- nextRunAt: string
- lastStatus: string
- lastMessage: string
- lastAsset: number | null
- lastThreshold: number | null
- lastAccounts: AdminScheduledJobAccountRuntime[]
- lastAccountCount: number
- lastCheckedCount: number
- lastOkCount: number
- lastLowAssetCount: number
- lastFailedCount: number
- lastManual: boolean
-}
-
-export interface AdminScheduledJobAccountRuntime {
- sourceKey: string
- label: string
- enabled: boolean
- hasToken: boolean
- ok: boolean
- skipped: boolean
- status: string
- message: string
- asset: number | null
- threshold: number
- checkedAt: string
-}
-
-export interface AdminCloudtentaclesMonitorAccount {
- sourceKey: string
- label: string
- enabled: boolean
- username: string
- phoneMasked: string
- hasToken: boolean
- loggedInAt: string
-}
-
-export interface AdminScheduledJobsResponse {
- filePath: string
- source: AdminScheduledJobsConfig
- runtime: AdminScheduledJobRuntimeState[]
- cloudtentaclesAccounts: AdminCloudtentaclesMonitorAccount[]
-}
diff --git a/apps/frontend-vue/src/types/admin/tasks.ts b/apps/frontend-vue/src/types/admin/tasks.ts
deleted file mode 100644
index baa0b711..00000000
--- a/apps/frontend-vue/src/types/admin/tasks.ts
+++ /dev/null
@@ -1,239 +0,0 @@
-export interface AdminTaskListItem {
- taskId: number
- taskNo: string
- platformOrderId: string
- skuCode: string
- skuName: string
- status: string
- executorKey: string
- deliveryStatus: string
- resultCode: string
- resultMessage: string
- resourceStatus: string
- customerStatus: string
- loginType: string
- roleName: string
- roleId: string
- runtimeSessionId: string
- claimedAt: string | null
- roleConfirmedAt: string | null
- redeemedAt: string | null
- retryCount: number
- lastError: string
- createdAt: string
- updatedAt: string
- claimToken: string
- screenshotPath: string
-}
-
-export interface AdminTaskOperations {
- canRetry: boolean
- canRegenerateClaimLink: boolean
- canClose: boolean
- canMarkManualReview: boolean
- canCompleteManualDispatch: boolean
- canPrepareKuaishouCloudFulfillment: boolean
- canRefreshKuaishouCloudRoleInfo: boolean
- canRebindKuaishouCloudRole: boolean
- canDispatchKuaishouCloudFulfillment: boolean
- canReturnKuaishouCloudFulfillment: boolean
- canResendKuaishouIndustryVoucherCode: boolean
- canConsumeKuaishouIndustryVoucher: boolean
- canViewSensitiveTaskData: boolean
-}
-
-export interface AdminTaskActionResponse {
- task: {
- taskId: number
- taskNo: string
- status: string
- deliveryStatus: string
- resultCode: string
- resultMessage: string
- primaryClaimTokenId: number | null
- lastError: string
- updatedAt: string
- }
- claimUrl?: string
- token?: string
-}
-
-export interface AdminTaskDetail {
- task: AdminTaskListItem
- order: null | {
- orderId: number
- provider: string
- platform: string
- shopId: string
- shopName: string
- platformOrderId: string
- payStatus: string
- orderStatus: string
- }
- orderItem: null | {
- orderItemId: number
- skuCode: string
- skuName: string
- quantity: number
- }
- claimToken: null | {
- primaryClaimTokenId: number
- token: string
- status: string
- expiredAt: string
- claimUrl: string
- }
- artifacts: Record
- screenshotUrl: string
- review: {
- required: boolean
- screenshotCapturedAt: string | null
- roleId: string
- roleName: string
- }
- redeemResolution: null | {
- status: string
- taskStatus: string
- replacementCount: number
- finishedAt: string | null
- attempts: Array<{
- attempt: number
- codeMasked: string
- credentialType: string
- outcome: string
- resultCode: string
- resultMessage: string
- }>
- }
- kuaishouCloudFulfillment: null | {
- flowType: string
- configId: string
- internalSkuCode: string
- internalSkuName: string
- ticket: {
- code: string
- capturedAt: string | null
- status: string
- verifiedAt: string | null
- goodsTitle: string
- leftCount: number
- }
- binding: {
- prepareStatus: string
- cloudSourceKeys: string[]
- cloudSourceLabels: string[]
- resolvedSourceKey: string
- resolvedSourceLabel: string
- skuId: number
- skuName: string
- vnKey: string
- vnId: number
- vnPhone: string
- bindUrl: string
- bindPreparedAt: string | null
- bindExpiresAt: string | null
- bindProbeAt: string | null
- bindProbeStatus: string
- bindProbeMessage: string
- }
- role: {
- status: string
- name: string
- rid: string
- refreshedAt: string | null
- errorMessage: string
- rawInfo: Record | null
- }
- purchase: {
- autoBuyEnabled: boolean
- minAssetReserve: number
- usedKnapsack: boolean
- purchaseTriggered: boolean
- assetBefore: number
- assetAfter: number
- purchaseAt: string | null
- }
- dispatch: {
- status: string
- dispatchAt: string | null
- sendType: number
- note: string
- }
- returnNumber: {
- status: string
- returnedAt: string | null
- autoReturnEnabled: boolean
- }
- consume: {
- status: string
- shopId: string
- shopName: string
- autoConsumeEnabled: boolean
- consumedAt: string | null
- errorMessage: string
- }
- rebind: {
- currentAttempt: number
- history: Array<{
- attempt: number
- source: string
- requestedAt: string | null
- requestedBy: Record | null
- status: string
- errorMessage: string
- oldBinding: {
- vnKey: string
- vnId: number
- vnPhone: string
- bindUrl: string
- bindPreparedAt: string | null
- bindExpiresAt: string | null
- roleName: string
- roleId: string
- }
- newBinding: null | {
- vnKey: string
- vnId: number
- vnPhone: string
- bindUrl: string
- bindPreparedAt: string | null
- bindExpiresAt: string | null
- }
- }>
- }
- notes: string
- }
- kuaishouIndustryVoucher: null | {
- oid: string
- voucherCode: string
- unitIndex: number
- status: string
- sendCallbackStatus: string
- sendCallbackLastError: string
- sendCallbackAttemptCount: number
- sendCallbackSentAt: string | null
- consumeSerialNum: string
- consumeDetails: Array>
- consumedAt: string | null
- destroyedAt: string | null
- }
- manualDispatch: null | {
- outcome: string
- deliveryReference: string
- deliveredCredential: string
- resultMessage: string
- completedAt: string | null
- completedBy: null | {
- userId: number
- username: string
- role: string
- }
- }
- events: Array<{
- eventId: number
- eventType: string
- payload: Record
- createdAt: string
- }>
- operations: AdminTaskOperations
-}
diff --git a/apps/frontend-vue/src/types/admin/users.ts b/apps/frontend-vue/src/types/admin/users.ts
deleted file mode 100644
index 7c5438a2..00000000
--- a/apps/frontend-vue/src/types/admin/users.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import type { AdminRole, AdminUserStatus } from './auth'
-
-export interface AdminUserListItem {
- userId: number
- username: string
- role: AdminRole
- status: AdminUserStatus
- createdAt: string
- updatedAt: string
-}
diff --git a/apps/frontend-vue/src/types/claim.ts b/apps/frontend-vue/src/types/claim.ts
deleted file mode 100644
index d1370129..00000000
--- a/apps/frontend-vue/src/types/claim.ts
+++ /dev/null
@@ -1,168 +0,0 @@
-import type { KnownTaskStatus } from '@/domain/task-status'
-
-export type ClaimTokenStatus = 'active' | 'used' | 'expired' | 'revoked' | (string & {})
-
-export type ClaimTaskStatus = KnownTaskStatus | (string & {})
-
-export interface ClaimTaskInfo {
- taskId: number
- taskNo: string
- status: ClaimTaskStatus
- executorKey: string
- requiresSupportReview: boolean
- expiresAt: string | null
- claimedAt: string | null
- roleConfirmedAt: string | null
- redeemedAt: string | null
- loginType: string
- lastError: string
- runtimeSessionId: string
-}
-
-export interface ClaimOrderInfo {
- orderId: number
- platform: string
- platformOrderId: string
- payStatus: string
- orderStatus: string
- totalAmount: string
- totalAmountFen: number
- currency: string
-}
-
-export interface ClaimOrderItemInfo {
- orderItemId: number
- skuCode: string
- skuName: string
- quantity: number
-}
-
-export interface ClaimProductInfo {
- title: string
- skuCode: string
- quantity: number
- isBundle: boolean
- items: Array<{
- cloudSkuId: number
- name: string
- quantity: number
- }>
-}
-
-export interface ClaimResultInfo {
- resultCode: string
- resultMessage: string
- screenshotReady: boolean
- screenshotUrl: string
-}
-
-export interface ClaimKuaishouCloudFlowInfo {
- flowType: 'kuaishou_cloud'
- shopId: string
- shopName: string
- guideImages: string[]
- ticket: {
- code: string
- status: string
- capturedAt: string | null
- verifiedAt: string | null
- goodsTitle: string
- leftCount: number
- }
- binding: {
- prepareStatus: string
- cloudSourceKeys: string[]
- resolvedSourceKey: string
- skuId: number
- skuName: string
- vnKey: string
- vnId: number
- bindUrl: string
- bindPreparedAt: string | null
- bindExpiresAt: string | null
- bindProbeAt: string | null
- bindProbeStatus: string
- bindProbeMessage: string
- vnPhone: string
- roleName: string
- roleId: string
- }
- role: {
- status: string
- name: string
- rid: string
- refreshedAt: string | null
- errorMessage: string
- defaultName: string
- defaultRid: string
- defaultCapturedAt: string | null
- defaultCaptureStatus: string
- defaultErrorMessage: string
- isDefaultRole: boolean
- }
- purchase: {
- autoBuyEnabled: boolean
- minAssetReserve: number
- usedKnapsack: boolean
- purchaseTriggered: boolean
- assetBefore: number
- assetAfter: number
- purchaseAt: string | null
- }
- dispatch: {
- status: string
- dispatchAt: string | null
- failedAt: string | null
- failedStage: string
- errorCode: string
- errorMessage: string
- note: string
- }
- returnNumber: {
- status: string
- returnedAt: string | null
- }
- consume: {
- status: string
- shopId: string
- shopName: string
- consumedAt: string | null
- errorMessage: string
- }
- rebind?: {
- currentAttempt: number
- history: Array>
- }
-}
-
-export interface ClaimKuaishouFeifeiFlowInfo {
- flowType: 'kuaishou_feifei'
- productCode: string
- productName: string
- platformOrderNo: string
- orderNo: string
- rechargeStatus: number
- rechargeStatusLabel: string
- rechargeResultMessage: string
- claimUrl: string
- consumeStatus: string
- h5: {
- entryUrl: string
- rechargeUrl: string
- }
- lastSyncedAt: string | null
-}
-
-export interface ClaimDetailData {
- tokenStatus: ClaimTokenStatus
- claimUrl: string
- flowType: 'kuaishou_cloud' | 'kuaishou_ct_assisted' | 'kuaishou_feifei' | (string & {})
- task: ClaimTaskInfo
- order: ClaimOrderInfo
- orderItem: ClaimOrderItemInfo
- product: ClaimProductInfo
- session: unknown | null
- kuaishouCloudFulfillment: ClaimKuaishouCloudFlowInfo | null
- kuaishouFeifei: ClaimKuaishouFeifeiFlowInfo | null
- result: ClaimResultInfo | null
-}
diff --git a/apps/frontend-vue/src/utils/admin-auth.ts b/apps/frontend-vue/src/utils/admin-auth.ts
deleted file mode 100644
index cbb374e6..00000000
--- a/apps/frontend-vue/src/utils/admin-auth.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-const ADMIN_TOKEN_KEY = 'order-site-admin-token'
-const ADMIN_EXPIRES_AT_KEY = 'order-site-admin-token-expires-at'
-const ADMIN_USER_ID_KEY = 'order-site-admin-user-id'
-const ADMIN_USERNAME_KEY = 'order-site-admin-username'
-const ADMIN_ROLE_KEY = 'order-site-admin-role'
-
-const ADMIN_ROLE_LEVEL: Record<'support' | 'operator' | 'admin', number> = {
- support: 1,
- operator: 2,
- admin: 3,
-}
-
-export function getAdminToken() {
- return localStorage.getItem(ADMIN_TOKEN_KEY) || ''
-}
-
-export function getAdminTokenExpiresAt() {
- return localStorage.getItem(ADMIN_EXPIRES_AT_KEY) || ''
-}
-
-export function getAdminUserId() {
- const value = Number(localStorage.getItem(ADMIN_USER_ID_KEY) || 0)
- return Number.isFinite(value) && value > 0 ? value : 0
-}
-
-export function getAdminUsername() {
- return localStorage.getItem(ADMIN_USERNAME_KEY) || ''
-}
-
-export function getAdminRole() {
- const role = localStorage.getItem(ADMIN_ROLE_KEY)
- if (role === 'admin' || role === 'operator' || role === 'support') {
- return role
- }
-
- return 'support'
-}
-
-export function hasAdminRole(role: 'admin' | 'operator' | 'support') {
- if (!hasAdminSession()) {
- return false
- }
-
- return ADMIN_ROLE_LEVEL[getAdminRole()] >= ADMIN_ROLE_LEVEL[role]
-}
-
-export function setAdminSession(
- token: string,
- expiresAt: string,
- user?: { userId: number; username: string; role: 'admin' | 'operator' | 'support' },
-) {
- localStorage.setItem(ADMIN_TOKEN_KEY, token)
- localStorage.setItem(ADMIN_EXPIRES_AT_KEY, expiresAt)
-
- if (user?.userId) {
- localStorage.setItem(ADMIN_USER_ID_KEY, String(user.userId))
- }
-
- if (user?.username) {
- localStorage.setItem(ADMIN_USERNAME_KEY, user.username)
- }
-
- if (user?.role) {
- localStorage.setItem(ADMIN_ROLE_KEY, user.role)
- }
-}
-
-export function clearAdminSession() {
- localStorage.removeItem(ADMIN_TOKEN_KEY)
- localStorage.removeItem(ADMIN_EXPIRES_AT_KEY)
- localStorage.removeItem(ADMIN_USER_ID_KEY)
- localStorage.removeItem(ADMIN_USERNAME_KEY)
- localStorage.removeItem(ADMIN_ROLE_KEY)
-}
-
-export function hasAdminSession() {
- const token = getAdminToken()
- const expiresAt = getAdminTokenExpiresAt()
-
- if (!token) {
- return false
- }
-
- if (isExpired(expiresAt)) {
- clearAdminSession()
- return false
- }
-
- return true
-}
-
-function isExpired(expiresAt: string) {
- if (!expiresAt) {
- return false
- }
-
- const expiresAtMs = Date.parse(expiresAt)
- return Number.isFinite(expiresAtMs) && expiresAtMs <= Date.now()
-}
diff --git a/apps/frontend-vue/src/utils/admin-display.ts b/apps/frontend-vue/src/utils/admin-display.ts
deleted file mode 100644
index c579d923..00000000
--- a/apps/frontend-vue/src/utils/admin-display.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-export function formatStatusWithRaw(status: string, labelMap: Record = {}) {
- const normalized = String(status || '').trim()
-
- if (!normalized) {
- return '-'
- }
-
- const key = normalized.toLowerCase()
- const label = labelMap[key]
-
- if (!label || label === normalized) {
- return normalized
- }
-
- return `${label} (${normalized})`
-}
-
-export function formatAuditAction(action: string) {
- const labelMap: Record = {
- admin_user_created: '创建后台用户',
- admin_user_role_updated: '修改用户角色',
- admin_user_status_updated: '修改用户状态',
- admin_user_password_reset: '重置用户密码',
- task_regenerate_claim_link: '重发领取链接',
- task_kuaishou_cloud_rebind_role: '换绑角色',
- task_closed: '关闭任务',
- task_mark_manual_review: '转人工处理',
- task_complete_manual_dispatch: '完成人工履约',
- platform_shop_config_updated: '更新店铺配置',
- platform_fulfillment_config_updated: '更新履约配置',
- }
-
- return formatStatusWithRaw(action, labelMap)
-}
-
-export function formatAuditTargetType(targetType: string) {
- const labelMap: Record = {
- admin_user: '后台用户',
- task: '交付任务',
- platform_config: '平台配置',
- }
-
- return formatStatusWithRaw(targetType, labelMap)
-}
-
-export function formatTaskEventType(eventType: string) {
- const labelMap: Record = {
- manual_dispatch_completed: '人工履约已回写',
- claim_redeem_code_used: '兑换码已使用',
- claim_redeem_code_invalid: '兑换码错误',
- claim_redeem_completed: '兑换链路完成',
- kuaishou_cloud_rebind_requested: '发起角色换绑',
- kuaishou_cloud_rebind_old_number_returned: '换绑旧号已退还',
- kuaishou_cloud_rebind_prepared: '换绑资源已准备',
- kuaishou_cloud_rebind_failed: '换绑失败',
- }
-
- return formatStatusWithRaw(eventType, labelMap)
-}
-
-export function formatRedeemOutcomeLabel(value: string) {
- const normalized = String(value || '').trim()
-
- switch (normalized) {
- case 'success':
- return '兑换成功'
- case 'code_used':
- return '兑换码已使用'
- case 'code_invalid':
- return '兑换码错误'
- case 'captcha_rejected':
- return '验证码错误'
- case 'failed':
- return '兑换失败'
- default:
- return normalized || '-'
- }
-}
-
-export function formatRedeemResolutionStatus(value: string) {
- return value === 'success' ? '已完成' : value === 'failed' ? '失败收口' : value || '-'
-}
-
-export function formatKuaishouRoleInfoLabel(value: string) {
- const normalized = String(value || '').trim()
-
- switch (normalized) {
- case 'name':
- return '角色名称'
- case 'rid':
- return '角色 ID'
- default:
- return normalized || '-'
- }
-}
-
-export function formatTaskEventPayload(payload: Record) {
- const parts = [
- payload.outcome ? `结果 ${payload.outcome}` : '',
- payload.resultCode ? `代码 ${payload.resultCode}` : '',
- payload.resultMessage ? `说明 ${payload.resultMessage}` : '',
- payload.codeMasked ? `凭据 ${payload.codeMasked}` : '',
- payload.previousCodeMasked ? `旧码 ${payload.previousCodeMasked}` : '',
- payload.nextCodeMasked ? `新码 ${payload.nextCodeMasked}` : '',
- payload.ticketCodeMasked ? `卡券号 ${payload.ticketCodeMasked}` : '',
- payload.vnId ? `虚拟号 #${payload.vnId}` : '',
- payload.oldVnId ? `旧虚拟号 #${payload.oldVnId}` : '',
- payload.vnPhoneMasked ? `号码 ${payload.vnPhoneMasked}` : '',
- payload.oldVnPhoneMasked ? `旧号码 ${payload.oldVnPhoneMasked}` : '',
- payload.oldRoleName ? `旧角色 ${payload.oldRoleName}` : '',
- payload.oldRoleId ? `旧角色ID ${payload.oldRoleId}` : '',
- payload.attempt ? `第 ${payload.attempt} 次` : '',
- payload.bindUrl ? `绑定链接 ${payload.bindUrl}` : '',
- payload.sendType ? `发送类型 ${payload.sendType}` : '',
- payload.note ? `备注 ${payload.note}` : '',
- payload.previousOutcome
- ? `切换原因 ${formatRedeemOutcomeLabel(String(payload.previousOutcome || ''))}`
- : '',
- payload.deliveryReference ? `单号 ${payload.deliveryReference}` : '',
- payload.platformOrderId ? `平台单 ${payload.platformOrderId}` : '',
- payload.trigger ? `触发 ${payload.trigger}` : '',
- payload.reason ? `原因 ${payload.reason}` : '',
- payload.purchaseTriggered === true ? '已触发购买' : '',
- payload.usedKnapsack === true ? '使用背包库存' : '',
- payload.responseStatus ? `HTTP ${payload.responseStatus}` : '',
- payload.requestId ? `请求 ${payload.requestId}` : '',
- payload.errorMessage ? `错误 ${payload.errorMessage}` : '',
- ].filter(Boolean)
-
- if (parts.length > 0) {
- return parts.join(' · ')
- }
-
- return JSON.stringify(payload || {})
-}
diff --git a/apps/frontend-vue/src/utils/admin-options.ts b/apps/frontend-vue/src/utils/admin-options.ts
deleted file mode 100644
index 5abb1c10..00000000
--- a/apps/frontend-vue/src/utils/admin-options.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-export const adminPayStatusOptions = [
- { label: '全部', value: '' },
- { label: '未支付', value: 'unpaid' },
- { label: '已支付', value: 'paid' },
- { label: '失败', value: 'failed' },
- { label: '已退款', value: 'refunded' },
-]
-
-export const adminTaskStatusOptions = [
- { label: '全部', value: '' },
- { label: '待支付', value: 'pending_payment' },
- { label: '已支付', value: 'paid' },
- { label: '已生成链接', value: 'link_generated' },
- { label: '已创建会话', value: 'claimed' },
- { label: '已确认角色', value: 'role_confirmed' },
- { label: '兑换中', value: 'redeeming' },
- { label: '已兑换', value: 'redeemed' },
- { label: '待重试', value: 'retry_pending' },
- { label: '人工处理', value: 'manual_review' },
- { label: '已过期', value: 'expired' },
- { label: '已关闭', value: 'closed' },
-]
-
-export const adminUserRoleOptions = [
- { label: '全部', value: '' },
- { label: '管理员', value: 'admin' },
- { label: '普通运营', value: 'operator' },
- { label: '客服', value: 'support' },
-]
-
-export const adminUserStatusOptions = [
- { label: '全部', value: '' },
- { label: '生效中', value: 'active' },
- { label: '已停用', value: 'disabled' },
-]
-
-export const adminAuditActionOptions = [
- { label: '全部', value: '' },
- { label: '创建后台用户', value: 'admin_user_created' },
- { label: '修改用户角色', value: 'admin_user_role_updated' },
- { label: '修改用户状态', value: 'admin_user_status_updated' },
- { label: '重置用户密码', value: 'admin_user_password_reset' },
- { label: '换绑角色', value: 'task_kuaishou_cloud_rebind_role' },
- { label: '关闭任务', value: 'task_closed' },
- { label: '转人工处理', value: 'task_mark_manual_review' },
-]
-
-export const adminAuditTargetTypeOptions = [
- { label: '全部', value: '' },
- { label: '后台用户', value: 'admin_user' },
- { label: '交付任务', value: 'task' },
-]
diff --git a/apps/frontend-vue/src/utils/admin-time.ts b/apps/frontend-vue/src/utils/admin-time.ts
deleted file mode 100644
index b3696153..00000000
--- a/apps/frontend-vue/src/utils/admin-time.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { formatDateTime as formatAdminDateTime } from '@/utils/date-time'
diff --git a/apps/frontend-vue/src/utils/date-time.ts b/apps/frontend-vue/src/utils/date-time.ts
deleted file mode 100644
index 1567b29f..00000000
--- a/apps/frontend-vue/src/utils/date-time.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-const ISO_DATE_TIME_PATTERN =
- /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$/
-
-export function isIsoDateTimeString(value: unknown): value is string {
- return typeof value === 'string' && ISO_DATE_TIME_PATTERN.test(value.trim())
-}
-
-export function formatDateTime(value: string | null | undefined, fallback = '-') {
- const normalized = String(value || '').trim()
-
- if (!normalized) {
- return fallback
- }
-
- const date = new Date(normalized)
-
- if (Number.isNaN(date.getTime())) {
- return normalized.replace('T', ' ').replace('Z', '')
- }
-
- const year = date.getFullYear()
- const month = String(date.getMonth() + 1).padStart(2, '0')
- const day = String(date.getDate()).padStart(2, '0')
- const hours = String(date.getHours()).padStart(2, '0')
- const minutes = String(date.getMinutes()).padStart(2, '0')
- const seconds = String(date.getSeconds()).padStart(2, '0')
-
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
-}
-
-export function normalizeDateTimeValue(value: unknown): unknown {
- if (Array.isArray(value)) {
- return value.map((item) => normalizeDateTimeValue(item))
- }
-
- if (value && typeof value === 'object') {
- return Object.fromEntries(
- Object.entries(value).map(([key, currentValue]) => [
- key,
- normalizeDateTimeValue(currentValue),
- ]),
- )
- }
-
- if (isIsoDateTimeString(value)) {
- return formatDateTime(value, '')
- }
-
- return value
-}
-
-export function stringifyDisplayJson(value: unknown, space = 2) {
- return JSON.stringify(normalizeDateTimeValue(value), null, space)
-}
diff --git a/apps/frontend-vue/src/views/NotFoundView.vue b/apps/frontend-vue/src/views/NotFoundView.vue
deleted file mode 100644
index 50882789..00000000
--- a/apps/frontend-vue/src/views/NotFoundView.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
404
-
页面不存在
-
当前快手轻量前端没有对应页面。
-
前往后台
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/audit-logs/AdminAuditLogsView.vue b/apps/frontend-vue/src/views/admin/audit-logs/AdminAuditLogsView.vue
deleted file mode 100644
index 8c70c47c..00000000
--- a/apps/frontend-vue/src/views/admin/audit-logs/AdminAuditLogsView.vue
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
-
-
-
- {{ totalLabel }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 重置
- 查询
-
-
-
-
-
-
-
-
-
-
-
- {{ formatAdminDateTime(row.createdAt) }}
-
-
-
-
-
-
-
- {{ formatAuditAction(row.action) }}
-
-
-
-
- {{ resolveTargetLabel(row.targetType, row.targetId) }}
-
-
-
-
- {{ formatPayload(row.payload) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/auth/AdminLoginView.vue b/apps/frontend-vue/src/views/admin/auth/AdminLoginView.vue
deleted file mode 100644
index 1c7c66f9..00000000
--- a/apps/frontend-vue/src/views/admin/auth/AdminLoginView.vue
+++ /dev/null
@@ -1,122 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- 登录后台
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue b/apps/frontend-vue/src/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue
deleted file mode 100644
index 25a5f6f3..00000000
--- a/apps/frontend-vue/src/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue
+++ /dev/null
@@ -1,649 +0,0 @@
-
-
-
-
-
-
- 共 {{ total }} 条记录
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 重置
-
- 查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 发货记录
- 账号 {{ currentSourceLabel }} · 第 {{ page }} 页,当前展示 {{ items.length }} 条
-
-
-
-
-
-
- {{ row.name || '-' }}
-
- 账号:{{ row.fulfillUser || '-' }}
-
-
- 角色:{{ row.roleName || '-' }}{{ row.roleId ? `(${row.roleId})` : '' }}
-
-
-
-
-
-
-
-
- {{ row.platformOrderId || '-' }}
-
-
- 订单店铺:{{ row.orderShopName || row.orderShopId || '-' }}
-
-
- 核销店铺:{{ row.consumeShopName || row.consumeShopId || '-' }}
-
-
-
-
-
-
-
- {{ row.phone || '-' }}
- VN {{ row.virtualNumberId || '-' }}
-
-
-
-
-
-
-
- {{ getStatusLabel(row.status) }}
-
-
- {{ getLocalDispatchStatusLabel(row.localDispatchStatus) }}
-
-
-
-
-
- {{ row.operatorName || '-' }}
-
-
- {{ formatAdminDateTime(row.createdAt) }}
-
-
-
-
- {{ row.recordId || '-' }}
-
- 任务:{{ row.taskNo }}
-
- · 匹配{{ getMatchConfidenceLabel(row.matchConfidence) }}
-
-
-
-
-
-
-
-
- 生成图片
-
-
-
-
-
-
-
-
-
-
-
-
![发货记录图片预览]()
-
-
- 关闭
- 下载图片
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/dashboard/AdminDashboardView.vue b/apps/frontend-vue/src/views/admin/dashboard/AdminDashboardView.vue
deleted file mode 100644
index 4d73b0ec..00000000
--- a/apps/frontend-vue/src/views/admin/dashboard/AdminDashboardView.vue
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ card.label }}
- {{ summary?.[card.key] ?? 0 }}
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue b/apps/frontend-vue/src/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue
deleted file mode 100644
index b51c35c8..00000000
--- a/apps/frontend-vue/src/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillment.css b/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillment.css
deleted file mode 100644
index 31127b27..00000000
--- a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillment.css
+++ /dev/null
@@ -1,271 +0,0 @@
-.admin-panel {
- display: grid;
- gap: var(--space-4);
-}
-
-.fulfillment-simple-page {
- min-width: 0;
-}
-
-.fulfillment-overview {
- display: grid;
- grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(120px, auto);
- gap: var(--space-3);
- align-items: stretch;
-}
-
-.metric-card {
- display: grid;
- gap: var(--space-2);
- min-width: 0;
- padding: var(--space-4);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-md);
- background: var(--bg-surface);
-}
-
-.metric-card span {
- color: var(--text-secondary);
- font-size: var(--text-sm);
-}
-
-.metric-card strong {
- color: var(--text-primary);
- font-size: var(--text-2xl);
- line-height: 1.1;
-}
-
-.overview-actions {
- display: flex;
- justify-content: flex-end;
- align-items: center;
-}
-
-.fulfillment-layout {
- display: grid;
- grid-template-columns: minmax(240px, 300px) minmax(0, 1fr);
- gap: var(--space-4);
- align-items: start;
-}
-
-.source-panel,
-.catalog-panel {
- min-width: 0;
- border: 1px solid var(--border-default);
- border-radius: var(--radius-md);
- background: var(--bg-surface);
-}
-
-.source-panel {
- display: grid;
- gap: var(--space-3);
- padding: var(--space-4);
-}
-
-.catalog-panel {
- display: grid;
- gap: var(--space-4);
- padding: var(--space-4);
-}
-
-.section-head {
- display: grid;
- gap: var(--space-1);
-}
-
-.section-head h3 {
- margin: 0;
- color: var(--text-primary);
- font-size: var(--text-lg);
- font-weight: 700;
-}
-
-.section-head p {
- margin: 0;
- color: var(--text-secondary);
- font-size: var(--text-sm);
-}
-
-.source-list {
- display: grid;
- gap: var(--space-2);
-}
-
-.source-item {
- display: flex;
- width: 100%;
- min-width: 0;
- justify-content: space-between;
- gap: var(--space-3);
- align-items: center;
- padding: var(--space-3);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-sm);
- background: var(--bg-surface);
- color: inherit;
- text-align: left;
- cursor: pointer;
-}
-
-.source-item:hover,
-.source-item--active {
- border-color: var(--color-primary);
- background: var(--bg-subtle);
-}
-
-.source-item span {
- display: grid;
- gap: 4px;
- min-width: 0;
-}
-
-.source-item strong,
-.source-item small {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.source-item strong {
- color: var(--text-primary);
-}
-
-.source-item small {
- color: var(--text-secondary);
-}
-
-.catalog-toolbar {
- display: flex;
- justify-content: space-between;
- gap: var(--space-3);
- align-items: flex-start;
-}
-
-.catalog-toolbar-actions {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
- justify-content: flex-end;
-}
-
-.match-checker {
- display: grid;
- grid-template-columns: minmax(260px, 1fr) auto;
- gap: var(--space-3);
- align-items: center;
- padding: var(--space-3);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-md);
- background: var(--bg-subtle);
-}
-
-.sku-table {
- width: 100%;
-}
-
-.sku-list-panel {
- display: grid;
- gap: var(--space-3);
- min-width: 0;
- padding-top: var(--space-2);
- border-top: 1px solid var(--border-default);
-}
-
-.sku-name-cell {
- display: grid;
- gap: 4px;
- min-width: 0;
-}
-
-.sku-name-cell strong {
- color: var(--text-primary);
-}
-
-.sku-name-cell small {
- color: var(--text-secondary);
- line-height: 1.5;
-}
-
-.match-name {
- display: inline-block;
- max-width: 100%;
- padding: 2px 6px;
- border-radius: var(--radius-sm);
- background: var(--bg-subtle);
- color: var(--text-primary);
- white-space: normal;
- word-break: break-all;
-}
-
-.override-panel {
- display: grid;
- gap: var(--space-4);
- min-width: 0;
- padding: var(--space-4);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-md);
- background: var(--bg-subtle);
-}
-
-.override-actions {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
- justify-content: flex-end;
- align-items: center;
-}
-
-.override-rule-list {
- display: grid;
- gap: var(--space-3);
-}
-
-.override-rule-item {
- display: grid;
- gap: var(--space-3);
- min-width: 0;
- padding: var(--space-3);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-md);
- background: var(--bg-surface);
-}
-
-.override-rule-head {
- display: grid;
- grid-template-columns: auto minmax(220px, 1fr) minmax(160px, 220px) auto;
- gap: var(--space-2);
- align-items: center;
-}
-
-.delivery-item-list {
- display: grid;
- gap: var(--space-2);
-}
-
-.delivery-item-row {
- display: grid;
- grid-template-columns: minmax(220px, 1.1fr) minmax(180px, 1fr) 120px auto;
- gap: var(--space-2);
- align-items: center;
-}
-
-@media (max-width: 960px) {
- .fulfillment-overview,
- .fulfillment-layout,
- .match-checker,
- .override-rule-head,
- .delivery-item-row {
- grid-template-columns: 1fr;
- }
-
- .overview-actions,
- .catalog-toolbar,
- .catalog-toolbar-actions,
- .override-actions {
- justify-content: stretch;
- }
-
- .catalog-toolbar {
- flex-direction: column;
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillmentView.vue b/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillmentView.vue
deleted file mode 100644
index f9653ff3..00000000
--- a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillmentView.vue
+++ /dev/null
@@ -1,545 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 履约账号
- {{ metrics.readySourceCount }} / {{ metrics.sourceCount }}
-
-
- 可发商品
- {{ metrics.skuCount }}
-
-
- 总库存
- {{ metrics.inventoryTotal }}
-
-
- 覆盖规则
- {{ overrideRuleCount }}
-
-
- 刷新
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 命中 #{{ matchedSku.id }} {{ matchedSku.name }}
-
-
- 未命中
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 删除
-
-
-
-
-
- handleDeliverySkuChange(item, value)"
- >
-
-
-
-
-
- 删除
-
-
-
增加发货商品
-
-
-
-
-
-
-
-
-
-
cloudtentacles 商品列表
-
用于核对商品名、库存和覆盖规则里的发货商品。
-
-
-
-
-
-
- {{ row.name || '-' }}
- #{{ row.id }} · {{ row.description || row.name || '-' }}
-
-
-
-
-
- {{ row.name || '-' }}
-
-
-
- {{ formatCloudPrice(row.price) }}
-
-
-
-
- {{ row.buyLimitMin || 1 }} - {{ row.buyLimitMax || 1 }}
-
-
-
-
-
- {{ Number(row.inventory || 0) > 0 ? '可履约' : '无库存' }}
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-feifei/AdminKuaishouFeifeiFulfillmentView.vue b/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-feifei/AdminKuaishouFeifeiFulfillmentView.vue
deleted file mode 100644
index 7df3ae92..00000000
--- a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-feifei/AdminKuaishouFeifeiFulfillmentView.vue
+++ /dev/null
@@ -1,349 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ metric.label }}
- {{ metric.value }}
- {{ metric.detail }}
-
-
- 刷新
-
- 同步商品映射
-
-
-
-
-
-
-
-
商品名字映射
-
{{ lastSyncText || 'feifei 商品名会按规范化名字匹配 91 商品名。' }}
-
-
-
-
-
- 预览命中
-
-
-
- {{ matchResult.matched ? '已命中' : '未命中' }}
-
- {{ matchResult.match.productName }} -> {{ matchResult.match.productCode }}
-
- {{ matchResult.normalizedProductName || matchResult.productName }}
-
-
-
-
-
-
-
-
- {{ row.productName || row.skuName || '-' }}
- {{ row.normalizedProductName || '-' }}
-
-
-
-
-
-
-
-
- {{ row.enabled !== false ? '启用' : '停用' }}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/layout/AdminLayout.vue b/apps/frontend-vue/src/views/admin/layout/AdminLayout.vue
deleted file mode 100644
index d39a67a9..00000000
--- a/apps/frontend-vue/src/views/admin/layout/AdminLayout.vue
+++ /dev/null
@@ -1,450 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/orders/AdminOrderDetailView.vue b/apps/frontend-vue/src/views/admin/orders/AdminOrderDetailView.vue
deleted file mode 100644
index 6e1c3192..00000000
--- a/apps/frontend-vue/src/views/admin/orders/AdminOrderDetailView.vue
+++ /dev/null
@@ -1,487 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ detail.order.platformOrderId }}
-
- {{ detail.order.provider }} / {{ detail.order.platform }}
-
-
-
-
-
-
-
- 91 商品
- {{ detail.order.itemSummary || '-' }}
- 用于匹配 cloudtentacles 商品或覆盖规则
-
-
- 核销店铺
- {{ detail.order.shopName || detail.order.shopId || '-' }}
- shopId:{{ detail.order.shopId || '-' }}
-
-
- 订单金额
- {{ detail.order.totalAmount }} {{ detail.order.currency }}
- 支付:{{ formatAdminDateTime(detail.order.paidAt) }}
-
-
- 履约进度
-
- {{ resolveOrderProgressText(detail.order.fulfillmentProgress) }}
-
-
- 完成 {{ detail.order.fulfillmentProgress.completedTaskCount }}/{{ detail.order.fulfillmentProgress.totalTaskCount }}
- · 资源 {{ detail.order.fulfillmentProgress.preparedTaskCount }}/{{ detail.order.fulfillmentProgress.totalTaskCount }}
-
-
-
-
-
-
-
- 内部订单
- - {{ detail.order.orderId }}
-
-
-
- 创建时间
- - {{ formatAdminDateTime(detail.order.createdAt) }}
-
-
-
- 更新时间
- - {{ formatAdminDateTime(detail.order.updatedAt) }}
-
-
-
-
-
-
-
电子凭证
-
- 重发发码回调
-
-
-
-
-
-
-
- {{ formatAdminDateTime(row.sendCallbackSentAt) }}
-
-
-
- {{ row.sendCallbackLastError || '-' }}
-
-
-
-
-
- 履约任务
-
-
-
- {{ row.taskNo }}
-
-
-
-
-
-
-
-
-
-
- {{ resolveResourceStageLabel(row.resourceStatus) }}
-
-
-
-
-
-
- {{ resolveCustomerStageLabel(row.customerStatus) }}
-
-
-
-
- {{ row.lastError || '-' }}
-
-
-
-
-
- 商品子项
-
-
-
-
-
- {{ formatSpecSummary(row.spec) }}
-
-
-
-
-
- 原始载荷
-
- 展开查看原始订单 JSON
- {{ formatJsonBlock(detail.order.rawPayload) }}
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/orders/AdminOrdersView.vue b/apps/frontend-vue/src/views/admin/orders/AdminOrdersView.vue
deleted file mode 100644
index 6d78eb19..00000000
--- a/apps/frontend-vue/src/views/admin/orders/AdminOrdersView.vue
+++ /dev/null
@@ -1,471 +0,0 @@
-
-
-
-
-
-
- 共 {{ pagination.total }} 条订单
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 重置
- 查询
-
-
-
-
-
- 当前页
- 已支付 {{ summary.paidCount }}
- 已退款 {{ summary.refundedCount }}
- 已完成 {{ summary.completedCount }}
- 需关注 {{ summary.issueCount }}
-
-
-
-
-
-
-
-
-
-
-
- 订单明细
- 第 {{ pagination.page }} 页,当前展示 {{ items.length }} 条
-
-
-
-
-
-
-
- {{ row.platformOrderId }}
-
-
- {{ row.platform || "-" }}
-
- 核销店铺 {{ resolveShopLabel(row) }}
-
-
-
-
-
-
-
-
- {{
- resolveItemSummary(row)
- }}
- {{ row.itemCount }} 项 · 合计 {{ row.totalQuantity }} 件
- 履约任务 {{ row.taskCount }} 个
-
-
-
-
-
-
-
{{ resolveFollowUpText(row) }}
-
-
- 客户 {{ resolveCustomerStageLabel(row.customerStatus) }}
- · 资源 {{ resolveResourceStageLabel(row.resourceStatus) }}
- · {{ row.completedTaskCount }}/{{ row.taskCount }}
-
-
-
-
-
-
-
- {{ row.totalAmount }} {{ row.currency }}
- 支付 {{ formatAdminDateTime(row.paidAt) }}
- 更新 {{ formatAdminDateTime(row.updatedAt) }}
-
-
-
-
-
- 详情
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/AdminPlatformShopsView.vue b/apps/frontend-vue/src/views/admin/platform-shops/AdminPlatformShopsView.vue
deleted file mode 100644
index 50bbb55b..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/AdminPlatformShopsView.vue
+++ /dev/null
@@ -1,539 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ activeOverview.tag }}
-
{{ activeOverview.label }}
-
{{ activeOverview.meta }}
-
-
-
- {{ activeOverview.unit }}
- {{ activeOverview.value }}
-
-
{{ activeOverview.status }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/AdminPlatformNinetyoneSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/AdminPlatformNinetyoneSection.vue
deleted file mode 100644
index 3e4b4214..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/AdminPlatformNinetyoneSection.vue
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesConfigCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesConfigCard.vue
deleted file mode 100644
index e7630d18..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesConfigCard.vue
+++ /dev/null
@@ -1,623 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ currentSource?.label || currentSource?.key || '未选择账号' }}
-
- {{
- currentSession?.hasToken
- ? `最近登录:${formatAdminDateTime(currentSession.loggedInAt)}`
- : '当前还没有可用 token'
- }}
-
-
-
-
- {{ currentSourceEnabled ? '已启用' : '已停用' }}
-
- {
- if (currentSource) currentSource.enabled = Boolean(value)
- }
- "
- />
-
- 删除账号
-
-
-
-
-
-
-
-
- {
- if (currentSource) currentSource.label = String(value)
- }
- "
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
登录与会话
-
发送验证码后测试登录;已有 token 可直接校验。
-
-
-
- 发送验证码
-
-
- 测试登录
-
-
- 校验 token
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 短信
- {{ cloudtentaclesSmsResult ? '已发送' : '未执行' }}
-
- {{
- cloudtentaclesSmsResult
- ? `${cloudtentaclesSmsResult.phoneMasked} · ${formatAdminDateTime(cloudtentaclesSmsResult.sentAt)}`
- : '先确认手机号可用'
- }}
-
-
-
- 登录
- {{ cloudtentaclesLoginResult ? '成功' : '未执行' }}
-
- {{
- cloudtentaclesLoginResult
- ? `${cloudtentaclesLoginResult.phoneMasked} · ${formatAdminDateTime(cloudtentaclesLoginResult.loggedInAt)}`
- : '填写验证码后测试登录'
- }}
-
-
-
- 会话
- {{ cloudtentaclesValidateResult ? '已校验' : '未执行' }}
-
- {{
- cloudtentaclesValidateResult
- ? `权限 ${cloudtentaclesValidateResult.session.permissionCount} 项 · 余额 ${cloudtentaclesValidateResult.asset}`
- : '登录成功后校验 token'
- }}
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesDebugCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesDebugCard.vue
deleted file mode 100644
index 58bec998..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesDebugCard.vue
+++ /dev/null
@@ -1,267 +0,0 @@
-
-
-
-
-
-
-
-
- 开发调试工具
- 分类、SKU、虚拟号和完整流程调试
-
-
-
-
-
-
基础
-
-
- 余额
-
-
- 分类
-
-
- SKU
-
-
- 背包
-
-
-
-
-
-
履约
-
-
- 购买
-
-
- 发货
-
-
- 完整流程
-
-
-
-
-
-
虚拟号
-
-
- 列表
-
-
- 申请
-
-
- 登录码
-
-
- 验证码
-
-
- 校验
-
-
- 兑换链接
-
-
- 退还
-
-
-
-
-
- {{
- cloudtentaclesDebugResult
- }}
- 执行调试动作后显示原始返回数据。
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesInfoCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesInfoCard.vue
deleted file mode 100644
index 89fcd93b..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesInfoCard.vue
+++ /dev/null
@@ -1,237 +0,0 @@
-
-
-
-
-
-
履约账号
-
cloudtentacles
-
管理外部履约账号、短信登录和 token 会话。订单来源同步不在这里处理。
-
-
-
-
- 账号
- {{ sources.length }}
-
-
- 已保存 token
- {{ countSavedTokens(sessions) }}
-
-
- 当前账号
- {{ selectedSourceKey || '-' }}
-
-
- 当前 token
-
- {{
- cloudtentaclesPersistedSession?.hasToken
- ? cloudtentaclesPersistedSession.tokenMasked
- : '未保存'
- }}
-
-
- {{ formatAdminDateTime(cloudtentaclesPersistedSession.loggedInAt) }}
-
-
-
-
-
- 配置 {{ cloudtentaclesFilePath || '-' }}
- 会话 {{ cloudtentaclesSessionFilePath || '-' }}
-
-
-
-
- {{ source.label || source.key }}
- {{ sessions[source.key]?.hasToken ? sessions[source.key]?.tokenMasked : '未登录' }}
-
-
- {{ key }}
- {{ session.hasToken ? session.tokenMasked : '孤立会话' }}
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesResultCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesResultCard.vue
deleted file mode 100644
index 4b00a782..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesResultCard.vue
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
cloudtentacles 调试结果
-
- 用于确认当前账号会话、权限和用户信息,后续发货执行器会复用这里的登录能力。
-
-
-
-
-
-
- 原始 token 已写入上方输入框,可继续用于校验或后续调试。
-
-
-
- {{
- (
- cloudtentaclesValidateResult?.session.permissions ||
- cloudtentaclesLoginResult?.session.permissions ||
- []
- ).join('、') || '暂无'
- }}
-
-
-
- 可用于确认当前履约账号状态。
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminPlatformCloudtentaclesSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminPlatformCloudtentaclesSection.vue
deleted file mode 100644
index eb385475..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminPlatformCloudtentaclesSection.vue
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketDebug.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketDebug.vue
deleted file mode 100644
index f74a19ed..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketDebug.vue
+++ /dev/null
@@ -1,276 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- eTicketId
- {{ kuaishouEticketForm.eTicketId || '查询后回填' }}
-
-
- oid
- {{ kuaishouEticketForm.oid || '查询后回填' }}
-
-
- formToken
- {{ kuaishouEticketForm.formToken || '查询后回填' }}
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketInfoCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketInfoCard.vue
deleted file mode 100644
index db756f30..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketInfoCard.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
快手小店核销
-
- 独立维护店铺 Cookie,选择目标店铺后查询券码并执行核销。
-
-
-
- 配置文件
- {{ kuaishouEticketFilePath || '-' }}
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketResults.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketResults.vue
deleted file mode 100644
index 17ea0075..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketResults.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
核销详情返回
-
成功查询后会自动回填 eTicketId、oid、formToken 和建议核销数量。
-
-
- {{ JSON.stringify(kuaishouEticketDetailResult.raw, null, 2) }}
-
-
-
-
-
-
核销执行返回
-
这里保留接口原始响应,方便核对 result、error_msg 和 requestId。
-
-
- {{ JSON.stringify(kuaishouEticketConsumeResult.raw, null, 2) }}
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketShopConfig.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketShopConfig.vue
deleted file mode 100644
index 04958c50..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketShopConfig.vue
+++ /dev/null
@@ -1,470 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- activeKuaishouEticketShop.kshopName ||
- activeKuaishouEticketShop.shopId ||
- '未命名店铺'
- }}
-
-
{{ describeKuaishouEticketShop(activeKuaishouEticketShop) }}
-
-
-
-
- 删除
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
请选择或新增店铺
-
左侧选择店铺后,这里会显示 Cookie、店铺 ID 和识别结果。
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminPlatformKuaishouEticketSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminPlatformKuaishouEticketSection.vue
deleted file mode 100644
index b2169054..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminPlatformKuaishouEticketSection.vue
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-feifei/AdminPlatformKuaishouFeifeiSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-feifei/AdminPlatformKuaishouFeifeiSection.vue
deleted file mode 100644
index 60b2b30a..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-feifei/AdminPlatformKuaishouFeifeiSection.vue
+++ /dev/null
@@ -1,814 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationBarkCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationBarkCard.vue
deleted file mode 100644
index b19c75ea..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationBarkCard.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 删除
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationInfoCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationInfoCard.vue
deleted file mode 100644
index a6e18474..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationInfoCard.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
- 配置信息
-
-
- 内部运营通知,仅发送给后台管理员、客服或值班人员。
- 当前支持 Bark 与 WPush,两种通道可同时启用。
- {{
- notificationFilePath || '-'
- }}
- {{
- scheduledJobsFilePath || '-'
- }}
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationScheduledJobsCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationScheduledJobsCard.vue
deleted file mode 100644
index 0d66577e..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationScheduledJobsCard.vue
+++ /dev/null
@@ -1,548 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ formatJobType(job.type) }}
-
- {{ job.enabled ? '已启用' : '已停用' }}
-
-
-
- {{ getScheduledJobRuntime(job.id)?.lastMessage || '等待首次执行' }}
-
-
-
-
-
- 立即检查
-
-
-
-
-
-
-
-
-
-
-
-
- 任务状态
-
- {{ formatStatus(getScheduledJobRuntime(job.id)?.lastStatus || 'pending') }}
-
-
-
- 账号
- {{ getScheduledJobRuntime(job.id)?.lastCheckedCount ?? 0 }}
- / {{ job.accounts.length }} 已检查
-
-
- 预警
- {{ getScheduledJobRuntime(job.id)?.lastLowAssetCount ?? 0 }}
-
-
- 异常
- {{ getScheduledJobRuntime(job.id)?.lastFailedCount ?? 0 }}
-
-
- 上次
- {{
- formatAdminDateTime(getScheduledJobRuntime(job.id)?.lastRunAt || '')
- }}
-
-
- 下次
- {{
- formatAdminDateTime(getScheduledJobRuntime(job.id)?.nextRunAt || '')
- }}
-
-
-
-
-
-
- {{ account.label || account.sourceKey }}
- {{ account.sourceKey }}
- {{ formatAccountMeta(account) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- formatStatus(
- getAccountRuntime(getScheduledJobRuntime(job.id), account)?.status ||
- 'pending',
- )
- }}
-
-
- 余额
- {{ getAccountRuntime(getScheduledJobRuntime(job.id), account)?.asset ?? '-' }}
- / 阈值
- {{
- getAccountRuntime(getScheduledJobRuntime(job.id), account)?.threshold ??
- account.assetThreshold
- }}
-
-
-
- {{ formatAccountRuntimeSummary(getAccountRuntime(getScheduledJobRuntime(job.id), account)) }}
-
-
- {{
- formatAdminDateTime(
- getAccountRuntime(getScheduledJobRuntime(job.id), account)?.checkedAt || '',
- )
- }}
-
-
- 尚未检查
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationTestCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationTestCard.vue
deleted file mode 100644
index be099f27..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationTestCard.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 成功
- {{ notificationTestResult.successCount }}
-
-
- 失败
- {{ notificationTestResult.failedCount }}
-
-
- 通道
- {{ notificationTestResult.channel || '-' }}
-
-
-
-
-
-
- {{
- row.recipientName || row.recipientKeyMasked || '-'
- }}
-
-
-
- {{
- row.ok ? '成功' : '失败'
- }}
-
-
-
-
- {{ row.errorMessage || '-' }}
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationWpushCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationWpushCard.vue
deleted file mode 100644
index 5c741d8a..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationWpushCard.vue
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 删除
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminPlatformNotificationSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminPlatformNotificationSection.vue
deleted file mode 100644
index 07b00bcb..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminPlatformNotificationSection.vue
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/cloudtentaclesDefaults.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/cloudtentaclesDefaults.ts
deleted file mode 100644
index 392fa915..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/cloudtentaclesDefaults.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export const DEFAULT_CLOUDTENTACLES_DEVICE_ID =
- '08bc9d8c-fd15-48ea-bc00-8d754076cafc'
-export const DEFAULT_CLOUDTENTACLES_DEVICE_TYPE = 1
-
-export function normalizeCloudtentaclesDeviceId(value: unknown) {
- const normalized = String(value || '').trim()
- return normalized && normalized !== '-' ? normalized : DEFAULT_CLOUDTENTACLES_DEVICE_ID
-}
-
-export function normalizeCloudtentaclesDeviceType(value: unknown) {
- const parsed = Number(value)
- return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_CLOUDTENTACLES_DEVICE_TYPE
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/types.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/types.ts
deleted file mode 100644
index 4e014ace..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/types.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-export type PlatformTab =
- | 'notifications'
- | 'ninetyone'
- | 'kuaishouEticket'
- | 'kuaishouFeifei'
- | 'cloudtentacles'
-
-export type EditableKuaishouEticketShop = {
- id: string
- shopId: string
- kshopName: string
- cookie: string
- userAvatar: string
- enabled: boolean
-}
-
-export type EditableNotificationRecipient = {
- id: string
- name: string
- deviceKey: string
- enabled: boolean
-}
-
-export type EditableWpushRecipient = {
- id: string
- name: string
- apiKey: string
- enabled: boolean
-}
-
-export type EditableScheduledJob = {
- id: string
- type: string
- enabled: boolean
- intervalSeconds: number
- intervalSecondsAmount: number
- intervalSecondsUnit: number
- cooldownSeconds: number
- cooldownSecondsAmount: number
- cooldownSecondsUnit: number
- assetThreshold: number
- accounts: EditableScheduledJobAccount[]
-}
-
-export type EditableScheduledJobAccount = {
- sourceKey: string
- label: string
- enabled: boolean
- assetThreshold: number
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminCloudtentaclesPlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminCloudtentaclesPlatform.ts
deleted file mode 100644
index 61213af8..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminCloudtentaclesPlatform.ts
+++ /dev/null
@@ -1,498 +0,0 @@
-import { computed, ref } from 'vue'
-
-import { showError, showPrompt, showSuccess, isFeedbackDismissed } from '@/lib/feedback'
-import {
- deleteAdminCloudtentaclesSource,
- saveAdminCloudtentaclesSourceConfig,
- sendAdminCloudtentaclesSmsCode,
- testAdminCloudtentaclesLogin,
- validateAdminCloudtentaclesSession,
-} from '@/services/admin'
-import type {
- AdminCloudtentaclesLoginTestResult,
- AdminCloudtentaclesPersistedSession,
- AdminCloudtentaclesSendSmsResult,
- AdminCloudtentaclesSourceItem,
- AdminCloudtentaclesSessionsMap,
- AdminCloudtentaclesSourceConfigResponse,
- AdminCloudtentaclesSourcesConfig,
- AdminCloudtentaclesValidateSessionResult,
-} from '@/types/admin'
-
-import type { CloudtentaclesForm } from './useCloudtentaclesDebugActions'
-import {
- DEFAULT_CLOUDTENTACLES_DEVICE_ID,
- DEFAULT_CLOUDTENTACLES_DEVICE_TYPE,
- normalizeCloudtentaclesDeviceId,
- normalizeCloudtentaclesDeviceType,
-} from './cloudtentaclesDefaults'
-import { useCloudtentaclesDebugActions } from './useCloudtentaclesDebugActions'
-
-export function useAdminCloudtentaclesPlatform() {
- const cloudtentaclesFilePath = ref('')
- const cloudtentaclesSessionFilePath = ref('')
- const selectedSourceKey = ref('')
-
- const sources = ref([])
- const sessions = ref({})
-
- const cloudtentaclesForm = ref({
- baseUrl: 'https://123.207.217.176',
- username: '',
- password: '',
- phone: '',
- code: '',
- token: '',
- vnKey: '1',
- vnId: 0,
- skuId: 5,
- skuCount: 1,
- deviceId: DEFAULT_CLOUDTENTACLES_DEVICE_ID,
- deviceType: DEFAULT_CLOUDTENTACLES_DEVICE_TYPE,
- })
- const cloudtentaclesSaving = ref(false)
- const cloudtentaclesSendingSms = ref(false)
- const cloudtentaclesTesting = ref(false)
- const cloudtentaclesValidating = ref(false)
- const cloudtentaclesResultError = ref('')
- const cloudtentaclesSmsResult = ref(null)
- const cloudtentaclesLoginResult = ref(null)
- const cloudtentaclesValidateResult = ref(null)
- const cloudtentaclesPersistedSession = ref(null)
-
- const debugActions = useCloudtentaclesDebugActions(
- cloudtentaclesForm,
- cloudtentaclesResultError,
- selectedSourceKey,
- )
-
- const sourceOptions = computed(() => sources.value.map((s) => ({ key: s.key, label: s.label })))
-
- const currentSource = computed(
- () => sources.value.find((s) => s.key === selectedSourceKey.value) || sources.value[0],
- )
-
- const currentSession = computed(() => sessions.value[selectedSourceKey.value] || null)
- const currentSourceEnabled = computed({
- get: () => currentSource.value?.enabled !== false,
- set: (value: boolean) => {
- const source = sources.value.find((item) => item.key === selectedSourceKey.value)
- if (source) {
- source.enabled = value
- }
- },
- })
-
- const cloudtentaclesStats = computed(() => ({
- hasCredential: Boolean(
- cloudtentaclesForm.value.username.trim() &&
- cloudtentaclesForm.value.password.trim() &&
- cloudtentaclesForm.value.phone.trim(),
- ),
- smsSent: Boolean(cloudtentaclesSmsResult.value),
- validated: Boolean(cloudtentaclesValidateResult.value || cloudtentaclesLoginResult.value),
- sourceCount: sources.value.length,
- }))
-
- function createSourceLabel(index: number) {
- return `履约账号 ${index}`
- }
-
- function generateSourceKey() {
- let key = ''
- do {
- key = `account_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`
- } while (sources.value.some((source) => source.key === key))
- return key
- }
-
- function createEmptySource(label = createSourceLabel(sources.value.length + 1)) {
- return {
- key: generateSourceKey(),
- label,
- enabled: true,
- baseUrl: 'https://123.207.217.176',
- username: '',
- password: '',
- phone: '',
- deviceId: DEFAULT_CLOUDTENTACLES_DEVICE_ID,
- deviceType: DEFAULT_CLOUDTENTACLES_DEVICE_TYPE,
- } satisfies AdminCloudtentaclesSourceItem
- }
-
- function resetCloudtentaclesTransientState() {
- cloudtentaclesSmsResult.value = null
- cloudtentaclesLoginResult.value = null
- cloudtentaclesValidateResult.value = null
- cloudtentaclesResultError.value = ''
- }
-
- function persistCurrentFormToSelectedSource() {
- const source = sources.value.find((item) => item.key === selectedSourceKey.value)
- if (!source) return
-
- source.baseUrl = cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176'
- source.username = cloudtentaclesForm.value.username.trim()
- source.password = cloudtentaclesForm.value.password.trim()
- source.phone = cloudtentaclesForm.value.phone.trim()
- source.deviceId = normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId)
- source.deviceType = normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType)
- }
-
- function selectFallbackSource(preferredKey = '') {
- const preferred = sources.value.find((source) => source.key === preferredKey)
- selectedSourceKey.value = preferred?.key || sources.value[0]?.key || ''
- }
-
- function hydrateCloudtentaclesConfig(data: AdminCloudtentaclesSourceConfigResponse) {
- cloudtentaclesFilePath.value = data.filePath
- cloudtentaclesSessionFilePath.value = data.sessionFilePath
- sources.value = data.sources || []
- sessions.value = data.sessions || {}
-
- if (!sources.value.length) {
- sources.value.push(createEmptySource())
- }
-
- if (!sources.value.find((s) => s.key === selectedSourceKey.value)) {
- selectFallbackSource()
- }
-
- hydrateFormFromSource(selectedSourceKey.value)
- }
-
- function hydrateFormFromSource(sourceKey: string) {
- const source = sources.value.find((s) => s.key === sourceKey)
- const session = sessions.value[sourceKey]
- if (source) {
- cloudtentaclesForm.value = {
- baseUrl: source.baseUrl || 'https://123.207.217.176',
- username: source.username || '',
- password: source.password || '',
- phone: source.phone || '',
- code: '',
- token: session?.token || '',
- vnKey: '1',
- vnId: 0,
- skuId: 5,
- skuCount: 1,
- deviceId: normalizeCloudtentaclesDeviceId(source.deviceId),
- deviceType: normalizeCloudtentaclesDeviceType(source.deviceType),
- }
- }
- cloudtentaclesPersistedSession.value = session || null
- }
-
- function switchSource(sourceKey: string) {
- if (sourceKey === selectedSourceKey.value) return
- if (!sources.value.some((source) => source.key === sourceKey)) return
-
- persistCurrentFormToSelectedSource()
- selectedSourceKey.value = sourceKey
- resetCloudtentaclesTransientState()
- hydrateFormFromSource(sourceKey)
- }
-
- async function addSource() {
- try {
- const result = await showPrompt(
- '请输入账号显示名称(例如:生产履约号、夜班履约号)',
- '新增 cloudtentacles 账号',
- {
- inputPattern: /\S/,
- inputErrorMessage: '账号名称不能为空',
- },
- )
- const trimmed = (result.value as string).trim()
- if (!trimmed) {
- showError('账号名称不能为空')
- return
- }
- persistCurrentFormToSelectedSource()
- const newSource = createEmptySource(trimmed)
- sources.value.push(newSource)
- selectedSourceKey.value = newSource.key
- resetCloudtentaclesTransientState()
- hydrateFormFromSource(newSource.key)
- } catch (error) {
- if (isFeedbackDismissed(error)) return // user cancelled / closed
- showError(error instanceof Error ? error.message : '新增账号失败')
- }
- }
-
- async function removeSource(sourceKey: string) {
- const sourceIndex = sources.value.findIndex((source) => source.key === sourceKey)
- if (sourceIndex < 0) {
- showError('账号不存在')
- return
- }
-
- try {
- cloudtentaclesSaving.value = true
- persistCurrentFormToSelectedSource()
-
- if (sources.value.length === 1) {
- const replacement = createEmptySource()
- const response = await saveAdminCloudtentaclesSourceConfig({
- enabled: true,
- sources: [replacement],
- })
- cloudtentaclesFilePath.value = response.data.filePath
- cloudtentaclesSessionFilePath.value = response.data.sessionFilePath
- sources.value = response.data.sources
- sessions.value = response.data.sessions
- selectFallbackSource(replacement.key)
- } else {
- await deleteAdminCloudtentaclesSource(sourceKey)
- sources.value = sources.value.filter((s) => s.key !== sourceKey)
- delete sessions.value[sourceKey]
-
- if (selectedSourceKey.value === sourceKey) {
- const nextSource = sources.value[sourceIndex] || sources.value[sourceIndex - 1] || sources.value[0]
- selectFallbackSource(nextSource?.key)
- }
- }
- resetCloudtentaclesTransientState()
- hydrateFormFromSource(selectedSourceKey.value)
- showSuccess('账号已删除')
- } catch (error) {
- showError(error instanceof Error ? error.message : '删除账号失败')
- } finally {
- cloudtentaclesSaving.value = false
- }
- }
-
- function buildCloudtentaclesConfigPayload(): AdminCloudtentaclesSourcesConfig {
- persistCurrentFormToSelectedSource()
- return {
- enabled: true,
- sources: sources.value.map((s) => ({
- key: s.key,
- label: s.label,
- enabled: s.enabled !== false,
- baseUrl: s.baseUrl,
- username: s.username,
- password: s.password,
- phone: s.phone,
- deviceId: s.deviceId,
- deviceType: s.deviceType,
- })),
- }
- }
-
- function buildCloudtentaclesLoginPayload() {
- return {
- ...buildCloudtentaclesSourcePayload(),
- code: cloudtentaclesForm.value.code.trim(),
- sourceKey: selectedSourceKey.value,
- }
- }
-
- function buildCloudtentaclesSourcePayload() {
- return {
- baseUrl: cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176',
- username: cloudtentaclesForm.value.username.trim(),
- password: cloudtentaclesForm.value.password.trim(),
- phone: cloudtentaclesForm.value.phone.trim(),
- deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId),
- deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType),
- sourceKey: selectedSourceKey.value,
- }
- }
-
- function ensureCloudtentaclesBaseFields() {
- if (!cloudtentaclesForm.value.username.trim() || !cloudtentaclesForm.value.phone.trim()) {
- cloudtentaclesResultError.value = '请先填写 cloudtentacles 账号和手机号'
- return false
- }
- return true
- }
-
- function ensureCloudtentaclesLoginFields() {
- if (
- !cloudtentaclesForm.value.username.trim() ||
- !cloudtentaclesForm.value.password.trim() ||
- !cloudtentaclesForm.value.phone.trim()
- ) {
- cloudtentaclesResultError.value = '请先填写 cloudtentacles 账号、密码和手机号'
- return false
- }
-
- if (!cloudtentaclesForm.value.code.trim()) {
- cloudtentaclesResultError.value = '请先填写短信验证码'
- return false
- }
-
- return true
- }
-
- async function handleCloudtentaclesSaveSource() {
- cloudtentaclesSaving.value = true
- cloudtentaclesResultError.value = ''
-
- try {
- const response = await saveAdminCloudtentaclesSourceConfig(buildCloudtentaclesConfigPayload())
- cloudtentaclesFilePath.value = response.data.filePath
- cloudtentaclesSessionFilePath.value = response.data.sessionFilePath
- sources.value = response.data.sources
- sessions.value = response.data.sessions
- const session = sessions.value[selectedSourceKey.value]
- cloudtentaclesPersistedSession.value = session || null
- cloudtentaclesForm.value.token = session?.token || ''
- showSuccess('cloudtentacles 履约平台配置已保存')
- } catch (error) {
- cloudtentaclesResultError.value =
- error instanceof Error ? error.message : 'cloudtentacles 配置保存失败'
- showError(cloudtentaclesResultError.value)
- } finally {
- cloudtentaclesSaving.value = false
- }
- }
-
- async function handleCloudtentaclesSendSmsCode() {
- if (!ensureCloudtentaclesBaseFields()) {
- return
- }
-
- cloudtentaclesSendingSms.value = true
- cloudtentaclesResultError.value = ''
-
- try {
- const response = await sendAdminCloudtentaclesSmsCode(buildCloudtentaclesSourcePayload())
- cloudtentaclesSmsResult.value = response.data
- showSuccess('cloudtentacles 短信验证码已发送')
- } catch (error) {
- cloudtentaclesResultError.value =
- error instanceof Error ? error.message : 'cloudtentacles 发送短信验证码失败'
- showError(cloudtentaclesResultError.value)
- } finally {
- cloudtentaclesSendingSms.value = false
- }
- }
-
- async function handleCloudtentaclesTestLogin() {
- if (!ensureCloudtentaclesLoginFields()) {
- return
- }
-
- cloudtentaclesTesting.value = true
- cloudtentaclesResultError.value = ''
-
- try {
- const response = await testAdminCloudtentaclesLogin(buildCloudtentaclesLoginPayload())
- cloudtentaclesLoginResult.value = response.data
- cloudtentaclesForm.value.token = response.data.token || cloudtentaclesForm.value.token
- cloudtentaclesPersistedSession.value = {
- token: response.data.token || '',
- tokenMasked: response.data.session.tokenMasked,
- baseUrl: response.data.baseUrl,
- username: response.data.username,
- phoneMasked: response.data.phoneMasked,
- loggedInAt: response.data.loggedInAt,
- deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId),
- deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType),
- hasToken: Boolean(response.data.token),
- }
- // Update sessions map
- sessions.value[selectedSourceKey.value] = cloudtentaclesPersistedSession.value
- showSuccess('cloudtentacles 登录测试成功')
- } catch (error) {
- cloudtentaclesResultError.value =
- error instanceof Error ? error.message : 'cloudtentacles 登录测试失败'
- showError(cloudtentaclesResultError.value)
- } finally {
- cloudtentaclesTesting.value = false
- }
- }
-
- async function handleCloudtentaclesValidateSession() {
- const token = cloudtentaclesForm.value.token.trim()
- if (!token) {
- cloudtentaclesResultError.value = '请先填写 token'
- return
- }
-
- cloudtentaclesValidating.value = true
- cloudtentaclesResultError.value = ''
-
- try {
- const response = await validateAdminCloudtentaclesSession({
- baseUrl: cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176',
- token,
- deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId),
- deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType),
- sourceKey: selectedSourceKey.value,
- })
- cloudtentaclesValidateResult.value = response.data
- cloudtentaclesPersistedSession.value = {
- token,
- tokenMasked: response.data.session.tokenMasked,
- baseUrl: response.data.baseUrl,
- username:
- cloudtentaclesPersistedSession.value?.username ||
- cloudtentaclesForm.value.username.trim(),
- phoneMasked: cloudtentaclesPersistedSession.value?.phoneMasked || '',
- loggedInAt: response.data.loggedInAt,
- deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId),
- deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType),
- hasToken: Boolean(token),
- }
- // Update sessions map
- sessions.value[selectedSourceKey.value] = cloudtentaclesPersistedSession.value
- showSuccess('cloudtentacles 会话校验成功')
- } catch (error) {
- cloudtentaclesResultError.value =
- error instanceof Error ? error.message : 'cloudtentacles 会话校验失败'
- showError(cloudtentaclesResultError.value)
- } finally {
- cloudtentaclesValidating.value = false
- }
- }
-
- return {
- cloudtentaclesFilePath,
- cloudtentaclesSessionFilePath,
- cloudtentaclesForm,
- cloudtentaclesSaving,
- cloudtentaclesSendingSms,
- cloudtentaclesTesting,
- cloudtentaclesValidating,
- cloudtentaclesResultError,
- cloudtentaclesSmsResult,
- cloudtentaclesLoginResult,
- cloudtentaclesValidateResult,
- cloudtentaclesDebugLoading: debugActions.cloudtentaclesDebugLoading,
- cloudtentaclesDebugResult: debugActions.cloudtentaclesDebugResult,
- cloudtentaclesPersistedSession,
- cloudtentaclesStats,
- sources,
- sessions,
- selectedSourceKey,
- sourceOptions,
- currentSource,
- currentSession,
- currentSourceEnabled,
- hydrateCloudtentaclesConfig,
- switchSource,
- addSource,
- removeSource,
- handleCloudtentaclesSaveSource,
- handleCloudtentaclesSendSmsCode,
- handleCloudtentaclesTestLogin,
- handleCloudtentaclesValidateSession,
- handleCloudtentaclesFetchAsset: debugActions.handleCloudtentaclesFetchAsset,
- handleCloudtentaclesFetchCategories: debugActions.handleCloudtentaclesFetchCategories,
- handleCloudtentaclesFetchSkuList: debugActions.handleCloudtentaclesFetchSkuList,
- handleCloudtentaclesBuySku: debugActions.handleCloudtentaclesBuySku,
- handleCloudtentaclesUseSku: debugActions.handleCloudtentaclesUseSku,
- handleCloudtentaclesFetchKnapsack: debugActions.handleCloudtentaclesFetchKnapsack,
- handleCloudtentaclesFetchVnList: debugActions.handleCloudtentaclesFetchVnList,
- handleCloudtentaclesAppointVn: debugActions.handleCloudtentaclesAppointVn,
- handleCloudtentaclesGenerateVnLoginCode: debugActions.handleCloudtentaclesGenerateVnLoginCode,
- handleCloudtentaclesFetchVnCode: debugActions.handleCloudtentaclesFetchVnCode,
- handleCloudtentaclesVerifyVnCode: debugActions.handleCloudtentaclesVerifyVnCode,
- handleCloudtentaclesFetchBindUrl: debugActions.handleCloudtentaclesFetchBindUrl,
- handleCloudtentaclesBackVn: debugActions.handleCloudtentaclesBackVn,
- handleCloudtentaclesRunFullFlow: debugActions.handleCloudtentaclesRunFullFlow,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminKuaishouEticketPlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminKuaishouEticketPlatform.ts
deleted file mode 100644
index eefa91d4..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminKuaishouEticketPlatform.ts
+++ /dev/null
@@ -1,328 +0,0 @@
-import { ref, computed } from 'vue'
-import { showError, showSuccess } from '@/lib/feedback'
-import {
- consumeAdminKuaishouEticket,
- queryAdminKuaishouEticketDetail,
- queryAdminKuaishouEticketShopInfo,
- saveAdminKuaishouEticketSourceConfig,
-} from '@/services/admin'
-import type {
- AdminKuaishouEticketConsumeResult,
- AdminKuaishouEticketDetailResult,
- AdminKuaishouEticketShopInfoResult,
- AdminKuaishouEticketSourceConfig,
-} from '@/types/admin'
-import type { EditableKuaishouEticketShop } from './types'
-import { useKuaishouEticketShopManager } from './useKuaishouEticketShopManager'
-
-type KuaishouEticketForm = {
- baseUrl: string
- selectedShopId: string
- queryTicketCode: string
- eTicketId: string
- oid: string
- formToken: string
- num: number
- storeId: string
-}
-
-export function useAdminKuaishouEticketPlatform() {
- const shopManager = useKuaishouEticketShopManager()
-
- const kuaishouEticketFilePath = ref('')
- const kuaishouEticketForm = ref({
- baseUrl: 'https://s.kwaixiaodian.com',
- selectedShopId: '',
- queryTicketCode: '',
- eTicketId: '',
- oid: '',
- formToken: '',
- num: 1,
- storeId: '0',
- })
- const kuaishouEticketSaving = ref(false)
- const kuaishouEticketResolvingShopId = ref('')
- const kuaishouEticketDetailing = ref(false)
- const kuaishouEticketConsuming = ref(false)
- const kuaishouEticketResultError = ref('')
- const kuaishouEticketShopInfoResult = ref(null)
- const kuaishouEticketDetailResult = ref(null)
- const kuaishouEticketConsumeResult = ref(null)
-
- const activeKuaishouEticketShop = computed(
- () =>
- shopManager.kuaishouEticketShops.value.find(
- (item) => item.id === kuaishouEticketForm.value.selectedShopId,
- ) || null,
- )
-
- const kuaishouEticketStats = computed(() => ({
- configuredShopCount: shopManager.kuaishouEticketShops.value.length,
- cookieReadyCount: shopManager.kuaishouEticketShops.value.filter((item) => item.cookie.trim()).length,
- selectedShopReady: Boolean(activeKuaishouEticketShop.value?.cookie.trim()),
- detailReady: Boolean(kuaishouEticketDetailResult.value?.detail),
- consumed: Boolean(kuaishouEticketConsumeResult.value?.consumed),
- }))
-
- function hydrateKuaishouEticketConfig(data: {
- filePath: string
- source: AdminKuaishouEticketSourceConfig
- }) {
- kuaishouEticketFilePath.value = data.filePath
- shopManager.setShopsFromConfig(data.source.shops)
- kuaishouEticketForm.value = {
- baseUrl: data.source.baseUrl || 'https://s.kwaixiaodian.com',
- selectedShopId: '',
- queryTicketCode: '',
- eTicketId: '',
- oid: '',
- formToken: '',
- num: 1,
- storeId: '0',
- }
- kuaishouEticketForm.value.selectedShopId = shopManager.kuaishouEticketShops.value[0]?.id || ''
- }
-
- function buildKuaishouEticketConfigPayload(): AdminKuaishouEticketSourceConfig {
- return {
- enabled: true,
- baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com',
- shops: shopManager.kuaishouEticketShops.value.map((item) => ({
- shopId: item.shopId.trim(),
- kshopName: item.kshopName.trim(),
- cookie: item.cookie.trim(),
- cookieMasked: '',
- hasCookie: Boolean(item.cookie.trim()),
- userAvatar: item.userAvatar.trim(),
- enabled: item.enabled,
- })),
- }
- }
-
- function addKuaishouEticketShop() {
- const { newSelectedId } = shopManager.addKuaishouEticketShop()
- setKuaishouEticketDebugShop(newSelectedId)
- }
-
- function removeKuaishouEticketShop(id: string) {
- kuaishouEticketForm.value.selectedShopId = shopManager.removeKuaishouEticketShop(
- id,
- kuaishouEticketForm.value.selectedShopId,
- )
- }
-
- function setKuaishouEticketDebugShop(id: string) {
- kuaishouEticketForm.value.selectedShopId = id
- }
-
- function ensureSelectedKuaishouEticketShop() {
- const selected = activeKuaishouEticketShop.value
-
- if (!selected) {
- kuaishouEticketResultError.value = '请先新增并选择一个店铺配置'
- return null
- }
-
- if (!selected.cookie.trim()) {
- kuaishouEticketResultError.value = '当前店铺缺少 Cookie,请先补全后再操作'
- return null
- }
-
- return selected
- }
-
- function ensureKuaishouEticketQueryFields() {
- const selected = ensureSelectedKuaishouEticketShop()
- if (!selected) return false
-
- if (!kuaishouEticketForm.value.queryTicketCode.trim()) {
- kuaishouEticketResultError.value = '请先填写查询券码'
- return false
- }
-
- return true
- }
-
- function ensureKuaishouEticketConsumeFields() {
- const selected = ensureSelectedKuaishouEticketShop()
- if (!selected) return false
-
- if (!kuaishouEticketDetailResult.value?.detail) {
- kuaishouEticketResultError.value =
- '请先查询核销信息,系统会自动带出 eTicketId、oid 和 formToken'
- return false
- }
-
- return true
- }
-
- function applyKuaishouEticketDetailToForm(result: AdminKuaishouEticketDetailResult | null) {
- if (!result?.detail) {
- return
- }
-
- kuaishouEticketForm.value.eTicketId =
- result.detail.eTicketId || kuaishouEticketForm.value.eTicketId
- kuaishouEticketForm.value.oid = result.detail.oid || kuaishouEticketForm.value.oid
- kuaishouEticketForm.value.formToken =
- result.detail.formToken || kuaishouEticketForm.value.formToken
-
- const leftCount = Number(result.detail.leftCount || 0)
- if (leftCount > 0) {
- kuaishouEticketForm.value.num = leftCount
- }
- }
-
- async function handleKuaishouEticketResolveShopInfo(shop: EditableKuaishouEticketShop) {
- if (!shop.cookie.trim()) {
- kuaishouEticketResultError.value = '请先为该店铺粘贴 Cookie'
- showError(kuaishouEticketResultError.value)
- return
- }
-
- kuaishouEticketResolvingShopId.value = shop.id
- kuaishouEticketResultError.value = ''
-
- try {
- const response = await queryAdminKuaishouEticketShopInfo({
- baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com',
- shopId: shop.shopId.trim(),
- cookie: shop.cookie.trim(),
- })
- kuaishouEticketShopInfoResult.value = response.data
- shop.shopId = response.data.shop.shopId || shop.shopId
- shop.kshopName = response.data.shop.kshopName || shop.kshopName
- shop.userAvatar = response.data.shop.userAvatar || shop.userAvatar
- if (!kuaishouEticketForm.value.selectedShopId) {
- setKuaishouEticketDebugShop(shop.id)
- }
- showSuccess(
- `已识别店铺:${response.data.shop.kshopName || response.data.shop.shopId || '未知店铺'}`,
- )
- } catch (error) {
- kuaishouEticketResultError.value =
- error instanceof Error ? error.message : '读取快手小店店铺信息失败'
- showError(kuaishouEticketResultError.value)
- } finally {
- kuaishouEticketResolvingShopId.value = ''
- }
- }
-
- async function handleKuaishouEticketSaveSource() {
- kuaishouEticketSaving.value = true
- kuaishouEticketResultError.value = ''
-
- try {
- const response = await saveAdminKuaishouEticketSourceConfig(
- buildKuaishouEticketConfigPayload(),
- )
- kuaishouEticketFilePath.value = response.data.filePath
- kuaishouEticketForm.value.baseUrl =
- response.data.source.baseUrl || 'https://s.kwaixiaodian.com'
- const previousSelectedShopId = activeKuaishouEticketShop.value?.shopId || ''
- shopManager.setShopsFromConfig(response.data.source.shops)
- kuaishouEticketForm.value.selectedShopId =
- shopManager.findShopByShopId(previousSelectedShopId)?.id ||
- shopManager.kuaishouEticketShops.value[0]?.id ||
- ''
- showSuccess('快手小店核销配置已保存')
- } catch (error) {
- kuaishouEticketResultError.value =
- error instanceof Error ? error.message : '快手小店核销配置保存失败'
- showError(kuaishouEticketResultError.value)
- } finally {
- kuaishouEticketSaving.value = false
- }
- }
-
- async function handleKuaishouEticketQueryDetail() {
- if (!ensureKuaishouEticketQueryFields()) {
- return
- }
-
- const selected = activeKuaishouEticketShop.value
- kuaishouEticketDetailing.value = true
- kuaishouEticketResultError.value = ''
- kuaishouEticketConsumeResult.value = null
-
- try {
- const response = await queryAdminKuaishouEticketDetail({
- baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com',
- shopId: selected?.shopId.trim(),
- cookie: selected?.cookie.trim(),
- eTicketId: kuaishouEticketForm.value.queryTicketCode.trim(),
- })
- kuaishouEticketDetailResult.value = response.data
- applyKuaishouEticketDetailToForm(response.data)
- showSuccess(
- response.data.ok ? '核销信息查询成功' : response.data.errorMessage || '核销信息已返回',
- )
- } catch (error) {
- kuaishouEticketResultError.value =
- error instanceof Error ? error.message : '查询快手小店核销信息失败'
- showError(kuaishouEticketResultError.value)
- } finally {
- kuaishouEticketDetailing.value = false
- }
- }
-
- async function handleKuaishouEticketConsume() {
- if (!ensureKuaishouEticketConsumeFields()) {
- return
- }
-
- const selected = activeKuaishouEticketShop.value
- kuaishouEticketConsuming.value = true
- kuaishouEticketResultError.value = ''
-
- try {
- const detail = kuaishouEticketDetailResult.value?.detail
- const response = await consumeAdminKuaishouEticket({
- baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com',
- shopId: selected?.shopId.trim(),
- cookie: selected?.cookie.trim(),
- eTicketId: String(detail?.eTicketId || kuaishouEticketForm.value.eTicketId || '').trim(),
- oid: String(detail?.oid || kuaishouEticketForm.value.oid || '').trim(),
- formToken: String(detail?.formToken || kuaishouEticketForm.value.formToken || '').trim(),
- num: Number(kuaishouEticketForm.value.num || 1),
- storeId: kuaishouEticketForm.value.storeId.trim() || '0',
- })
- kuaishouEticketConsumeResult.value = response.data
- showSuccess(
- response.data.ok ? '快手小店核销成功' : response.data.errorMessage || '核销请求已执行',
- )
- } catch (error) {
- kuaishouEticketResultError.value =
- error instanceof Error ? error.message : '执行快手小店核销失败'
- showError(kuaishouEticketResultError.value)
- } finally {
- kuaishouEticketConsuming.value = false
- }
- }
-
- return {
- kuaishouEticketFilePath,
- kuaishouEticketShops: shopManager.kuaishouEticketShops,
- kuaishouEticketForm,
- kuaishouEticketSaving,
- kuaishouEticketResolvingShopId,
- kuaishouEticketDetailing,
- kuaishouEticketConsuming,
- kuaishouEticketResultError,
- kuaishouEticketShopInfoResult,
- kuaishouEticketDetailResult,
- kuaishouEticketConsumeResult,
- activeKuaishouEticketShop,
- kuaishouEticketStats,
- hydrateKuaishouEticketConfig,
- addKuaishouEticketShop,
- removeKuaishouEticketShop,
- setKuaishouEticketDebugShop,
- describeKuaishouEticketShop: shopManager.describeKuaishouEticketShop,
- getKuaishouEticketShopInitial: shopManager.getKuaishouEticketShopInitial,
- handleKuaishouEticketResolveShopInfo,
- handleKuaishouEticketSaveSource,
- handleKuaishouEticketQueryDetail,
- handleKuaishouEticketConsume,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNinetyonePlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNinetyonePlatform.ts
deleted file mode 100644
index 9650ac27..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNinetyonePlatform.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import { computed, ref } from 'vue'
-
-import { showConfirm, showError, showSuccess } from '@/lib/feedback'
-import {
- failAdminNinetyoneOrder,
- fetchAdminNinetyoneOrders,
- retryAdminNinetyoneOrder,
-} from '@/services/admin'
-import type { AdminNinetyoneOrderItem, AdminNinetyoneOrderListResult } from '@/types/admin'
-
-export function useAdminNinetyonePlatform() {
- const ninetyoneLoading = ref(false)
- const ninetyoneActionLoadingId = ref(null)
- const ninetyoneResultError = ref('')
- const ninetyoneStatus = ref<'pending_config' | 'all' | 'manual_failed'>('pending_config')
- const ninetyoneOrders = ref({
- page: 1,
- pageSize: 20,
- total: 0,
- items: [],
- })
-
- const ninetyoneStats = computed(() => {
- const pendingCount = ninetyoneOrders.value.items.filter(
- (item) => item.orderStatus === 'pending_config',
- ).length
- const failedCount = ninetyoneOrders.value.items.filter(
- (item) => item.orderStatus === 'manual_failed',
- ).length
- const taskReadyCount = ninetyoneOrders.value.items.filter((item) => item.taskCount > 0).length
-
- return {
- total: ninetyoneOrders.value.total,
- currentCount: ninetyoneOrders.value.items.length,
- pendingCount,
- failedCount,
- taskReadyCount,
- }
- })
-
- async function loadNinetyoneOrders(page = 1) {
- ninetyoneLoading.value = true
- ninetyoneResultError.value = ''
-
- try {
- const response = await fetchAdminNinetyoneOrders({
- page,
- pageSize: ninetyoneOrders.value.pageSize || 20,
- status: ninetyoneStatus.value,
- })
- ninetyoneOrders.value = response.data
- } catch (error) {
- ninetyoneResultError.value = error instanceof Error ? error.message : '91卡券订单读取失败'
- showError(ninetyoneResultError.value)
- } finally {
- ninetyoneLoading.value = false
- }
- }
-
- async function handleNinetyoneStatusChange(status: 'pending_config' | 'all' | 'manual_failed') {
- ninetyoneStatus.value = status
- await loadNinetyoneOrders(1)
- }
-
- async function handleNinetyoneRetryOrder(item: AdminNinetyoneOrderItem) {
- ninetyoneActionLoadingId.value = item.orderId
- ninetyoneResultError.value = ''
-
- try {
- const response = await retryAdminNinetyoneOrder(item.orderId)
- showSuccess(`91卡券订单已重试,生成任务 ${response.data.taskCount} 个`)
- await loadNinetyoneOrders(ninetyoneOrders.value.page || 1)
- } catch (error) {
- ninetyoneResultError.value = error instanceof Error ? error.message : '91卡券订单重试失败'
- showError(ninetyoneResultError.value)
- } finally {
- ninetyoneActionLoadingId.value = null
- }
- }
-
- async function handleNinetyoneFailOrder(item: AdminNinetyoneOrderItem) {
- try {
- await showConfirm(
- `确认把 91卡券订单 ${item.orderNo} 标记为无法履约吗?查询接口会返回失败状态。`,
- '确认标记失败',
- {
- type: 'warning',
- confirmButtonText: '标记失败',
- cancelButtonText: '取消',
- },
- )
- } catch {
- return
- }
-
- ninetyoneActionLoadingId.value = item.orderId
- ninetyoneResultError.value = ''
-
- try {
- await failAdminNinetyoneOrder(item.orderId, {
- reason: '商家后台手动标记无法履约',
- })
- showSuccess('91卡券订单已标记失败')
- await loadNinetyoneOrders(ninetyoneOrders.value.page || 1)
- } catch (error) {
- ninetyoneResultError.value = error instanceof Error ? error.message : '91卡券订单标记失败失败'
- showError(ninetyoneResultError.value)
- } finally {
- ninetyoneActionLoadingId.value = null
- }
- }
-
- return {
- ninetyoneLoading,
- ninetyoneActionLoadingId,
- ninetyoneResultError,
- ninetyoneStatus,
- ninetyoneOrders,
- ninetyoneStats,
- loadNinetyoneOrders,
- handleNinetyoneStatusChange,
- handleNinetyoneRetryOrder,
- handleNinetyoneFailOrder,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNotificationPlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNotificationPlatform.ts
deleted file mode 100644
index 88c61928..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNotificationPlatform.ts
+++ /dev/null
@@ -1,384 +0,0 @@
-import { computed, ref } from 'vue'
-
-import { showError, showSuccess } from '@/lib/feedback'
-import {
- runAdminScheduledJob,
- saveAdminNotificationConfig,
- saveAdminScheduledJobsConfig,
- testAdminNotification,
-} from '@/services/admin'
-import type {
- AdminCloudtentaclesMonitorAccount,
- AdminNotificationConfig,
- AdminNotificationTestResult,
- AdminScheduledJobRuntimeState,
- AdminScheduledJobsConfig,
- AdminScheduledJobsResponse,
-} from '@/types/admin'
-
-import type {
- EditableNotificationRecipient,
- EditableScheduledJob,
- EditableWpushRecipient,
-} from './types'
-
-export function useAdminNotificationPlatform() {
- const notificationFilePath = ref('')
- const notificationForm = ref({
- enabled: true,
- barkEnabled: true,
- barkServerUrl: 'https://api.day.app',
- wpushEnabled: true,
- testTitle: '订单系统测试通知',
- testBody: '这是一条内部通知测试。',
- testUrl: '',
- })
- const notificationRecipients = ref([])
- const wpushRecipients = ref([])
- const notificationSaving = ref(false)
- const notificationTesting = ref(false)
- const notificationResultError = ref('')
- const notificationTestResult = ref(null)
- const scheduledJobsFilePath = ref('')
- const scheduledJobsForm = ref({
- enabled: true,
- })
- const scheduledJobs = ref([])
- const scheduledJobRuntime = ref([])
- const cloudtentaclesMonitorAccounts = ref([])
- const scheduledJobsSaving = ref(false)
- const scheduledJobRunningId = ref('')
-
- const notificationStats = computed(() => {
- const enabledBarkRecipients = notificationRecipients.value.filter(
- (item) => item.enabled && item.deviceKey.trim(),
- )
- const enabledWpushRecipients = wpushRecipients.value.filter(
- (item) => item.enabled && item.apiKey.trim(),
- )
-
- return {
- barkConfiguredRecipientCount: notificationRecipients.value.length,
- barkEnabledRecipientCount: enabledBarkRecipients.length,
- wpushConfiguredRecipientCount: wpushRecipients.value.length,
- wpushEnabledRecipientCount: enabledWpushRecipients.length,
- barkReady:
- notificationForm.value.enabled &&
- notificationForm.value.barkEnabled &&
- enabledBarkRecipients.length > 0,
- wpushReady:
- notificationForm.value.enabled &&
- notificationForm.value.wpushEnabled &&
- enabledWpushRecipients.length > 0,
- ready:
- (
- notificationForm.value.enabled &&
- notificationForm.value.barkEnabled &&
- enabledBarkRecipients.length > 0
- ) ||
- (
- notificationForm.value.enabled &&
- notificationForm.value.wpushEnabled &&
- enabledWpushRecipients.length > 0
- ),
- lastSuccessCount: notificationTestResult.value?.successCount || 0,
- lastFailedCount: notificationTestResult.value?.failedCount || 0,
- scheduledJobEnabledCount: scheduledJobs.value.filter((item) => item.enabled).length,
- }
- })
-
- function hydrateNotificationConfig(data: { filePath: string; source: AdminNotificationConfig }) {
- notificationFilePath.value = data.filePath
- notificationForm.value.enabled = data.source.enabled !== false
- notificationForm.value.barkEnabled = data.source.channels.bark.enabled !== false
- notificationForm.value.barkServerUrl =
- data.source.channels.bark.serverUrl || 'https://api.day.app'
- notificationForm.value.wpushEnabled = data.source.channels.wpush.enabled !== false
- notificationRecipients.value = data.source.channels.bark.recipients.map((item) => ({
- id: item.id || crypto.randomUUID(),
- name: item.name,
- deviceKey: item.deviceKey,
- enabled: item.enabled !== false,
- }))
- wpushRecipients.value = data.source.channels.wpush.recipients.map((item) => ({
- id: item.id || crypto.randomUUID(),
- name: item.name,
- apiKey: item.apiKey,
- enabled: item.enabled !== false,
- }))
- }
-
- function hydrateScheduledJobsConfig(data: AdminScheduledJobsResponse) {
- scheduledJobsFilePath.value = data.filePath
- scheduledJobsForm.value.enabled = data.source.enabled !== false
- cloudtentaclesMonitorAccounts.value = data.cloudtentaclesAccounts || []
- scheduledJobs.value = data.source.jobs.map((item) => ({
- id: item.id,
- type: item.type,
- enabled: item.enabled === true,
- intervalSeconds: Number(item.intervalSeconds || 300),
- intervalSecondsAmount: resolveTimeValue(Number(item.intervalSeconds || 300)).amount,
- intervalSecondsUnit: resolveTimeValue(Number(item.intervalSeconds || 300)).unit,
- cooldownSeconds: Number(item.cooldownSeconds || 1800),
- cooldownSecondsAmount: resolveTimeValue(Number(item.cooldownSeconds || 1800)).amount,
- cooldownSecondsUnit: resolveTimeValue(Number(item.cooldownSeconds || 1800)).unit,
- assetThreshold: normalizeAssetThreshold(item.config?.assetThreshold, 500),
- accounts: mergeScheduledJobAccounts(
- item.config?.accounts || [],
- data.cloudtentaclesAccounts || [],
- normalizeAssetThreshold(item.config?.assetThreshold, 500),
- ),
- }))
- scheduledJobRuntime.value = data.runtime || []
- }
-
- function addNotificationRecipient(channel: 'bark' | 'wpush') {
- if (channel === 'wpush') {
- wpushRecipients.value.unshift({
- id: crypto.randomUUID(),
- name: '',
- apiKey: '',
- enabled: true,
- })
- return
- }
-
- notificationRecipients.value.unshift({
- id: crypto.randomUUID(),
- name: '',
- deviceKey: '',
- enabled: true,
- })
- }
-
- function removeNotificationRecipient(channel: 'bark' | 'wpush', id: string) {
- if (channel === 'wpush') {
- wpushRecipients.value = wpushRecipients.value.filter((item) => item.id !== id)
- return
- }
-
- notificationRecipients.value = notificationRecipients.value.filter((item) => item.id !== id)
- }
-
- function buildNotificationConfigPayload(): AdminNotificationConfig {
- return {
- enabled: notificationForm.value.enabled,
- channels: {
- bark: {
- enabled: notificationForm.value.barkEnabled,
- serverUrl: notificationForm.value.barkServerUrl.trim() || 'https://api.day.app',
- recipients: notificationRecipients.value.map((item) => ({
- id: item.id,
- name: item.name.trim(),
- deviceKey: item.deviceKey.trim(),
- deviceKeyMasked: '',
- enabled: item.enabled,
- })),
- },
- wpush: {
- enabled: notificationForm.value.wpushEnabled,
- recipients: wpushRecipients.value.map((item) => ({
- id: item.id,
- name: item.name.trim(),
- apiKey: item.apiKey.trim(),
- apiKeyMasked: '',
- enabled: item.enabled,
- })),
- },
- },
- }
- }
-
- function buildScheduledJobsConfigPayload(): AdminScheduledJobsConfig {
- return {
- enabled: scheduledJobsForm.value.enabled,
- jobs: scheduledJobs.value.map((item) => ({
- id: item.id,
- type: item.type,
- enabled: item.enabled,
- intervalSeconds: Number(item.intervalSeconds || 300),
- cooldownSeconds: Number(item.cooldownSeconds || 1800),
- config: {
- assetThreshold: normalizeAssetThreshold(item.assetThreshold, 500),
- accounts: item.accounts.map((account) => ({
- sourceKey: account.sourceKey,
- label: account.label.trim(),
- enabled: account.enabled,
- assetThreshold: normalizeAssetThreshold(account.assetThreshold, 0),
- })),
- },
- })),
- }
- }
-
- async function handleNotificationSaveConfig() {
- notificationSaving.value = true
- notificationResultError.value = ''
-
- try {
- const response = await saveAdminNotificationConfig(buildNotificationConfigPayload())
- notificationFilePath.value = response.data.filePath
- hydrateNotificationConfig(response.data)
- showSuccess('内部通知配置已保存')
- } catch (error) {
- notificationResultError.value =
- error instanceof Error ? error.message : '内部通知配置保存失败'
- showError(notificationResultError.value)
- } finally {
- notificationSaving.value = false
- }
- }
-
- async function handleNotificationTest() {
- notificationTesting.value = true
- notificationResultError.value = ''
- notificationTestResult.value = null
-
- try {
- const saved = await saveAdminNotificationConfig(buildNotificationConfigPayload())
- notificationFilePath.value = saved.data.filePath
- hydrateNotificationConfig(saved.data)
-
- const response = await testAdminNotification({
- title: notificationForm.value.testTitle.trim(),
- body: notificationForm.value.testBody.trim(),
- url: notificationForm.value.testUrl.trim(),
- })
- notificationTestResult.value = response.data
- if (response.data.successCount > 0) {
- showSuccess(`内部通知测试完成,成功 ${response.data.successCount} 个`)
- } else {
- showError('内部通知测试未成功发送,请检查通知通道配置')
- }
- } catch (error) {
- notificationResultError.value = error instanceof Error ? error.message : '内部通知测试失败'
- showError(notificationResultError.value)
- } finally {
- notificationTesting.value = false
- }
- }
-
- async function handleScheduledJobsSaveConfig() {
- scheduledJobsSaving.value = true
- notificationResultError.value = ''
-
- try {
- const response = await saveAdminScheduledJobsConfig(buildScheduledJobsConfigPayload())
- hydrateScheduledJobsConfig(response.data)
- showSuccess('监控任务配置已保存')
- } catch (error) {
- notificationResultError.value =
- error instanceof Error ? error.message : '监控任务配置保存失败'
- showError(notificationResultError.value)
- } finally {
- scheduledJobsSaving.value = false
- }
- }
-
- async function handleScheduledJobRunNow(jobId: string) {
- scheduledJobRunningId.value = jobId
- notificationResultError.value = ''
-
- try {
- const saved = await saveAdminScheduledJobsConfig(buildScheduledJobsConfigPayload())
- hydrateScheduledJobsConfig(saved.data)
- const response = await runAdminScheduledJob(jobId)
- scheduledJobRuntime.value = response.data.runtime || []
- const message = String(response.data.result?.message || '监控任务已执行')
- showSuccess(message)
- } catch (error) {
- notificationResultError.value = error instanceof Error ? error.message : '监控任务执行失败'
- showError(notificationResultError.value)
- } finally {
- scheduledJobRunningId.value = ''
- }
- }
-
- function getScheduledJobRuntime(jobId: string) {
- return scheduledJobRuntime.value.find((item) => item.id === jobId) || null
- }
-
- function mergeScheduledJobAccounts(
- configuredAccounts: EditableScheduledJob['accounts'],
- monitorAccounts: AdminCloudtentaclesMonitorAccount[],
- defaultAssetThreshold: number,
- ) {
- const configuredMap = new Map(
- configuredAccounts.map((item) => [String(item.sourceKey || '').trim(), item]),
- )
- const merged = monitorAccounts
- .filter((item) => String(item.sourceKey || '').trim())
- .map((item) => {
- const sourceKey = String(item.sourceKey || '').trim()
- const configured = configuredMap.get(sourceKey)
- return {
- sourceKey,
- label: String(configured?.label || item.label || sourceKey).trim(),
- enabled: configured ? configured.enabled !== false : item.enabled !== false,
- assetThreshold: normalizeAssetThreshold(configured?.assetThreshold, defaultAssetThreshold),
- }
- })
- const mergedKeys = new Set(merged.map((item) => item.sourceKey))
-
- for (const configured of configuredAccounts) {
- const sourceKey = String(configured.sourceKey || '').trim()
- if (!sourceKey || mergedKeys.has(sourceKey)) {
- continue
- }
- merged.push({
- sourceKey,
- label: String(configured.label || sourceKey).trim(),
- enabled: configured.enabled !== false,
- assetThreshold: normalizeAssetThreshold(configured.assetThreshold, defaultAssetThreshold),
- })
- }
-
- return merged
- }
-
- function normalizeAssetThreshold(value: unknown, fallback: number) {
- const parsed = Number(value)
- return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback
- }
-
- function resolveTimeValue(seconds: number) {
- const normalized = Math.max(0, Number(seconds || 0))
- if (normalized >= 3600 && normalized % 3600 === 0) {
- return { amount: normalized / 3600, unit: 3600 }
- }
-
- if (normalized >= 60 && normalized % 60 === 0) {
- return { amount: normalized / 60, unit: 60 }
- }
-
- return { amount: normalized || 1, unit: 1 }
- }
-
- return {
- notificationFilePath,
- notificationForm,
- notificationRecipients,
- wpushRecipients,
- notificationSaving,
- notificationTesting,
- notificationResultError,
- notificationTestResult,
- scheduledJobsFilePath,
- scheduledJobsForm,
- scheduledJobs,
- scheduledJobRuntime,
- cloudtentaclesMonitorAccounts,
- scheduledJobsSaving,
- scheduledJobRunningId,
- notificationStats,
- hydrateNotificationConfig,
- hydrateScheduledJobsConfig,
- addNotificationRecipient,
- removeNotificationRecipient,
- handleNotificationSaveConfig,
- handleNotificationTest,
- handleScheduledJobsSaveConfig,
- handleScheduledJobRunNow,
- getScheduledJobRuntime,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useCloudtentaclesDebugActions.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useCloudtentaclesDebugActions.ts
deleted file mode 100644
index fd1ff836..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useCloudtentaclesDebugActions.ts
+++ /dev/null
@@ -1,261 +0,0 @@
-import { ref } from 'vue'
-import { showError, showSuccess } from '@/lib/feedback'
-import {
- appointAdminCloudtentaclesVn,
- backAdminCloudtentaclesVn,
- buyAdminCloudtentaclesSku,
- fetchAdminCloudtentaclesAsset,
- fetchAdminCloudtentaclesBindUrl,
- fetchAdminCloudtentaclesCategories,
- fetchAdminCloudtentaclesKnapsack,
- fetchAdminCloudtentaclesSkuList,
- fetchAdminCloudtentaclesVnCode,
- fetchAdminCloudtentaclesVnList,
- generateAdminCloudtentaclesVnLoginCode,
- runAdminCloudtentaclesFullFlow,
- useAdminCloudtentaclesSku,
- verifyAdminCloudtentaclesVnCode,
-} from '@/services/admin'
-
-import {
- normalizeCloudtentaclesDeviceId,
- normalizeCloudtentaclesDeviceType,
-} from './cloudtentaclesDefaults'
-
-export type CloudtentaclesForm = {
- baseUrl: string
- username: string
- password: string
- phone: string
- code: string
- token: string
- vnKey: string
- vnId: number
- skuId: number
- skuCount: number
- deviceId: string
- deviceType: number
-}
-
-export function useCloudtentaclesDebugActions(
- cloudtentaclesForm: { value: CloudtentaclesForm },
- cloudtentaclesResultError: { value: string },
- selectedSourceKey: { value: string },
-) {
- const cloudtentaclesDebugLoading = ref(false)
- const cloudtentaclesDebugResult = ref('')
-
- function buildCloudtentaclesTokenPayload() {
- return {
- baseUrl: cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176',
- token: cloudtentaclesForm.value.token.trim(),
- deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId),
- deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType),
- sourceKey: selectedSourceKey.value,
- }
- }
-
- function ensureCloudtentaclesToken() {
- if (!cloudtentaclesForm.value.token.trim()) {
- cloudtentaclesResultError.value = '请先登录或手动填写 token'
- return false
- }
- return true
- }
-
- function renderCloudtentaclesDebugResult(label: string, data: unknown) {
- cloudtentaclesDebugResult.value = `${label}\n${JSON.stringify(data, null, 2)}`
- }
-
- async function runCloudtentaclesDebugAction(
- label: string,
- runner: () => Promise<{ data: unknown }>,
- ) {
- cloudtentaclesDebugLoading.value = true
- cloudtentaclesResultError.value = ''
-
- try {
- const response = await runner()
- renderCloudtentaclesDebugResult(label, response.data)
- showSuccess(`${label}成功`)
- } catch (error) {
- cloudtentaclesResultError.value = error instanceof Error ? error.message : `${label}失败`
- showError(cloudtentaclesResultError.value)
- } finally {
- cloudtentaclesDebugLoading.value = false
- }
- }
-
- async function handleCloudtentaclesFetchAsset() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('查询余额', () =>
- fetchAdminCloudtentaclesAsset(buildCloudtentaclesTokenPayload()),
- )
- }
-
- async function handleCloudtentaclesFetchCategories() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('查询分类', () =>
- fetchAdminCloudtentaclesCategories(buildCloudtentaclesTokenPayload()),
- )
- }
-
- async function handleCloudtentaclesFetchSkuList() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('查询SKU列表', () =>
- fetchAdminCloudtentaclesSkuList(buildCloudtentaclesTokenPayload()),
- )
- }
-
- async function handleCloudtentaclesBuySku() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('购买SKU', () =>
- buyAdminCloudtentaclesSku({
- ...buildCloudtentaclesTokenPayload(),
- id: Number(cloudtentaclesForm.value.skuId || 0),
- count: Number(cloudtentaclesForm.value.skuCount || 1),
- }),
- )
- }
-
- async function handleCloudtentaclesUseSku() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('执行发货', () =>
- useAdminCloudtentaclesSku({
- ...buildCloudtentaclesTokenPayload(),
- id: Number(cloudtentaclesForm.value.skuId || 0),
- virtualNumberId: Number(cloudtentaclesForm.value.vnId || 0),
- phone: cloudtentaclesForm.value.phone.trim(),
- }),
- )
- }
-
- async function handleCloudtentaclesFetchKnapsack() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('查询背包', () =>
- fetchAdminCloudtentaclesKnapsack(buildCloudtentaclesTokenPayload()),
- )
- }
-
- async function handleCloudtentaclesFetchVnList() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('查询虚拟号列表', () =>
- fetchAdminCloudtentaclesVnList({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- }),
- )
- }
-
- async function handleCloudtentaclesAppointVn() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('申请虚拟号', async () => {
- const response = await appointAdminCloudtentaclesVn({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- })
- const item = (response.data as { item?: { id?: number; phone?: string } }).item
- if (item?.id) {
- cloudtentaclesForm.value.vnId = Number(item.id)
- }
- if (item?.phone) {
- cloudtentaclesForm.value.phone = String(item.phone)
- }
- return response
- })
- }
-
- async function handleCloudtentaclesGenerateVnLoginCode() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('生成登录码', () =>
- generateAdminCloudtentaclesVnLoginCode({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- id: Number(cloudtentaclesForm.value.vnId || 0),
- }),
- )
- }
-
- async function handleCloudtentaclesFetchVnCode() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('获取验证码', async () => {
- const response = await fetchAdminCloudtentaclesVnCode({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- phone: cloudtentaclesForm.value.phone.trim(),
- })
- const code = (response.data as { code?: string }).code
- if (code) {
- cloudtentaclesForm.value.code = String(code)
- }
- return response
- })
- }
-
- async function handleCloudtentaclesVerifyVnCode() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('校验验证码', () =>
- verifyAdminCloudtentaclesVnCode({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- id: Number(cloudtentaclesForm.value.vnId || 0),
- code: cloudtentaclesForm.value.code.trim(),
- }),
- )
- }
-
- async function handleCloudtentaclesFetchBindUrl() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('获取兑换链接', () =>
- fetchAdminCloudtentaclesBindUrl({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- id: Number(cloudtentaclesForm.value.vnId || 0),
- }),
- )
- }
-
- async function handleCloudtentaclesBackVn() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('退还号码', () =>
- backAdminCloudtentaclesVn({
- ...buildCloudtentaclesTokenPayload(),
- key: cloudtentaclesForm.value.vnKey.trim(),
- id: Number(cloudtentaclesForm.value.vnId || 0),
- }),
- )
- }
-
- async function handleCloudtentaclesRunFullFlow() {
- if (!ensureCloudtentaclesToken()) return
- await runCloudtentaclesDebugAction('完整测试流程', () =>
- runAdminCloudtentaclesFullFlow({
- ...buildCloudtentaclesTokenPayload(),
- skuId: Number(cloudtentaclesForm.value.skuId || 0),
- skuCount: Number(cloudtentaclesForm.value.skuCount || 1),
- vnKey: cloudtentaclesForm.value.vnKey.trim(),
- }),
- )
- }
-
- return {
- cloudtentaclesDebugLoading,
- cloudtentaclesDebugResult,
- buildCloudtentaclesTokenPayload,
- ensureCloudtentaclesToken,
- handleCloudtentaclesFetchAsset,
- handleCloudtentaclesFetchCategories,
- handleCloudtentaclesFetchSkuList,
- handleCloudtentaclesBuySku,
- handleCloudtentaclesUseSku,
- handleCloudtentaclesFetchKnapsack,
- handleCloudtentaclesFetchVnList,
- handleCloudtentaclesAppointVn,
- handleCloudtentaclesGenerateVnLoginCode,
- handleCloudtentaclesFetchVnCode,
- handleCloudtentaclesVerifyVnCode,
- handleCloudtentaclesFetchBindUrl,
- handleCloudtentaclesBackVn,
- handleCloudtentaclesRunFullFlow,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useKuaishouEticketShopManager.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useKuaishouEticketShopManager.ts
deleted file mode 100644
index 30ad86f8..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useKuaishouEticketShopManager.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { ref } from 'vue'
-import type { EditableKuaishouEticketShop } from './types'
-import type { AdminKuaishouEticketShopConfigItem } from '@/types/admin'
-
-export function useKuaishouEticketShopManager() {
- const kuaishouEticketShops = ref([])
-
- function addKuaishouEticketShop() {
- const shop = createEmptyKuaishouEticketShop()
- kuaishouEticketShops.value.unshift(shop)
- return { shop, newSelectedId: shop.id }
- }
-
- function removeKuaishouEticketShop(id: string, currentSelectedId: string) {
- kuaishouEticketShops.value = kuaishouEticketShops.value.filter((item) => item.id !== id)
- if (currentSelectedId === id) {
- return kuaishouEticketShops.value[0]?.id || ''
- }
- return currentSelectedId
- }
-
- function describeKuaishouEticketShop(shop: EditableKuaishouEticketShop) {
- const status = shop.cookie.trim() ? 'Cookie 已就绪' : '待补 Cookie'
- const identity = shop.shopId.trim() ? '已识别店铺' : '待读取信息'
- return `${status} · ${identity}`
- }
-
- function getKuaishouEticketShopInitial(shop: EditableKuaishouEticketShop) {
- const label = shop.kshopName.trim() || shop.shopId.trim() || '店'
- return label.slice(0, 1).toUpperCase()
- }
-
- function setShopsFromConfig(shops: AdminKuaishouEticketShopConfigItem[]) {
- kuaishouEticketShops.value = shops.map(mapEditableKuaishouEticketShop)
- return kuaishouEticketShops.value
- }
-
- function findShopByShopId(shopId: string) {
- return kuaishouEticketShops.value.find((item) => item.shopId && item.shopId === shopId)
- }
-
- return {
- kuaishouEticketShops,
- addKuaishouEticketShop,
- removeKuaishouEticketShop,
- describeKuaishouEticketShop,
- getKuaishouEticketShopInitial,
- setShopsFromConfig,
- findShopByShopId,
- }
-}
-
-function createEmptyKuaishouEticketShop(): EditableKuaishouEticketShop {
- return {
- id: crypto.randomUUID(),
- shopId: '',
- kshopName: '',
- cookie: '',
- userAvatar: '',
- enabled: true,
- }
-}
-
-function mapEditableKuaishouEticketShop(
- item: AdminKuaishouEticketShopConfigItem,
-): EditableKuaishouEticketShop {
- return {
- id: crypto.randomUUID(),
- shopId: item.shopId,
- kshopName: item.kshopName,
- cookie: item.cookie,
- userAvatar: item.userAvatar,
- enabled: item.enabled !== false,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useRememberedCollapse.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useRememberedCollapse.ts
deleted file mode 100644
index c22d866a..00000000
--- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useRememberedCollapse.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { ref, watch, type Ref } from 'vue'
-
-export type RememberedCollapseState = {
- activeNames: Ref
- handleChange: (value: unknown) => void
-}
-
-export function useRememberedCollapse(
- storageKey: string,
- defaultValue: string[] = [],
-): RememberedCollapseState {
- const activeNames = ref(readStoredCollapseNames(storageKey, defaultValue))
-
- function handleChange(value: unknown) {
- const nextNames = normalizeCollapseNames(value)
- activeNames.value = nextNames
- writeStoredCollapseNames(storageKey, nextNames)
- }
-
- watch(
- activeNames,
- (names) => {
- writeStoredCollapseNames(storageKey, names)
- },
- { deep: true },
- )
-
- return {
- activeNames,
- handleChange,
- }
-}
-
-function readStoredCollapseNames(storageKey: string, defaultValue: string[]): string[] {
- if (!canUseLocalStorage()) {
- return [...defaultValue]
- }
-
- try {
- const rawValue = window.localStorage.getItem(storageKey)
- if (!rawValue) {
- return [...defaultValue]
- }
-
- const parsed = JSON.parse(rawValue)
- return normalizeCollapseNames(parsed, defaultValue)
- } catch {
- return [...defaultValue]
- }
-}
-
-function writeStoredCollapseNames(storageKey: string, names: unknown): void {
- if (!canUseLocalStorage()) {
- return
- }
-
- try {
- window.localStorage.setItem(storageKey, JSON.stringify(normalizeCollapseNames(names)))
- } catch {
- // 浏览器禁用存储时忽略,折叠状态退化为本次会话内有效。
- }
-}
-
-function normalizeCollapseNames(value: unknown, fallback: string[] = []): string[] {
- if (typeof value === 'string' || typeof value === 'number') {
- const normalized = String(value || '').trim()
- return normalized ? [normalized] : []
- }
-
- if (!Array.isArray(value)) {
- return [...fallback]
- }
-
- return Array.from(new Set(value.map((item) => String(item || '').trim()).filter(Boolean)))
-}
-
-function canUseLocalStorage(): boolean {
- return typeof window !== 'undefined' && Boolean(window.localStorage)
-}
diff --git a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetail.css b/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetail.css
deleted file mode 100644
index 376df950..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetail.css
+++ /dev/null
@@ -1,687 +0,0 @@
-.admin-panel {
- display: grid;
- gap: var(--space-4);
-}
-
-.claim-link {
- color: var(--color-primary);
- text-decoration: none;
- word-break: break-all;
-}
-
-.section-card p {
- margin: 10px 0 0;
- color: var(--text-primary);
-}
-
-.section-card h3 {
- margin: 0 0 var(--space-3);
- color: var(--text-primary);
-}
-
-.hero-card {
- display: grid;
- gap: var(--space-4);
- background:
- radial-gradient(circle at top right, rgba(14, 165, 233, 0.12), transparent 26%),
- linear-gradient(135deg, rgba(255, 255, 255, 0.98), rgba(239, 246, 255, 0.96));
-}
-
-.hero-head {
- display: flex;
- justify-content: space-between;
- gap: var(--space-4);
- align-items: flex-start;
-}
-
-.hero-copy {
- display: grid;
- gap: 6px;
- min-width: 0;
-}
-
-.hero-copy h2 {
- margin: 0;
- color: var(--text-primary);
- font-size: 30px;
- line-height: 1.1;
-}
-
-.hero-copy p,
-.hero-inline span,
-.hero-link-row span {
- color: var(--text-secondary);
-}
-
-.hero-copy p {
- line-height: 1.6;
-}
-
-.hero-eyebrow {
- color: var(--color-primary);
- font-size: var(--text-xs);
- font-weight: 700;
- letter-spacing: 0.08em;
- text-transform: uppercase;
-}
-
-.hero-meta-grid {
- display: flex;
- flex-wrap: wrap;
- gap: 1px;
- background: var(--border-default);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-md);
- overflow: hidden;
-}
-
-@media (max-width: 640px) {
- .hero-meta-grid {
- flex-direction: column;
- }
-}
-
-.hero-metric {
- flex: 1;
- min-width: 120px;
- padding: 10px var(--space-4);
- background: #fff;
- display: flex;
- align-items: center;
- gap: var(--space-3);
-}
-
-.hero-metric span {
- display: block;
- color: var(--text-secondary);
- font-size: var(--text-xs);
- white-space: nowrap;
- flex-shrink: 0;
-}
-
-.hero-metric strong {
- color: var(--text-primary);
- font-size: var(--text-sm);
- font-weight: 600;
- line-height: 1.3;
- word-break: break-all;
-}
-
-.hero-inline,
-.hero-link-row {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-3);
- align-items: center;
-}
-
-.action-row {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-3);
-}
-
-.section-headline {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: var(--space-3);
- margin-bottom: var(--space-3);
-}
-
-.section-headline h3 {
- margin: 0;
-}
-
-.section-actions {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
- justify-content: flex-end;
-}
-
-.voucher-detail-block {
- margin-top: var(--space-4);
-}
-
-.voucher-detail-block h4 {
- margin: 0 0 var(--space-3);
- color: var(--text-primary);
-}
-
-.voucher-missing-alert {
- margin-bottom: var(--space-3);
-}
-
-.section-copy {
- margin: 0 0 var(--space-3);
- color: var(--text-secondary);
-}
-
-.auto-delivery-tag-line {
- display: flex;
- align-items: center;
-}
-
-.auto-delivery-note {
- margin-top: 14px;
- padding: 14px var(--space-4);
- border-radius: var(--radius-md);
- background: rgba(248, 250, 252, 0.92);
- border: 1px solid var(--border-default);
-}
-
-.auto-delivery-note p {
- margin: 0 0 var(--space-2);
- color: var(--text-primary);
-}
-
-.auto-delivery-note p:last-child {
- margin-bottom: 0;
-}
-
-.status-stack {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
-}
-
-.redeem-summary-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
- gap: var(--space-3);
- margin-bottom: 14px;
-}
-
-.metric-card,
-.redeem-attempt-card {
- padding: 14px var(--space-4);
- border-radius: var(--radius-md);
- border: 1px solid var(--border-default);
- background: rgba(248, 250, 252, 0.92);
-}
-
-.metric-card span,
-.redeem-attempt-grid span {
- display: block;
- color: var(--text-secondary);
- font-size: var(--text-xs);
- margin-bottom: 6px;
-}
-
-.metric-card strong,
-.redeem-attempt-grid strong {
- color: var(--text-primary);
-}
-
-.redeem-attempts {
- display: grid;
- gap: var(--space-3);
-}
-
-.redeem-attempt-head {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: var(--space-3);
-}
-
-.redeem-outcome {
- color: var(--color-primary);
- font-size: var(--text-sm);
- font-weight: 600;
-}
-
-.redeem-attempt-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: var(--space-3);
- margin-top: var(--space-3);
-}
-
-.redeem-attempt-copy {
- margin: var(--space-3) 0 0;
- color: var(--text-primary);
- line-height: 1.6;
-}
-
-.table-empty {
- text-align: center;
- color: var(--text-secondary);
-}
-
-.binding-primary {
- margin-top: 4px;
- color: var(--color-success);
- font-size: var(--text-xs);
- font-weight: 600;
-}
-
-.binding-meta {
- margin-top: 4px;
- color: var(--text-secondary);
- font-size: var(--text-xs);
-}
-
-.manual-grid {
- display: grid;
- gap: 14px;
-}
-
-.admin-panel :deep(.el-form-item) {
- margin-bottom: 0;
-}
-
-.admin-panel :deep(.el-form-item__label) {
- color: var(--text-secondary);
- font-size: var(--text-xs);
- font-weight: 700;
- line-height: 1.4;
- margin-bottom: 6px;
-}
-
-.manual-hint {
- margin: 14px 0 0;
- color: var(--text-secondary);
-}
-
-.manual-summary {
- margin-top: var(--space-4);
- padding: 14px;
- border-radius: var(--radius-md);
- background: rgba(248, 250, 252, 0.9);
-}
-
-.manual-summary p {
- margin: 0 0 var(--space-2);
- color: var(--text-primary);
-}
-
-.manual-summary p:last-child {
- margin-bottom: 0;
-}
-
-.flow-card {
- display: grid;
- gap: var(--space-4);
- background:
- radial-gradient(circle at top right, rgba(37, 99, 235, 0.08), transparent 28%),
- linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(248, 250, 252, 0.96));
-}
-
-.flow-card-head {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-between;
- gap: 14px;
-}
-
-.flow-head-actions {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-}
-
-.kuaishou-focus-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
- gap: 14px;
-}
-
-.flow-block {
- padding: var(--space-4);
- border-radius: 18px;
- border: 1px solid var(--border-default);
- background: rgba(248, 250, 252, 0.9);
-}
-
-.flow-block--spotlight {
- background:
- linear-gradient(160deg, rgba(255, 255, 255, 0.98), rgba(239, 246, 255, 0.95)),
- rgba(248, 250, 252, 0.9);
-}
-
-.flow-block h4 {
- margin: 0;
- color: var(--text-primary);
-}
-
-.flow-block p {
- margin: 10px 0 0;
- color: var(--text-secondary);
- line-height: 1.6;
-}
-
-.flow-meta-list {
- display: grid;
- gap: 10px;
- margin-top: 14px;
-}
-
-.flow-meta-list div {
- display: grid;
- gap: 4px;
-}
-
-.flow-meta-list span {
- color: var(--text-secondary);
- font-size: var(--text-xs);
-}
-
-.flow-meta-list strong {
- color: var(--text-primary);
- word-break: break-all;
-}
-
-.flow-meta-list--dense {
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
-}
-
-.flow-meta-list--two-column {
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
-}
-
-.spotlight-head {
- display: flex;
- justify-content: space-between;
- gap: var(--space-3);
- align-items: flex-start;
-}
-
-.spotlight-actions {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-
-.flow-copy {
- margin: var(--space-2) 0 0;
- color: var(--text-secondary);
- line-height: 1.6;
-}
-
-.flow-collapse {
- display: grid;
- gap: var(--space-3);
-}
-
-/* ===== Flow Timeline (Checklist) ===== */
-.flow-timeline {
- display: grid;
- gap: 0;
- margin-top: var(--space-4);
- padding-left: 2px;
-}
-
-.flow-timeline-item {
- display: grid;
- grid-template-columns: 20px 1fr;
- gap: 0 var(--space-3);
- position: relative;
-}
-
-/* Vertical connector line */
-.flow-timeline-item:not(:last-child) .timeline-gutter::after {
- content: '';
- display: block;
- position: absolute;
- left: 9px;
- top: 24px;
- bottom: 0;
- width: 1px;
- background: var(--border-default);
-}
-
-.timeline-gutter {
- position: relative;
- display: flex;
- flex-direction: column;
- align-items: center;
- padding-top: 14px;
-}
-
-.timeline-dot {
- width: 8px;
- height: 8px;
- border-radius: 50%;
- flex-shrink: 0;
- z-index: 1;
- background: var(--border-default);
- margin-top: 4px;
-}
-
-.flow-timeline-item--done .timeline-dot {
- background: var(--text-muted);
-}
-
-.flow-timeline-item--current .timeline-dot {
- background: var(--text-primary);
- width: 10px;
- height: 10px;
- margin-top: 3px;
-}
-
-.flow-timeline-item--error .timeline-dot {
- background: var(--color-danger);
-}
-
-.timeline-body {
- padding: 8px 0 14px;
-}
-
-.timeline-head {
- display: flex;
- align-items: center;
- gap: var(--space-2);
- margin-bottom: 2px;
-}
-
-.timeline-label {
- font-size: var(--text-xs);
- font-weight: 500;
- color: var(--text-secondary);
-}
-
-.flow-timeline-item--current .timeline-label {
- color: var(--text-primary);
- font-weight: 600;
-}
-
-.timeline-current-badge {
- font-size: 10px;
- font-weight: 600;
- padding: 0 5px;
- border-radius: var(--radius-sm);
- background: var(--bg-subtle);
- color: var(--text-secondary);
-}
-
-.timeline-detail {
- color: var(--text-primary);
- font-size: var(--text-sm);
- line-height: 1.5;
-}
-
-.flow-timeline-item--done .timeline-detail {
- color: var(--text-muted);
-}
-
-/* ===== Collapse Badge ===== */
-.collapse-title-wrap {
- display: flex;
- align-items: center;
- gap: var(--space-2);
-}
-
-.collapse-badge {
- font-size: 10px;
- font-weight: 500;
- padding: 0 5px;
- border-radius: var(--radius-sm);
- background: rgba(100, 116, 139, 0.08);
- color: var(--text-muted);
-}
-
-/* ===== Event Timeline ===== */
-.event-timeline {
- display: grid;
- gap: 0;
- padding-left: 2px;
-}
-
-.event-tl-item {
- display: grid;
- grid-template-columns: 20px 1fr;
- gap: 0 var(--space-3);
- position: relative;
-}
-
-.event-tl-item:not(:last-child) .event-tl-gutter::after {
- content: '';
- display: block;
- position: absolute;
- left: 9px;
- top: 24px;
- bottom: 0;
- width: 1px;
- background: var(--border-default);
-}
-
-.event-tl-gutter {
- position: relative;
- display: flex;
- flex-direction: column;
- align-items: center;
- padding-top: 14px;
-}
-
-.event-tl-dot {
- width: 6px;
- height: 6px;
- border-radius: 50%;
- background: var(--text-muted);
- margin-top: 6px;
- flex-shrink: 0;
- z-index: 1;
-}
-
-.event-tl-body {
- padding: 8px 0 14px;
-}
-
-.event-tl-type {
- font-size: var(--text-xs);
- font-weight: 500;
- color: var(--text-secondary);
- margin-bottom: 2px;
-}
-
-.event-tl-payload {
- color: var(--text-primary);
- font-size: var(--text-sm);
- line-height: 1.5;
-}
-
-.event-tl-time {
- margin-top: 2px;
- color: var(--text-muted);
- font-size: var(--text-xs);
-}
-
-/* ===== Role Enhancements ===== */
-.role-verified-badge {
- display: inline-block;
- margin-top: var(--space-2);
- font-size: var(--text-xs);
- color: var(--text-muted);
-}
-
-.role-pending-hint {
- margin-top: var(--space-3);
- color: var(--text-secondary);
- font-size: var(--text-xs);
- line-height: 1.6;
-}
-
-.role-hero {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
- gap: var(--space-3);
- margin-top: var(--space-4);
-}
-
-.role-hero div {
- padding: 14px var(--space-4);
- border-radius: var(--radius-md);
- background: rgba(255, 255, 255, 0.88);
- border: 1px solid var(--border-default);
-}
-
-.role-hero span {
- display: block;
- margin-bottom: 6px;
- color: var(--text-secondary);
- font-size: var(--text-xs);
-}
-
-.role-hero strong {
- color: var(--text-primary);
- font-size: var(--text-lg);
- line-height: 1.35;
- word-break: break-word;
-}
-
-.role-warning {
- margin: 14px 0 0;
- padding: var(--space-3) 14px;
- border-radius: 14px;
- background: var(--color-warning-light);
- color: #b54708;
-}
-
-.event-copy {
- color: var(--text-primary);
-}
-
-.event-time {
- margin-top: 6px;
- color: var(--text-secondary);
- font-size: var(--text-xs);
-}
-
-.screenshot-link {
- display: inline-block;
- margin-bottom: var(--space-3);
- color: var(--color-primary);
- text-decoration: none;
-}
-
-.screenshot-empty {
- margin: 0 0 var(--space-3);
- color: var(--text-secondary);
-}
-
-.screenshot-preview {
- display: block;
- width: min(100%, 720px);
- border-radius: 18px;
- border: 1px solid var(--border-default);
- box-shadow: 0 20px 48px rgba(15, 23, 42, 0.08);
-}
-
-@media (max-width: 900px) {
- .hero-head,
- .hero-inline,
- .hero-link-row,
- .flow-card-head,
- .flow-head-actions,
- .spotlight-head,
- .spotlight-actions {
- display: grid;
- }
-
- .timeline-head {
- flex-wrap: wrap;
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetailView.vue b/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetailView.vue
deleted file mode 100644
index 33aff7c4..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetailView.vue
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- retryAdminTask(detail!.task.taskId),
- '任务已重试',
- `确认重试任务 ${detail!.task.taskNo} 吗?`,
- )
- "
- @rebind-role="
- runAction(
- () => rebindAdminTaskKuaishouCloudRole(detail!.task.taskId),
- '角色换绑资源已准备完成',
- `确认为任务 ${detail!.task.taskNo} 换绑角色吗?当前虚拟号会退还,并生成新的绑定二维码。`,
- )
- "
- @prepare-kuaishou-cloud="submitKuaishouCloudPrepare"
- @dispatch-kuaishou-cloud="submitKuaishouCloudDispatch"
- @return-kuaishou-cloud="submitKuaishouCloudReturnNumber"
- @resend-industry-code="submitKuaishouIndustryResendCode"
- @consume-industry-voucher="submitKuaishouIndustryConsume"
- @mark-manual-review="
- runAction(
- () => markAdminTaskManualReview(detail!.task.taskId),
- '任务已转人工处理',
- `确认将任务 ${detail!.task.taskNo} 转为人工处理吗?`,
- )
- "
- @submit-manual-dispatch="submitManualDispatch"
- @close-task="
- runAction(
- () => closeAdminTask(detail!.task.taskId),
- '任务已关闭',
- `确认关闭任务 ${detail!.task.taskNo} 吗?关闭后不会自动继续推进。`,
- )
- "
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/AdminTasksView.vue b/apps/frontend-vue/src/views/admin/tasks/AdminTasksView.vue
deleted file mode 100644
index 592330bc..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/AdminTasksView.vue
+++ /dev/null
@@ -1,495 +0,0 @@
-
-
-
-
-
-
- 共 {{ pagination.total }} 条任务
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 重置
- 查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 任务列表
- 第 {{ pagination.page }} 页,当前展示 {{ items.length }} 条
-
-
-
-
-
-
-
- {{ row.taskNo }}
-
-
- 订单 {{ row.platformOrderId }}
- 重试 {{ row.retryCount }} 次
-
-
-
-
-
-
-
- {{
- row.skuName || row.skuCode
- }}
- SKU {{ row.skuCode || '-' }}
-
-
-
-
-
-
-
- {{ resolveTaskMainText(row) }}
-
-
- 客户 {{ resolveCustomerStageLabel(row.customerStatus) }} · 资源
- {{ resolveResourceStageLabel(row.resourceStatus) }}
-
-
- 角色 {{ row.roleName || '-' }} / {{ row.roleId || '-' }}
-
-
-
-
-
-
-
- 创建 {{ formatAdminDateTime(row.createdAt) }}
- 更新 {{ formatAdminDateTime(row.updatedAt) }}
- 领取 {{ formatAdminDateTime(row.claimedAt) }}
- 确认 {{ formatAdminDateTime(row.roleConfirmedAt) }}
- 兑换 {{ formatAdminDateTime(row.redeemedAt) }}
-
-
-
-
-
-
-
{{
- row.lastError || '当前无异常'
- }}
-
-
- 重试
-
-
- 换绑角色
-
-
- 转人工
-
-
- 关闭任务
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskActionBar.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskActionBar.vue
deleted file mode 100644
index 66bf5e06..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskActionBar.vue
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
- 重试任务
-
-
- 换绑角色
-
-
- 准备绑定资源
-
-
- 确认绑定完成并发货
-
-
- 退还号码
-
-
- 重发发码回调
-
-
- 手动核销
-
-
- 转人工
-
-
- 人工完成
-
-
- 履约失败
-
-
- 关闭任务
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskEventsSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskEventsSection.vue
deleted file mode 100644
index 1b993374..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskEventsSection.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- 任务事件
-
-
-
-
-
{{ formatTaskEventType(event.eventType) }}
-
{{ formatTaskEventPayload(event.payload) }}
-
{{ formatAdminDateTime(event.createdAt) }}
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskHeroSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskHeroSection.vue
deleted file mode 100644
index 4cf95fb5..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskHeroSection.vue
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
-
-
-
自动履约任务
-
{{ detail.task.taskNo }}
-
- 订单 {{ detail.order?.platformOrderId || '-' }} · 商品
- {{ detail.orderItem?.skuName || detail.orderItem?.skuCode || '-' }}
- · 核销店铺
- {{ detail.order?.shopName || detail.order?.shopId || '-' }}
-
-
-
-
-
-
-
- {{ card.label }}
- {{ card.value }}
-
-
-
-
- 资源 {{ resolveResourceStageLabel(detail.task.resourceStatus) }}
- 客户 {{ resolveCustomerStageLabel(detail.task.customerStatus) }}
- 最近异常 {{ detail.task.lastError }}
-
-
-
- 客户领取页
- 已失效
-
-
-
-
-
- {{ detail.task.taskNo }}
-
- 状态: · 订单:{{
- detail.order?.platformOrderId || '-'
- }}
-
-
- 执行器:{{ detail.task.executorKey || '-' }} · 履约:
-
-
- 资源:{{ resolveResourceStageLabel(detail.task.resourceStatus) }} ·
- 客户:{{ resolveCustomerStageLabel(detail.task.customerStatus) }}
-
-
- 角色:{{ detail.task.roleName || '-' }} /
- {{ detail.task.roleId || '-' }}
-
- 最后错误:{{ detail.task.lastError || '-' }}
-
- 领取链接:
- {{ claimUrl }}
-
- 领取链接:已失效
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskInfoSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskInfoSection.vue
deleted file mode 100644
index 51bbb0ca..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskInfoSection.vue
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
- 任务信息
-
- {{
- detail.orderItem?.skuName || '-'
- }}
- {{
- detail.orderItem?.skuCode || '-'
- }}
-
- {{ detail.task.executorKey || '-' }}
-
-
-
-
- {{
- detail.task.resultCode || '-'
- }}
-
- {{ detail.task.resultMessage || '-' }}
-
-
-
- {{ detail.claimToken?.token || '-' }}
-
-
-
- 客服账号不可查看原始领取 Token
-
-
-
-
-
- {{ formatAdminDateTime(detail.claimToken?.expiredAt) }}
-
-
- {{
- claimUrl
- }}
- 已失效
- -
-
-
- {{ detail.task.runtimeSessionId || '-' }}
-
-
- {{ formatAdminDateTime(detail.task.claimedAt) }}
-
-
- {{ formatAdminDateTime(detail.task.roleConfirmedAt) }}
-
-
- {{ formatAdminDateTime(detail.task.redeemedAt) }}
-
-
- {{ detail.task.screenshotPath || '-' }}
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouCloudPanel.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouCloudPanel.vue
deleted file mode 100644
index cc82bab8..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouCloudPanel.vue
+++ /dev/null
@@ -1,473 +0,0 @@
-
-
-
-
-
-
-
自动履约流程
-
- 优先看当前步骤和客户角色;详细链接、核销、cloud 资源字段可按需展开。
-
-
-
-
- 刷新角色信息
-
-
- 复制绑定链接
-
-
- 打开绑定页
-
-
-
-
-
-
-
-
-
-
客户角色
-
客户绑定后刷新角色信息,确认无误后再执行发货。
-
-
-
-
-
- 角色名
- {{ flow.role?.name || detail.task.roleName || '等待识别' }}
-
-
- 角色 ID
- {{ flow.role?.rid || detail.task.roleId || '等待识别' }}
-
-
- 最近刷新
- {{ formatAdminDateTime(flow.role?.refreshedAt) }}
-
-
-
- ✓ 角色已识别
-
-
- 客户完成绑定后,点击右上角「刷新」按钮获取角色信息,确认角色名与 ID 无误后再执行发货。
-
-
- {{ flow.role.errorMessage }}
-
-
-
-
-
- 流程进度
- 当前任务只需要按这个顺序推进,异常时再展开下方明细。
-
-
-
-
-
- {{ item.label }}
- 当前
-
-
{{ item.detail }}
-
-
-
-
-
-
-
-
-
-
- 客户领取与绑定明细
-
- {{ badgeLabel(resolveClaimBadge(flow, claimUrl)) }}
-
-
-
-
-
- 客户会先在领取页查看图文指引并提交核销码,只有校验通过后才会自动跳转绑定链接。
-
-
-
-
-
-
- 核销与商品明细
-
- {{ badgeLabel(resolveTicketBadge(flow)) }}
-
-
-
-
-
- "确认绑定完成并发货"已经合并为一个按钮,只有核销码通过校验后才能继续。
-
-
-
-
-
-
- Cloud 资源与发货明细
-
- {{ badgeLabel(resolveCloudBadge(flow)) }}
-
-
-
-
-
-
-
-
-
- 流程收口
-
- {{ badgeLabel(resolveClosureBadge(flow)) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 第 {{ item.attempt }} 次换绑 · {{ formatRebindSource(item.source) }} ·
- {{ item.status === 'success' ? '成功' : '失败' }}
-
-
原 {{ formatRebindBinding(item.oldBinding) }}
-
- 新 {{ formatRebindBinding(item.newBinding) }}
-
-
- {{ item.errorMessage }}
-
-
{{ formatAdminDateTime(item.requestedAt) }}
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouIndustryVoucherSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouIndustryVoucherSection.vue
deleted file mode 100644
index 5eeb7a93..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouIndustryVoucherSection.vue
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
-
电子凭证与核销
-
-
- 重发发码回调
-
-
- 手动核销
-
-
-
-
-
-
-
- {{ voucher.oid || '-' }}
-
-
- {{ voucher.unitIndex || '-' }}
-
-
- {{ voucher.voucherCode || '-' }}
-
-
-
-
-
-
-
-
- {{ voucher.sendCallbackAttemptCount || 0 }}
-
-
- {{ formatAdminDateTime(voucher.sendCallbackSentAt) }}
-
-
- {{ voucher.sendCallbackLastError || '-' }}
-
-
- {{ voucher.consumeSerialNum || '-' }}
-
-
- {{ formatAdminDateTime(voucher.consumedAt) }}
-
-
- {{ formatAdminDateTime(voucher.destroyedAt) }}
-
-
-
-
-
核销明细
-
-
- {{ formatValue(row.serialNum) }}
-
-
- {{ formatValue(row.consumeType) }}
-
-
- {{ formatConsumeDetailTime(row.consumeTime) }}
-
-
- {{ formatValue(row.source) }}
-
-
-
- {{
- [row.storeName, row.storeAddress, row.expressCode, row.expressNo]
- .map(formatValue)
- .filter((item) => item !== '-')
- .join(' / ') || '-'
- }}
-
-
-
-
-
-
-
-
-
-
-
- {{ detail.task.platformOrderId || '-' }}
-
-
- {{ detail.task.resultCode || '-' }}
-
-
- {{ missingReason }}
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskManualDispatchSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskManualDispatchSection.vue
deleted file mode 100644
index e2dd8619..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskManualDispatchSection.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
- 人工履约回写
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- · {{ formatAdminDateTime(detail.manualDispatch.completedAt) }}
-
-
- {{ detail.manualDispatch.completedBy?.username || '-' }} /
- {{ detail.manualDispatch.completedBy?.role || '-' }}
-
-
- {{ detail.manualDispatch.deliveryReference || '-' }}
-
-
- {{ detail.manualDispatch.deliveredCredential || '-' }}
-
-
- {{ detail.manualDispatch.resultMessage || '-' }}
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskRedeemResolutionSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskRedeemResolutionSection.vue
deleted file mode 100644
index 26f7fb8e..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskRedeemResolutionSection.vue
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
- 兑换重试链路
-
- 这里记录自动兑换时每次使用过的 CDK、判定结果,以及是否切换到了新的同类型凭据。
-
-
-
-
- 处理结果
- {{ formatRedeemResolutionStatus(detail.redeemResolution!.status) }}
-
-
- 任务收口状态
- {{ detail.redeemResolution!.taskStatus || detail.task.status || '-' }}
-
-
- 更换新码次数
- {{ detail.redeemResolution!.replacementCount }}
-
-
- 完成时间
- {{ formatAdminDateTime(detail.redeemResolution!.finishedAt) }}
-
-
-
-
-
-
- 第 {{ attempt.attempt }} 次尝试
- {{ formatRedeemOutcomeLabel(attempt.outcome) }}
-
-
-
- 凭据
- {{ attempt.codeMasked || '-' }}
-
-
- 类型
- {{ attempt.credentialType || '-' }}
-
-
- 结果码
- {{ attempt.resultCode || '-' }}
-
-
-
- {{ attempt.resultMessage || '-' }}
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskScreenshotSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskScreenshotSection.vue
deleted file mode 100644
index 3050390d..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskScreenshotSection.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- {{ sectionTitle }}
- 截图加载中或当前不可读取。
- 打开原图
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/tasks/composables/types.ts b/apps/frontend-vue/src/views/admin/tasks/composables/types.ts
deleted file mode 100644
index b4f28035..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/composables/types.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import type { AdminTaskDetail } from '@/types/admin'
-
-export type KuaishouCloudFlow = NonNullable
-
-export type SummaryCard = {
- label: string
- value: string
- tone: 'blue' | 'green' | 'amber' | 'slate'
-}
-
-export type RoleInfoEntry = {
- key: string
- label: string
- value: string
-}
-
-export type ChecklistItem = {
- key: string
- label: string
- status: string
- detail: string
-}
-
-export type ManualDispatchForm = {
- deliveryReference: string
- deliveredCredential: string
- resultMessage: string
-}
diff --git a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskDetail.ts b/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskDetail.ts
deleted file mode 100644
index 95e7bcde..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskDetail.ts
+++ /dev/null
@@ -1,211 +0,0 @@
-import { computed, onBeforeUnmount, ref } from 'vue'
-import { useRoute } from 'vue-router'
-
-import { showConfirm, showError, showSuccess } from '@/lib/feedback'
-import {
- completeAdminTaskManualDispatch,
- fetchAdminTaskScreenshot,
- fetchAdminTaskDetail,
-} from '@/services/admin'
-import type { AdminTaskActionResponse, AdminTaskDetail } from '@/types/admin'
-import { hasAdminRole } from '@/utils/admin-auth'
-
-import type { ManualDispatchForm } from './types'
-
-export function useAdminTaskDetail() {
- const route = useRoute()
- const loading = ref(true)
- const actionLoading = ref(false)
- const errorMessage = ref('')
- const detail = ref(null)
- const lastClaimUrl = ref('')
- const screenshotPreviewUrl = ref('')
- const manualDispatchForm = ref({
- deliveryReference: '',
- deliveredCredential: '',
- resultMessage: '',
- })
-
- const canManageTaskLifecycle = computed(() => hasAdminRole('operator'))
- const canCloseTasks = computed(() => hasAdminRole('support'))
- const canViewSensitiveTaskData = computed(() =>
- Boolean(detail.value?.operations.canViewSensitiveTaskData),
- )
-
- const claimUrl = computed(() => {
- const tokenStatus = String(detail.value?.claimToken?.status || '').trim()
- const taskStatus = String(detail.value?.task.status || '').trim()
-
- if (tokenStatus !== 'active' || ['closed', 'expired'].includes(taskStatus)) {
- return ''
- }
-
- return lastClaimUrl.value || detail.value?.claimToken?.claimUrl || ''
- })
-
- const claimLinkInvalid = computed(() => {
- const tokenStatus = String(detail.value?.claimToken?.status || '').trim()
- return Boolean(
- detail.value?.claimToken?.claimUrl &&
- tokenStatus &&
- tokenStatus !== 'active',
- )
- })
-
- const screenshotSectionTitle = computed(() => {
- if (detail.value?.task.status === 'redeemed') {
- return '结果截图'
- }
-
- return detail.value?.review.required ? '客服复核截图' : '结果截图'
- })
-
- async function loadDetail() {
- loading.value = true
- errorMessage.value = ''
-
- try {
- const response = await fetchAdminTaskDetail(String(route.params.taskId || ''))
- detail.value = response.data
- syncManualDispatchForm(response.data)
- await loadScreenshotPreview(response.data)
- } catch (error) {
- errorMessage.value = error instanceof Error ? error.message : '读取任务详情失败'
- } finally {
- loading.value = false
- }
- }
-
- async function runAction(
- action: () => Promise<{ data: AdminTaskActionResponse }>,
- successMessage: string,
- confirmText: string,
- ) {
- try {
- await showConfirm(confirmText, '确认操作', {
- type: 'warning',
- confirmButtonText: '继续执行',
- cancelButtonText: '取消',
- })
- } catch {
- return
- }
-
- actionLoading.value = true
-
- try {
- const response = await action()
- if (response.data.claimUrl) {
- lastClaimUrl.value = response.data.claimUrl
- }
- showSuccess(successMessage)
- await loadDetail()
- } catch (error) {
- showError(error instanceof Error ? error.message : '操作失败')
- await loadDetail()
- } finally {
- actionLoading.value = false
- }
- }
-
- async function loadScreenshotPreview(taskDetail: AdminTaskDetail) {
- clearScreenshotPreview()
-
- if (!taskDetail.screenshotUrl) {
- return
- }
-
- try {
- const blob = await fetchAdminTaskScreenshot(taskDetail.task.taskId)
- screenshotPreviewUrl.value = URL.createObjectURL(blob)
- } catch {
- screenshotPreviewUrl.value = ''
- }
- }
-
- function clearScreenshotPreview() {
- if (screenshotPreviewUrl.value) {
- URL.revokeObjectURL(screenshotPreviewUrl.value)
- screenshotPreviewUrl.value = ''
- }
- }
-
- function syncManualDispatchForm(taskDetail: AdminTaskDetail) {
- manualDispatchForm.value = {
- deliveryReference: taskDetail.manualDispatch?.deliveryReference || '',
- deliveredCredential: taskDetail.manualDispatch?.deliveredCredential || '',
- resultMessage:
- taskDetail.manualDispatch?.resultMessage || taskDetail.task.resultMessage || '',
- }
- }
-
- async function submitManualDispatch(outcome: 'delivered' | 'failed') {
- if (!detail.value) {
- return
- }
-
- const actionLabel = outcome === 'failed' ? '标记履约失败' : '标记已完成履约'
- const confirmText =
- outcome === 'failed'
- ? `确认把任务 ${detail.value.task.taskNo} 回写为人工履约失败吗?这会把任务直接收口并保留失败原因。`
- : `确认把任务 ${detail.value.task.taskNo} 回写为人工履约完成吗?这会把任务直接标记为已发放。`
-
- await runAction(
- () =>
- completeAdminTaskManualDispatch(detail.value!.task.taskId, {
- outcome,
- resultMessage: manualDispatchForm.value.resultMessage,
- deliveryReference: manualDispatchForm.value.deliveryReference,
- deliveredCredential: manualDispatchForm.value.deliveredCredential,
- }),
- actionLabel,
- confirmText,
- )
- }
-
- async function copyText(value: string, successMessage: string) {
- const text = String(value || '').trim()
- if (!text) {
- showError('当前没有可复制的内容')
- return
- }
-
- try {
- await navigator.clipboard.writeText(text)
- showSuccess(successMessage)
- } catch {
- showError('复制失败,请手动复制')
- }
- }
-
- function openExternalLink(value: string) {
- const text = String(value || '').trim()
- if (!text) {
- return
- }
-
- window.open(text, '_blank', 'noopener,noreferrer')
- }
-
- onBeforeUnmount(clearScreenshotPreview)
-
- return {
- loading,
- actionLoading,
- errorMessage,
- detail,
- screenshotPreviewUrl,
- manualDispatchForm,
- canManageTaskLifecycle,
- canCloseTasks,
- canViewSensitiveTaskData,
- claimUrl,
- claimLinkInvalid,
- screenshotSectionTitle,
- loadDetail,
- runAction,
- submitManualDispatch,
- copyText,
- openExternalLink,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskKuaishouCloud.ts b/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskKuaishouCloud.ts
deleted file mode 100644
index 0d36cf22..00000000
--- a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskKuaishouCloud.ts
+++ /dev/null
@@ -1,221 +0,0 @@
-import { computed, type Ref } from 'vue'
-
-import {
- consumeAdminTaskKuaishouIndustryVoucher,
- dispatchAdminTaskKuaishouCloudFulfillment,
- prepareAdminTaskKuaishouCloudFulfillment,
- refreshAdminTaskKuaishouCloudRoleInfo,
- resendAdminTaskKuaishouIndustryVoucherCode,
- returnNumberAdminTaskKuaishouCloudFulfillment,
-} from '@/services/admin'
-import type { AdminTaskActionResponse, AdminTaskDetail } from '@/types/admin'
-import { formatKuaishouRoleInfoLabel } from '@/utils/admin-display'
-import { formatAdminDateTime } from '@/utils/admin-time'
-
-import type { ChecklistItem, RoleInfoEntry, SummaryCard } from './types'
-
-export function useAdminTaskKuaishouCloud(
- detail: Ref,
- runAction: (
- action: () => Promise<{ data: AdminTaskActionResponse }>,
- successMessage: string,
- confirmText: string,
- ) => Promise,
-) {
- const kuaishouCloudFlow = computed(() => detail.value?.kuaishouCloudFulfillment || null)
- const kuaishouCloudRole = computed(() => kuaishouCloudFlow.value?.role || null)
- const isKuaishouCloudTask = computed(
- () => detail.value?.task.executorKey === 'kuaishou_ct_assisted',
- )
-
- const summaryCards = computed(() => {
- if (!detail.value) {
- return []
- }
-
- return [
- {
- label: '任务状态',
- value: detail.value.task.status || '-',
- tone: 'blue',
- },
- {
- label: '履约状态',
- value: detail.value.task.deliveryStatus || '-',
- tone: 'green',
- },
- {
- label: '当前角色',
- value: kuaishouCloudRole.value?.name || detail.value.task.roleName || '-',
- tone: 'amber',
- },
- {
- label: '角色 ID',
- value: kuaishouCloudRole.value?.rid || detail.value.task.roleId || '-',
- tone: 'slate',
- },
- ]
- })
-
- const kuaishouRoleInfoEntries = computed(() => {
- const rawInfo = kuaishouCloudRole.value?.rawInfo
- if (!rawInfo) {
- return []
- }
-
- return Object.entries(rawInfo)
- .filter(([, value]) => value !== null && value !== undefined && String(value).trim() !== '')
- .map(([key, value]) => ({
- key,
- label: formatKuaishouRoleInfoLabel(key),
- value: typeof value === 'object' ? JSON.stringify(value) : String(value),
- }))
- })
-
- const kuaishouCloudChecklist = computed(() => {
- const flow = kuaishouCloudFlow.value
- const role = kuaishouCloudRole.value
- if (!flow) {
- return []
- }
-
- return [
- {
- key: 'ticket',
- label: '核销码校验',
- status: flow.ticket.status || 'pending',
- detail: flow.ticket.verifiedAt
- ? `已于 ${formatAdminDateTime(flow.ticket.verifiedAt)} 校验`
- : '等待客户提交并校验核销码',
- },
- {
- key: 'bind',
- label: '绑定资源',
- status: flow.binding.prepareStatus || 'pending',
- detail: flow.binding.bindPreparedAt
- ? `绑定资源已准备,VN ${flow.binding.vnId || '-'}`
- : '等待准备 Cloud 绑定资源',
- },
- {
- key: 'role',
- label: '角色识别',
- status: role?.status || 'pending',
- detail:
- role?.name || role?.rid
- ? `${role?.name || '-'} / ${role?.rid || '-'}`
- : '客户绑定后刷新角色信息',
- },
- {
- key: 'dispatch',
- label: '发货执行',
- status: flow.dispatch.status || 'pending',
- detail: flow.dispatch.dispatchAt
- ? `已于 ${formatAdminDateTime(flow.dispatch.dispatchAt)} 发货`
- : '等待客服确认绑定并发货',
- },
- {
- key: 'return',
- label: '退还号码',
- status: flow.returnNumber.status || 'pending',
- detail: flow.returnNumber.returnedAt
- ? `已于 ${formatAdminDateTime(flow.returnNumber.returnedAt)} 退号`
- : '发货后执行退还号码',
- },
- {
- key: 'consume',
- label: '快手核销',
- status: flow.consume.status || 'pending',
- detail: flow.consume.consumedAt
- ? `已于 ${formatAdminDateTime(flow.consume.consumedAt)} 完成核销`
- : flow.consume.errorMessage || '等待退号后核销收口',
- },
- ]
- })
-
- async function submitKuaishouCloudPrepare() {
- if (!detail.value) {
- return
- }
-
- await runAction(
- () => prepareAdminTaskKuaishouCloudFulfillment(detail.value!.task.taskId),
- '绑定资源已准备完成',
- `确认开始为任务 ${detail.value.task.taskNo} 准备绑定资源吗?系统会自动检查背包、余额并申请虚拟号。`,
- )
- }
-
- async function submitKuaishouCloudDispatch() {
- if (!detail.value) {
- return
- }
-
- await runAction(
- () => dispatchAdminTaskKuaishouCloudFulfillment(detail.value!.task.taskId),
- '已完成绑定确认并发货',
- `确认客户已经完成绑定,并立即为任务 ${detail.value.task.taskNo} 执行发货吗?这个动作会把"确认绑定完成"和"发货"合并为一步。`,
- )
- }
-
- async function submitKuaishouCloudRefreshRoleInfo() {
- if (!detail.value) {
- return
- }
-
- await runAction(
- () => refreshAdminTaskKuaishouCloudRoleInfo(detail.value!.task.taskId),
- '角色信息已刷新',
- `确认刷新任务 ${detail.value.task.taskNo} 当前云绑定角色信息吗?系统会重新查询 cloudtentacles 的绑定结果。`,
- )
- }
-
- async function submitKuaishouCloudReturnNumber() {
- if (!detail.value) {
- return
- }
-
- await runAction(
- () => returnNumberAdminTaskKuaishouCloudFulfillment(detail.value!.task.taskId),
- '号码已退还',
- `确认退还任务 ${detail.value.task.taskNo} 当前使用的虚拟号吗?退号后该流程会正式收口。`,
- )
- }
-
- async function submitKuaishouIndustryResendCode() {
- if (!detail.value) {
- return
- }
-
- await runAction(
- () => resendAdminTaskKuaishouIndustryVoucherCode(detail.value!.task.taskId),
- '电子凭证发码回调已重发',
- `确认重发任务 ${detail.value.task.taskNo} 的电子凭证发码回调吗?系统会复用当前核销码,不会生成新码。`,
- )
- }
-
- async function submitKuaishouIndustryConsume() {
- if (!detail.value) {
- return
- }
-
- await runAction(
- () => consumeAdminTaskKuaishouIndustryVoucher(detail.value!.task.taskId),
- '电子凭证已执行核销',
- `确认手动执行任务 ${detail.value.task.taskNo} 的电子凭证核销吗?请先确认快手侧已收到发码回调。`,
- )
- }
-
- return {
- kuaishouCloudFlow,
- kuaishouCloudRole,
- isKuaishouCloudTask,
- summaryCards,
- kuaishouRoleInfoEntries,
- kuaishouCloudChecklist,
- submitKuaishouCloudPrepare,
- submitKuaishouCloudDispatch,
- submitKuaishouCloudRefreshRoleInfo,
- submitKuaishouCloudReturnNumber,
- submitKuaishouIndustryResendCode,
- submitKuaishouIndustryConsume,
- }
-}
diff --git a/apps/frontend-vue/src/views/admin/users/AdminUsersView.vue b/apps/frontend-vue/src/views/admin/users/AdminUsersView.vue
deleted file mode 100644
index 9518122a..00000000
--- a/apps/frontend-vue/src/views/admin/users/AdminUsersView.vue
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/users/components/AdminUsersFilterSection.vue b/apps/frontend-vue/src/views/admin/users/components/AdminUsersFilterSection.vue
deleted file mode 100644
index 287578e5..00000000
--- a/apps/frontend-vue/src/views/admin/users/components/AdminUsersFilterSection.vue
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/users/components/AdminUsersTable.vue b/apps/frontend-vue/src/views/admin/users/components/AdminUsersTable.vue
deleted file mode 100644
index 47862a68..00000000
--- a/apps/frontend-vue/src/views/admin/users/components/AdminUsersTable.vue
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
- 用户列表
- 共 {{ pagination.total }} 个账号
-
-
-
-
-
- {{ formatRoleLabel(row.role) }}
-
-
-
-
-
- {{ formatAdminDateTime(row.createdAt) }}
-
-
- {{ formatAdminDateTime(row.updatedAt) }}
-
-
-
-
-
updateRole(row, cmd as AdminRole)"
- >
-
- 改角色
-
-
-
- 设为管理员
- 设为运营
- 设为客服
-
-
-
-
{{ row.status === 'active' ? '停用' : '启用' }}
-
重置密码
-
当前账号
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/admin/users/composables/useAdminUsers.ts b/apps/frontend-vue/src/views/admin/users/composables/useAdminUsers.ts
deleted file mode 100644
index 82de9cf1..00000000
--- a/apps/frontend-vue/src/views/admin/users/composables/useAdminUsers.ts
+++ /dev/null
@@ -1,199 +0,0 @@
-import { onMounted, ref } from 'vue'
-
-import {
- isFeedbackDismissed,
- showConfirm,
- showError,
- showPrompt,
- showSuccess,
-} from '@/lib/feedback'
-import {
- createAdminUser,
- fetchAdminUsers,
- resetAdminUserPassword,
- updateAdminUserRole,
- updateAdminUserStatus,
-} from '@/services/admin'
-import type { AdminPagination, AdminRole, AdminUserListItem } from '@/types/admin'
-import { getAdminUserId, hasAdminRole } from '@/utils/admin-auth'
-import { adminUserRoleOptions, adminUserStatusOptions } from '@/utils/admin-options'
-import { formatAdminDateTime } from '@/utils/admin-time'
-
-export function useAdminUsers() {
- const loading = ref(true)
- const creating = ref(false)
- const actionLoadingId = ref(null)
- const errorMessage = ref('')
- const username = ref('')
- const role = ref('')
- const status = ref('')
- const createUsername = ref('')
- const createPassword = ref('')
- const createRole = ref('operator')
- const items = ref([])
- const pagination = ref({ page: 1, pageSize: 20, total: 0 })
-
- function isCurrentUser(userId: number) {
- return getAdminUserId() === userId
- }
-
- function formatRoleLabel(role: AdminRole) {
- if (role === 'admin') return '管理员'
- if (role === 'support') return '客服'
- return '普通运营'
- }
-
- async function loadUsers(page = pagination.value.page) {
- if (!hasAdminRole('admin')) {
- loading.value = false
- return
- }
- loading.value = true
- errorMessage.value = ''
- try {
- const response = await fetchAdminUsers({
- page,
- pageSize: pagination.value.pageSize,
- username: username.value.trim(),
- role: role.value.trim(),
- status: status.value.trim(),
- })
- items.value = response.data.items
- pagination.value = response.data.pagination
- } catch (error) {
- errorMessage.value = error instanceof Error ? error.message : '读取后台用户失败'
- } finally {
- loading.value = false
- }
- }
-
- async function submitCreate() {
- if (!createUsername.value.trim() || !createPassword.value.trim()) {
- showError('请填写账号和密码')
- return
- }
- creating.value = true
- try {
- await createAdminUser({
- username: createUsername.value.trim(),
- password: createPassword.value.trim(),
- role: createRole.value,
- status: 'active',
- })
- showSuccess('后台用户已创建')
- createUsername.value = ''
- createPassword.value = ''
- createRole.value = 'operator'
- await loadUsers(1)
- } catch (error) {
- showError(error instanceof Error ? error.message : '创建后台用户失败')
- } finally {
- creating.value = false
- }
- }
-
- async function updateRole(item: AdminUserListItem, nextRole: AdminRole) {
- if (item.role === nextRole) return
- try {
- await showConfirm(
- `确认将 ${item.username} 调整为${formatRoleLabel(nextRole)}吗?`,
- '确认操作',
- { type: 'warning', confirmButtonText: '继续执行', cancelButtonText: '取消' },
- )
- } catch {
- return
- }
- actionLoadingId.value = item.userId
- try {
- await updateAdminUserRole(item.userId, { role: nextRole })
- showSuccess('用户角色已更新')
- await loadUsers()
- } catch (error) {
- showError(error instanceof Error ? error.message : '更新用户角色失败')
- } finally {
- actionLoadingId.value = null
- }
- }
-
- async function toggleStatus(item: AdminUserListItem) {
- const nextStatus = item.status === 'active' ? 'disabled' : 'active'
- try {
- await showConfirm(
- `确认将 ${item.username}${nextStatus === 'active' ? '启用' : '停用'}吗?`,
- '确认操作',
- {
- type: nextStatus === 'active' ? 'info' : 'warning',
- confirmButtonText: '继续执行',
- cancelButtonText: '取消',
- },
- )
- } catch {
- return
- }
- actionLoadingId.value = item.userId
- try {
- await updateAdminUserStatus(item.userId, { status: nextStatus })
- showSuccess('用户状态已更新')
- await loadUsers()
- } catch (error) {
- showError(error instanceof Error ? error.message : '更新用户状态失败')
- } finally {
- actionLoadingId.value = null
- }
- }
-
- async function promptResetPassword(item: AdminUserListItem) {
- try {
- const result = await showPrompt(`请输入 ${item.username} 的新密码`, '重置密码', {
- inputType: 'password',
- inputPlaceholder: '至少 8 位',
- confirmButtonText: '提交',
- cancelButtonText: '取消',
- inputValidator: (value) => value.trim().length >= 8 || '密码至少 8 位',
- })
- actionLoadingId.value = item.userId
- await resetAdminUserPassword(item.userId, { password: result.value.trim() })
- showSuccess('用户密码已重置')
- await loadUsers()
- } catch (error) {
- if (isFeedbackDismissed(error)) return
- showError(error instanceof Error ? error.message : '重置密码失败')
- } finally {
- actionLoadingId.value = null
- }
- }
-
- onMounted(loadUsers)
-
- return {
- // state
- loading,
- creating,
- actionLoadingId,
- errorMessage,
- items,
- pagination,
- // filter
- username,
- role,
- status,
- // create
- createUsername,
- createPassword,
- createRole,
- // actions
- loadUsers,
- submitCreate,
- updateRole,
- toggleStatus,
- promptResetPassword,
- // formatters
- isCurrentUser,
- formatRoleLabel,
- // utils
- hasAdminRole,
- formatAdminDateTime,
- adminUserRoleOptions,
- adminUserStatusOptions,
- }
-}
diff --git a/apps/frontend-vue/src/views/claim/ClaimView.vue b/apps/frontend-vue/src/views/claim/ClaimView.vue
deleted file mode 100644
index 45f05643..00000000
--- a/apps/frontend-vue/src/views/claim/ClaimView.vue
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/KuaishouCloudClaimView.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/KuaishouCloudClaimView.vue
deleted file mode 100644
index 153714f2..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/KuaishouCloudClaimView.vue
+++ /dev/null
@@ -1,260 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
{{ claim.errorMessage.value }}
-
-
-
-
-
-
kuaishou-feifei
-
{{ claim.product.value?.title || claim.orderItem.value?.skuName || '商品领取' }}
-
- {{ claim.feifei.value.rechargeStatusLabel || '待领取' }}
-
-
-
-
-
-
- 订单号
- - {{ claim.order.value?.platformOrderId || '-' }}
-
-
-
- 平台单号
- - {{ claim.feifei.value.orderNo || claim.feifei.value.platformOrderNo || '-' }}
-
-
-
-
- 打开领取链接
-
-
-
- {{ claim.task.value.lastError }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimBindingStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimBindingStep.vue
deleted file mode 100644
index 359334a2..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimBindingStep.vue
+++ /dev/null
@@ -1,350 +0,0 @@
-
-
-
-
-
-
-
Q区用Q扫
-
![绑定二维码]()
-
V区用V扫
-
长按保存相册进行扫码绑定
-
-
-
-
-
- 系统正在准备绑定资源,请稍后自动刷新。
-
-
-
-
- 当前角色
- {{ roleName || '待识别' }}
-
-
- 角色 ID
- {{ roleId || '-' }}
-
-
-
-
- 当前仍是虚拟机默认角色,请重新绑定自己的角色信息。
-
-
-
-
-
- 刷新角色信息
-
-
- 换绑角色
-
-
-
-
- 我已完成绑定,下一步
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimConfirmStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimConfirmStep.vue
deleted file mode 100644
index c553ebd6..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimConfirmStep.vue
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
-
-
- 第 3 步:确认兑换信息
- 请再次确认角色和商品信息,确认无误后再继续兑换。
-
-
-
- 角色名称
- {{ roleName || '-' }}
-
-
- 角色 ID
- {{ roleId || '-' }}
-
-
- 领取商品
- {{ product?.title || '-' }}
-
-
- 商品数量
- {{ product?.quantity || 0 }}
-
-
-
-
-
-
-
- 兑换后不可取消,也不可退货。
-
-
-
-
- 换绑角色
-
-
- 确认兑换
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimHeaderCard.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimHeaderCard.vue
deleted file mode 100644
index 557c72e4..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimHeaderCard.vue
+++ /dev/null
@@ -1,208 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimProductItems.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimProductItems.vue
deleted file mode 100644
index 5f8534c5..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimProductItems.vue
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
-
-
-
- {{ item.name }}
- x{{ item.quantity }}
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimResultStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimResultStep.vue
deleted file mode 100644
index 50ebe345..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimResultStep.vue
+++ /dev/null
@@ -1,181 +0,0 @@
-
-
-
-
-
-
-
-
- 结果时间
- {{ formatDateTime(flow.dispatch.dispatchAt) }}
-
-
- 领取商品
- {{ product?.title || '-' }}
-
-
- 角色名称
- {{ roleName || '-' }}
-
-
- 角色 ID
- {{ roleId || '-' }}
-
-
- 订单号
- {{ order?.platformOrderId || '-' }}
-
-
- 购买数量
- {{ product?.quantity || 0 }}
-
-
-
-
-
-
-
-
-
-
- 当前兑换未完成,客服会根据后台任务记录继续处理。
- 客户侧操作已经完成,后续履约结果请以后台任务界面为准。
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimSummaryCard.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimSummaryCard.vue
deleted file mode 100644
index 71890a2f..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimSummaryCard.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
- 当前进度
- {{ progressText }}
-
-
- 当前角色
- {{ roleName || '待识别' }}
-
-
- 角色 ID
- {{ roleId || '-' }}
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimTicketStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimTicketStep.vue
deleted file mode 100644
index e9507005..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimTicketStep.vue
+++ /dev/null
@@ -1,149 +0,0 @@
-
-
-
-
- 第 1 步:提交核销码
-
- 请您先从快手小店复制核销码。提交后会立即核销,核销成功后系统会自动准备绑定资源。
-
-
-
-
-
- 提交核销码并继续
-
-
-
-
- {{
- isBindingPreparing ? '核销完成后会自动准备绑定资源。' : '核销完成后会自动进入扫码绑定步骤。'
- }}
-
-
-
-
-
-
-
-
- 步骤 {{ index + 1 }}
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/composables/useKuaishouCloudClaim.ts b/apps/frontend-vue/src/views/claim/kuaishou-cloud/composables/useKuaishouCloudClaim.ts
deleted file mode 100644
index 623dc141..00000000
--- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/composables/useKuaishouCloudClaim.ts
+++ /dev/null
@@ -1,523 +0,0 @@
-import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
-import QRCode from 'qrcode'
-import { ElMessageBox } from 'element-plus'
-
-import { showError, showSuccess } from '@/lib/feedback'
-import {
- TASK_STATUS,
- hasKuaishouCloudRedeemResultStatus,
- isClaimInactiveTaskStatus,
- isKuaishouCloudCompletedStatus,
- isKuaishouCloudRoleConfirmedStatus,
- normalizeTaskStatus,
-} from '@/domain/task-status'
-import { formatAdminDateTime } from '@/utils/admin-time'
-import {
- confirmKuaishouCloudClaimRole,
- fetchClaimDetail,
- rebindKuaishouCloudClaimRole,
- redeemKuaishouCloudClaim,
- verifyKuaishouCloudClaimTicket,
-} from '@/services/claim'
-import type { ClaimDetailData } from '@/types/claim'
-
-const BINDING_PREPARE_POLL_MS = 5_000
-const ROLE_FAST_POLL_MS = 10_000
-const ROLE_SLOW_POLL_MS = 30_000
-const ROLE_IDLE_POLL_MS = 60_000
-const ROLE_FAST_WINDOW_MS = 3 * 60_000
-const ROLE_IDLE_WINDOW_MS = 10 * 60_000
-
-export function useKuaishouCloudClaim(token: () => string) {
- const loading = ref(true)
- const submitting = ref(false)
- const refreshingRole = ref(false)
- const confirmingRole = ref(false)
- const rebindingRole = ref(false)
- const redeeming = ref(false)
- const errorMessage = ref('')
- const detail = ref(null)
- const ticketCode = ref('')
- const qrCodeDataUrl = ref('')
- let pollTimer = 0
- let rolePollBaselineAt = 0
- let rolePollBaselineKey = ''
-
- // ── derived data ────────────────────────────────────────
-
- const flow = computed(() => detail.value?.kuaishouCloudFulfillment || null)
- const feifei = computed(() => detail.value?.kuaishouFeifei || null)
- const order = computed(() => detail.value?.order || null)
- const orderItem = computed(() => detail.value?.orderItem || null)
- const product = computed(() => detail.value?.product || null)
- const task = computed(() => detail.value?.task || null)
-
- // ── computed status flags ───────────────────────────────
-
- const roleName = computed(() => flow.value?.role.name || flow.value?.binding.roleName || '')
- const roleId = computed(() => flow.value?.role.rid || flow.value?.binding.roleId || '')
- const isFeifeiFlow = computed(() => detail.value?.flowType === 'kuaishou_feifei')
- const isTicketVerified = computed(() => flow.value?.ticket.status === 'verified')
-
- const isBindUrlExpired = computed(() => {
- const expiresAt = String(flow.value?.binding.bindExpiresAt || '').trim()
- if (!expiresAt) {
- return false
- }
- const expiresTime = Date.parse(expiresAt)
- return Number.isFinite(expiresTime) && expiresTime <= Date.now()
- })
-
- const isBindingPrepared = computed(
- () =>
- flow.value?.binding.prepareStatus === 'ready' &&
- Boolean(String(flow.value?.binding.bindUrl || '').trim()) &&
- !isBindUrlExpired.value,
- )
-
- const isBindingPreparing = computed(() => flow.value?.binding.prepareStatus === 'pending')
- const canEnterBindingStep = computed(() => isTicketVerified.value)
- const isRoleReady = computed(() => Boolean(roleName.value || roleId.value))
- const hasDefaultRoleSnapshot = computed(() =>
- Boolean(flow.value?.role.defaultName || flow.value?.role.defaultRid),
- )
- const isDefaultRole = computed(() => flow.value?.role.isDefaultRole === true)
- const isCustomerRoleReady = computed(
- () => isRoleReady.value && hasDefaultRoleSnapshot.value && !isDefaultRole.value,
- )
- const confirmRoleDisabledReason = computed(() => {
- if (!isBindingPrepared.value) {
- return '绑定二维码还在准备中,请稍后自动刷新'
- }
- if (!hasDefaultRoleSnapshot.value) {
- return flow.value?.role.defaultErrorMessage || '系统还未获取到虚拟机默认角色信息,请稍后刷新'
- }
- if (!isRoleReady.value) {
- return '请先扫码绑定自己的角色,并刷新角色信息'
- }
- if (isDefaultRole.value) {
- return '当前仍是虚拟机默认角色,请重新绑定自己的角色信息'
- }
- if (rebindingRole.value) {
- return '正在换绑角色,请稍候'
- }
- return ''
- })
- const isRoleConfirmed = computed(() => isKuaishouCloudRoleConfirmedStatus(task.value?.status))
- const isDispatched = computed(
- () => String(flow.value?.dispatch.status || '').trim() === 'success',
- )
- const isRedeemFailed = computed(() => {
- const status = normalizeTaskStatus(task.value?.status)
- return (
- status === TASK_STATUS.MANUAL_REVIEW ||
- status === TASK_STATUS.FAILED ||
- String(flow.value?.dispatch.status || '').trim() === 'failed'
- )
- })
-
- const isCompleted = computed(() => isKuaishouCloudCompletedStatus(task.value?.status))
-
- const hasRedeemResult = computed(() => {
- return isDispatched.value || hasKuaishouCloudRedeemResultStatus(task.value?.status)
- })
-
- const canSubmitTicket = computed(
- () => !isClaimInactiveTaskStatus(task.value?.status) && !submitting.value,
- )
-
- const currentStep = computed(() => {
- if (isFeifeiFlow.value) {
- return isCompleted.value ? 4 : 2
- }
- if (hasRedeemResult.value) {
- return 4
- }
- if (isRoleConfirmed.value) {
- return 3
- }
- if (canEnterBindingStep.value) {
- return 2
- }
- return 1
- })
-
- const progressText = computed(() => {
- if (isFeifeiFlow.value) {
- return feifei.value?.rechargeStatusLabel || '请打开领取链接'
- }
- if (hasRedeemResult.value) {
- return '兑换结果已生成'
- }
- if (isRoleConfirmed.value) {
- return '角色已确认,等待兑换'
- }
- if (isTicketVerified.value) {
- return isBindingPrepared.value ? '请完成扫码绑定' : '绑定链接刷新中,请稍候'
- }
- return '等待提交并核销'
- })
-
- const resultTitle = computed(() => {
- if (isRedeemFailed.value) {
- return '兑换遇到问题'
- }
- if (isCompleted.value) {
- return '兑换成功'
- }
- if (isDispatched.value) {
- return '兑换请求已提交'
- }
- return '结果已记录'
- })
-
- const resultDescription = computed(() => {
- if (isRedeemFailed.value) {
- const message = String(
- task.value?.lastError ||
- flow.value?.dispatch.errorMessage ||
- detail.value?.result?.resultMessage ||
- '',
- ).trim()
- return message || '当前兑换流程需要客服处理,后续结果请以后台任务界面为准。'
- }
- if (isCompleted.value) {
- return '当前兑换流程已经完成。发货、退号和核销结果会保存在后台任务界面。'
- }
- return '你的兑换请求已经提交。发货、退号和核销结果会由系统保存在后台任务界面,无需在此页面等待。'
- })
-
- const resultVariant = computed(() => {
- if (isRedeemFailed.value) {
- return 'warning'
- }
- if (isCompleted.value || isDispatched.value) {
- return 'success'
- }
- return 'info'
- })
-
- // ── actions ─────────────────────────────────────────────
-
- async function generateQRCode(url: string) {
- if (!url) {
- qrCodeDataUrl.value = ''
- return
- }
- try {
- qrCodeDataUrl.value = await QRCode.toDataURL(url, {
- width: 280,
- margin: 2,
- color: {
- dark: '#0f172a',
- light: '#ffffff',
- },
- })
- } catch (error) {
- qrCodeDataUrl.value = ''
- console.error('生成二维码失败:', error)
- }
- }
-
- async function applyDetail(nextDetail: ClaimDetailData) {
- detail.value = nextDetail
- if (!ticketCode.value && nextDetail.kuaishouCloudFulfillment?.ticket.code) {
- ticketCode.value = nextDetail.kuaishouCloudFulfillment.ticket.code
- }
- await generateQRCode(String(nextDetail.kuaishouCloudFulfillment?.binding.bindUrl || '').trim())
- }
-
- async function loadDetail(options: { silent?: boolean } = {}) {
- if (!options.silent) {
- loading.value = true
- }
- errorMessage.value = ''
- try {
- const response = await fetchClaimDetail(token())
- await applyDetail(response.data)
- syncPolling()
- } catch (error) {
- errorMessage.value = error instanceof Error ? error.message : '读取领取信息失败'
- stopPolling()
- } finally {
- if (!options.silent) {
- loading.value = false
- }
- }
- }
-
- async function submitTicket() {
- const normalizedTicketCode = ticketCode.value.trim()
- if (!normalizedTicketCode) {
- showError('请输入核销码')
- return
- }
-
- submitting.value = true
- try {
- const response = await verifyKuaishouCloudClaimTicket(token(), {
- ticketCode: normalizedTicketCode,
- })
- await applyDetail(response.data)
- showSuccess('核销已完成,系统已开始准备绑定资源')
- syncPolling()
- } catch (error) {
- showError(error instanceof Error ? error.message : '核销码验证失败')
- } finally {
- submitting.value = false
- }
- }
-
- async function refreshRole() {
- refreshingRole.value = true
- try {
- await loadDetail({ silent: true })
- if (isCustomerRoleReady.value) {
- showSuccess('角色信息已刷新')
- } else if (isDefaultRole.value) {
- showError('当前仍是虚拟机默认角色,请重新绑定自己的角色信息')
- } else {
- showError(
- flow.value?.role.errorMessage ||
- flow.value?.role.defaultErrorMessage ||
- '暂时还没有识别到角色信息,请完成绑定后稍等片刻再试',
- )
- }
- } finally {
- refreshingRole.value = false
- }
- }
-
- async function confirmRole() {
- confirmingRole.value = true
- try {
- const response = await confirmKuaishouCloudClaimRole(token())
- await applyDetail(response.data)
- showSuccess('角色已确认,进入下一步')
- syncPolling()
- } catch (error) {
- showError(error instanceof Error ? error.message : '确认角色失败')
- } finally {
- confirmingRole.value = false
- }
- }
-
- async function confirmRedeem() {
- try {
- await ElMessageBox.confirm(
- '兑换后不可取消,也不可退货。请确认角色和商品信息完全正确。',
- '确认兑换',
- {
- confirmButtonText: '确认兑换',
- cancelButtonText: '取消',
- type: 'warning',
- center: true,
- },
- )
- } catch {
- return
- }
-
- redeeming.value = true
- try {
- const response = await redeemKuaishouCloudClaim(token())
- await applyDetail(response.data)
- showSuccess('兑换请求已提交')
- syncPolling()
- } catch (error) {
- showError(error instanceof Error ? error.message : '兑换失败')
- } finally {
- redeeming.value = false
- }
- }
-
- async function rebindRole() {
- try {
- await ElMessageBox.confirm(
- '换绑后当前绑定链接会失效,系统会退还当前虚拟号并生成新的绑定二维码。核销码和领取商品不会改变,但需要重新扫码绑定角色。',
- '确认换绑角色',
- {
- confirmButtonText: '确认换绑',
- cancelButtonText: '取消',
- type: 'warning',
- center: true,
- },
- )
- } catch {
- return
- }
-
- rebindingRole.value = true
- try {
- const response = await rebindKuaishouCloudClaimRole(token())
- await applyDetail(response.data)
- showSuccess('新的绑定二维码已生成,请重新绑定角色')
- syncPolling()
- } catch (error) {
- showError(error instanceof Error ? error.message : '换绑角色失败')
- } finally {
- rebindingRole.value = false
- }
- }
-
- function openBindUrl(useCurrentPage = false) {
- const bindUrl = String(flow.value?.binding.bindUrl || '').trim()
- if (!bindUrl) {
- showError('绑定链接还没准备好,请稍后刷新')
- return
- }
- if (useCurrentPage) {
- window.location.assign(bindUrl)
- return
- }
- window.open(bindUrl, '_blank', 'noopener,noreferrer')
- }
-
- function openFeifeiUrl(useCurrentPage = false) {
- const url = String(feifei.value?.h5.rechargeUrl || feifei.value?.h5.entryUrl || '').trim()
- if (!url) {
- showError('领取链接还没准备好,请稍后刷新')
- return
- }
- if (useCurrentPage) {
- window.location.assign(url)
- return
- }
- window.open(url, '_blank', 'noopener,noreferrer')
- }
-
- // ── polling ─────────────────────────────────────────────
-
- function stopPolling() {
- if (pollTimer) {
- window.clearTimeout(pollTimer)
- pollTimer = 0
- }
- }
-
- function syncPolling() {
- const delay = resolveNextPollDelay()
- if (!delay) {
- stopPolling()
- return
- }
-
- stopPolling()
- pollTimer = window.setTimeout(() => {
- pollTimer = 0
- void loadDetail({ silent: true })
- }, delay)
- }
-
- function resolveNextPollDelay() {
- if (!flow.value || hasRedeemResult.value || isClaimInactiveTaskStatus(task.value?.status)) {
- return 0
- }
-
- if (currentStep.value === 2) {
- if (!isBindingPrepared.value) {
- return BINDING_PREPARE_POLL_MS
- }
-
- return resolveRolePollDelay()
- }
-
- if (currentStep.value === 3) {
- return 0
- }
-
- return 0
- }
-
- function resolveRolePollDelay() {
- const nextRoleKey = [roleName.value, roleId.value].join('::')
- const now = Date.now()
-
- if (nextRoleKey !== rolePollBaselineKey) {
- rolePollBaselineKey = nextRoleKey
- rolePollBaselineAt = now
- }
-
- if (!rolePollBaselineAt) {
- rolePollBaselineAt = now
- }
-
- const elapsedMs = now - rolePollBaselineAt
- if (elapsedMs < ROLE_FAST_WINDOW_MS) {
- return ROLE_FAST_POLL_MS
- }
-
- if (elapsedMs < ROLE_IDLE_WINDOW_MS) {
- return ROLE_SLOW_POLL_MS
- }
-
- return ROLE_IDLE_POLL_MS
- }
-
- // ── lifecycle ───────────────────────────────────────────
-
- onMounted(() => {
- void loadDetail()
- })
-
- onBeforeUnmount(() => {
- stopPolling()
- })
-
- return {
- // state
- loading,
- submitting,
- refreshingRole,
- confirmingRole,
- rebindingRole,
- redeeming,
- errorMessage,
- detail,
- ticketCode,
- qrCodeDataUrl,
- // derived data
- flow,
- feifei,
- order,
- orderItem,
- product,
- task,
- // computed status
- roleName,
- roleId,
- isFeifeiFlow,
- isTicketVerified,
- isBindUrlExpired,
- isBindingPrepared,
- isBindingPreparing,
- canEnterBindingStep,
- isRoleReady,
- hasDefaultRoleSnapshot,
- isDefaultRole,
- isCustomerRoleReady,
- confirmRoleDisabledReason,
- isRoleConfirmed,
- isDispatched,
- isRedeemFailed,
- isCompleted,
- hasRedeemResult,
- canSubmitTicket,
- currentStep,
- progressText,
- resultTitle,
- resultDescription,
- resultVariant,
- // actions
- loadDetail,
- submitTicket,
- refreshRole,
- confirmRole,
- rebindRole,
- confirmRedeem,
- openBindUrl,
- openFeifeiUrl,
- // utility
- formatAdminDateTime,
- }
-}
diff --git a/apps/frontend-vue/tsconfig.app.json b/apps/frontend-vue/tsconfig.app.json
deleted file mode 100644
index 245d63d0..00000000
--- a/apps/frontend-vue/tsconfig.app.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "extends": "@vue/tsconfig/tsconfig.dom.json",
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "types": ["vite/client"],
- "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/apps/frontend-vue/tsconfig.json b/apps/frontend-vue/tsconfig.json
deleted file mode 100644
index d32ff682..00000000
--- a/apps/frontend-vue/tsconfig.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "files": [],
- "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }]
-}
diff --git a/apps/frontend-vue/tsconfig.node.json b/apps/frontend-vue/tsconfig.node.json
deleted file mode 100644
index 8a67f62f..00000000
--- a/apps/frontend-vue/tsconfig.node.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "target": "ES2023",
- "lib": ["ES2023"],
- "module": "ESNext",
- "types": ["node"],
- "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/apps/frontend-vue/vite.config.ts b/apps/frontend-vue/vite.config.ts
deleted file mode 100644
index 1b7f2e33..00000000
--- a/apps/frontend-vue/vite.config.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { fileURLToPath, URL } from 'node:url'
-
-import { defineConfig, loadEnv } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import AutoImport from 'unplugin-auto-import/vite'
-import Components from 'unplugin-vue-components/vite'
-import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
-
-export default defineConfig(({ mode }) => {
- const env = loadEnv(mode, process.cwd(), '')
- const allowedHosts = parseAllowedHosts(env.VITE_ALLOWED_HOSTS)
-
- return {
- plugins: [
- vue(),
- AutoImport({
- imports: ['vue', 'vue-router'],
- dts: 'src/auto-imports.d.ts',
- resolvers: [ElementPlusResolver({ importStyle: 'css' })],
- }),
- Components({
- dts: 'src/components.d.ts',
- resolvers: [ElementPlusResolver({ importStyle: 'css' })],
- }),
- ],
- resolve: {
- alias: {
- '@': fileURLToPath(new URL('./src', import.meta.url)),
- },
- },
- server: {
- host: env.VITE_DEV_HOST === 'true',
- allowedHosts: env.VITE_ALLOW_ALL_HOSTS === 'true' ? true : allowedHosts,
- proxy: {
- '/api': {
- target: env.VITE_API_TARGET || 'http://localhost:3000',
- changeOrigin: true,
- },
- },
- },
- build: {
- rollupOptions: {
- output: {
- manualChunks: splitVendorChunk,
- },
- },
- },
- }
-})
-
-function parseAllowedHosts(value?: string) {
- const hosts = value
- ?.split(',')
- .map((host) => host.trim())
- .filter(Boolean)
-
- return hosts && hosts.length > 0 ? hosts : ['localhost', '127.0.0.1']
-}
-
-const elementPlusChunkGroups: Array<[string, string[]]> = [
- [
- 'element-plus-form',
- [
- '/components/form',
- '/components/input',
- '/components/select',
- '/components/date-picker',
- '/components/checkbox',
- '/components/radio',
- '/components/switch',
- '/components/upload',
- ],
- ],
- [
- 'element-plus-data',
- [
- '/components/table',
- '/components/pagination',
- '/components/tag',
- '/components/card',
- '/components/descriptions',
- '/components/empty',
- ],
- ],
- [
- 'element-plus-feedback',
- [
- '/components/message',
- '/components/message-box',
- '/components/dialog',
- '/components/popover',
- '/components/tooltip',
- '/components/loading',
- ],
- ],
- [
- 'element-plus-navigation',
- ['/components/menu', '/components/tabs', '/components/breadcrumb', '/components/dropdown'],
- ],
- [
- 'element-plus-layout',
- [
- '/components/container',
- '/components/row',
- '/components/col',
- '/components/space',
- '/components/divider',
- ],
- ],
-]
-
-function splitVendorChunk(id: string) {
- if (!id.includes('/node_modules/')) {
- return
- }
-
- if (id.includes('/node_modules/@element-plus/icons-vue/')) {
- return 'element-plus-icons'
- }
-
- if (id.includes('/node_modules/element-plus/')) {
- return splitElementPlusChunk(id)
- }
-
- if (id.includes('/node_modules/vue/') || id.includes('/node_modules/vue-router/')) {
- return 'vue-vendor'
- }
-
- if (id.includes('/node_modules/axios/')) {
- return 'axios'
- }
-
- if (id.includes('/node_modules/qrcode/')) {
- return 'qrcode'
- }
-
- return 'vendor'
-}
-
-function splitElementPlusChunk(id: string) {
- for (const [chunkName, includesList] of elementPlusChunkGroups) {
- if (includesList.some((includePath) => id.includes(includePath))) {
- return chunkName
- }
- }
-
- return 'element-plus-core'
-}