mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 18:49:06 +08:00 
			
		
		
		
	完成操作日志的迁移
This commit is contained in:
		| @ -14,6 +14,7 @@ export function exportOperateLog(query) { | |||||||
|   return request({ |   return request({ | ||||||
|     url: '/system/operate-log/export', |     url: '/system/operate-log/export', | ||||||
|     method: 'get', |     method: 'get', | ||||||
|     params: query |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  | |||||||
| @ -138,36 +138,41 @@ | |||||||
|     <el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body> |     <el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body> | ||||||
|       <el-form ref="form" :model="form" label-width="100px" size="mini"> |       <el-form ref="form" :model="form" label-width="100px" size="mini"> | ||||||
|         <el-row> |         <el-row> | ||||||
|           <el-col :span="12"> |           <el-col :span="24"> | ||||||
|             <el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item> |             <el-form-item label="日志主键:">{{ form.id }}</el-form-item> | ||||||
|             <el-form-item |  | ||||||
|               label="登录信息:" |  | ||||||
|             >{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item> |  | ||||||
|           </el-col> |  | ||||||
|           <el-col :span="12"> |  | ||||||
|             <el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item> |  | ||||||
|             <el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item> |  | ||||||
|           </el-col> |           </el-col> | ||||||
|           <el-col :span="24"> |           <el-col :span="24"> | ||||||
|             <el-form-item label="操作方法:">{{ form.method }}</el-form-item> |             <el-form-item label="链路追踪:">{{ form.traceId }}</el-form-item> | ||||||
|           </el-col> |           </el-col> | ||||||
|           <el-col :span="24"> |           <el-col :span="24"> | ||||||
|             <el-form-item label="请求参数:">{{ form.operParam }}</el-form-item> |             <el-form-item label="用户信息:">{{ form.userId }} | {{ form.userNickname }} | {{ form.userIp }} | {{ form.userAgent}} </el-form-item> | ||||||
|           </el-col> |           </el-col> | ||||||
|           <el-col :span="24"> |           <el-col :span="24"> | ||||||
|             <el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item> |             <el-form-item label="操作信息:"> | ||||||
|  |               {{ form.module }} | {{ form.name }} | {{ getDictDataLabel(DICT_TYPE.SYS_OPERATE_TYPE, form.type) }} | ||||||
|  |               <br /> {{ form.content }} | ||||||
|  |               <br /> {{ form.exts }} | ||||||
|  |             </el-form-item> | ||||||
|           </el-col> |           </el-col> | ||||||
|           <el-col :span="12"> |           <el-col :span="24"> | ||||||
|             <el-form-item label="操作状态:"> |             <el-form-item label="请求信息:">{{ form.requestMethod }} | {{ form.requestUrl }} </el-form-item> | ||||||
|               <div v-if="form.status === 0">正常</div> |           </el-col> | ||||||
|               <div v-else-if="form.status === 1">失败</div> |           <el-col :span="24"> | ||||||
|  |             <el-form-item label="方法名:">{{ form.javaMethod }}</el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="24"> | ||||||
|  |             <el-form-item label="方法参数:">{{ form.javaMethodArgs }}</el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="24"> | ||||||
|  |             <el-form-item label="开始时间:"> | ||||||
|  |               {{ parseTime(form.startTime) }} | {{ form.duration }} ms | ||||||
|             </el-form-item> |             </el-form-item> | ||||||
|           </el-col> |           </el-col> | ||||||
|           <el-col :span="12"> |           <el-col :span="12"> | ||||||
|             <el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item> |             <el-form-item label="操作结果:"> | ||||||
|           </el-col> |               <div v-if="form.resultCode === 0">正常 | {{ form.resultData}} </div> | ||||||
|           <el-col :span="24"> |               <div v-else-if="form.resultCode > 0">失败 | {{ form.resultCode }} || {{ form.resultMsg}}</div> | ||||||
|             <el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item> |             </el-form-item> | ||||||
|           </el-col> |           </el-col> | ||||||
|         </el-row> |         </el-row> | ||||||
|       </el-form> |       </el-form> | ||||||
| @ -258,7 +263,10 @@ export default { | |||||||
|     }, |     }, | ||||||
|     /** 导出按钮操作 */ |     /** 导出按钮操作 */ | ||||||
|     handleExport() { |     handleExport() { | ||||||
|       const queryParams = this.queryParams; |       const queryParams = this.addDateRange(this.queryParams, [ | ||||||
|  |         this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, | ||||||
|  |         this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, | ||||||
|  |       ]) | ||||||
|       this.$confirm('是否确认导出所有操作日志数据项?', "警告", { |       this.$confirm('是否确认导出所有操作日志数据项?', "警告", { | ||||||
|           confirmButtonText: "确定", |           confirmButtonText: "确定", | ||||||
|           cancelButtonText: "取消", |           cancelButtonText: "取消", | ||||||
| @ -266,7 +274,7 @@ export default { | |||||||
|         }).then(function() { |         }).then(function() { | ||||||
|           return exportOperateLog(queryParams); |           return exportOperateLog(queryParams); | ||||||
|         }).then(response => { |         }).then(response => { | ||||||
|           this.download(response.msg); |           this.downloadExcel(response, '操作日志.xls'); | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package cn.iocoder.dashboard.framework.logger.operatelog.core.annotations; | 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.Api; | ||||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||||
|  |  | ||||||
| @ -32,7 +32,7 @@ public @interface OperateLog { | |||||||
|      * |      * | ||||||
|      * 实际并不是数组,因为枚举不能设置 null 作为默认值 |      * 实际并不是数组,因为枚举不能设置 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.hutool.extra.servlet.ServletUtil; | ||||||
| import cn.iocoder.dashboard.common.pojo.CommonResult; | 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.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.logger.operatelog.core.service.OperateLogFrameworkService; | ||||||
| import cn.iocoder.dashboard.framework.security.core.util.SecurityUtils; | import cn.iocoder.dashboard.framework.security.core.util.SecurityUtils; | ||||||
| import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; | import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; | ||||||
| @ -163,8 +163,14 @@ public class OperateLogAspect { | |||||||
|         if (StrUtil.isEmpty(operateLogVO.getModule())) { |         if (StrUtil.isEmpty(operateLogVO.getModule())) { | ||||||
|             Api api = getClassAnnotation(joinPoint, Api.class); |             Api api = getClassAnnotation(joinPoint, Api.class); | ||||||
|             if (api != null) { |             if (api != null) { | ||||||
|                 operateLogVO.setModule(Optional.of(api.value()) |                 // 优先读取 @API 的 name 属性 | ||||||
|                         .orElse(ArrayUtil.isEmpty(api.tags()) ? api.tags()[0] : null)); |                 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 属性 |         // name 属性 | ||||||
| @ -180,7 +186,7 @@ public class OperateLogAspect { | |||||||
|         } |         } | ||||||
|         if (operateLogVO.getType() == null) { |         if (operateLogVO.getType() == null) { | ||||||
|             RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); |             RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); | ||||||
|             OperateLogTypeEnum operateLogType = convertOperateLogType(requestMethod); |             OperateTypeEnum operateLogType = convertOperateLogType(requestMethod); | ||||||
|             operateLogVO.setType(operateLogType != null ? operateLogType.getType() : null); |             operateLogVO.setType(operateLogType != null ? operateLogType.getType() : null); | ||||||
|         } |         } | ||||||
|         // content 和 exts 属性 |         // content 和 exts 属性 | ||||||
| @ -275,21 +281,21 @@ public class OperateLogAspect { | |||||||
|         return requestMethods[0]; |         return requestMethods[0]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static OperateLogTypeEnum convertOperateLogType(RequestMethod requestMethod) { |     private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) { | ||||||
|         if (requestMethod == null) { |         if (requestMethod == null) { | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|         switch (requestMethod) { |         switch (requestMethod) { | ||||||
|             case GET: |             case GET: | ||||||
|                 return OperateLogTypeEnum.GET; |                 return OperateTypeEnum.GET; | ||||||
|             case POST: |             case POST: | ||||||
|                 return OperateLogTypeEnum.CREATE; |                 return OperateTypeEnum.CREATE; | ||||||
|             case PUT: |             case PUT: | ||||||
|                 return OperateLogTypeEnum.UPDATE; |                 return OperateTypeEnum.UPDATE; | ||||||
|             case DELETE: |             case DELETE: | ||||||
|                 return OperateLogTypeEnum.DELETE; |                 return OperateTypeEnum.DELETE; | ||||||
|             default: |             default: | ||||||
|                 return OperateLogTypeEnum.OTHER; |                 return OperateTypeEnum.OTHER; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -322,7 +328,7 @@ public class OperateLogAspect { | |||||||
|             // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 |             // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 | ||||||
|             args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); |             args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); | ||||||
|         } |         } | ||||||
|         return JSON.toJSONString(argValues); |         return JSON.toJSONString(args); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static String obtainResultData(Object result) { |     private static String obtainResultData(Object result) { | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ import lombok.Getter; | |||||||
|  */ |  */ | ||||||
| @Getter | @Getter | ||||||
| @AllArgsConstructor | @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.CommonResult; | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | 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.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.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.SysOperateLogPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogRespVO; | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogRespVO; | ||||||
| import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | 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 org.springframework.web.bind.annotation.RestController; | ||||||
|  |  | ||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
|  | import javax.servlet.http.HttpServletResponse; | ||||||
|  | import java.io.IOException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| import static cn.iocoder.dashboard.common.pojo.CommonResult.success; | import static cn.iocoder.dashboard.common.pojo.CommonResult.success; | ||||||
|  | import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT; | ||||||
|  |  | ||||||
| @Api(tags = "操作日志 API") | @Api(tags = "操作日志 API") | ||||||
| @RestController | @RestController | ||||||
| @ -41,7 +47,7 @@ public class SysOperateLogController { | |||||||
|     private SysUserService userService; |     private SysUserService userService; | ||||||
|  |  | ||||||
|     @ApiOperation("示例") |     @ApiOperation("示例") | ||||||
|     @OperateLog(type = OperateLogTypeEnum.OTHER) |     @OperateLog(type = OperateTypeEnum.OTHER) | ||||||
|     @GetMapping("/demo") |     @GetMapping("/demo") | ||||||
|     public CommonResult<Boolean> demo() { |     public CommonResult<Boolean> demo() { | ||||||
|         // 这里可以调用业务逻辑 |         // 这里可以调用业务逻辑 | ||||||
| @ -74,13 +80,22 @@ public class SysOperateLogController { | |||||||
|         return success(new PageResult<>(list, pageResult.getTotal())); |         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')") | //    @PreAuthorize("@ss.hasPermi('system:operate-log:export')") | ||||||
| //    @GetMapping("/export") |     public void exportOperateLog(HttpServletResponse response, @Validated SysOperateLogExportReqVO reqVO) | ||||||
| //    public AjaxResult export(SysOperLog operLog) { |             throws IOException { | ||||||
| //        List<SysOperLog> list = operLogService.selectOperLogList(operLog); |         List<SysOperateLogDO> list = operateLogService.listOperateLogs(reqVO); | ||||||
| //        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); |  | ||||||
| //        return util.exportExcel(list, "操作日志"); |         // 获得拼接需要的数据 | ||||||
| //    } |         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.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogCreateReqVO; | 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.controller.logger.vo.SysOperateLogRespVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | 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.Mapper; | ||||||
| import org.mapstruct.factory.Mappers; | 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 | @Mapper | ||||||
| public interface SysOperateLogConvert { | public interface SysOperateLogConvert { | ||||||
|  |  | ||||||
| @ -18,4 +27,15 @@ public interface SysOperateLogConvert { | |||||||
|  |  | ||||||
|     SysOperateLogRespVO convert(SysOperateLogDO bean); |     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.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; | import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; | ||||||
| import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; | 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.controller.logger.vo.SysOperateLogPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
|  |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| @Mapper | @Mapper | ||||||
| public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { | public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { | ||||||
| @ -24,7 +26,23 @@ public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { | |||||||
|         } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { |         } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { | ||||||
|             query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); |             query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); | ||||||
|         } |         } | ||||||
|  |         query.orderByDesc("id"); // 降序 | ||||||
|         return selectPage(reqVO, query); |         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.common.pojo.CommonResult; | ||||||
| import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | 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.TableField; | ||||||
| import com.baomidou.mybatisplus.annotation.TableId; | import com.baomidou.mybatisplus.annotation.TableId; | ||||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||||
| @ -19,7 +19,7 @@ import java.util.Map; | |||||||
|  * |  * | ||||||
|  * @author 芋道源码 |  * @author 芋道源码 | ||||||
|  */ |  */ | ||||||
| @TableName("sys_operate_log") | @TableName(value = "sys_operate_log", autoResultMap = true) | ||||||
| @Data | @Data | ||||||
| @EqualsAndHashCode(callSuper = true) | @EqualsAndHashCode(callSuper = true) | ||||||
| public class SysOperateLogDO extends BaseDO { | public class SysOperateLogDO extends BaseDO { | ||||||
| @ -62,7 +62,7 @@ public class SysOperateLogDO extends BaseDO { | |||||||
|     /** |     /** | ||||||
|      * 操作分类 |      * 操作分类 | ||||||
|      * |      * | ||||||
|      * 枚举 {@link OperateLogTypeEnum} |      * 枚举 {@link OperateTypeEnum} | ||||||
|      */ |      */ | ||||||
|     @TableField("operate_type") |     @TableField("operate_type") | ||||||
|     private Integer type; |     private Integer type; | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ public enum DictTypeEnum { | |||||||
|  |  | ||||||
|     SYS_USER_SEX("sys_user_sex"), // 用户性别 |     SYS_USER_SEX("sys_user_sex"), // 用户性别 | ||||||
|     SYS_COMMON_STATUS("sys_common_status"), // 系统状态 |     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.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService; | 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.controller.logger.vo.SysOperateLogPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 操作日志 Service 接口 |  * 操作日志 Service 接口 | ||||||
|  */ |  */ | ||||||
| @ -18,4 +21,12 @@ public interface SysOperateLogService extends OperateLogFrameworkService { | |||||||
|      */ |      */ | ||||||
|     PageResult<SysOperateLogDO> pageOperateLog(SysOperateLogPageReqVO reqVO); |     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.hutool.core.util.StrUtil; | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | 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.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.controller.logger.vo.SysOperateLogPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dao.logger.SysOperateLogMapper; | 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 javax.annotation.Resource; | ||||||
| import java.util.Collection; | 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.JAVA_METHOD_ARGS_MAX_LENGTH; | ||||||
| import static cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO.RESULT_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); |         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