|
|
# 配置管理逻辑文档
|
|
|
|
|
|
本文档详细介绍了 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 |