chore: initialize insar management system v2

This commit is contained in:
2026-04-14 13:16:01 +08:00
commit ecc72ec9cd
361 changed files with 2142522 additions and 0 deletions
@@ -0,0 +1,332 @@
# 日志管理功能实施总结(2026-03-05)
## 实施概述
按照你的需求,实现了统一的日志管理功能:
- ✅ 统一日志目录结构
- ✅ 前端管理模块(放在运维自检)
- ✅ Modal 查看日志
- ✅ 手动删除(不自动删除)
- ✅ 仅管理员可删除
---
## 已完成的工作
### 1. 创建统一日志目录结构
```
logs/
├── app/ # 应用日志
├── tasks/ # 任务日志
│ ├── envi/ # ENVI 工作流日志
│ └── unpacker/ # 解包任务日志
└── error/ # 错误日志
```
### 2. 移动现有日志文件
-`unpacker_activity.log``logs/tasks/unpacker/unpacker_20260304.log`
-`unpacker_log.json``logs/tasks/unpacker/unpacker_20260304.json`
### 3. 修改 unpacker 脚本
**文件**`scripts/unpack_archives.py`
**修改内容**
- 使用统一的日志目录 `logs/tasks/unpacker/`
- 使用日期命名日志文件(`unpacker_YYYYMMDD.log`
- 自动创建日志目录
### 4. 更新 .gitignore
**新增内容**
```gitignore
# 日志文件
logs/
*.log
*.log.*
# 但保留日志目录结构
!logs/.gitkeep
!logs/app/.gitkeep
!logs/tasks/.gitkeep
!logs/error/.gitkeep
```
### 5. 实现后端 API
**文件**`backend/app/routers/logs.py`
**API 端点**
1. `GET /logs/list` - 列出所有日志文件
- 支持按类型过滤(app, task, error
- 返回文件名、大小、修改时间
2. `GET /logs/content/{log_path}` - 读取日志内容
- 支持分页读取(offset, limit
- 最多一次读取 10000 行
- 防止路径遍历攻击
3. `DELETE /logs/{log_path}` - 删除日志文件
- 仅管理员可删除
- 防止路径遍历攻击
**安全特性**
- 路径安全检查(防止 `../` 攻击)
- 权限控制(删除仅管理员)
- 文件类型验证
### 6. 实现前端 API
**文件**`frontend/src/api/logs.js`
**函数**
- `listLogs(logType)` - 获取日志列表
- `getLogContent(logPath, offset, limit)` - 获取日志内容
- `deleteLog(logPath)` - 删除日志
### 7. 实现前端日志管理组件
**文件**`frontend/src/LogManagementPanel.jsx`
**功能**
- 日志列表展示(表格形式)
- 类型过滤(应用/任务/错误)
- 查看日志(Modal
- 删除日志(仅管理员,需确认)
- 日志搜索(实时过滤)
- 分页加载(大文件支持)
**UI 特性**
- 类型标签(彩色徽章)
- 文件大小格式化(B/KB/MB
- 修改时间显示
- 深色代码编辑器风格
- 响应式布局
### 8. 集成到运维自检
**修改文件**
- `frontend/src/HealthCheckPanel.jsx` - 添加日志管理区域
- `frontend/src/App.jsx` - 传递 currentUser 参数
---
## 功能特性
### 日志列表
| 列名 | 说明 |
|------|------|
| 文件名 | 日志文件名(等宽字体) |
| 类型 | 应用/任务/错误(彩色标签) |
| 大小 | 文件大小(自动格式化) |
| 修改时间 | 最后修改时间 |
| 操作 | 查看/删除按钮 |
**过滤功能**
- 全部
- 应用日志
- 任务日志
- 错误日志
### 日志查看 Modal
**顶部信息栏**
- 文件名(等宽字体)
- 文件大小
- 修改时间
- 总行数
**搜索栏**
- 实时搜索(过滤日志内容)
- 显示当前行范围
- 上一页/下一页按钮
**日志内容区**
- 深色背景(#1e1e1e
- 等宽字体(Consolas, Monaco
- 自动换行
- 滚动查看
### 删除功能
**权限控制**
- 只有管理员可以看到删除按钮
- 非管理员点击会提示"只有管理员可以删除日志"
**确认对话框**
```
确定要删除日志文件 "xxx.log" 吗?
此操作不可恢复!
```
---
## 技术实现
### 后端
**路径安全检查**
```python
def _is_safe_path(file_path: str) -> bool:
"""检查路径是否安全(防止路径遍历攻击)"""
try:
requested_path = (LOG_ROOT / file_path).resolve()
return requested_path.is_relative_to(LOG_ROOT)
except (ValueError, RuntimeError):
return False
```
**分页读取**
```python
with open(log_file, "r", encoding="utf-8", errors="replace") as f:
lines = f.readlines()
total_lines = len(lines)
start = offset
end = min(offset + limit, total_lines)
content_lines = lines[start:end]
```
### 前端
**分页加载**
```javascript
const loadLogContent = async (logPath, offset = 0) => {
const data = await getLogContent(logPath, offset, 1000);
setLogContent(data.content);
setTotalLines(data.total_lines);
setCurrentOffset(offset);
};
```
**实时搜索**
```javascript
const filteredContent = searchTerm
? logContent.split('\n')
.filter(line => line.toLowerCase().includes(searchTerm.toLowerCase()))
.join('\n')
: logContent;
```
---
## 使用说明
### 查看日志
1. 登录系统
2. 进入"运维自检" Tab
3. 滚动到"日志管理"区域
4. 点击日志文件的"查看"按钮
5. 在 Modal 中查看日志内容
6. 使用搜索框过滤内容
7. 使用上一页/下一页浏览大文件
### 删除日志
1. 以管理员身份登录
2. 进入"运维自检" Tab
3. 找到要删除的日志文件
4. 点击"删除"按钮
5. 确认删除操作
6. 日志文件被永久删除
### 过滤日志
1. 使用"类型过滤"下拉菜单
2. 选择"应用日志"、"任务日志"或"错误日志"
3. 列表自动更新
---
## 文件清单
### 后端文件
- `backend/app/routers/logs.py` - 日志管理 API(新建)
- `backend/app/routers/__init__.py` - 注册日志路由(修改)
- `scripts/unpack_archives.py` - 使用新日志路径(修改)
### 前端文件
- `frontend/src/api/logs.js` - 日志 API 封装(新建)
- `frontend/src/LogManagementPanel.jsx` - 日志管理组件(新建)
- `frontend/src/HealthCheckPanel.jsx` - 集成日志管理(修改)
- `frontend/src/App.jsx` - 传递 currentUser(修改)
### 配置文件
- `.gitignore` - 忽略日志文件(新建)
### 目录结构
- `logs/` - 统一日志目录(新建)
- `logs/app/` - 应用日志目录(新建)
- `logs/tasks/envi/` - ENVI 日志目录(新建)
- `logs/tasks/unpacker/` - 解包日志目录(新建)
- `logs/error/` - 错误日志目录(新建)
---
## 测试清单
### 后端测试
- [ ] 启动后端服务
- [ ] 访问 `/api/logs/list` 验证 API
- [ ] 访问 `/api/logs/content/{log_path}` 验证内容读取
- [ ] 测试路径遍历攻击(应该被拒绝)
- [ ] 测试删除权限(非管理员应该被拒绝)
### 前端测试
- [ ] 打包前端(`npm run build`
- [ ] 登录系统
- [ ] 进入"运维自检" Tab
- [ ] 验证日志列表显示
- [ ] 点击"查看"按钮验证 Modal
- [ ] 测试搜索功能
- [ ] 测试分页功能
- [ ] 测试删除功能(管理员)
- [ ] 测试删除权限(非管理员应该看不到删除按钮)
### 集成测试
- [ ] 运行 unpacker 脚本,验证日志保存到新位置
- [ ] 在前端查看新生成的日志
- [ ] 删除日志后验证文件确实被删除
---
## 下一步优化(可选)
### 短期优化
1. 添加日志下载功能(如果需要)
2. 添加日志实时刷新(WebSocket)
3. 添加日志高亮(错误/警告)
### 长期优化
1. 使用 Monaco Editor 替代 Textarea
2. 添加日志统计(错误数、警告数)
3. 添加日志归档功能
4. 集成日志分析工具(ELK
---
## 总结
✅ 已完成所有需求:
1. 统一日志管理 ✅
2. 前端管理模块(放在运维自检)✅
3. Modal 查看日志 ✅
4. 手动删除(不自动删除)✅
5. 仅管理员可删除 ✅
**代码修改**
- 新建文件:5 个
- 修改文件:4 个
- 总代码行数:约 400 行
**风险评估**:🟢 低风险
- 不影响现有功能
- 只读操作无风险
- 删除操作有权限控制和确认
**状态**:✅ 代码完成,等待测试验证