包含多个会话的累积代码变更: - backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔 - admin-web: ETL 状态页、任务管理、调度配置、登录优化 - miniprogram: 看板页面、聊天集成、UI 组件、导航更新 - etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强 - tenant-admin: 项目初始化 - db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8) - packages/shared: 枚举和工具函数更新 - tools: 数据库工具、报表生成、健康检查 - docs: PRD/架构/部署/合约文档更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
86 lines
5.2 KiB
Markdown
86 lines
5.2 KiB
Markdown
# P10-NS4-04:操作日志/审计日志的查看界面
|
||
|
||
## 简要结论
|
||
- 状态:❌ 未解决
|
||
- 项目当前没有业务操作审计日志的数据库表、后端记录逻辑、以及前端查看界面。仅有 Excel 上传记录(`biz.excel_upload_log`)和 ETL 任务执行日志(admin-web LogViewer),均不属于业务操作审计日志范畴。
|
||
|
||
## 详细审查
|
||
|
||
### 数据库端
|
||
|
||
**查库方式**:pg-app-test MCP 连接不可用,改用 DDL 迁移文件搜索。
|
||
|
||
| 检查项 | 结果 |
|
||
|--------|------|
|
||
| `audit_log` / `operation_log` / `activity_log` 表 | ❌ 不存在(DDL 搜索无匹配) |
|
||
| `auth` schema 中日志相关表 | ❌ 不存在(仅有 `users`、`tenant_admins`、`user_roles`、`user_site_roles`、`user_applications`、`user_assistant_binding`) |
|
||
| `biz` schema 中日志相关表 | ⚠️ 仅有 `biz.excel_upload_log`(Excel 上传批次记录,非操作审计日志) |
|
||
| `task_execution_log` 表 | 存在于 `_archived/` 基线中,属于 ETL 任务执行日志,非业务操作审计 |
|
||
|
||
**结论**:数据库中不存在通用的业务操作审计日志表。`biz.excel_upload_log` 记录的是 Excel 上传批次状态(pending/confirmed/failed),不记录"谁做了什么操作"这类审计信息。
|
||
|
||
### 后端代码
|
||
|
||
| 检查项 | 结果 |
|
||
|--------|------|
|
||
| `apps/backend/app/routers/` 中审计日志路由 | ❌ 不存在(无 `audit`/`log`/`activity` 相关路由文件) |
|
||
| 审计中间件 / 日志记录装饰器 | ❌ 不存在(`app/middleware/` 仅有 `response_wrapper.py` 和 `permission.py`) |
|
||
| `tenant_users.py` 审核操作日志 | ❌ 审核通过/拒绝仅更新状态字段(`user_applications.status`、`reviewed_by`、`reviewed_at`),不写入独立审计日志表 |
|
||
| `tenant_clues.py` 线索操作日志 | ❌ 编辑/删除/隐藏操作直接修改数据,无审计记录 |
|
||
| `tenant_excel.py` 上传操作日志 | ⚠️ 写入 `biz.excel_upload_log`,但仅记录批次元数据,不记录操作人的具体行为 |
|
||
|
||
**关键发现**:
|
||
- 用户审核(通过/拒绝):`user_applications` 表有 `reviewed_by` + `reviewed_at` 字段,可追溯审核人和时间,但不是独立的审计日志
|
||
- 用户编辑(状态变更/绑定修改):无任何操作记录
|
||
- 维客线索修改/删除/隐藏:无任何操作记录,且删除为物理删除(`DELETE FROM`),数据不可恢复
|
||
- Excel 上传:`excel_upload_log` 记录了 `uploaded_by`,但无确认操作的审计
|
||
|
||
### 前端代码
|
||
|
||
| 检查项 | 结果 |
|
||
|--------|------|
|
||
| `apps/tenant-admin/src/pages/` 中日志查看页面 | ❌ 不存在(仅有 Login、UserApproval、UserManagement、ExcelUpload、RetentionClues 五个页面) |
|
||
| `apps/tenant-admin/src/App.tsx` 路由配置 | ❌ 无日志相关路由(路由:`/login`、`/applications`、`/users`、`/excel`、`/clues`) |
|
||
| `apps/admin-web/src/pages/LogViewer.tsx` | ⚠️ 存在,但功能是 ETL 任务执行日志查看器(通过 WebSocket 接收执行日志、按任务分组展示),不是业务操作审计日志 |
|
||
| `apps/admin-web/src/App.tsx` 路由 `/log-viewer` | 指向 ETL LogViewer,与业务操作审计无关 |
|
||
|
||
**结论**:两个前端应用均无业务操作审计日志查看界面。
|
||
|
||
### 差距分析
|
||
|
||
P10 标杆文件要求管理后台具备操作审计功能,即"谁在什么时间做了什么操作"的完整追溯能力。当前 NS4 的差距:
|
||
|
||
| 维度 | P10 要求 | NS4 现状 | 差距 |
|
||
|------|----------|----------|------|
|
||
| 审计数据存储 | 独立审计日志表 | ❌ 不存在 | 完全缺失 |
|
||
| 审计记录写入 | 关键操作自动记录 | ❌ 无中间件/装饰器 | 完全缺失 |
|
||
| 审计日志查看 | 管理后台可查看/筛选 | ❌ 无页面 | 完全缺失 |
|
||
| 操作可追溯性 | 所有关键操作可追溯 | ⚠️ 仅审核操作有 `reviewed_by`/`reviewed_at` | 大部分缺失 |
|
||
| 数据安全 | 删除操作可恢复/可审计 | ❌ 线索删除为物理删除 | 高风险 |
|
||
|
||
### 建议
|
||
|
||
#### 短期(高优先级)
|
||
|
||
1. **新建审计日志表** `biz.audit_log`:
|
||
- 字段:`id`、`site_id`、`operator_id`(操作人)、`operator_type`(tenant_admin/system)、`action`(approve/reject/edit/delete/hide/upload 等)、`target_type`(user/clue/excel 等)、`target_id`、`detail`(JSONB,变更前后值)、`ip_address`、`created_at`
|
||
- 索引:`(site_id, created_at DESC)`、`(operator_id)`、`(target_type, target_id)`
|
||
|
||
2. **后端审计中间件/工具函数**:
|
||
- 在 `tenant_users.py` 的审核通过/拒绝、用户编辑/禁用操作中写入审计日志
|
||
- 在 `tenant_clues.py` 的编辑/删除/隐藏操作中写入审计日志
|
||
- 在 `tenant_excel.py` 的上传确认操作中写入审计日志
|
||
- 建议实现为可复用的 `log_audit()` 工具函数,在事务内调用
|
||
|
||
3. **线索删除改为软删除**:当前 `DELETE FROM public.member_retention_clue` 为物理删除,建议改为 `SET is_deleted = true`,配合审计日志记录
|
||
|
||
#### 中期
|
||
|
||
4. **前端审计日志查看页面**(tenant-admin):
|
||
- 新增 `/audit-logs` 路由和 `AuditLogs` 页面
|
||
- 支持按时间范围、操作类型、操作人筛选
|
||
- 展示操作详情(变更前后对比)
|
||
|
||
5. **后端审计日志查询 API**:
|
||
- `GET /api/tenant/audit-logs`(分页 + 筛选)
|