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.

345 lines
8.9 KiB

# 配置管理逻辑文档
本文档详细介绍了 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. 前端显示成功提示并重<E5B9B6><E9878D><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