# 配置管理逻辑文档 本文档详细介绍了 Alpha Futures Pro 系统中配置管理的实现逻辑,包括配置的获取、保存、存储位置等内容。 ## 配置管理架构 - **前端组件**:`AdminConfig.jsx`(管理配置界面) - **后端 API**:`config.ts`(配置管理接口) - **配置存储**:`backend/config.json`(JSON 格式文件) ## 前端配置管理逻辑 ### 1. 获取配置 **文件位置**:`src/pages/admin/AdminConfig.jsx` **函数**:`fetchConfig`(第174-205行) **实现逻辑**: ```javascript const fetchConfig = async () => { try { // 调用后端 API 获取配置 const response = await fetch('http://localhost:3007/api/config/get'); const result = await response.json(); if (result.success) { // 更新本地配置状态 const newConfig = result.data; setConfig(newConfig); // 更新表单字段值 form.setFieldsValue({ database: newConfig.database, server: newConfig.server, security: { ...newConfig.security, cors: { ...newConfig.security.cors, methods: newConfig.security.cors.methods.join(', '), allowedHeaders: newConfig.security.cors.allowedHeaders.join(', ') } }, dataSource: newConfig.dataSource }); messageApi.success('配置加载成功'); } else { messageApi.error('配置加载失败'); } } catch (error) { console.error('获取配置失败:', error); messageApi.error('获取配置失败,请检查网络连接'); } }; ``` **调用时机**: - 组件挂载时(通过 useEffect 钩子) - 保存配置成功后(重新获取最新配置) ### 2. 保存配置 **文件位置**:`src/pages/admin/AdminConfig.jsx` **函数**:`handleSubmit`(第208-228行) **实现逻辑**: ```javascript const handleSubmit = async (values) => { try { // 调用后端 API 保存配置 const response = await fetch('http://localhost:3007/api/config/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config) }); const result = await response.json(); if (result.success) { messageApi.success(result.message); // 保存成功后重新获取配置 fetchConfig(); } else { messageApi.error(result.message); } } catch (error) { console.error('保存配置失败:', error); messageApi.error('保存配置失败,请检查网络连接'); } }; ``` **调用时机**: - 用户点击 "保存配置" 按钮时 ## 后端配置管理逻辑 ### 1. 获取配置 API **文件位置**:`backend/src/api/config.ts` **路由**:`/api/config/get`(第151-169行) **实现逻辑**: ```typescript // 获取配置 router.get('/get', async (req, res) => { try { // 从文件读取配置 const fs = require('fs'); const path = require('path'); const configPath = path.join(__dirname, '../../config.json'); let config = {}; if (fs.existsSync(configPath)) { const configData = fs.readFileSync(configPath, 'utf8'); config = JSON.parse(configData); } res.status(200).json({ success: true, data: config }); } catch (error) { console.error('获取配置失败:', error); res.status(500).json({ success: false, message: '获取配置失败' }); } }); ``` **功能**: - 从 `backend/config.json` 文件读取配置 - 如果文件不存在,返回空对象 - 将配置数据以 JSON 格式返回给前端 ### 2. 保存配置 API **文件位置**:`backend/src/api/config.ts` **路由**:`/api/config/save`(第131-148行) **实现逻辑**: ```typescript // 保存配置 router.post('/save', async (req, res) => { try { // 获取前端发送的配置数据 const config = req.body; console.log('保存配置:', config); // 保存配置到文件 const fs = require('fs'); const path = require('path'); const configPath = path.join(__dirname, '../../config.json'); fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); res.status(200).json({ success: true, message: '配置保存成功' }); } catch (error) { console.error('保存配置失败:', error); res.status(500).json({ success: false, message: '保存配置失败' }); } }); ``` **功能**: - 接收前端发送的配置数据 - 将配置数据写入 `backend/config.json` 文件 - 返回保存成功的提示信息 ## 配置存储位置 **配置文件**:`backend/config.json` **文件格式**:JSON 格式 **存储内容**: - 数据库配置(MongoDB、PostgreSQL、Redis、InfluxDB) - 服务器配置(端口、主机、环境等) - 安全配置(JWT、速率限制、CORS 等) - 数据源配置(测试数据、TQSDK、Wind、新浪财经等) **文件示例**: ```json { "database": { "mongoDB": { "host": "localhost", "port": 27017, "database": "alpha-futures", "username": "", "password": "", "authSource": "admin", "ssl": false, "enabled": true }, "postgreSQL": { "host": "localhost", "port": 5432, "database": "alpha-futures", "username": "postgres", "password": "password", "ssl": false, "enabled": true }, "redis": { "host": "localhost", "port": 6379, "password": "", "db": 0, "enabled": true }, "influxDB": { "host": "localhost", "port": 8086, "database": "alpha-futures", "username": "", "password": "", "ssl": false, "enabled": true } }, "server": { "port": 3007, "host": "0.0.0.0", "environment": "development", "debug": true, "timeout": 30000, "maxBodySize": "10mb" }, "security": { "jwtSecret": "your-secret-key", "jwtExpiresIn": "7d", "rateLimit": { "windowMs": 60000, "max": 120 }, "cors": { "origin": "*", "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], "allowedHeaders": ["Content-Type", "Authorization"] } }, "dataSource": { "test": { "enabled": true, "timeout": 10000, "retries": 3, "refreshInterval": 60000 }, "tqsdk": { "enabled": true, "username": "", "password": "", "timeout": 30000, "retries": 3, "maxConnections": 5 }, "wind": { "enabled": false, "apiKey": "", "apiSecret": "", "url": "https://api.wind.com.cn", "timeout": 30000, "retries": 3 }, "sina": { "enabled": false, "url": "https://finance.sina.com.cn", "timeout": 10000, "retries": 3, "refreshInterval": 60000 }, "defaultDataSource": "tqsdk" } } ``` ## 配置管理流程 ### 1. 系统启动时 1. 后端服务启动,从 `backend/config.json` 文件读取配置 2. 如果配置文件不存在,使用默认配置 3. 前端应用启动,加载 `AdminConfig` 组件 4. `AdminConfig` 组件挂载时调用 `fetchConfig` 函数获取配置 ### 2. 用户修改配置时 1. 用户在管理配置界面修改配置项 2. 前端实时更新本地配置状态 3. 用户点击 "保存配置" 按钮 4. 前端调用 `handleSubmit` 函数,将配置发送到后端 5. 后端接收配置数据,写入 `config.json` 文件 6. 后端返回保存成功的响应 7. 前端显示成功提示,并重���获取配置以更新本地状态 ### 3. 配置生效 - **前端**:配置修改后立即在界面上生效 - **后端**:配置保存后,新的配置会在下次服务重启时生效 - **数据源配置**:修改后需要重启后端服务才能完全生效 ## 注意事项 1. **配置文件权限**:确保后端服务有读写 `config.json` 文件的权限 2. **配置格式**:配置数据必须是有效的 JSON 格式 3. **敏感信息**:配置文件中包含敏感信息(如数据库密码、TQSDK 用户名密码),请妥善保管 4. **配置备份**:建议定期备份 `config.json` 文件,以防止配置丢失 5. **服务重启**:修改某些配置项(如服务器端口、数据库连接信息)后,需要重启后端服务才能生效 ## 故障排查 ### 1. 获取配置失败 **症状**:前端显示 "获取配置失败" 错误 **解决方案**: - 检查后端服务是否正常运行 - 检查 `config.json` 文件是否存在且格式正确 - 检查后端 API 是否可以正常访问 ### 2. 保存配置失败 **症状**:前端显示 "保存配置失败" 错误 **解决方案**: - 检查后端服务是否正常运行 - 检查 `config.json` 文件是否有写入权限 - 检查配置数据是否格式正确 - 检查后端日志中的错误信息 ### 3. 配置不生效 **症状**:修改配置后,系统行为没有改变 **解决方案**: - 检查配置是否成功保存到 `config.json` 文件 - 尝试重启后端服务 - 检查配置项是否正确设置 --- **文档版本**:v1.0 **最后更新**:2026-02-20