mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	完成操作日志的迁移
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| package cn.iocoder.dashboard.framework.logger.operatelog.core.annotations; | ||||
|  | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | ||||
| import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiOperation; | ||||
|  | ||||
| @@ -32,7 +32,7 @@ public @interface OperateLog { | ||||
|      * | ||||
|      * 实际并不是数组,因为枚举不能设置 null 作为默认值 | ||||
|      */ | ||||
|     OperateLogTypeEnum[] type() default {}; | ||||
|     OperateTypeEnum[] type() default {}; | ||||
|  | ||||
|     // ========== 开关字段 ========== | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil; | ||||
| import cn.hutool.extra.servlet.ServletUtil; | ||||
| import cn.iocoder.dashboard.common.pojo.CommonResult; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService; | ||||
| import cn.iocoder.dashboard.framework.security.core.util.SecurityUtils; | ||||
| import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; | ||||
| @@ -163,8 +163,14 @@ public class OperateLogAspect { | ||||
|         if (StrUtil.isEmpty(operateLogVO.getModule())) { | ||||
|             Api api = getClassAnnotation(joinPoint, Api.class); | ||||
|             if (api != null) { | ||||
|                 operateLogVO.setModule(Optional.of(api.value()) | ||||
|                         .orElse(ArrayUtil.isEmpty(api.tags()) ? api.tags()[0] : null)); | ||||
|                 // 优先读取 @API 的 name 属性 | ||||
|                 if (StrUtil.isNotEmpty(api.value())) { | ||||
|                     operateLogVO.setModule(api.value()); | ||||
|                 } | ||||
|                 // 没有的话,读取 @API 的 tags 属性 | ||||
|                 if (StrUtil.isEmpty(operateLogVO.getModule()) && ArrayUtil.isNotEmpty(api.tags())) { | ||||
|                     operateLogVO.setModule(api.tags()[0]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // name 属性 | ||||
| @@ -180,7 +186,7 @@ public class OperateLogAspect { | ||||
|         } | ||||
|         if (operateLogVO.getType() == null) { | ||||
|             RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); | ||||
|             OperateLogTypeEnum operateLogType = convertOperateLogType(requestMethod); | ||||
|             OperateTypeEnum operateLogType = convertOperateLogType(requestMethod); | ||||
|             operateLogVO.setType(operateLogType != null ? operateLogType.getType() : null); | ||||
|         } | ||||
|         // content 和 exts 属性 | ||||
| @@ -275,21 +281,21 @@ public class OperateLogAspect { | ||||
|         return requestMethods[0]; | ||||
|     } | ||||
|  | ||||
|     private static OperateLogTypeEnum convertOperateLogType(RequestMethod requestMethod) { | ||||
|     private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) { | ||||
|         if (requestMethod == null) { | ||||
|             return null; | ||||
|         } | ||||
|         switch (requestMethod) { | ||||
|             case GET: | ||||
|                 return OperateLogTypeEnum.GET; | ||||
|                 return OperateTypeEnum.GET; | ||||
|             case POST: | ||||
|                 return OperateLogTypeEnum.CREATE; | ||||
|                 return OperateTypeEnum.CREATE; | ||||
|             case PUT: | ||||
|                 return OperateLogTypeEnum.UPDATE; | ||||
|                 return OperateTypeEnum.UPDATE; | ||||
|             case DELETE: | ||||
|                 return OperateLogTypeEnum.DELETE; | ||||
|                 return OperateTypeEnum.DELETE; | ||||
|             default: | ||||
|                 return OperateLogTypeEnum.OTHER; | ||||
|                 return OperateTypeEnum.OTHER; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -322,7 +328,7 @@ public class OperateLogAspect { | ||||
|             // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 | ||||
|             args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); | ||||
|         } | ||||
|         return JSON.toJSONString(argValues); | ||||
|         return JSON.toJSONString(args); | ||||
|     } | ||||
|  | ||||
|     private static String obtainResultData(Object result) { | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import lombok.Getter; | ||||
|  */ | ||||
| @Getter | ||||
| @AllArgsConstructor | ||||
| public enum OperateLogTypeEnum { | ||||
| public enum OperateTypeEnum { | ||||
| 
 | ||||
|     /** | ||||
|      * 查询 | ||||
| @@ -2,9 +2,12 @@ package cn.iocoder.dashboard.modules.system.controller.logger; | ||||
|  | ||||
| import cn.iocoder.dashboard.common.pojo.CommonResult; | ||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | ||||
| import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.util.OperateLogUtils; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExcelVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogRespVO; | ||||
| import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | ||||
| @@ -22,12 +25,15 @@ import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| import static cn.iocoder.dashboard.common.pojo.CommonResult.success; | ||||
| import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT; | ||||
|  | ||||
| @Api(tags = "操作日志 API") | ||||
| @RestController | ||||
| @@ -41,7 +47,7 @@ public class SysOperateLogController { | ||||
|     private SysUserService userService; | ||||
|  | ||||
|     @ApiOperation("示例") | ||||
|     @OperateLog(type = OperateLogTypeEnum.OTHER) | ||||
|     @OperateLog(type = OperateTypeEnum.OTHER) | ||||
|     @GetMapping("/demo") | ||||
|     public CommonResult<Boolean> demo() { | ||||
|         // 这里可以调用业务逻辑 | ||||
| @@ -74,13 +80,22 @@ public class SysOperateLogController { | ||||
|         return success(new PageResult<>(list, pageResult.getTotal())); | ||||
|     } | ||||
|  | ||||
| //    @Log(title = "操作日志", businessType = BusinessType.EXPORT) | ||||
|     @ApiOperation("导出操作日志") | ||||
|     @GetMapping("/export") | ||||
|     @OperateLog(type = EXPORT) | ||||
| //    @PreAuthorize("@ss.hasPermi('system:operate-log:export')") | ||||
| //    @GetMapping("/export") | ||||
| //    public AjaxResult export(SysOperLog operLog) { | ||||
| //        List<SysOperLog> list = operLogService.selectOperLogList(operLog); | ||||
| //        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); | ||||
| //        return util.exportExcel(list, "操作日志"); | ||||
| //    } | ||||
|     public void exportOperateLog(HttpServletResponse response, @Validated SysOperateLogExportReqVO reqVO) | ||||
|             throws IOException { | ||||
|         List<SysOperateLogDO> list = operateLogService.listOperateLogs(reqVO); | ||||
|  | ||||
|         // 获得拼接需要的数据 | ||||
|         Collection<Long> userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); | ||||
|         Map<Long, SysUserDO> userMap = userService.getUserMap(userIds); | ||||
|         // 拼接数据 | ||||
|         List<SysOperateLogExcelVO> excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); | ||||
|         // 输出 | ||||
|         ExcelUtils.write(response, "操作日志.xls", "数据列表", | ||||
|                 SysOperateLogExcelVO.class, excelDataList); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,42 @@ | ||||
| package cn.iocoder.dashboard.modules.system.controller.logger.vo; | ||||
|  | ||||
| import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat; | ||||
| import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert; | ||||
| import cn.iocoder.dashboard.modules.system.enums.dict.DictTypeEnum; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.util.Date; | ||||
|  | ||||
| /** | ||||
|  * 操作日志 Excel 导出响应 VO | ||||
|  */ | ||||
| @Data | ||||
| public class SysOperateLogExcelVO { | ||||
|  | ||||
|     @ExcelProperty("日志编号") | ||||
|     private Long id; | ||||
|  | ||||
|     @ExcelProperty("操作模块") | ||||
|     private String module; | ||||
|  | ||||
|     @ExcelProperty("操作名") | ||||
|     private String name; | ||||
|  | ||||
|     @ExcelProperty(value = "操作类型", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeEnum.SYS_OPERATE_TYPE) | ||||
|     private String type; | ||||
|  | ||||
|     @ExcelProperty("操作人") | ||||
|     private String userNickname; | ||||
|  | ||||
|     @ExcelProperty(value = "操作结果") // 成功 or 失败 | ||||
|     private String successStr; | ||||
|  | ||||
|     @ExcelProperty("操作日志") | ||||
|     private Date startTime; | ||||
|  | ||||
|     @ExcelProperty("执行时长") | ||||
|     private Integer duration; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,36 @@ | ||||
| package cn.iocoder.dashboard.modules.system.controller.logger.vo; | ||||
|  | ||||
| import io.swagger.annotations.ApiModel; | ||||
| import io.swagger.annotations.ApiModelProperty; | ||||
| import lombok.Data; | ||||
| import org.springframework.format.annotation.DateTimeFormat; | ||||
|  | ||||
| import java.util.Date; | ||||
|  | ||||
| import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||||
|  | ||||
| @ApiModel("操作日志分页列表 Request VO") | ||||
| @Data | ||||
| public class SysOperateLogExportReqVO { | ||||
|  | ||||
|     @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") | ||||
|     private String module; | ||||
|  | ||||
|     @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") | ||||
|     private String userNickname; | ||||
|  | ||||
|     @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") | ||||
|     private Integer type; | ||||
|  | ||||
|     @ApiModelProperty(value = "操作状态", example = "true") | ||||
|     private Boolean success; | ||||
|  | ||||
|     @ApiModelProperty(value = "开始时间", example = "2020-10-24") | ||||
|     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||
|     private Date beginTime; | ||||
|  | ||||
|     @ApiModelProperty(value = "结束时间", example = "2020-10-24") | ||||
|     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||
|     private Date endTime; | ||||
|  | ||||
| } | ||||
| @@ -2,11 +2,20 @@ package cn.iocoder.dashboard.modules.system.convert.logger; | ||||
|  | ||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogCreateReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExcelVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogRespVO; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.dashboard.util.collection.MapUtils; | ||||
| import org.mapstruct.Mapper; | ||||
| import org.mapstruct.factory.Mappers; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import static cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; | ||||
|  | ||||
| @Mapper | ||||
| public interface SysOperateLogConvert { | ||||
|  | ||||
| @@ -18,4 +27,15 @@ public interface SysOperateLogConvert { | ||||
|  | ||||
|     SysOperateLogRespVO convert(SysOperateLogDO bean); | ||||
|  | ||||
|     default List<SysOperateLogExcelVO> convertList(List<SysOperateLogDO> list, Map<Long, SysUserDO> userMap) { | ||||
|         return list.stream().map(operateLog -> { | ||||
|             SysOperateLogExcelVO excelVO = convert02(operateLog); | ||||
|             MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); | ||||
|             excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); | ||||
|             return excelVO; | ||||
|         }).collect(Collectors.toList()); | ||||
|     } | ||||
|  | ||||
|     SysOperateLogExcelVO convert02(SysOperateLogDO bean); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,11 +4,13 @@ import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; | ||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | ||||
| import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| @Mapper | ||||
| public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { | ||||
| @@ -24,7 +26,23 @@ public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { | ||||
|         } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { | ||||
|             query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); | ||||
|         } | ||||
|         query.orderByDesc("id"); // 降序 | ||||
|         return selectPage(reqVO, query); | ||||
|     } | ||||
|  | ||||
|     default List<SysOperateLogDO> selectList(SysOperateLogExportReqVO reqVO, Collection<Long> userIds) { | ||||
|         QueryWrapperX<SysOperateLogDO> query = new QueryWrapperX<SysOperateLogDO>() | ||||
|                 .likeIfPresent("module", reqVO.getModule()) | ||||
|                 .inIfPresent("user_id", userIds) | ||||
|                 .eqIfPresent("operate_type", reqVO.getType()) | ||||
|                 .betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime()); | ||||
|         if (Boolean.TRUE.equals(reqVO.getSuccess())) { | ||||
|             query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); | ||||
|         } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { | ||||
|             query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); | ||||
|         } | ||||
|         query.orderByDesc("id"); // 降序 | ||||
|         return selectList(query); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger; | ||||
| import cn.iocoder.dashboard.common.pojo.CommonResult; | ||||
| import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | ||||
| import com.baomidou.mybatisplus.annotation.TableField; | ||||
| import com.baomidou.mybatisplus.annotation.TableId; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| @@ -19,7 +19,7 @@ import java.util.Map; | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @TableName("sys_operate_log") | ||||
| @TableName(value = "sys_operate_log", autoResultMap = true) | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| public class SysOperateLogDO extends BaseDO { | ||||
| @@ -62,7 +62,7 @@ public class SysOperateLogDO extends BaseDO { | ||||
|     /** | ||||
|      * 操作分类 | ||||
|      * | ||||
|      * 枚举 {@link OperateLogTypeEnum} | ||||
|      * 枚举 {@link OperateTypeEnum} | ||||
|      */ | ||||
|     @TableField("operate_type") | ||||
|     private Integer type; | ||||
|   | ||||
| @@ -12,6 +12,7 @@ public enum DictTypeEnum { | ||||
|  | ||||
|     SYS_USER_SEX("sys_user_sex"), // 用户性别 | ||||
|     SYS_COMMON_STATUS("sys_common_status"), // 系统状态 | ||||
|     SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型 | ||||
|     ; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -2,9 +2,12 @@ package cn.iocoder.dashboard.modules.system.service.logger; | ||||
|  | ||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | ||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * 操作日志 Service 接口 | ||||
|  */ | ||||
| @@ -18,4 +21,12 @@ public interface SysOperateLogService extends OperateLogFrameworkService { | ||||
|      */ | ||||
|     PageResult<SysOperateLogDO> pageOperateLog(SysOperateLogPageReqVO reqVO); | ||||
|  | ||||
|     /** | ||||
|      * 获得操作日志列表 | ||||
|      * | ||||
|      * @param reqVO 列表条件 | ||||
|      * @return 日志列表 | ||||
|      */ | ||||
|     List<SysOperateLogDO> listOperateLogs(SysOperateLogExportReqVO reqVO); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogCreateReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; | ||||
| import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dao.logger.SysOperateLogMapper; | ||||
| @@ -18,6 +19,8 @@ import org.springframework.stereotype.Service; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; | ||||
| import static cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; | ||||
| @@ -61,4 +64,18 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { | ||||
|         return operateLogMapper.selectPage(reqVO, userIds); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<SysOperateLogDO> listOperateLogs(SysOperateLogExportReqVO reqVO) { | ||||
|         // 处理基于用户昵称的查询 | ||||
|         Collection<Long> userIds = null; | ||||
|         if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { | ||||
|             userIds = convertSet(userService.listUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); | ||||
|             if (CollUtil.isEmpty(userIds)) { | ||||
|                 return Collections.emptyList(); | ||||
|             } | ||||
|         } | ||||
|         // 查询列表 | ||||
|         return operateLogMapper.selectList(reqVO, userIds); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV