Commit e330bf0f39d41124000fd1b43d701d88fe1e35c4
1 parent
1768d27e
完成操作日志的迁移
Showing
14 changed files
with
223 additions
and
48 deletions
ruoyi-ui/src/api/system/operatelog.js
ruoyi-ui/src/views/system/operatelog/index.vue
| ... | ... | @@ -138,36 +138,41 @@ |
| 138 | 138 | <el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body> |
| 139 | 139 | <el-form ref="form" :model="form" label-width="100px" size="mini"> |
| 140 | 140 | <el-row> |
| 141 | - <el-col :span="12"> | |
| 142 | - <el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item> | |
| 143 | - <el-form-item | |
| 144 | - label="登录信息:" | |
| 145 | - >{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item> | |
| 141 | + <el-col :span="24"> | |
| 142 | + <el-form-item label="日志主键:">{{ form.id }}</el-form-item> | |
| 146 | 143 | </el-col> |
| 147 | - <el-col :span="12"> | |
| 148 | - <el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item> | |
| 149 | - <el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item> | |
| 144 | + <el-col :span="24"> | |
| 145 | + <el-form-item label="链路追踪:">{{ form.traceId }}</el-form-item> | |
| 150 | 146 | </el-col> |
| 151 | 147 | <el-col :span="24"> |
| 152 | - <el-form-item label="操作方法:">{{ form.method }}</el-form-item> | |
| 148 | + <el-form-item label="用户信息:">{{ form.userId }} | {{ form.userNickname }} | {{ form.userIp }} | {{ form.userAgent}} </el-form-item> | |
| 153 | 149 | </el-col> |
| 154 | 150 | <el-col :span="24"> |
| 155 | - <el-form-item label="请求参数:">{{ form.operParam }}</el-form-item> | |
| 151 | + <el-form-item label="操作信息:"> | |
| 152 | + {{ form.module }} | {{ form.name }} | {{ getDictDataLabel(DICT_TYPE.SYS_OPERATE_TYPE, form.type) }} | |
| 153 | + <br /> {{ form.content }} | |
| 154 | + <br /> {{ form.exts }} | |
| 155 | + </el-form-item> | |
| 156 | 156 | </el-col> |
| 157 | 157 | <el-col :span="24"> |
| 158 | - <el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item> | |
| 158 | + <el-form-item label="请求信息:">{{ form.requestMethod }} | {{ form.requestUrl }} </el-form-item> | |
| 159 | 159 | </el-col> |
| 160 | - <el-col :span="12"> | |
| 161 | - <el-form-item label="操作状态:"> | |
| 162 | - <div v-if="form.status === 0">正常</div> | |
| 163 | - <div v-else-if="form.status === 1">失败</div> | |
| 164 | - </el-form-item> | |
| 160 | + <el-col :span="24"> | |
| 161 | + <el-form-item label="方法名:">{{ form.javaMethod }}</el-form-item> | |
| 165 | 162 | </el-col> |
| 166 | - <el-col :span="12"> | |
| 167 | - <el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item> | |
| 163 | + <el-col :span="24"> | |
| 164 | + <el-form-item label="方法参数:">{{ form.javaMethodArgs }}</el-form-item> | |
| 168 | 165 | </el-col> |
| 169 | 166 | <el-col :span="24"> |
| 170 | - <el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item> | |
| 167 | + <el-form-item label="开始时间:"> | |
| 168 | + {{ parseTime(form.startTime) }} | {{ form.duration }} ms | |
| 169 | + </el-form-item> | |
| 170 | + </el-col> | |
| 171 | + <el-col :span="12"> | |
| 172 | + <el-form-item label="操作结果:"> | |
| 173 | + <div v-if="form.resultCode === 0">正常 | {{ form.resultData}} </div> | |
| 174 | + <div v-else-if="form.resultCode > 0">失败 | {{ form.resultCode }} || {{ form.resultMsg}}</div> | |
| 175 | + </el-form-item> | |
| 171 | 176 | </el-col> |
| 172 | 177 | </el-row> |
| 173 | 178 | </el-form> |
| ... | ... | @@ -258,7 +263,10 @@ export default { |
| 258 | 263 | }, |
| 259 | 264 | /** 导出按钮操作 */ |
| 260 | 265 | handleExport() { |
| 261 | - const queryParams = this.queryParams; | |
| 266 | + const queryParams = this.addDateRange(this.queryParams, [ | |
| 267 | + this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, | |
| 268 | + this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, | |
| 269 | + ]) | |
| 262 | 270 | this.$confirm('是否确认导出所有操作日志数据项?', "警告", { |
| 263 | 271 | confirmButtonText: "确定", |
| 264 | 272 | cancelButtonText: "取消", |
| ... | ... | @@ -266,7 +274,7 @@ export default { |
| 266 | 274 | }).then(function() { |
| 267 | 275 | return exportOperateLog(queryParams); |
| 268 | 276 | }).then(response => { |
| 269 | - this.download(response.msg); | |
| 277 | + this.downloadExcel(response, '操作日志.xls'); | |
| 270 | 278 | }) |
| 271 | 279 | } |
| 272 | 280 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/annotations/OperateLog.java
| 1 | 1 | package cn.iocoder.dashboard.framework.logger.operatelog.core.annotations; |
| 2 | 2 | |
| 3 | -import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | |
| 3 | +import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | |
| 4 | 4 | import io.swagger.annotations.Api; |
| 5 | 5 | import io.swagger.annotations.ApiOperation; |
| 6 | 6 | |
| ... | ... | @@ -32,7 +32,7 @@ public @interface OperateLog { |
| 32 | 32 | * |
| 33 | 33 | * 实际并不是数组,因为枚举不能设置 null 作为默认值 |
| 34 | 34 | */ |
| 35 | - OperateLogTypeEnum[] type() default {}; | |
| 35 | + OperateTypeEnum[] type() default {}; | |
| 36 | 36 | |
| 37 | 37 | // ========== 开关字段 ========== |
| 38 | 38 | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java
| ... | ... | @@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil; |
| 6 | 6 | import cn.hutool.extra.servlet.ServletUtil; |
| 7 | 7 | import cn.iocoder.dashboard.common.pojo.CommonResult; |
| 8 | 8 | import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; |
| 9 | -import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | |
| 9 | +import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | |
| 10 | 10 | import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService; |
| 11 | 11 | import cn.iocoder.dashboard.framework.security.core.util.SecurityUtils; |
| 12 | 12 | import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; |
| ... | ... | @@ -163,8 +163,14 @@ public class OperateLogAspect { |
| 163 | 163 | if (StrUtil.isEmpty(operateLogVO.getModule())) { |
| 164 | 164 | Api api = getClassAnnotation(joinPoint, Api.class); |
| 165 | 165 | if (api != null) { |
| 166 | - operateLogVO.setModule(Optional.of(api.value()) | |
| 167 | - .orElse(ArrayUtil.isEmpty(api.tags()) ? api.tags()[0] : null)); | |
| 166 | + // 优先读取 @API 的 name 属性 | |
| 167 | + if (StrUtil.isNotEmpty(api.value())) { | |
| 168 | + operateLogVO.setModule(api.value()); | |
| 169 | + } | |
| 170 | + // 没有的话,读取 @API 的 tags 属性 | |
| 171 | + if (StrUtil.isEmpty(operateLogVO.getModule()) && ArrayUtil.isNotEmpty(api.tags())) { | |
| 172 | + operateLogVO.setModule(api.tags()[0]); | |
| 173 | + } | |
| 168 | 174 | } |
| 169 | 175 | } |
| 170 | 176 | // name 属性 |
| ... | ... | @@ -180,7 +186,7 @@ public class OperateLogAspect { |
| 180 | 186 | } |
| 181 | 187 | if (operateLogVO.getType() == null) { |
| 182 | 188 | RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); |
| 183 | - OperateLogTypeEnum operateLogType = convertOperateLogType(requestMethod); | |
| 189 | + OperateTypeEnum operateLogType = convertOperateLogType(requestMethod); | |
| 184 | 190 | operateLogVO.setType(operateLogType != null ? operateLogType.getType() : null); |
| 185 | 191 | } |
| 186 | 192 | // content 和 exts 属性 |
| ... | ... | @@ -275,21 +281,21 @@ public class OperateLogAspect { |
| 275 | 281 | return requestMethods[0]; |
| 276 | 282 | } |
| 277 | 283 | |
| 278 | - private static OperateLogTypeEnum convertOperateLogType(RequestMethod requestMethod) { | |
| 284 | + private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) { | |
| 279 | 285 | if (requestMethod == null) { |
| 280 | 286 | return null; |
| 281 | 287 | } |
| 282 | 288 | switch (requestMethod) { |
| 283 | 289 | case GET: |
| 284 | - return OperateLogTypeEnum.GET; | |
| 290 | + return OperateTypeEnum.GET; | |
| 285 | 291 | case POST: |
| 286 | - return OperateLogTypeEnum.CREATE; | |
| 292 | + return OperateTypeEnum.CREATE; | |
| 287 | 293 | case PUT: |
| 288 | - return OperateLogTypeEnum.UPDATE; | |
| 294 | + return OperateTypeEnum.UPDATE; | |
| 289 | 295 | case DELETE: |
| 290 | - return OperateLogTypeEnum.DELETE; | |
| 296 | + return OperateTypeEnum.DELETE; | |
| 291 | 297 | default: |
| 292 | - return OperateLogTypeEnum.OTHER; | |
| 298 | + return OperateTypeEnum.OTHER; | |
| 293 | 299 | } |
| 294 | 300 | } |
| 295 | 301 | |
| ... | ... | @@ -322,7 +328,7 @@ public class OperateLogAspect { |
| 322 | 328 | // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 |
| 323 | 329 | args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); |
| 324 | 330 | } |
| 325 | - return JSON.toJSONString(argValues); | |
| 331 | + return JSON.toJSONString(args); | |
| 326 | 332 | } |
| 327 | 333 | |
| 328 | 334 | private static String obtainResultData(Object result) { | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/enums/OperateLogTypeEnum.java renamed to src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/enums/OperateTypeEnum.java
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java
| ... | ... | @@ -2,9 +2,12 @@ package cn.iocoder.dashboard.modules.system.controller.logger; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 5 | +import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; | |
| 5 | 6 | import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; |
| 6 | -import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | |
| 7 | +import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | |
| 7 | 8 | import cn.iocoder.dashboard.framework.logger.operatelog.core.util.OperateLogUtils; |
| 9 | +import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExcelVO; | |
| 10 | +import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | |
| 8 | 11 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; |
| 9 | 12 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogRespVO; |
| 10 | 13 | import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; |
| ... | ... | @@ -22,12 +25,15 @@ import org.springframework.web.bind.annotation.RequestMapping; |
| 22 | 25 | import org.springframework.web.bind.annotation.RestController; |
| 23 | 26 | |
| 24 | 27 | import javax.annotation.Resource; |
| 28 | +import javax.servlet.http.HttpServletResponse; | |
| 29 | +import java.io.IOException; | |
| 25 | 30 | import java.util.ArrayList; |
| 26 | 31 | import java.util.Collection; |
| 27 | 32 | import java.util.List; |
| 28 | 33 | import java.util.Map; |
| 29 | 34 | |
| 30 | 35 | import static cn.iocoder.dashboard.common.pojo.CommonResult.success; |
| 36 | +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT; | |
| 31 | 37 | |
| 32 | 38 | @Api(tags = "操作日志 API") |
| 33 | 39 | @RestController |
| ... | ... | @@ -41,7 +47,7 @@ public class SysOperateLogController { |
| 41 | 47 | private SysUserService userService; |
| 42 | 48 | |
| 43 | 49 | @ApiOperation("示例") |
| 44 | - @OperateLog(type = OperateLogTypeEnum.OTHER) | |
| 50 | + @OperateLog(type = OperateTypeEnum.OTHER) | |
| 45 | 51 | @GetMapping("/demo") |
| 46 | 52 | public CommonResult<Boolean> demo() { |
| 47 | 53 | // 这里可以调用业务逻辑 |
| ... | ... | @@ -74,13 +80,22 @@ public class SysOperateLogController { |
| 74 | 80 | return success(new PageResult<>(list, pageResult.getTotal())); |
| 75 | 81 | } |
| 76 | 82 | |
| 77 | -// @Log(title = "操作日志", businessType = BusinessType.EXPORT) | |
| 83 | + @ApiOperation("导出操作日志") | |
| 84 | + @GetMapping("/export") | |
| 85 | + @OperateLog(type = EXPORT) | |
| 78 | 86 | // @PreAuthorize("@ss.hasPermi('system:operate-log:export')") |
| 79 | -// @GetMapping("/export") | |
| 80 | -// public AjaxResult export(SysOperLog operLog) { | |
| 81 | -// List<SysOperLog> list = operLogService.selectOperLogList(operLog); | |
| 82 | -// ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); | |
| 83 | -// return util.exportExcel(list, "操作日志"); | |
| 84 | -// } | |
| 87 | + public void exportOperateLog(HttpServletResponse response, @Validated SysOperateLogExportReqVO reqVO) | |
| 88 | + throws IOException { | |
| 89 | + List<SysOperateLogDO> list = operateLogService.listOperateLogs(reqVO); | |
| 90 | + | |
| 91 | + // 获得拼接需要的数据 | |
| 92 | + Collection<Long> userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); | |
| 93 | + Map<Long, SysUserDO> userMap = userService.getUserMap(userIds); | |
| 94 | + // 拼接数据 | |
| 95 | + List<SysOperateLogExcelVO> excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); | |
| 96 | + // 输出 | |
| 97 | + ExcelUtils.write(response, "操作日志.xls", "数据列表", | |
| 98 | + SysOperateLogExcelVO.class, excelDataList); | |
| 99 | + } | |
| 85 | 100 | |
| 86 | 101 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/SysOperateLogExcelVO.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.logger.vo; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat; | |
| 4 | +import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert; | |
| 5 | +import cn.iocoder.dashboard.modules.system.enums.dict.DictTypeEnum; | |
| 6 | +import com.alibaba.excel.annotation.ExcelProperty; | |
| 7 | +import lombok.Data; | |
| 8 | + | |
| 9 | +import java.util.Date; | |
| 10 | + | |
| 11 | +/** | |
| 12 | + * 操作日志 Excel 导出响应 VO | |
| 13 | + */ | |
| 14 | +@Data | |
| 15 | +public class SysOperateLogExcelVO { | |
| 16 | + | |
| 17 | + @ExcelProperty("日志编号") | |
| 18 | + private Long id; | |
| 19 | + | |
| 20 | + @ExcelProperty("操作模块") | |
| 21 | + private String module; | |
| 22 | + | |
| 23 | + @ExcelProperty("操作名") | |
| 24 | + private String name; | |
| 25 | + | |
| 26 | + @ExcelProperty(value = "操作类型", converter = DictConvert.class) | |
| 27 | + @DictFormat(DictTypeEnum.SYS_OPERATE_TYPE) | |
| 28 | + private String type; | |
| 29 | + | |
| 30 | + @ExcelProperty("操作人") | |
| 31 | + private String userNickname; | |
| 32 | + | |
| 33 | + @ExcelProperty(value = "操作结果") // 成功 or 失败 | |
| 34 | + private String successStr; | |
| 35 | + | |
| 36 | + @ExcelProperty("操作日志") | |
| 37 | + private Date startTime; | |
| 38 | + | |
| 39 | + @ExcelProperty("执行时长") | |
| 40 | + private Integer duration; | |
| 41 | + | |
| 42 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/SysOperateLogExportReqVO.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.logger.vo; | |
| 2 | + | |
| 3 | +import io.swagger.annotations.ApiModel; | |
| 4 | +import io.swagger.annotations.ApiModelProperty; | |
| 5 | +import lombok.Data; | |
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 7 | + | |
| 8 | +import java.util.Date; | |
| 9 | + | |
| 10 | +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 11 | + | |
| 12 | +@ApiModel("操作日志分页列表 Request VO") | |
| 13 | +@Data | |
| 14 | +public class SysOperateLogExportReqVO { | |
| 15 | + | |
| 16 | + @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") | |
| 17 | + private String module; | |
| 18 | + | |
| 19 | + @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") | |
| 20 | + private String userNickname; | |
| 21 | + | |
| 22 | + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") | |
| 23 | + private Integer type; | |
| 24 | + | |
| 25 | + @ApiModelProperty(value = "操作状态", example = "true") | |
| 26 | + private Boolean success; | |
| 27 | + | |
| 28 | + @ApiModelProperty(value = "开始时间", example = "2020-10-24") | |
| 29 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 30 | + private Date beginTime; | |
| 31 | + | |
| 32 | + @ApiModelProperty(value = "结束时间", example = "2020-10-24") | |
| 33 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 34 | + private Date endTime; | |
| 35 | + | |
| 36 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java
| ... | ... | @@ -2,11 +2,20 @@ package cn.iocoder.dashboard.modules.system.convert.logger; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogCreateReqVO; |
| 5 | +import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExcelVO; | |
| 5 | 6 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogRespVO; |
| 6 | 7 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; |
| 8 | +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | |
| 9 | +import cn.iocoder.dashboard.util.collection.MapUtils; | |
| 7 | 10 | import org.mapstruct.Mapper; |
| 8 | 11 | import org.mapstruct.factory.Mappers; |
| 9 | 12 | |
| 13 | +import java.util.List; | |
| 14 | +import java.util.Map; | |
| 15 | +import java.util.stream.Collectors; | |
| 16 | + | |
| 17 | +import static cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; | |
| 18 | + | |
| 10 | 19 | @Mapper |
| 11 | 20 | public interface SysOperateLogConvert { |
| 12 | 21 | |
| ... | ... | @@ -18,4 +27,15 @@ public interface SysOperateLogConvert { |
| 18 | 27 | |
| 19 | 28 | SysOperateLogRespVO convert(SysOperateLogDO bean); |
| 20 | 29 | |
| 30 | + default List<SysOperateLogExcelVO> convertList(List<SysOperateLogDO> list, Map<Long, SysUserDO> userMap) { | |
| 31 | + return list.stream().map(operateLog -> { | |
| 32 | + SysOperateLogExcelVO excelVO = convert02(operateLog); | |
| 33 | + MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); | |
| 34 | + excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); | |
| 35 | + return excelVO; | |
| 36 | + }).collect(Collectors.toList()); | |
| 37 | + } | |
| 38 | + | |
| 39 | + SysOperateLogExcelVO convert02(SysOperateLogDO bean); | |
| 40 | + | |
| 21 | 41 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/logger/SysOperateLogMapper.java
| ... | ... | @@ -4,11 +4,13 @@ import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; |
| 4 | 4 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 5 | 5 | import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; |
| 6 | 6 | import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; |
| 7 | +import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | |
| 7 | 8 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; |
| 8 | 9 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; |
| 9 | 10 | import org.apache.ibatis.annotations.Mapper; |
| 10 | 11 | |
| 11 | 12 | import java.util.Collection; |
| 13 | +import java.util.List; | |
| 12 | 14 | |
| 13 | 15 | @Mapper |
| 14 | 16 | public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { |
| ... | ... | @@ -24,7 +26,23 @@ public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> { |
| 24 | 26 | } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { |
| 25 | 27 | query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); |
| 26 | 28 | } |
| 29 | + query.orderByDesc("id"); // 降序 | |
| 27 | 30 | return selectPage(reqVO, query); |
| 28 | 31 | } |
| 29 | 32 | |
| 33 | + default List<SysOperateLogDO> selectList(SysOperateLogExportReqVO reqVO, Collection<Long> userIds) { | |
| 34 | + QueryWrapperX<SysOperateLogDO> query = new QueryWrapperX<SysOperateLogDO>() | |
| 35 | + .likeIfPresent("module", reqVO.getModule()) | |
| 36 | + .inIfPresent("user_id", userIds) | |
| 37 | + .eqIfPresent("operate_type", reqVO.getType()) | |
| 38 | + .betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime()); | |
| 39 | + if (Boolean.TRUE.equals(reqVO.getSuccess())) { | |
| 40 | + query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); | |
| 41 | + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { | |
| 42 | + query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); | |
| 43 | + } | |
| 44 | + query.orderByDesc("id"); // 降序 | |
| 45 | + return selectList(query); | |
| 46 | + } | |
| 47 | + | |
| 30 | 48 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/logger/SysOperateLogDO.java
| ... | ... | @@ -3,7 +3,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger; |
| 3 | 3 | import cn.iocoder.dashboard.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 5 | 5 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; |
| 6 | -import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateLogTypeEnum; | |
| 6 | +import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; | |
| 7 | 7 | import com.baomidou.mybatisplus.annotation.TableField; |
| 8 | 8 | import com.baomidou.mybatisplus.annotation.TableId; |
| 9 | 9 | import com.baomidou.mybatisplus.annotation.TableName; |
| ... | ... | @@ -19,7 +19,7 @@ import java.util.Map; |
| 19 | 19 | * |
| 20 | 20 | * @author 芋道源码 |
| 21 | 21 | */ |
| 22 | -@TableName("sys_operate_log") | |
| 22 | +@TableName(value = "sys_operate_log", autoResultMap = true) | |
| 23 | 23 | @Data |
| 24 | 24 | @EqualsAndHashCode(callSuper = true) |
| 25 | 25 | public class SysOperateLogDO extends BaseDO { |
| ... | ... | @@ -62,7 +62,7 @@ public class SysOperateLogDO extends BaseDO { |
| 62 | 62 | /** |
| 63 | 63 | * 操作分类 |
| 64 | 64 | * |
| 65 | - * 枚举 {@link OperateLogTypeEnum} | |
| 65 | + * 枚举 {@link OperateTypeEnum} | |
| 66 | 66 | */ |
| 67 | 67 | @TableField("operate_type") |
| 68 | 68 | private Integer type; | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/DictTypeEnum.java
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java
| ... | ... | @@ -2,9 +2,12 @@ package cn.iocoder.dashboard.modules.system.service.logger; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService; |
| 5 | +import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | |
| 5 | 6 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; |
| 6 | 7 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; |
| 7 | 8 | |
| 9 | +import java.util.List; | |
| 10 | + | |
| 8 | 11 | /** |
| 9 | 12 | * 操作日志 Service 接口 |
| 10 | 13 | */ |
| ... | ... | @@ -18,4 +21,12 @@ public interface SysOperateLogService extends OperateLogFrameworkService { |
| 18 | 21 | */ |
| 19 | 22 | PageResult<SysOperateLogDO> pageOperateLog(SysOperateLogPageReqVO reqVO); |
| 20 | 23 | |
| 24 | + /** | |
| 25 | + * 获得操作日志列表 | |
| 26 | + * | |
| 27 | + * @param reqVO 列表条件 | |
| 28 | + * @return 日志列表 | |
| 29 | + */ | |
| 30 | + List<SysOperateLogDO> listOperateLogs(SysOperateLogExportReqVO reqVO); | |
| 31 | + | |
| 21 | 32 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java
| ... | ... | @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | 5 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 6 | 6 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogCreateReqVO; |
| 7 | +import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogExportReqVO; | |
| 7 | 8 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO; |
| 8 | 9 | import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; |
| 9 | 10 | import cn.iocoder.dashboard.modules.system.dal.mysql.dao.logger.SysOperateLogMapper; |
| ... | ... | @@ -18,6 +19,8 @@ import org.springframework.stereotype.Service; |
| 18 | 19 | |
| 19 | 20 | import javax.annotation.Resource; |
| 20 | 21 | import java.util.Collection; |
| 22 | +import java.util.Collections; | |
| 23 | +import java.util.List; | |
| 21 | 24 | |
| 22 | 25 | import static cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; |
| 23 | 26 | import static cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; |
| ... | ... | @@ -61,4 +64,18 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { |
| 61 | 64 | return operateLogMapper.selectPage(reqVO, userIds); |
| 62 | 65 | } |
| 63 | 66 | |
| 67 | + @Override | |
| 68 | + public List<SysOperateLogDO> listOperateLogs(SysOperateLogExportReqVO reqVO) { | |
| 69 | + // 处理基于用户昵称的查询 | |
| 70 | + Collection<Long> userIds = null; | |
| 71 | + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { | |
| 72 | + userIds = convertSet(userService.listUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); | |
| 73 | + if (CollUtil.isEmpty(userIds)) { | |
| 74 | + return Collections.emptyList(); | |
| 75 | + } | |
| 76 | + } | |
| 77 | + // 查询列表 | |
| 78 | + return operateLogMapper.selectList(reqVO, userIds); | |
| 79 | + } | |
| 80 | + | |
| 64 | 81 | } | ... | ... |