# 配置管理逻辑文档

本文档详细介绍了 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