فهرست منبع

fix(gen):
代码生成时Service类名报错
通过本地缓存获取用户信息时为空

style(controller): 查询权限仅在详情查询时存在,列表查询无权限

feat(log): 新增系统日志记录

18339543638 2 سال پیش
والد
کامیت
5aa4a4240b
33فایلهای تغییر یافته به همراه428 افزوده شده و 414 حذف شده
  1. 2 2
      tr-framework/src/main/java/cn/tr/core/constant/MybatisConstant.java
  2. 5 1
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/impl/GenBasicServiceImpl.java
  3. 1 2
      tr-modules/tr-module-gen/src/main/resources/backend/Controller.java.btl
  4. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictController.java
  5. 27 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/config/LoginConfig.java
  6. 67 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/controller/SysLogController.java
  7. 14 13
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogDTO.java
  8. 7 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogQueryDTO.java
  9. 15 15
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/po/SysLogPO.java
  10. 5 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/repository/SysLogRepository.java
  11. 54 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/service/ISysLogService.java
  12. 92 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/service/impl/SysLogServiceImpl.java
  13. 31 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/SysLogMapper.java
  14. 0 31
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/SysOperLogMapper.java
  15. 4 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/OAuth2ServerController.java
  16. 0 30
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/config/OperLogConfig.java
  17. 0 57
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/controller/SysOperLogController.java
  18. 0 54
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/service/ISysOperLogService.java
  19. 0 90
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/service/impl/SysOperLogServiceImpl.java
  20. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantController.java
  21. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java
  22. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysMenuController.java
  23. 0 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysOrgController.java
  24. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java
  25. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPositionController.java
  26. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java
  27. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysUserController.java
  28. 2 2
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/annotation/OperateLog.java
  29. 6 4
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/bo/OperateLogBO.java
  30. 57 29
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/config/OperateLogAspect.java
  31. 30 0
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/enums/LoginType.java
  32. 0 54
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/enums/OperateTypeEnum.java
  33. 1 0
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/config/LoginUserStrategyConfig.java

+ 2 - 2
tr-framework/src/main/java/cn/tr/core/constant/MybatisConstant.java

@@ -19,11 +19,11 @@ public class MybatisConstant {
     /**
      * 创建人字段名称
      */
-    public static final String CREATE_BY = "create_by";
+    public static final String CREATE_BY = "createBy";
     /**
      * 更新人字段名称
      */
-    public static final String UPDATE_BY = "update_by";
+    public static final String UPDATE_BY = "updateBy";
 
     /**
      * 租户id字段名称

+ 5 - 1
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/impl/GenBasicServiceImpl.java

@@ -464,7 +464,11 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
                 Template templateBackend = groupTemplateBackEnd.getTemplate(fileTemplateName);
                 templateBackend.binding(bindingJsonObject);
                 String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl");
-                genBasicCodeBackendResult.setCodeFileName(genBasic.getClassName() + resultName);
+                if(StrUtil.equals("Service.java.btl",fileTemplateName)){
+                    genBasicCodeBackendResult.setCodeFileName("I"+genBasic.getClassName() + resultName);
+                }else{
+                    genBasicCodeBackendResult.setCodeFileName(genBasic.getClassName() + resultName);
+                }
                 genBasicCodeBackendResult.setCodeFileWithPathName(genBackendBasicPath + fileTemplatePath + File.separator + genBasic.getClassName() + resultName);
                 genBasicCodeBackendResult.setCodeFileContent(templateBackend.render());
                 genBasicCodeBackendResultList.add(genBasicCodeBackendResult);

+ 1 - 2
tr-modules/tr-module-gen/src/main/resources/backend/Controller.java.btl

@@ -35,9 +35,8 @@ public class ${className}Controller extends BaseController{
     private final I${className}Service ${classNameFirstLower}Service;
 
     @ApiOperationSupport(author = "${authorName}",order = 1)
-    @ApiOperation(value="根据条件查询${functionName}",notes = "权限: ${backendModuleName}:${busName}:query")
+    @ApiOperation(value="根据条件查询${functionName}",notes = "权限: ")
     @PostMapping("/query/page")
-    @SaCheckPermission("${backendModuleName}:${busName}:query")
     public CommonResult<List<${className}DTO>> selectList(@RequestBody ${className}QueryDTO query) {
         startPage();
         return CommonResult.success(${classNameFirstLower}Service.select${className}List(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictController.java

@@ -34,8 +34,7 @@ public class SysDictController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
-    @SaCheckPermission("sys:dict:query")
-    @ApiOperation(value = "根据条件查询字典",notes = "权限: sys:dict:query")
+    @ApiOperation(value = "根据条件查询字典",notes = "权限: 无")
     public TableDataInfo<SysDictDTO> selectList(@RequestBody SysDictQueryDTO query){
         startPage();
         return getDataTable(dictService.selectDictDataList(query));

+ 27 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/config/LoginConfig.java

@@ -0,0 +1,27 @@
+package cn.tr.module.sys.log.config;
+
+import cn.tr.module.sys.log.service.ISysLogService;
+import cn.tr.module.sys.mapper.SysLogMapper;
+import cn.tr.plugin.operatelog.strategy.OperateStrategy;
+import lombok.AllArgsConstructor;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * @ClassName : LoginConfig
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月18日
+ */
+@Configuration
+@AllArgsConstructor
+public class LoginConfig {
+    private final ISysLogService logService;
+    @PostConstruct
+    public void init(){
+        OperateStrategy.tr.logSaveConsumer=log->{
+            logService.insertSysLog(SysLogMapper.INSTANCE.convertDto(log));
+        };
+    }
+}

+ 67 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/controller/SysLogController.java

@@ -0,0 +1,67 @@
+package cn.tr.module.sys.log.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.sys.log.dto.SysLogDTO;
+import cn.tr.module.sys.log.service.ISysLogService;
+import cn.tr.module.sys.log.dto.SysLogQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+/**
+ * 系统日志控制器
+ *
+ * @author lf
+ * @date  2023/04/18 14:16
+ */
+@Api(tags = "系统日志")
+@RestController
+@RequestMapping("/sys/log")
+@AllArgsConstructor
+public class SysLogController extends BaseController{
+
+    private final ISysLogService sysLogService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询系统日志",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public CommonResult<List<SysLogDTO>> selectList(@RequestBody SysLogQueryDTO query) {
+        startPage();
+        return CommonResult.success(sysLogService.selectSysLogList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询系统日志",notes = "权限: sys:log:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("sys:log:query")
+    public CommonResult<SysLogDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(sysLogService.selectSysLogById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加系统日志",notes = "权限: sys:log:add")
+    @PostMapping("/add")
+    @SaCheckPermission("sys:log:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysLogDTO source) {
+        return CommonResult.success(sysLogService.insertSysLog(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑系统日志",notes = "权限: sys:log:edit")
+    @PostMapping("/edit")
+    @SaCheckPermission("sys:log:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysLogDTO source) {
+        return CommonResult.success(sysLogService.updateSysLogById(source));
+    }
+}

+ 14 - 13
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/dto/SysOperLogDTO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogDTO.java

@@ -1,8 +1,9 @@
-package cn.tr.module.sys.operLog.dto;
+package cn.tr.module.sys.log.dto;
 
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
+import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -10,16 +11,16 @@ import lombok.Data;
 import javax.validation.constraints.NotNull;
 import java.util.*;
 /**
- * 操作日志传输对象
+ * 系统日志传输对象
  *
  * @author lf
- * @date  2023/04/17 16:28
+ * @date  2023/04/18 14:16
  **/
 @Data
-@ApiModel("操作日志传输对象")
+@ApiModel("系统日志传输对象")
 @EqualsAndHashCode(callSuper = true)
 @ToString
-public class SysOperLogDTO extends BaseDTO  {
+public class SysLogDTO extends BaseDTO  {
     private static final long serialVersionUID = 1L;
     @ApiModelProperty(value = "id", position = 1)
     @NotNull(message = "主键不能为空",groups = {Update.class})
@@ -34,18 +35,18 @@ public class SysOperLogDTO extends BaseDTO  {
     private String javaClass;
     @ApiModelProperty(value = "方法名称", position = 6)
     private String javaMethod;
-    @ApiModelProperty(value = "操作时间", position = 7)
+    @ApiModelProperty(value = "操作日志类型", position = 7)
+    private String type;
+    @ApiModelProperty(value = "操作时间", position = 8)
     private Date opTime;
-    @ApiModelProperty(value = "执行时长", position = 8)
+    @ApiModelProperty(value = "执行时长", position = 9)
     private Integer duration;
-    @ApiModelProperty(value = "操作用户", position = 9)
+    @ApiModelProperty(value = "操作用户", position = 10)
     private String opUser;
-    @ApiModelProperty(value = "请求参数", position = 10)
+    @ApiModelProperty(value = "请求参数", position = 11)
     private String requestArgs;
-    @ApiModelProperty(value = "响应类型", position = 11)
-    private Boolean responseType;
-    @ApiModelProperty(value = "浏览器UserAgent", position = 12)
+    @ApiModelProperty(value = "浏览器UserAgent", position = 13)
     private String userAgent;
-    @ApiModelProperty(value = "响应结果", position = 13)
+    @ApiModelProperty(value = "响应结果", position = 14)
     private String resultJson;
 }

+ 7 - 8
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/dto/SysOperLogQueryDTO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogQueryDTO.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.operLog.dto;
+package cn.tr.module.sys.log.dto;
 
 import lombok.ToString;
 import io.swagger.annotations.ApiModel;
@@ -7,20 +7,19 @@ import lombok.Data;
 import cn.tr.plugin.mybatis.pojo.BetweenQuery;
 import java.util.*;
 /**
- * 操作日志查询参数
+ * 系统日志查询参数
  *
  * @author lf
- * @date  2023/04/17 16:17
+ * @date  2023/04/18 14:16
  **/
 @Data
-@ApiModel("操作日志查询参数")
+@ApiModel("系统日志查询参数")
 @ToString
-public class SysOperLogQueryDTO  {
+public class SysLogQueryDTO  {
     private static final long serialVersionUID = 1L;
     @ApiModelProperty(value = "操作名称", position = 2)
     private String opName;
 
-    @ApiModelProperty(value = "响应类型", position = 11)
-    private Boolean responseType;
-
+    @ApiModelProperty(value = "操作日志类型", position = 7)
+    private String type;
 }

+ 15 - 15
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/po/SysOperLogPO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/po/SysLogPO.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.operLog.po;
+package cn.tr.module.sys.log.po;
 
 import cn.tr.plugin.mybatis.pojo.TenantPO;   
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -9,16 +9,16 @@ import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import java.util.*;
 /**
- * 操作日志实体
+ * 系统日志实体
  *
  * @author lf
- * @date  2023/04/17 16:17
+ * @date  2023/04/18 14:16
  **/
 @Data
-@TableName("sys_oper_log")
+@TableName("sys_log")
 @EqualsAndHashCode(callSuper = true)
 @ToString
-public class SysOperLogPO extends TenantPO {
+public class SysLogPO extends TenantPO {
 
     /** id */
     @TableId
@@ -45,32 +45,32 @@ public class SysOperLogPO extends TenantPO {
     @ApiModelProperty(value = "方法名称", position = 6)
     private String javaMethod;
 
+    /** 操作日志类型 */
+    @ApiModelProperty(value = "操作日志类型", position = 7)
+    private String type;
+
     /** 操作时间 */
-    @ApiModelProperty(value = "操作时间", position = 7)
+    @ApiModelProperty(value = "操作时间", position = 8)
     private Date opTime;
 
     /** 执行时长 */
-    @ApiModelProperty(value = "执行时长", position = 8)
+    @ApiModelProperty(value = "执行时长", position = 9)
     private Integer duration;
 
     /** 操作用户 */
-    @ApiModelProperty(value = "操作用户", position = 9)
+    @ApiModelProperty(value = "操作用户", position = 10)
     private String opUser;
 
     /** 请求参数 */
-    @ApiModelProperty(value = "请求参数", position = 10)
+    @ApiModelProperty(value = "请求参数", position = 11)
     private String requestArgs;
 
-    /** 响应类型 */
-    @ApiModelProperty(value = "响应类型", position = 11)
-    private Boolean responseType;
-
     /** 浏览器UserAgent */
-    @ApiModelProperty(value = "浏览器UserAgent", position = 12)
+    @ApiModelProperty(value = "浏览器UserAgent", position = 13)
     private String userAgent;
 
     /** 响应结果 */
-    @ApiModelProperty(value = "响应结果", position = 13)
+    @ApiModelProperty(value = "响应结果", position = 14)
     private String resultJson;
 
 }

+ 5 - 5
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/repository/SysOperLogRepository.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/repository/SysLogRepository.java

@@ -1,18 +1,18 @@
-package cn.tr.module.sys.operLog.repository;
+package cn.tr.module.sys.log.repository;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 import java.util.*;
-import cn.tr.module.sys.operLog.po.SysOperLogPO;
+import cn.tr.module.sys.log.po.SysLogPO;
 /**
- * 操作日志Mapper接口
+ * 系统日志Mapper接口
  *
  * @author lf
- * @date  2023/04/17 16:17
+ * @date  2023/04/18 14:16
  **/
 @Repository
 @Mapper
-public interface SysOperLogRepository extends BaseMapper<SysOperLogPO> {
+public interface SysLogRepository extends BaseMapper<SysLogPO> {
 }

+ 54 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/service/ISysLogService.java

@@ -0,0 +1,54 @@
+package cn.tr.module.sys.log.service;
+
+import cn.tr.module.sys.log.dto.SysLogDTO;
+import cn.tr.module.sys.log.dto.SysLogQueryDTO;
+import java.util.*;
+
+/**
+ * 系统日志Service接口
+ *
+ * @author lf
+ * @date  2023/04/18 14:16
+ **/
+public interface ISysLogService{
+
+    /**
+     * 根据条件查询系统日志
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/04/18 14:16
+     */
+    List<SysLogDTO> selectSysLogList(SysLogQueryDTO query);
+
+    /**
+     * 根据id查询系统日志
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/04/18 14:16
+     */
+    SysLogDTO selectSysLogById(String id);
+
+    /**
+     * 编辑系统日志
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/04/18 14:16
+     */
+    boolean updateSysLogById(SysLogDTO source);
+
+    /**
+     * 新增系统日志
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/04/18 14:16
+     */
+    boolean insertSysLog(SysLogDTO source);
+
+    /**
+     * 删除系统日志详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/04/18 14:16
+     */
+    int removeSysLogByIds(Collection<String> ids);
+}

+ 92 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/service/impl/SysLogServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.tr.module.sys.log.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.*;
+import cn.tr.plugin.mybatis.pojo.BetweenQuery;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.sys.log.repository.SysLogRepository;
+import cn.tr.module.sys.log.po.SysLogPO;
+import cn.tr.module.sys.log.dto.SysLogDTO;
+import cn.tr.module.sys.log.dto.SysLogQueryDTO;
+import java.util.*;
+import cn.tr.module.sys.log.service.ISysLogService;
+import cn.tr.module.sys.mapper.SysLogMapper;
+/**
+ * 系统日志Service接口实现类
+ *
+ * @author lf
+ * @date  2023/04/18 14:16
+ **/
+@Service
+public class SysLogServiceImpl implements ISysLogService {
+    @Autowired
+    private SysLogRepository baseRepository;
+
+
+    /**
+    * 根据条件查询系统日志
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2023/04/18 14:16
+    */
+    @Override
+    public List<SysLogDTO> selectSysLogList(SysLogQueryDTO query){
+        return SysLogMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<SysLogPO>()
+                        .like(Objects.nonNull(query.getOpName()),SysLogPO::getOpName,
+query.getOpName())
+                        .eq(Objects.nonNull(query.getType()),SysLogPO::getType,query.getType())
+                )
+        );
+    };
+
+    /**
+    * 根据id查询系统日志
+    * @param    id 主键id
+    * @author   lf
+    * @date      2023/04/18 14:16
+    */
+    @Override
+    public SysLogDTO selectSysLogById(String id){
+        return SysLogMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑系统日志
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2023/04/18 14:16
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateSysLogById(SysLogDTO source){
+            return baseRepository.updateById(SysLogMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增系统日志
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2023/04/18 14:16
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertSysLog(SysLogDTO source){
+        return baseRepository.insert(SysLogMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除系统日志详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2023/04/18 14:16
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeSysLogByIds(Collection<String> ids){
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 31 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/SysLogMapper.java

@@ -0,0 +1,31 @@
+package cn.tr.module.sys.mapper;
+
+import cn.tr.module.sys.log.po.SysLogPO;
+import cn.tr.module.sys.log.dto.SysLogDTO;
+import cn.tr.plugin.operatelog.bo.OperateLogBO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 系统日志映射工具
+*
+* @author lf
+* @date  2023/04/18 14:16
+**/
+@Mapper
+public interface SysLogMapper {
+    SysLogMapper INSTANCE = Mappers.getMapper(SysLogMapper.class);
+
+    SysLogPO convertPO(SysLogDTO source);
+
+    SysLogDTO convertDto(SysLogPO source);
+
+    SysLogDTO convertDto(OperateLogBO source);
+
+    List<SysLogDTO> convertDtoList(List<SysLogPO> source);
+
+    List<SysLogPO> convertPOList(List<SysLogDTO> source);
+
+}

+ 0 - 31
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/SysOperLogMapper.java

@@ -1,31 +0,0 @@
-package cn.tr.module.sys.mapper;
-
-import cn.tr.module.sys.operLog.po.SysOperLogPO;
-import cn.tr.module.sys.operLog.dto.SysOperLogDTO;
-import cn.tr.plugin.operatelog.bo.OperateLogBO;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
-
-import java.util.List;
-
-/**
-* 操作日志映射工具
-*
-* @author lf
-* @date  2023/04/17 16:17
-**/
-@Mapper
-public interface SysOperLogMapper {
-    SysOperLogMapper INSTANCE = Mappers.getMapper(SysOperLogMapper.class);
-
-    SysOperLogPO convertPO(SysOperLogDTO source);
-
-    SysOperLogDTO convertDto(SysOperLogPO source);
-
-    SysOperLogDTO convertDto(OperateLogBO source);
-
-    List<SysOperLogDTO> convertDtoList(List<SysOperLogPO> source);
-
-    List<SysOperLogPO> convertPOList(List<SysOperLogDTO> source);
-
-}

+ 4 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/OAuth2ServerController.java

@@ -19,6 +19,8 @@ import cn.tr.module.sys.oauth2.psw.operator.AbstractOAuth2PswUserOperator;
 import cn.tr.module.sys.oauth2.dto.OAuth2PswReqDTO;
 import cn.tr.module.sys.oauth2.dto.OAuth2RefreshDTO;
 import cn.tr.module.sys.oauth2.psw.operator.OAuth2PswUserOperatorManager;
+import cn.tr.plugin.operatelog.annotation.OperateLog;
+import cn.tr.plugin.operatelog.enums.LoginType;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -43,6 +45,7 @@ public class OAuth2ServerController {
     @ApiOperation("获取token")
     @ApiOperationSupport(author = "lf")
     @GetMapping("/token")
+    @OperateLog(loginType = LoginType.login,logArgs = false,logResultData = false)
     @SaIgnore
     public CommonResult<Object> request(@Validated OAuth2PswReqDTO source) {
         SaRequest req = SaHolder.getRequest();
@@ -98,6 +101,7 @@ public class OAuth2ServerController {
     @ApiOperationSupport(author = "lf")
     @ApiOperation("退出登录")
     @PostMapping("/logout")
+    @OperateLog(loginType = LoginType.logout,logResultData = false,logArgs = false)
     public CommonResult<Boolean> logout(){
         SaTokenUtils.logout();
         return CommonResult.success(true);

+ 0 - 30
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/config/OperLogConfig.java

@@ -1,30 +0,0 @@
-package cn.tr.module.sys.operLog.config;
-
-import cn.tr.module.sys.mapper.SysOperLogMapper;
-import cn.tr.module.sys.operLog.service.ISysOperLogService;
-import cn.tr.module.sys.user.service.ISysOrgService;
-import cn.tr.plugin.operatelog.strategy.OperateStrategy;
-import lombok.AllArgsConstructor;
-import org.springframework.context.annotation.Configuration;
-
-import javax.annotation.PostConstruct;
-
-/**
- * @ClassName : OperLogConfig
- * @Description :
- * @Author : LF
- * @Date: 2023年04月17日
- */
-@Configuration
-@AllArgsConstructor
-public class OperLogConfig {
-    private final ISysOperLogService sysOperLogService;
-
-    @PostConstruct
-    public void init() {
-        OperateStrategy.tr.logSaveConsumer=operLog->{
-            sysOperLogService.insertSysOperLog(SysOperLogMapper.INSTANCE.convertDto(operLog));
-        };;
-
-    }
-}

+ 0 - 57
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/controller/SysOperLogController.java

@@ -1,57 +0,0 @@
-package cn.tr.module.sys.operLog.controller;
-
-import cn.tr.module.sys.operLog.service.ISysOperLogService;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.tr.core.pojo.CommonResult;
-import lombok.AllArgsConstructor;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-import cn.tr.module.sys.operLog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operLog.dto.SysOperLogQueryDTO;
-import java.util.*;
-import cn.tr.plugin.mybatis.base.BaseController;
-import org.springframework.web.bind.annotation.*;
-/**
- * 操作日志
- *
- * @author lf
- * @date  2023/04/17 16:17
- */
-@Api(tags = "操作日志")
-@RestController
-@RequestMapping("/sys/operLog")
-@AllArgsConstructor
-public class SysOperLogController extends BaseController{
-
-    private final ISysOperLogService sysOperLogService;
-
-    @ApiOperationSupport(author = "lf",order = 1)
-    @ApiOperation(value="根据条件查询操作日志",notes = "权限: sys:operLog:query")
-    @PostMapping("/query/page")
-    @SaCheckPermission("sys:operLog:query")
-    public CommonResult<List<SysOperLogDTO>> selectList(@RequestBody SysOperLogQueryDTO query) {
-        startPage();
-        return CommonResult.success(sysOperLogService.selectSysOperLogList(query));
-    }
-
-    @ApiOperationSupport(author = "lf",order = 2)
-    @ApiOperation(value = "根据id查询操作日志",notes = "权限: sys:operLog:query")
-    @GetMapping("/detail/{id}")
-    @SaCheckPermission("sys:operLog:query")
-    public CommonResult<SysOperLogDTO> findById(@PathVariable("id") String id){
-        return CommonResult.success(sysOperLogService.selectSysOperLogById(id));
-    }
-
-    @ApiOperationSupport(author = "lf",order = 5)
-    @ApiOperation(value="删除操作日志",notes = "权限: sys:operLog:remove")
-    @PostMapping("/removeByIds")
-    @SaCheckPermission("sys:operLog:remove")
-    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
-        return CommonResult.success(sysOperLogService.removeSysOperLogByIds(ids));
-    }
-}

+ 0 - 54
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/service/ISysOperLogService.java

@@ -1,54 +0,0 @@
-package cn.tr.module.sys.operLog.service;
-
-import cn.tr.module.sys.operLog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operLog.dto.SysOperLogQueryDTO;
-import java.util.*;
-
-/**
- * 操作日志Service接口
- *
- * @author lf
- * @date  2023/04/17 16:17
- **/
-public interface ISysOperLogService{
-
-    /**
-     * 根据条件查询操作日志
-     * @param    query 查询参数
-     * @author   lf
-     * @date      2023/04/17 16:17
-     */
-    List<SysOperLogDTO> selectSysOperLogList(SysOperLogQueryDTO query);
-
-    /**
-     * 根据id查询操作日志
-     * @param    id 主键id
-     * @author   lf
-     * @date      2023/04/17 16:17
-     */
-    SysOperLogDTO selectSysOperLogById(String id);
-
-    /**
-     * 编辑操作日志
-     * @param   source 编辑实体类
-     * @author  lf
-     * @date     2023/04/17 16:17
-     */
-    boolean updateSysOperLogById(SysOperLogDTO source);
-
-    /**
-     * 新增操作日志
-     * @param   source 新增实体类
-     * @author lf
-     * @date  2023/04/17 16:17
-     */
-    boolean insertSysOperLog(SysOperLogDTO source);
-
-    /**
-     * 删除操作日志详情
-     * @param  ids 删除主键集合
-     * @author lf
-     * @date    2023/04/17 16:17
-     */
-    int removeSysOperLogByIds(Collection<String> ids);
-}

+ 0 - 90
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operLog/service/impl/SysOperLogServiceImpl.java

@@ -1,90 +0,0 @@
-package cn.tr.module.sys.operLog.service.impl;
-
-import cn.tr.module.sys.operLog.service.ISysOperLogService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import cn.tr.module.sys.operLog.repository.SysOperLogRepository;
-import cn.tr.module.sys.operLog.po.SysOperLogPO;
-import cn.tr.module.sys.operLog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operLog.dto.SysOperLogQueryDTO;
-import java.util.*;
-import cn.tr.module.sys.mapper.SysOperLogMapper;
-/**
- * 操作日志Service接口实现类
- *
- * @author lf
- * @date  2023/04/17 16:17
- **/
-@Service
-public class SysOperLogServiceImpl implements ISysOperLogService {
-    @Autowired
-    private SysOperLogRepository baseRepository;
-
-
-    /**
-     * 根据条件查询操作日志
-     * @param    query 查询参数
-     * @author   lf
-     * @date      2023/04/17 16:17
-     */
-    @Override
-    public List<SysOperLogDTO> selectSysOperLogList(SysOperLogQueryDTO query){
-        return SysOperLogMapper.INSTANCE.convertDtoList(
-                baseRepository.selectList(new LambdaQueryWrapper<SysOperLogPO>()
-                        .like(Objects.nonNull(query.getOpName()),SysOperLogPO::getOpName,
-                                query.getOpName())
-                        .eq(Objects.nonNull(query.getResponseType()),SysOperLogPO::getResponseType,
-                                query.getResponseType())
-                )
-        );
-    };
-
-    /**
-     * 根据id查询操作日志
-     * @param    id 主键id
-     * @author   lf
-     * @date      2023/04/17 16:17
-     */
-    @Override
-    public SysOperLogDTO selectSysOperLogById(String id){
-        return SysOperLogMapper.INSTANCE.convertDto(baseRepository.selectById(id));
-    };
-
-    /**
-     * 编辑操作日志
-     * @param   source 编辑实体类
-     * @author  lf
-     * @date     2023/04/17 16:17
-     */
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public boolean updateSysOperLogById(SysOperLogDTO source){
-        return baseRepository.updateById(SysOperLogMapper.INSTANCE.convertPO(source))!=0;
-    };
-
-    /**
-     * 新增操作日志
-     * @param   source 新增实体类
-     * @author lf
-     * @date  2023/04/17 16:17
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean insertSysOperLog(SysOperLogDTO source){
-        return baseRepository.insert(SysOperLogMapper.INSTANCE.convertPO(source))!=0;
-    };
-
-    /**
-     * 删除操作日志详情
-     * @param  ids 删除主键集合
-     * @author lf
-     * @date    2023/04/17 16:17
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int removeSysOperLogByIds(Collection<String> ids){
-        return baseRepository.deleteBatchIds(ids);
-    };
-}

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantController.java

@@ -36,9 +36,8 @@ public class SysTenantController extends BaseController{
     private final ISysTenantService sysTenantService;
 
     @ApiOperationSupport(author = "lf",order = 1)
-    @ApiOperation(value="根据条件查询租户列表",notes = "权限: sys:tenant:query")
+    @ApiOperation(value="根据条件查询租户列表",notes = "权限: ")
     @PostMapping("/query/page")
-    @SaCheckPermission("sys:tenant:query")
     public CommonResult<List<SysTenantCommonDTO>> selectList(@RequestBody SysTenantQueryDTO query) {
         startPage();
         return CommonResult.success(sysTenantService.selectSysTenantList(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java

@@ -35,9 +35,8 @@ public class SysTenantPackageController extends BaseController{
     private final ISysTenantPackageService sysTenantPackageService;
 
     @ApiOperationSupport(author = "lf",order = 1)
-    @ApiOperation(value="根据条件查询租户套餐",notes = "权限: sys:tenantPackage:query")
+    @ApiOperation(value="根据条件查询租户套餐",notes = "权限:")
     @PostMapping("/query/page")
-    @SaCheckPermission("sys:tenantPackage:query")
     public CommonResult<List<SysTenantPackageDTO>> selectList(@RequestBody SysTenantPackageQueryDTO query) {
         startPage();
         return CommonResult.success(sysTenantPackageService.selectSysTenantPackageList(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysMenuController.java

@@ -42,8 +42,7 @@ public class SysMenuController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "根据条件查询菜单",notes = "权限: sys:menu:query")
-    @SaCheckPermission("sys:menu:query")
+    @ApiOperation(value = "根据条件查询菜单",notes = "权限: 无")
     public TableDataInfo<SysMenuDTO> selectList(@RequestBody SysMenuQueryDTO query){
         startPage();
         return getDataTable(menuService.selectSysMenuList(query));

+ 0 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysOrgController.java

@@ -43,7 +43,6 @@ public class SysOrgController extends BaseController {
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "根据条件查询组织",notes = "权限: sys:org:query")
-    @SaCheckPermission("sys:org:query")
     public TableDataInfo<SysOrgDTO> selectList(@RequestBody SysOrgQueryDTO query){
         startPage();
         return getDataTable(orgService.selectSysOrgList(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java

@@ -55,8 +55,7 @@ public class SysPortalController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "根据条件查询门户",notes = "权限: sys:portal:query")
-    @SaCheckPermission("sys:portal:query")
+    @ApiOperation(value = "根据条件查询门户",notes = "权限: 无")
     public TableDataInfo<SysPortalDTO> selectList(@RequestBody SysPortalQueryDTO query){
         startPage();
         return getDataTable(portalService.selectSysPortalList(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPositionController.java

@@ -34,8 +34,7 @@ public class SysPositionController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf",order = 1)
-    @ApiOperation(value = "根据条件查询岗位",notes = "权限: sys:pos:query")
-    @SaCheckPermission("sys:pos:query")
+    @ApiOperation(value = "根据条件查询岗位",notes = "权限:无")
     public TableDataInfo<SysPositionDTO> selectList(@RequestBody SysPositionQueryDTO query){
         startPage();
         return getDataTable(PositionService.selectSysPositionList(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java

@@ -48,8 +48,7 @@ public class SysRoleController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "根据条件查询角色",notes = "权限: sys:role:query")
-    @SaCheckPermission("sys:role:query")
+    @ApiOperation(value = "根据条件查询角色",notes = "权限: 无")
     public TableDataInfo<SysRoleDTO> selectList(@RequestBody SysRoleQueryDTO query){
         startPage();
         return getDataTable(roleService.selectSysRoleList(query));

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysUserController.java

@@ -35,8 +35,7 @@ public class SysUserController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "根据条件查询用户",notes = "权限: sys:user:query")
-    @SaCheckPermission("sys:user:query")
+    @ApiOperation(value = "根据条件查询用户",notes = "权限: 无")
     public TableDataInfo<SysUserDTO> selectList(@RequestBody SysUserQueryDTO query){
         startPage();
         return getDataTable(userService.selectSysUserList(query));

+ 2 - 2
tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/annotation/OperateLog.java

@@ -1,7 +1,6 @@
 package cn.tr.plugin.operatelog.annotation;
 
-import cn.tr.plugin.operatelog.enums.OperateTypeEnum;
-import io.swagger.annotations.Api;
+import cn.tr.plugin.operatelog.enums.LoginType;
 import io.swagger.annotations.ApiOperation;
 
 import java.lang.annotation.ElementType;
@@ -27,6 +26,7 @@ public @interface OperateLog {
      */
     String name() default "";
 
+    LoginType loginType() default  LoginType.oper;
 
     // ========== 开关字段 ==========
 

+ 6 - 4
tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/bo/OperateLogBO.java

@@ -49,10 +49,6 @@ public class OperateLogBO {
      * 请求参数
      */
     private String requestArgs;
-    /**
-     * 响应类型
-     */
-    private Boolean responseType;
     /**
      * 浏览器UserAgent
      */
@@ -61,4 +57,10 @@ public class OperateLogBO {
      * 响应结果
      */
     private String resultJson;
+
+    /**
+     * 日志类型
+     * {@link cn.tr.plugin.operatelog.enums.LoginType}
+     */
+    private String type;
 }

+ 57 - 29
tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/config/OperateLogAspect.java

@@ -3,6 +3,7 @@ package cn.tr.plugin.operatelog.config;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.strategy.ExceptionStrategy;
@@ -12,6 +13,7 @@ import cn.tr.core.utils.JsonUtils;
 import cn.tr.core.utils.ServletUtils;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import cn.tr.plugin.operatelog.bo.OperateLogBO;
+import cn.tr.plugin.operatelog.enums.LoginType;
 import cn.tr.plugin.operatelog.strategy.OperateStrategy;
 import cn.tr.plugin.web.context.RequestContextHolder;
 import io.swagger.annotations.ApiOperation;
@@ -20,14 +22,22 @@ import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
 import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.security.auth.login.LoginContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
+import java.lang.reflect.Method;
 import java.util.*;
 import java.util.function.Predicate;
 import java.util.stream.IntStream;
@@ -45,22 +55,24 @@ public class OperateLogAspect {
     // 兼容处理,只添加 @OperateLog 注解的情况
     public Object around(ProceedingJoinPoint joinPoint,
                          OperateLog operateLog) throws Throwable {
-        return around0(joinPoint, operateLog, null);
+        return around0(joinPoint, operateLog);
     }
 
     private Object around0(ProceedingJoinPoint joinPoint,
-                           OperateLog operateLog,
-                           ApiOperation apiOperation) throws Throwable {
+                           OperateLog operateLog) throws Throwable {
         // 记录开始时间
         Date startTime = new Date();
         try {
             // 执行原有方法
             Object result = joinPoint.proceed();
             // 记录正常执行时的操作日志
-            this.log(joinPoint, operateLog, apiOperation, startTime, result, null);
+            this.log(joinPoint, operateLog,startTime, result, null);
             return result;
         } catch (Throwable exception) {
-            this.log(joinPoint, operateLog, apiOperation, startTime, null, exception);
+            if(ObjectUtil.equals(operateLog.loginType(),LoginType.oper)){
+                //登录失败和登出失败不做记录
+                this.log(joinPoint, operateLog, startTime, null, exception);
+            }
             throw exception;
         }
     }
@@ -68,24 +80,24 @@ public class OperateLogAspect {
 
     private void log(ProceedingJoinPoint joinPoint,
                      OperateLog operateLog,
-                     ApiOperation apiOperation,
                      Date startTime, Object result, Throwable exception) {
         try {
             // 判断不记录的情况
-            if (!isLogEnable(joinPoint, operateLog)) {
+            if (!isLogEnable(operateLog)) {
                 return;
             }
             // 真正记录操作日志
-            this.log0(joinPoint, operateLog, apiOperation, startTime, result, exception);
+            this.log0(joinPoint, operateLog,startTime, result, exception);
         } catch (Throwable ex) {
-            log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) apiOperation({}) result({}) exception({}) ]",
-                    joinPoint, operateLog, apiOperation, result, exception, ex);
+            log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) result({}) exception({}) ]",
+                    joinPoint, operateLog, result, exception, ex);
             throw ex;
         }
     }
 
-    private void log0(ProceedingJoinPoint joinPoint, OperateLog operateLog, ApiOperation apiOperation, Date startTime, Object result, Throwable exception) {
+    private void log0(ProceedingJoinPoint joinPoint, OperateLog operateLog ,Date startTime, Object result, Throwable exception) {
         OperateLogBO log = new OperateLogBO();
+        ApiOperation apiOperation = getMethodAnnotation(joinPoint, ApiOperation.class);
         // 补全通用字段
         log.setOpTime(startTime);
         // 补充用户信息
@@ -96,7 +108,6 @@ public class OperateLogAspect {
         fillRequestFields(log);
         // 补全方法信息
         fillMethodFields(log, joinPoint, operateLog, startTime, result, exception);
-
         // 异步记录日志
         OperateStrategy.tr.saveLog(log);
     }
@@ -107,25 +118,21 @@ public class OperateLogAspect {
                                          OperateLog operateLog,
                                          Date startTime, Object result, Throwable exception) {
         MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
-
         operateLogObj.setJavaClass(methodSignature.getMethod().getDeclaringClass().getCanonicalName());
         operateLogObj.setJavaMethod(methodSignature.toString());
-
-
         operateLogObj.setDuration((int) (DateUtil.between(startTime,DateUtil.date(),DateUnit.MS)));
         // 处理响应结果
         if (result != null) {
-            operateLogObj.setResponseType(true);
-            if (operateLog == null || operateLog.logArgs()) {
+            operateLogObj.setType(operateLog.loginType().name());
+            if (operateLog.logResultData()) {
                 operateLogObj.setResultJson(obtainMethodArgs(joinPoint));
             }
         }
         // (异常)处理 resultCode 和 resultMsg 字段
         if (exception != null) {
-            operateLogObj.setResponseType(false);
-            if (operateLog == null || operateLog.logArgs()) {
-                operateLogObj.setResultJson(obtainResultData( ExceptionStrategy.tr.exceptionHandle(ServletUtils.getRequest(),exception)));
-            }
+            operateLogObj.setType(LoginType.exception.name());
+            operateLogObj.setResultJson(obtainResultData( ExceptionStrategy.tr.exceptionHandle(ServletUtils.getRequest(),exception)));
+
         }
     }
 
@@ -205,21 +212,18 @@ public class OperateLogAspect {
         if (operateLog != null) {
             operateLogObj.setOpName(operateLog.name());
         }
-        if (StrUtil.isEmpty(operateLogObj.getOpName()) && apiOperation != null) {
+        if (StrUtil.isAllBlank(operateLogObj.getOpName()) && apiOperation != null) {
             operateLogObj.setOpName(apiOperation.value());
         }
         // content
         operateLogObj.setRequestArgs(RequestContextHolder.getRequestBody());
     }
 
-    private static boolean isLogEnable(ProceedingJoinPoint joinPoint,
-                                       OperateLog operateLog) {
-        // 有 @OperateLog 注解的情况下
-        if (operateLog != null) {
-            return operateLog.enable();
+    private static boolean isLogEnable(OperateLog operateLog) {
+        if(operateLog==null){
+            return false;
         }
-        // 没有 @ApiOperation 注解的情况下,只记录 GET、POST、PUT、DELETE 的情况
-        return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null;
+        return operateLog.enable();
     }
 
     private static RequestMethod obtainFirstLogRequestMethod(RequestMethod[] requestMethods) {
@@ -241,4 +245,28 @@ public class OperateLogAspect {
                 ((MethodSignature) joinPoint.getSignature()).getMethod(), RequestMapping.class);
         return requestMapping != null ? requestMapping.method() : new RequestMethod[]{};
     }
+
+    private static <T extends Annotation> T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class<T> annotationClass) {
+        return ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(annotationClass);
+    }
+
+    /**
+     * 解析
+     * @param expressionString el表达式
+     * @param method           拦截方法
+     * @param args             拦截参数
+     * @return
+     */
+    private String parseExpression(String expressionString, Method method, Object[] args) {
+        //获取被拦截方法参数名列表
+        LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
+        String[] paramNameArr = discoverer.getParameterNames(method);
+        //SPEL解析
+        ExpressionParser parser = new SpelExpressionParser();
+        StandardEvaluationContext context = new StandardEvaluationContext();
+        for (int i = 0; i < paramNameArr.length; i++) {
+            context.setVariable(paramNameArr[i], args[i]);
+        }
+        return parser.parseExpression(expressionString).getValue(context, String.class);
+    }
 }

+ 30 - 0
tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/enums/LoginType.java

@@ -0,0 +1,30 @@
+package cn.tr.plugin.operatelog.enums;
+
+import lombok.Getter;
+
+/**
+ * 操作日志的操作类型
+ *
+ * @author ruoyi
+ */
+@Getter
+public enum LoginType {
+
+    /**
+     * 操作日志
+     */
+    oper,
+    /**
+     * 异常日志
+     */
+    exception,
+    /**
+     * 登录日志
+     */
+    login,
+    /**
+     * 登出日志
+     */
+    logout;
+
+}

+ 0 - 54
tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/enums/OperateTypeEnum.java

@@ -1,54 +0,0 @@
-package cn.tr.plugin.operatelog.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 操作日志的操作类型
- *
- * @author ruoyi
- */
-@Getter
-@AllArgsConstructor
-public enum OperateTypeEnum {
-
-    /**
-     * 查询
-     *
-     * 绝大多数情况下,不会记录查询动作,因为过于大量显得没有意义。
-     * 在有需要的时候,通过声明 {@link io.swagger.annotations.ApiOperation} 注解来记录
-     */
-    GET(1),
-    /**
-     * 新增
-     */
-    CREATE(2),
-    /**
-     * 修改
-     */
-    UPDATE(3),
-    /**
-     * 删除
-     */
-    DELETE(4),
-    /**
-     * 导出
-     */
-    EXPORT(5),
-    /**
-     * 导入
-     */
-    IMPORT(6),
-    /**
-     * 其它
-     *
-     * 在无法归类时,可以选择使用其它。因为还有操作名可以进一步标识
-     */
-    OTHER(0);
-
-    /**
-     * 类型
-     */
-    private final Integer type;
-
-}

+ 1 - 0
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/config/LoginUserStrategyConfig.java

@@ -24,6 +24,7 @@ public class LoginUserStrategyConfig {
             UserLoginInfoBO user = LoginUserContextHolder.getUser();
             if(user==null){
                 user = SaTokenUtils.getValue(SecurityConstant.LOGIN_USER, UserLoginInfoBO.class);
+                LoginUserContextHolder.setUser(user);
             }
             UserLoginInfoBO finalUser = user;
             return new ILoginUser() {