/** * Admin 后台 - 系统配置管理页面(报刊风) * * 功能: * - 管理员密钥(X-API-Key):存本机浏览器,自动附带到采集/回测/结算等受保护接口 * - 显示当前 .env 配置(脱敏;后端暂无配置端点,为静态说明) * - 配置修改指南 */ import { useEffect, useState, useCallback } from 'react' import { fetchSystemConfig } from '../dal' import { getAdminKey, setAdminKey } from '../api' import { Card, CardBody, CardHeader, Badge, SectionHeader, Alert, Spinner, SkeletonBlock } from '../components' export default function ConfigPage() { const [config, setConfig] = useState([]) const [loading, setLoading] = useState(true) // 管理员密钥 const [adminKey, setAdminKeyInput] = useState('') const [keySaved, setKeySaved] = useState(false) const [keyExists, setKeyExists] = useState(false) const loadConfig = useCallback(async () => { setLoading(true) try { const data = await fetchSystemConfig() setConfig(data) } catch { setConfig([]) } finally { setLoading(false) } }, []) useEffect(() => { loadConfig() const stored = getAdminKey() setKeyExists(stored !== '') }, [loadConfig]) function handleSaveKey(e: React.FormEvent) { e.preventDefault() setAdminKey(adminKey.trim()) setKeyExists(adminKey.trim() !== '') setKeySaved(true) setAdminKeyInput('') setTimeout(() => setKeySaved(false), 3000) } function handleClearKey() { setAdminKey('') setAdminKeyInput('') setKeyExists(false) } return (
{/* 管理员密钥 */}
setAdminKeyInput(e.target.value)} placeholder={keyExists ? '••••••••(已保存,输入新值可更换)' : '粘贴 ADMIN_API_KEY'} autoComplete="off" className="field flex-1" />
{keySaved && } {keyExists && !keySaved && (

当前状态:已保存密钥 密钥仅保存在本机浏览器,不会上传到任何第三方。

)}

密钥与服务器 .env 中 ADMIN_API_KEY 一致即可。留空时后端默认不鉴权(本地开发模式)。 遇到 401 错误通常就是缺这个密钥。

{/* 快速导航 */}
数据源配置
管理采集源 API Key
LLM 配置
管理模型连接与统计
{/* 配置列表 */} {loading ? (<> 加载中) : '刷新'} } /> {loading ? (
{[1, 2, 3, 4, 5].map(i => ( ))}
) : config.length > 0 ? (
{config.map(item => (
{item.key} {item.is_sensitive && 敏感}
{item.value_masked}
{item.description}
))}
) : (

无法加载配置信息

)}
{/* 修改指南 */}

通过 SSH 修改 .env

{`# 连接到部署主机
ssh user@your-server-ip

# 进入项目目录
cd /vol2/1000/Docker/Profeto

# 编辑 .env 文件
nano .env

# 修改后重启后端服务
docker compose restart api

# 查看日志确认生效
docker compose logs -f api`}
            

常用配置项说明

{[ ['LLM_API_KEY', 'LLM 服务商的 API 密钥,用于调用大模型'], ['LLM_MODEL', '使用的模型名称,如 gpt-4o、claude-3-5-sonnet'], ['LLM_BASE_URL', 'API 基础地址,支持兼容 OpenAI 协议的服务商'], ['ADMIN_API_KEY', '管理后台写接口的鉴权密钥,配置后需在本页保存到浏览器'], ['BZZOIRO_KEY', 'Bzzoiro 数据源 API 密钥'], ['DATABASE_URL', 'PostgreSQL 数据库连接字符串'], ].map(([key, desc]) => (
{key} {desc}
))}
) }