# 日志平台区分功能说明 ## 一、功能概述 在系统日志中新增 `platform` 字段,用于区分医生端(doctor)和管理端(manage)的操作日志,并提供分别查询医生端和管理端日志的接口。 --- ## 二、数据库修改 ### 执行 SQL 脚本 位置:`/doc/sql/add_platform_to_sys_log.sql` ```sql -- 1. 添加 platform 字段 ALTER TABLE `sys_log` ADD COLUMN `platform` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台类型:doctor-医生端,manage-管理端' AFTER `real_name`; -- 2. 添加索引 ALTER TABLE `sys_log` ADD INDEX `idx_platform` (`platform`); ALTER TABLE `sys_log` ADD INDEX `idx_platform_time` (`platform`, `operate_time`); ``` --- ## 三、前端配置 ### Vue 前端请求头配置 在前端项目的 axios 拦截器中添加 `platform` 请求头: #### 医生端项目(doctor) ```javascript // axios 请求拦截器 axios.interceptors.request.use(config => { // 添加平台标识 config.headers['platform'] = 'doctor'; // 其他配置... return config; }); ``` #### 管理端项目(manage) ```javascript // axios 请求拦截器 axios.interceptors.request.use(config => { // 添加平台标识 config.headers['platform'] = 'manage'; // 其他配置... return config; }); ``` --- ## 四、后端实现说明 ### 1. 日志记录 (ControllerAop.java) AOP 会自动从请求头获取 `platform` 字段并记录到日志中: ```java // 平台类型(从请求头获取) String platform = request.getHeader("platform"); if (StringUtils.isNotBlank(platform)) { log.setPlatform(platform.toLowerCase()); // 转为小写存储 } else { // 如果请求头没有platform,尝试从URL判断 String requestUri = request.getRequestURI(); if (requestUri.contains("/api/doctor/") || requestUri.contains("/doctor/")) { log.setPlatform("doctor"); } else if (requestUri.contains("/api/admin/") || requestUri.contains("/api/manage/")) { log.setPlatform("manage"); } } ``` **说明:** - 优先从请求头 `platform` 获取 - 如果请求头没有,则尝试从 URL 路径判断 - 存储时统一转为小写 ### 2. 实体类修改 (SysLog.java) 新增字段: ```java /** * 平台类型:doctor-医生端,manage-管理端 */ private String platform; ``` --- ## 五、API 接口说明 ### 基础路径 `/api/log` ### 1. 查询医生端日志 **接口:** `POST /api/log/doctor/page` **请求体:** ```json { "username": "zhangsan", // 可选,用户名模糊查询 "logType": "操作日志", // 可选,日志类型 "operateType": "查询", // 可选,操作类型 "status": 1, // 可选,状态 0-失败 1-成功 "startTime": "2025-12-01 00:00:00", // 可选,开始时间 "endTime": "2025-12-01 23:59:59", // 可选,结束时间 "pageNum": 1, // 页码,默认1 "pageSize": 10 // 每页大小,默认10 } ``` **响应示例:** ```json { "code": 200, "message": "查询成功", "data": { "total": 100, "pageNum": 1, "pageSize": 10, "list": [ { "id": 1, "userId": 10, "username": "zhangsan", "realName": "张三", "platform": "doctor", "logType": "操作日志", "operateType": "查询", "detail": "查询患者列表", "requestUrl": "/api/patient/list", "requestMethod": "POST", "operateIp": "192.168.1.100", "operateTime": "2025-12-01 10:00:00", "useTime": 123, "status": 1, "browser": "Chrome", "os": "Windows 10" } ] } } ``` ### 2. 查询管理端日志 **接口:** `POST /api/log/manage/page` **请求体:** 同医生端 **响应:** 同医生端,`platform` 字段为 `"manage"` ### 3. 通用日志查询 **接口:** `POST /api/log/page` **请求体:** ```json { "platform": "doctor", // 可选,指定平台 doctor/manage "username": "admin", // 可选 "logType": "登录日志", // 可选 "pageNum": 1, "pageSize": 10 } ``` **说明:** 可以通过 `platform` 字段指定查询哪个平台的日志,如果不指定则查询所有平台 ### 4. 获取日志详情 **接口:** `GET /api/log/{id}` **响应示例:** ```json { "code": 200, "message": "查询成功", "data": { "id": 1, "userId": 10, "username": "zhangsan", "realName": "张三", "platform": "doctor", "logType": "操作日志", "operateType": "查询", "detail": "查询患者列表", "controller": "PatientController", "method": "getPatientList", "requestUrl": "/api/patient/list", "requestMethod": "POST", "requestParams": "{\"pageNum\":1,\"pageSize\":10}", "operateIp": "192.168.1.100", "operateTime": "2025-12-01 10:00:00", "useTime": 123, "status": 1, "browser": "Chrome 120.0.0", "os": "Windows 10" } } ``` --- ## 六、使用示例 ### 前端调用示例 #### 查询医生端日志 ```javascript // 查询医生端日志 async getDoctorLogs() { const queryParams = { username: this.searchForm.username, logType: this.searchForm.logType, startTime: this.searchForm.startTime, endTime: this.searchForm.endTime, pageNum: this.currentPage, pageSize: this.pageSize }; const response = await this.$axios.post('/api/log/doctor/page', queryParams); if (response.data.code === 200) { this.logList = response.data.data.list; this.total = response.data.data.total; } } ``` #### 查询管理端日志 ```javascript // 查询管理端日志 async getManageLogs() { const queryParams = { username: this.searchForm.username, logType: this.searchForm.logType, startTime: this.searchForm.startTime, endTime: this.searchForm.endTime, pageNum: this.currentPage, pageSize: this.pageSize }; const response = await this.$axios.post('/api/log/manage/page', queryParams); if (response.data.code === 200) { this.logList = response.data.data.list; this.total = response.data.data.total; } } ``` --- ## 七、文件清单 ### 新增/修改的文件 ``` 修改: - src/main/java/com/zskk/pacsonline/component/aop/ControllerAop.java - src/main/java/com/zskk/pacsonline/modules/system/entity/SysLog.java - src/main/java/com/zskk/pacsonline/modules/system/mapper/SysLogMapper.java - src/main/java/com/zskk/pacsonline/modules/system/service/SysLogService.java - src/main/java/com/zskk/pacsonline/modules/system/service/impl/SysLogServiceImpl.java - src/main/java/com/zskk/pacsonline/modules/system/controller/LogController.java 新增: - doc/sql/add_platform_to_sys_log.sql - src/main/java/com/zskk/pacsonline/modules/system/vo/LogQueryVO.java - src/main/java/com/zskk/pacsonline/modules/system/dto/LogDTO.java - src/main/java/com/zskk/pacsonline/modules/system/mapper/xml/SysLogMapper.xml ``` --- ## 八、注意事项 1. **数据库迁移**:请先执行 SQL 脚本添加 `platform` 字段和索引 2. **前端配置**:确保前端项目在请求拦截器中正确配置了 `platform` 请求头 3. **历史数据**:现有的历史日志 `platform` 字段为 NULL,可以通过 URL 规则进行批量更新 4. **平台值**:platform 统一使用小写存储(doctor/manage) 5. **查询性能**:已添加 `idx_platform` 和 `idx_platform_time` 索引优化查询性能 --- ## 九、Swagger 接口文档 启动项目后,访问 Swagger 文档查看详细的 API 接口说明: ``` http://localhost:8080/swagger-ui/index.html ``` 在 "系统日志管理" 分组下可以看到所有日志查询相关的接口。 --- ## 十、测试建议 1. 在医生端项目发起操作,检查日志的 `platform` 字段是否为 `doctor` 2. 在管理端项目发起操作,检查日志的 `platform` 字段是否为 `manage` 3. 分别调用 `/api/log/doctor/page` 和 `/api/log/manage/page` 验证日志筛选是否正确 4. 测试各种查询条件组合(用户名、日志类型、时间范围等)