195 lines
4.7 KiB
Markdown
195 lines
4.7 KiB
Markdown
# 配置管理功能实现说明
|
||
|
||
## 功能概述
|
||
|
||
本次更新为WebSocket API添加了配置管理功能,允许前端动态修改CAD文件的基础路径和文件扩展名配置,所有修改都会持久化到配置文件中。
|
||
|
||
## 新增功能
|
||
|
||
### 1. 获取文件配置 (get_file_config)
|
||
|
||
获取当前的文件基础路径和扩展名配置。
|
||
|
||
**WebSocket消息**:
|
||
```json
|
||
{
|
||
"type": "get_file_config"
|
||
}
|
||
```
|
||
|
||
**响应**:
|
||
```json
|
||
{
|
||
"type": "info",
|
||
"message": "获取文件配置成功",
|
||
"data": {
|
||
"base_path": "C:\\Users\\Public\\Documents",
|
||
"file_extensions": {
|
||
"creo": [".prt", ".asm", ".drw"],
|
||
"pdms": [".rvm", ".dri"],
|
||
"revit": [".rvt", ".rfa", ".rte"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 设置基础路径 (set_base_path)
|
||
|
||
修改CAD文件的基础存储路径并持久化。
|
||
|
||
**WebSocket消息**:
|
||
```json
|
||
{
|
||
"type": "set_base_path",
|
||
"base_path": "D:\\CAD_Files"
|
||
}
|
||
```
|
||
|
||
**验证规则**:
|
||
- 路径必须存在
|
||
- 路径必须是有效的目录
|
||
- 修改会立即写入配置文件
|
||
|
||
### 3. 设置文件扩展名 (set_file_extensions)
|
||
|
||
修改支持的文件扩展名配置并持久化。
|
||
|
||
**WebSocket消息**:
|
||
```json
|
||
{
|
||
"type": "set_file_extensions",
|
||
"file_extensions": {
|
||
"creo": [".prt", ".asm", ".drw", ".sec"],
|
||
"pdms": [".rvm", ".dri"],
|
||
"revit": [".rvt", ".rfa", ".rte"],
|
||
"autocad": [".dwg", ".dxf"]
|
||
}
|
||
}
|
||
```
|
||
|
||
**验证规则**:
|
||
- 扩展名配置必须是字典格式
|
||
- 每个软件的扩展名必须是数组
|
||
- 所有扩展名必须以"."开头
|
||
- 修改会立即写入配置文件
|
||
|
||
## 代码修改说明
|
||
|
||
### 1. 配置文件修改 (`configs/software_config.yaml`)
|
||
|
||
添加了`file_extensions`配置项:
|
||
|
||
```yaml
|
||
file_storage:
|
||
cad_files_path: "C:\\Users\\Public\\Documents"
|
||
# 文件扩展名配置
|
||
file_extensions:
|
||
creo: [".prt", ".asm", ".drw"]
|
||
pdms: [".rvm", ".dri"]
|
||
revit: [".rvt", ".rfa", ".rte"]
|
||
```
|
||
|
||
### 2. 配置类扩展 (`app/config.py`)
|
||
|
||
在`SoftwareConfig`类中新增方法:
|
||
- `get_file_extensions()`: 获取文件扩展名配置
|
||
- `set_file_extensions(extensions)`: 设置文件扩展名并持久化
|
||
- `set_cad_files_path(path)`: 设置CAD文件路径并持久化
|
||
- `save_config()`: 保存配置到YAML文件
|
||
|
||
### 3. 文件管理模块修改 (`app/api/v1/files.py`)
|
||
|
||
- 将硬编码的`CAD_EXTENSIONS`改为动态获取:`get_cad_extensions()`
|
||
- 更新`is_cad_file()`函数,从配置动态读取扩展名
|
||
- 更新`get_file_extension()`函数,从配置动态读取扩展名
|
||
|
||
### 4. WebSocket API扩展 (`app/api/v1/websocket.py`)
|
||
|
||
在`WSMessageType`类中新增消息类型:
|
||
- `GET_FILE_CONFIG = "get_file_config"`
|
||
- `SET_BASE_PATH = "set_base_path"`
|
||
- `SET_FILE_EXTENSIONS = "set_file_extensions"`
|
||
|
||
在`handle_client_message()`函数中新增对应的消息处理逻辑。
|
||
|
||
### 5. API文档更新 (`websocket-file-api-docs.md`)
|
||
|
||
添加了完整的配置管理功能文档,包括:
|
||
- 接口说明
|
||
- 请求/响应示例
|
||
- JavaScript和React使用示例
|
||
- 注意事项
|
||
|
||
## 使用示例
|
||
|
||
### JavaScript示例
|
||
|
||
```javascript
|
||
const ws = new WebSocket('ws://localhost:8000/api/v1/ws/connect?user_id=user123');
|
||
|
||
ws.onopen = () => {
|
||
// 获取当前配置
|
||
ws.send(JSON.stringify({ type: 'get_file_config' }));
|
||
};
|
||
|
||
ws.onmessage = (event) => {
|
||
const message = JSON.parse(event.data);
|
||
console.log(message);
|
||
};
|
||
|
||
// 修改基础路径
|
||
setTimeout(() => {
|
||
ws.send(JSON.stringify({
|
||
type: 'set_base_path',
|
||
base_path: 'D:\\CAD_Files'
|
||
}));
|
||
}, 1000);
|
||
|
||
// 修改文件扩展名
|
||
setTimeout(() => {
|
||
ws.send(JSON.stringify({
|
||
type: 'set_file_extensions',
|
||
file_extensions: {
|
||
creo: ['.prt', '.asm', '.drw'],
|
||
pdms: ['.rvm', '.dri'],
|
||
revit: ['.rvt', '.rfa', '.rte'],
|
||
autocad: ['.dwg', '.dxf']
|
||
}
|
||
}));
|
||
}, 2000);
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **权限要求**: 修改配置需要对`configs/software_config.yaml`文件有写入权限
|
||
|
||
2. **配置立即生效**: 修改后立即生效,影响文件列表查询和下载功能
|
||
|
||
3. **路径验证**: 设置基础路径时会验证路径是否存在且为有效目录
|
||
|
||
4. **扩展名格式**: 所有扩展名必须以"."开头
|
||
|
||
5. **配置同步**: 修改配置后,建议调用`get_file_list`重新获取文件列表以查看变更效果
|
||
|
||
6. **并发修改**: 多个客户端同时修改配置时,以最后一次修改为准
|
||
|
||
## 测试建议
|
||
|
||
1. 启动WebSocket服务器
|
||
2. 使用WebSocket客户端连接
|
||
3. 测试获取配置功能
|
||
4. 测试修改基础路径(使用有效和无效路径)
|
||
5. 测试修改文件扩展名(使用有效和无效格式)
|
||
6. 验证配置文件是否正确更新
|
||
7. 验证文件列表是否使用新配置
|
||
|
||
## 错误处理
|
||
|
||
所有接口都包含完善的错误处理:
|
||
- 参数验证
|
||
- 路径验证
|
||
- 扩展名格式验证
|
||
- 文件写入异常处理
|
||
|
||
错误会通过WebSocket以`type: "error"`消息返回给客户端。
|