日志平台区分功能说明.md 7.9 KB

日志平台区分功能说明

一、功能概述

在系统日志中新增 platform 字段,用于区分医生端(doctor)和管理端(manage)的操作日志,并提供分别查询医生端和管理端日志的接口。


二、数据库修改

执行 SQL 脚本

位置:/doc/sql/add_platform_to_sys_log.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)

// axios 请求拦截器
axios.interceptors.request.use(config => {
  // 添加平台标识
  config.headers['platform'] = 'doctor';

  // 其他配置...
  return config;
});

管理端项目(manage)

// axios 请求拦截器
axios.interceptors.request.use(config => {
  // 添加平台标识
  config.headers['platform'] = 'manage';

  // 其他配置...
  return config;
});

四、后端实现说明

1. 日志记录 (ControllerAop.java)

AOP 会自动从请求头获取 platform 字段并记录到日志中:

// 平台类型(从请求头获取)
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)

新增字段:

/**
 * 平台类型:doctor-医生端,manage-管理端
 */
private String platform;

五、API 接口说明

基础路径

/api/log

1. 查询医生端日志

接口: POST /api/log/doctor/page

请求体:

{
  "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
}

响应示例:

{
  "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

请求体:

{
  "platform": "doctor",         // 可选,指定平台 doctor/manage
  "username": "admin",          // 可选
  "logType": "登录日志",        // 可选
  "pageNum": 1,
  "pageSize": 10
}

说明: 可以通过 platform 字段指定查询哪个平台的日志,如果不指定则查询所有平台

4. 获取日志详情

接口: GET /api/log/{id}

响应示例:

{
  "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"
  }
}

六、使用示例

前端调用示例

查询医生端日志

// 查询医生端日志
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;
  }
}

查询管理端日志

// 查询管理端日志
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_platformidx_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. 测试各种查询条件组合(用户名、日志类型、时间范围等)