# 操作日志页面 > 最后更新:2026-04-26 > 状态:已设计 --- ### 1. 基本信息 | 项 | 值 | |----|-----| | 路由 | /log | | 权限 | admin | | 入口 | 侧边栏操作日志 | | 面包屑 | 首页 / 操作日志 | ### 2. 界面布局 ``` ┌──────────────────────────────────────────────────────────┐ │ [面包屑] 首页 / 操作日志 │ ├──────────────────────────────────────────────────────────┤ │ [Tab切换] [产量修正日志] [系统运行日志] │ ├──────────────────────────────────────────────────────────┤ │ │ │ ====== Tab1: 产量修正日志 ====== │ │ │ │ [查询条件区] │ │ 时间范围[__________] 目标[▼全部] 关键字[________] │ │ [查询] [重置] [导出] │ │ │ │ [列表区] │ │ 修正时间 | 目标表 | 目标ID | 修正前 | 修正后 | 原因 | 操作IP │ │ 2026-04-25 15:30 | daily_production | 3 | 310 | 320 | 传感器计数偏差 | 192.168.1.5│ │ 2026-04-24 10:15 | worker_summary | 12 | 850 | 900 | 漏计补录 | 192.168.1.5│ │ │ │ [分页] 共80条 每页[20▼] < 1 2 3 4 > │ │ │ │ ====== Tab2: 系统运行日志 ====== │ │ │ │ [查询条件区] │ │ 日志级别[▼全部] 来源[▼全部] 时间范围[__________] │ │ 关键字[___________] [查询] [重置] │ │ │ │ [列表区] │ │ 时间 | 级别 | 来源 | 消息 │ │ 2026-04-25 17:36 | INFO | CncCollector | 采集完成:32台成功 │ │ 2026-04-25 17:35 | WARN | CncCollector | 采集失败:1台超时 │ │ 2026-04-25 17:00 | ERROR | CncCollector | 连接拒绝:10.1.2.5 │ │ │ │ [分页] 共5600条 每页[20▼] < 1 2 3 ... 280 > │ └──────────────────────────────────────────────────────────┘ ``` ### 3. Tab1-产量修正日志 #### 查询条件 | 字段 | 控件 | 必填 | 默认值 | 校验 | 联动 | |------|------|------|--------|------|------| | 时间范围 | el-date-picker type=daterange | 否 | 空 | - | 无 | | 目标表 | el-select(daily_production/worker_daily_summary/全部) | 否 | 全部 | - | 无 | | 关键字 | el-input placeholder=原因/操作IP | 否 | 空 | - | 无 | #### 列表字段 | 字段名 | 列宽 | 排序 | 超长处理 | 对齐 | |--------|------|------|---------|------| | 修正时间 | 170px | y(默认倒序) | - | center | | 目标表 | 150px | - | tooltip | left | | 目标ID | 80px | - | - | center | | 修正前 | 80px | - | - | center | | 修正后 | 80px | - | - | center | | 修正原因 | auto | - | tooltip | left | | 操作IP | 130px | - | - | center | ### 4. Tab2-系统运行日志 #### 查询条件 | 字段 | 控件 | 必填 | 默认值 | 校验 | 联动 | |------|------|------|--------|------|------| | 日志级别 | el-select(ERROR/WARN/INFO/DEBUG/全部) | 否 | 全部 | - | 无 | | 来源 | el-select(CncCollector/WebApi/Scheduler/全部) | 否 | 全部 | - | 无 | | 时间范围 | el-date-picker type=daterange | 否 | 空 | - | 无 | | 关键字 | el-input placeholder=消息内容 | 否 | 空 | - | 无 | #### 列表字段 | 字段名 | 列宽 | 排序 | 超长处理 | 对齐 | |--------|------|------|---------|------| | 时间 | 170px | y(默认倒序) | - | center | | 级别 | 80px | - | - | center | | 来源 | 130px | - | tooltip | left | | 消息 | auto | - | tooltip+点击展开详情 | left | ### 5. 操作按钮 | 名称 | 权限编码 | 位置 | 显示条件 | 点击行为 | |------|---------|------|---------|---------| | 查询 | - | 查询区 | 始终 | 重置page=1->请求列表 | | 重置 | - | 查询区 | 始终 | 清空条件->请求列表 | | 导出 | log:export | 查询区 | Tab1产量修正日志 | 按当前查询条件导出Excel | | 查看详情 | - | 行操作 | Tab2系统运行日志 | 弹窗展示完整消息+堆栈 | ### 6. 弹窗规格 **系统日志详情弹窗(只读):** - 宽度700px,标题=日志详情 | 展示字段 | 说明 | |---------|------| | 时间 | created_at | | 级别 | log_level | | 来源 | source | | 消息 | message(完整文本,支持换行) | | 堆栈信息 | stack_trace(代码格式化展示,无则为空) | | 附加数据 | extra_data(JSON格式化展示) | ### 7. 状态机 日志级别(log_level): - ERROR: el-tag danger - WARN: el-tag warning - INFO: el-tag success - DEBUG: el-tag info ### 8. 交互流程 **Tab1-产量修正日志:** - 加载:请求修正日志列表->渲染 - 查询:选条件->查询->重置page=1->请求列表 - 重置:清空条件->请求 - 导出:调API下载Excel **Tab2-系统运行日志:** - 加载:请求系统日志列表->渲染 - 查询:选条件->查询->重置page=1->请求列表 - 重置:清空条件->请求 - 查看详情:弹窗(只读)->展示完整消息+堆栈+附加数据->关闭 ### 9. 空状态 修正日志无数据:el-empty 暂无产量修正记录 系统日志无数据:el-empty 暂无系统日志 查询无结果:el-empty 未找到匹配的日志,请调整查询条件 ### 10. Mock数据 **GET /api/admin/log/adjustment 产量修正日志:** ```json { "code": 0, "data": { "items": [ { "id": 1, "createdAt": "2026-04-25T15:30:00", "targetTable": "daily_production", "targetId": 3, "oldValue": 310, "newValue": 320, "reason": "传感器计数偏差,手工校准", "operatorIp": "192.168.1.5" }, { "id": 2, "createdAt": "2026-04-24T10:15:00", "targetTable": "worker_daily_summary", "targetId": 12, "oldValue": 850, "newValue": 900, "reason": "漏计补录,夜班产量未计入", "operatorIp": "192.168.1.5" } ], "total": 80, "page": 1, "pageSize": 20 }} ``` **GET /api/admin/log/system 系统运行日志:** ```json { "code": 0, "data": { "items": [ { "id": 1, "createdAt": "2026-04-25T17:36:38", "logLevel": "INFO", "source": "CncCollector", "message": "采集完成: 32台成功, 0台失败", "stackTrace": null, "extraData": null }, { "id": 2, "createdAt": "2026-04-25T17:35:38", "logLevel": "WARN", "source": "CncCollector", "message": "采集失败: 1台超时(fanake_2.5)", "stackTrace": null, "extraData": "{\"machineId\":4,\"addressId\":2,\"error\":\"timeout\"}" }, { "id": 3, "createdAt": "2026-04-25T17:00:00", "logLevel": "ERROR", "source": "CncCollector", "message": "连接拒绝: 10.1.2.5", "stackTrace": "System.Net.Http.HttpRequestException: Connection refused\n at CncCollector.HttpClientWrapper.SendAsync()", "extraData": null }, { "id": 4, "createdAt": "2026-04-25T01:00:00", "logLevel": "INFO", "source": "Scheduler", "message": "日终汇总完成: 160台, 耗时12秒", "stackTrace": null, "extraData": null } ], "total": 5600, "page": 1, "pageSize": 20 }} ``` **GET /api/admin/log/adjustment/export 导出修正日志(返回文件流):** 二进制Excel文件,Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ### 11. 数据需求 > 以下为本页面需要的数据,数据库设计定稿时需覆盖。参考 `01-数据库设计.md` 草案。 | 数据需求 | 草案对应 | 说明 | |---------|---------|------| | 产量修正日志 | cnc_production_adjustment | 主表(业务库) | | 系统运行日志 | log_system | 主表(日志库),按月分区 | | 导出修正日志 | cnc_production_adjustment | 导出Excel |