From e8407432953b9bdb3706a9b6be394960aa7961e2 Mon Sep 17 00:00:00 2001 From: "CJACK." Date: Wed, 22 Apr 2026 17:30:39 +0000 Subject: [PATCH] refactor: centralize batch import templates and enable config file access in Vite --- webui/src/components/BatchImport.jsx | 51 +------------------------ webui/src/locales/en.json | 2 +- webui/src/locales/zh.json | 2 +- webui/src/utils/batchImportTemplates.js | 42 ++++++++++++++++++++ webui/vite.config.js | 8 ++++ 5 files changed, 54 insertions(+), 51 deletions(-) create mode 100644 webui/src/utils/batchImportTemplates.js diff --git a/webui/src/components/BatchImport.jsx b/webui/src/components/BatchImport.jsx index f06da69..06e6313 100644 --- a/webui/src/components/BatchImport.jsx +++ b/webui/src/components/BatchImport.jsx @@ -2,6 +2,7 @@ import { useState } from 'react' import { FileCode, Download, Upload, Copy, Check, AlertTriangle } from 'lucide-react' import clsx from 'clsx' import { useI18n } from '../i18n' +import { getBatchImportTemplates } from '../utils/batchImportTemplates' export default function BatchImport({ onRefresh, onMessage, authFetch }) { const { t } = useI18n() @@ -11,55 +12,7 @@ export default function BatchImport({ onRefresh, onMessage, authFetch }) { const [copied, setCopied] = useState(false) const apiFetch = authFetch || fetch - const templates = { - full: { - name: t('batchImport.templates.full.name'), - desc: t('batchImport.templates.full.desc'), - config: { - keys: ["your-api-key-1", "your-api-key-2"], - accounts: [ - { email: "user1@example.com", password: "password1", token: "" }, - { email: "user2@example.com", password: "password2", token: "" }, - { mobile: "+8613800138001", password: "password3", token: "" } - ], - claude_model_mapping: { - fast: "deepseek-chat", - slow: "deepseek-reasoner" - } - } - }, - email_only: { - name: t('batchImport.templates.emailOnly.name'), - desc: t('batchImport.templates.emailOnly.desc'), - config: { - keys: ["your-api-key"], - accounts: [ - { email: "account1@example.com", password: "pass1", token: "" }, - { email: "account2@example.com", password: "pass2", token: "" }, - { email: "account3@example.com", password: "pass3", token: "" } - ] - } - }, - mobile_only: { - name: t('batchImport.templates.mobileOnly.name'), - desc: t('batchImport.templates.mobileOnly.desc'), - config: { - keys: ["your-api-key"], - accounts: [ - { mobile: "+8613800000001", password: "pass1", token: "" }, - { mobile: "+8613800000002", password: "pass2", token: "" }, - { mobile: "+8613800000003", password: "pass3", token: "" } - ] - } - }, - keys_only: { - name: t('batchImport.templates.keysOnly.name'), - desc: t('batchImport.templates.keysOnly.desc'), - config: { - keys: ["key-1", "key-2", "key-3"] - } - } - } + const templates = getBatchImportTemplates(t) const handleImport = async () => { if (!jsonInput.trim()) { diff --git a/webui/src/locales/en.json b/webui/src/locales/en.json index 79622df..7548a30 100644 --- a/webui/src/locales/en.json +++ b/webui/src/locales/en.json @@ -321,7 +321,7 @@ "templates": { "full": { "name": "Full configuration template", - "desc": "Includes keys, accounts, and model mapping" + "desc": "Loaded from config.example.json with keys, accounts, and defaults" }, "emailOnly": { "name": "Email-only accounts", diff --git a/webui/src/locales/zh.json b/webui/src/locales/zh.json index 443cc29..9477c5f 100644 --- a/webui/src/locales/zh.json +++ b/webui/src/locales/zh.json @@ -321,7 +321,7 @@ "templates": { "full": { "name": "全量配置模板", - "desc": "包含密钥、账号及模型映射" + "desc": "直接复用 config.example.json,包含密钥、账号和默认配置" }, "emailOnly": { "name": "仅邮箱账号", diff --git a/webui/src/utils/batchImportTemplates.js b/webui/src/utils/batchImportTemplates.js new file mode 100644 index 0000000..652640d --- /dev/null +++ b/webui/src/utils/batchImportTemplates.js @@ -0,0 +1,42 @@ +import exampleConfig from '../../../config.example.json' + +export function getBatchImportTemplates(t) { + return { + full: { + name: t('batchImport.templates.full.name'), + desc: t('batchImport.templates.full.desc'), + config: exampleConfig, + }, + email_only: { + name: t('batchImport.templates.emailOnly.name'), + desc: t('batchImport.templates.emailOnly.desc'), + config: { + keys: ['your-api-key'], + accounts: [ + { email: 'account1@example.com', password: 'pass1', token: '' }, + { email: 'account2@example.com', password: 'pass2', token: '' }, + { email: 'account3@example.com', password: 'pass3', token: '' }, + ], + }, + }, + mobile_only: { + name: t('batchImport.templates.mobileOnly.name'), + desc: t('batchImport.templates.mobileOnly.desc'), + config: { + keys: ['your-api-key'], + accounts: [ + { mobile: '+8613800000001', password: 'pass1', token: '' }, + { mobile: '+8613800000002', password: 'pass2', token: '' }, + { mobile: '+8613800000003', password: 'pass3', token: '' }, + ], + }, + }, + keys_only: { + name: t('batchImport.templates.keysOnly.name'), + desc: t('batchImport.templates.keysOnly.desc'), + config: { + keys: ['key-1', 'key-2', 'key-3'], + }, + }, + } +} diff --git a/webui/vite.config.js b/webui/vite.config.js index f874531..1dc770a 100644 --- a/webui/vite.config.js +++ b/webui/vite.config.js @@ -1,5 +1,10 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const webuiDir = dirname(fileURLToPath(import.meta.url)) +const repoRoot = resolve(webuiDir, '..') export default defineConfig(({ mode }) => ({ plugins: [ @@ -7,6 +12,9 @@ export default defineConfig(({ mode }) => ({ ], server: { port: 5173, + fs: { + allow: [repoRoot], + }, proxy: { // 代理 /admin 下的 API 请求到后端 '/admin': {