Commit e330bf0f39d41124000fd1b43d701d88fe1e35c4

Authored by YunaiV
1 parent 1768d27e

完成操作日志的迁移

ruoyi-ui/src/api/system/operatelog.js
... ... @@ -14,6 +14,7 @@ export function exportOperateLog(query) {
14 14 return request({
15 15 url: '/system/operate-log/export',
16 16 method: 'get',
17   - params: query
  17 + params: query,
  18 + responseType: 'blob'
18 19 })
19 20 }
... ...
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
... ... @@ -11,7 +11,7 @@ import lombok.Getter;
11 11 */
12 12 @Getter
13 13 @AllArgsConstructor
14   -public enum OperateLogTypeEnum {
  14 +public enum OperateTypeEnum {
15 15  
16 16 /**
17 17 * 查询
... ...
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&lt;SysOperateLogDO&gt; {
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
... ... @@ -12,6 +12,7 @@ public enum DictTypeEnum {
12 12  
13 13 SYS_USER_SEX("sys_user_sex"), // 用户性别
14 14 SYS_COMMON_STATUS("sys_common_status"), // 系统状态
  15 + SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型
15 16 ;
16 17  
17 18  
... ...
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 }
... ...