You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

配置管理逻辑文档

本文档详细介绍了 Alpha Futures Pro 系统中配置管理的实现逻辑,包括配置的获取、保存、存储位置等内容。

配置管理架构

  • 前端组件AdminConfig.jsx(管理配置界面)
  • 后端 APIconfig.ts(配置管理接口)
  • 配置存储backend/config.jsonJSON 格式文件)

前端配置管理逻辑

1. 获取配置

文件位置src/pages/admin/AdminConfig.jsx 函数fetchConfig第174-205行

实现逻辑

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行

实现逻辑

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行

实现逻辑

// 获取配置
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行

实现逻辑

// 保存配置
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、新浪财经等

文件示例

{
  "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. 前端显示成功提示并重<EFBFBD><EFBFBD><EFBFBD>获取配置以更新本地状态

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