Просмотр исходного кода

新增 字典、字典项、操作日志模块

18339543638 2 лет назад
Родитель
Сommit
3981da6543
36 измененных файлов с 1002 добавлено и 229 удалено
  1. 15 0
      tr-framework/src/main/java/cn/tr/core/validation/Insert.java
  2. 15 0
      tr-framework/src/main/java/cn/tr/core/validation/Update.java
  3. 10 0
      tr-modules/tr-module-system/pom.xml
  4. 79 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictController.java
  5. 91 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictItemController.java
  6. 48 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictDTO.java
  7. 62 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictItemDTO.java
  8. 25 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictItemQueryDTO.java
  9. 23 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictQueryDTO.java
  10. 52 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/po/SysDictItemPO.java
  11. 49 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/po/SysDictPO.java
  12. 17 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/repository/SysDictItemRepository.java
  13. 17 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/repository/SysDictRepository.java
  14. 56 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/ISysDictItemService.java
  15. 64 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/ISysDictService.java
  16. 148 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/impl/SysDictItemServiceImpl.java
  17. 98 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/impl/SysDictServiceImpl.java
  18. 2 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/config/OperateConfig.java
  19. 17 9
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/controller/SysOperLogController.java
  20. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysOpeLogQueryDTO.java
  21. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysOperLogDTO.java
  22. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/po/SysOperLogPO.java
  23. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/repository/SysOperLogRepository.java
  24. 8 7
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/service/impl/SysOperLogServiceImpl.java
  25. 25 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/DictItemMapper.java
  26. 25 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/DictMapper.java
  27. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/OperLogMapper.java
  28. 0 120
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/controller/vo/SysOperLogVO.java
  29. 0 43
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/service/ISysOperLogService.java
  30. 0 16
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/TrTenantAutoConfiguration.java
  31. 4 8
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantDatabaseInterceptor.java
  32. 10 4
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java
  33. 6 0
      tr-plugins/tr-spring-boot-starter-plugin-dict/src/main/java/cn/tr/plugin/dict/bo/DictBO.java
  34. 1 1
      tr-test/src/main/java/cn/tr/test/WebApplication.java
  35. 6 9
      tr-test/src/main/resources/application-doc.yml
  36. 22 2
      tr-test/src/main/resources/application.yml

+ 15 - 0
tr-framework/src/main/java/cn/tr/core/validation/Insert.java

@@ -0,0 +1,15 @@
+package cn.tr.core.validation;
+
+import java.lang.annotation.*;
+
+/**
+ * @@interface : Insert
+ * @Description : 数据新增时校验
+ * @Author : LF
+ * @Date: 2023年03月27日
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Insert {
+}

+ 15 - 0
tr-framework/src/main/java/cn/tr/core/validation/Update.java

@@ -0,0 +1,15 @@
+package cn.tr.core.validation;
+
+import java.lang.annotation.*;
+
+/**
+ * @@interface : Update
+ * @Description : 数据更新时校验
+ * @Author : LF
+ * @Date: 2023年03月27日
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Update {
+}

+ 10 - 0
tr-modules/tr-module-system/pom.xml

@@ -13,11 +13,21 @@
     <version>${revision}</version>
     <version>${revision}</version>
 
 
     <dependencies>
     <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-dict</artifactId>
+        </dependency>
+
         <dependency>
         <dependency>
             <groupId>cn.tr</groupId>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
             <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
         </dependency>
         </dependency>
 
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-satoken</artifactId>
+        </dependency>
+
         <dependency>
         <dependency>
             <groupId>cn.tr</groupId>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-mp-enhance-actable</artifactId>
             <artifactId>tr-spring-boot-starter-plugin-mp-enhance-actable</artifactId>

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

@@ -0,0 +1,79 @@
+package cn.tr.module.sys.dict.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.core.pojo.TableDataInfo;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.module.sys.dict.dto.SysDictDTO;
+import cn.tr.module.sys.dict.dto.SysDictQueryDTO;
+import cn.tr.module.sys.dict.service.ISysDictService;
+import cn.tr.plugin.mybatis.base.BaseController;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collection;
+
+/**
+ * @ClassName : SysOperLogController
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@RestController
+@RequestMapping("/sys/dict")
+@Api(tags = "字典")
+@AllArgsConstructor
+public class SysDictController extends BaseController {
+    private final ISysDictService dictService;
+
+    @PostMapping("/query/page")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dict:query")
+    @ApiOperation(value = "根据条件查询字典",notes = "权限: sys:dict:query")
+    public TableDataInfo<SysDictDTO> selectList(@RequestBody SysDictQueryDTO query){
+        startPage();
+        return getDataTable(dictService.selectDictDataList(query));
+    }
+
+
+    @GetMapping("/detail/{id}")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dict:query")
+    @ApiOperation(value = "根据id查询字典",notes = "权限: sys:dict:query")
+    public CommonResult<SysDictDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(dictService.selectDictById(id));
+    }
+
+    @PostMapping("/edit")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dict:edit")
+    @ApiOperation(value = "根据id更新字典",notes = "权限: sys:dict:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysDictDTO source){
+        return CommonResult.success(dictService.updateDictById(source));
+    }
+
+    @PostMapping("/add")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dict:add")
+    @ApiOperation(value = "新增字典",notes = "权限: sys:dict:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysDictDTO source){
+        return CommonResult.success(dictService.insertDict(source));
+    }
+
+
+    @PostMapping("/deleteByIds")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dict:del")
+    @ApiOperation(value = "删除字典",notes = "权限: sys:dict:del")
+    public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
+        return CommonResult.success(dictService.deleteDictByIds(ids));
+    }
+
+    //todo 导出
+
+}

+ 91 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictItemController.java

@@ -0,0 +1,91 @@
+package cn.tr.module.sys.dict.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.module.sys.dict.dto.SysDictDTO;
+import cn.tr.module.sys.dict.dto.SysDictItemDTO;
+import cn.tr.module.sys.dict.dto.SysDictItemQueryDTO;
+import cn.tr.module.sys.dict.service.ISysDictItemService;
+import cn.tr.module.sys.dict.service.ISysDictService;
+import cn.tr.plugin.dict.bo.DictBO;
+import cn.tr.plugin.dict.config.cache.DictManager;
+import cn.tr.plugin.mybatis.base.BaseController;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+/**
+ * @ClassName : SysOperLogController
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@RestController
+@RequestMapping("/sys/dictItem")
+@Api(tags = "字典项")
+@AllArgsConstructor
+public class SysDictItemController extends BaseController {
+    private final ISysDictItemService dictItemService;
+    private final DictManager dictManager;
+    private final ISysDictService dictService;
+
+    @PostMapping("/query/list")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "根据条件查询字典",notes = "无权限")
+    public CommonResult<List<DictBO>> selectList(@RequestBody SysDictItemQueryDTO query){
+        if(StrUtil.isEmpty(query.getDictCode())){
+            SysDictDTO dict = dictService.selectDictById(query.getDictCode());
+            if(dict==null){
+                return CommonResult.success();
+            }
+            query.setDictCode(dict.getDictCode());
+        }
+        return CommonResult.success(dictManager.lookAllByDictCode(query.getDictCode()));
+    }
+
+    @PostMapping("/reload")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dictItem:reload")
+    @ApiOperation(value = "刷新缓存",notes = "权限: sys:dictItem:reload")
+    public CommonResult<Void> reload(){
+        dictItemService.reloadCache();
+        return CommonResult.success();
+    }
+
+
+    @PostMapping("/edit")
+    @ApiOperationSupport(author = "lf")
+    @SaCheckPermission("sys:dictItem:edit")
+    @ApiOperation(value = "根据id更新字典项",notes = "权限: sys:dictItem:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysDictItemDTO source){
+        return CommonResult.success(dictItemService.updateDictItemById(source));
+    }
+
+    @PostMapping("/add")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "新增字典项",notes = "权限: sys:dictItem:add")
+    @SaCheckPermission("sys:dictItem:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysDictItemDTO source){
+        return CommonResult.success(dictItemService.insertDictItem(source));
+    }
+
+
+    @PostMapping("/deleteByIds")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "删除字典项",notes = "权限: sys:dictItem:del")
+    @SaCheckPermission("sys:dictItem:del")
+    public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
+        return CommonResult.success(dictItemService.deleteDictItemByIds(ids));
+    }
+
+    //todo 导出
+
+}

+ 48 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictDTO.java

@@ -0,0 +1,48 @@
+package cn.tr.module.sys.dict.dto;
+
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 字典对象 sys_dict
+ *
+ * @author tr
+ * @date 2022-11-26 20:19:56
+ */
+@Data
+@ToString
+@EqualsAndHashCode(callSuper = true)
+public class SysDictDTO extends BasePO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @NotNull(message = "字典id不能为空",groups = {Update.class})
+    private String dictId;
+
+
+    @ApiModelProperty(value = "字典编码",required = true)
+    @NotNull(message = "字典编码不能为空",groups = {Insert.class, Update.class})
+    private String dictCode;
+
+    @NotNull(message = "字典名称不能为空",groups = {Insert.class, Update.class})
+    @ApiModelProperty(value = "字典名称",required = true)
+    private String dictName;
+
+    @ApiModelProperty(value = "字典类型 字典值:sys_com_type",required = true)
+    @NotNull(message = "字典类型不能为空",groups = {Insert.class, Update.class})
+    private String dictType;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+    @ApiModelProperty(value = "状态 0正常;1停用",required = true)
+    @NotNull(message = "字典状态不能为空",groups = {Insert.class, Update.class})
+    private Boolean disable;
+}

+ 62 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictItemDTO.java

@@ -0,0 +1,62 @@
+package cn.tr.module.sys.dict.dto;
+
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 字典项对象 sys_dict_item
+ *
+ * @author tr
+ * @date 2022-11-26 20:30:55
+ */
+@Data
+@ApiModel("字典项传输对象")
+@ToString
+@EqualsAndHashCode(callSuper = true)
+public class SysDictItemDTO extends BasePO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    private String dictItemId;
+
+    @ApiModelProperty(value = "字典ID" ,required = true)
+    @NotNull(message = "字典id不能为空",groups = {Insert.class, Update.class})
+    @Length(min=1,max = 255,groups = {Insert.class, Update.class},message = "字典ID 字段长度需在 1至255 之间")
+    private String dictId;
+
+    @ApiModelProperty(value = "字典项值" ,required = true )
+    @NotNull(message = "字典项值不能为空",groups = {Insert.class, Update.class})
+    @Length(min=1,max = 128,groups = {Insert.class, Update.class},message = "字典项值 字段长度需在 1至128 之间")
+    private String value;
+
+    @ApiModelProperty(value = "字典项标签" ,required = true )
+    @NotNull(message = "字典项标签不能为空",groups = {Insert.class, Update.class})
+    @Length(min=1,max = 128,groups = {Insert.class, Update.class},message = "字典项标签 字段长度需在 1至128 之间")
+    private String label;
+
+    @ApiModelProperty(value = "排序" ,required = true  )
+    @NotNull(message = "排序不能为空",groups = {Insert.class, Update.class})
+    private Integer sort;
+
+    @ApiModelProperty(value = "备注")
+    @Length(min=1,max = 512,groups = {Insert.class, Update.class},message = "备注 字段长度需在 1至512 之间")
+    private String remark;
+
+    @ApiModelProperty(value = "回显颜色"  )
+    @Length(min=1,max = 255,groups = {Insert.class, Update.class},message = "回显颜色 字段长度需在 1至255 之间")
+    private String color;
+
+    @ApiModelProperty(value = "状态 0正常;1停用" ,required = true  )
+    @NotNull(message = "状态不能为空",groups = {Insert.class, Update.class})
+    private Boolean disable;
+
+}

+ 25 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictItemQueryDTO.java

@@ -0,0 +1,25 @@
+package cn.tr.module.sys.dict.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * 字典项查询参数
+ *
+ * @author tr
+ * @date 2022-11-26 20:30:55
+ */
+@ApiModel("字典项查询参数")
+@ToString
+@Data
+public class SysDictItemQueryDTO implements Serializable {
+    private static final long serialVersionUID = -6194175201423381425L;
+    @ApiModelProperty(value ="字典码")
+    private String dictId;
+    @ApiModelProperty(value ="字典id")
+    private String dictCode;
+}

+ 23 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictQueryDTO.java

@@ -0,0 +1,23 @@
+package cn.tr.module.sys.dict.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName : SysDictQueryDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Data
+public class SysDictQueryDTO implements Serializable {
+    private static final long serialVersionUID = -4279171934716001840L;
+
+    @ApiModelProperty("字典名称")
+    private String dictName;
+
+    @ApiModelProperty("字典编码")
+    private String dictCode;
+}

+ 52 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/po/SysDictItemPO.java

@@ -0,0 +1,52 @@
+package cn.tr.module.sys.dict.po;
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 字典项对象 sys_dict_item
+ *
+ * @author tr
+ * @date 2022-11-26 20:30:55
+ */
+@Data
+@ToString
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_dict_item")
+public class SysDictItemPO extends BasePO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId
+    private String dictItemId;
+
+    @ApiModelProperty(value = "字典ID")
+    private String dictId;
+
+    @ApiModelProperty(value = "字典项值")
+    private String value;
+
+
+    @ApiModelProperty(value = "字典项标签")
+    private String label;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "回显颜色")
+    private String color;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "状态 0正常;1停用")
+    private Boolean disable;
+
+}

+ 49 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/po/SysDictPO.java

@@ -0,0 +1,49 @@
+package cn.tr.module.sys.dict.po;
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.stereotype.Indexed;
+
+import javax.persistence.Column;
+
+/**
+ * 字典对象 sys_dict
+ *
+ * @author tr
+ * @date 2022-11-26 20:19:56
+ */
+@Data
+@ToString
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_dict")
+public class SysDictPO extends BasePO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId
+    private String dictId;
+
+
+    @ApiModelProperty(value = "字典编码")
+    @Column(unique = true)
+    private String dictCode;
+
+    @ApiModelProperty(value = "字典名称")
+    private String dictName;
+
+    @ApiModelProperty(value = "字典类型 字典值:sys_com_type")
+    private String dictType;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+    @ApiModelProperty(value = "状态 0正常;1停用")
+    private Boolean disable;
+
+}

+ 17 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/repository/SysDictItemRepository.java

@@ -0,0 +1,17 @@
+package cn.tr.module.sys.dict.repository;
+
+import cn.tr.module.sys.dict.po.SysDictItemPO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @ClassName : SysOperLogMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Repository
+@Mapper
+public interface SysDictItemRepository extends BaseMapper<SysDictItemPO> {
+}

+ 17 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/repository/SysDictRepository.java

@@ -0,0 +1,17 @@
+package cn.tr.module.sys.dict.repository;
+
+import cn.tr.module.sys.dict.po.SysDictPO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @ClassName : SysOperLogMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Repository
+@Mapper
+public interface SysDictRepository extends BaseMapper<SysDictPO> {
+}

+ 56 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/ISysDictItemService.java

@@ -0,0 +1,56 @@
+package cn.tr.module.sys.dict.service;
+
+import cn.tr.module.sys.dict.dto.SysDictItemDTO;
+import cn.tr.module.sys.dict.dto.SysDictItemQueryDTO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @ClassName : ISysDictService
+ * @Description : 字典操作类
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+
+public interface ISysDictItemService {
+    /**
+     * 根据条件查询
+     * @param query 查询参数
+     * @return
+     */
+    List<SysDictItemDTO> selectDictItemDataList(SysDictItemQueryDTO query);
+
+    /**
+     * 根据id查询字典项
+     * @param id 字典项id
+     * @return 字典项
+     */
+    SysDictItemDTO selectDictItemById(String id);
+
+    /**
+     * 新增字典项
+     * @param source 新增字典项
+     * @return true:新增字典项成功
+     */
+    boolean insertDictItem(SysDictItemDTO source);
+
+    /**
+     * 根据id删除字典项
+     * @param ids 日志id
+     * @return 删除数量
+     */
+    int deleteDictItemByIds(Collection<String> ids);
+
+    /**
+     * 根据id更新字典项
+     * @param source
+     * @return
+     */
+    boolean updateDictItemById(SysDictItemDTO source);
+
+    /**
+     * 刷新缓存
+     */
+    void reloadCache();
+}

+ 64 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/ISysDictService.java

@@ -0,0 +1,64 @@
+package cn.tr.module.sys.dict.service;
+
+import cn.tr.module.sys.dict.dto.SysDictDTO;
+import cn.tr.module.sys.dict.dto.SysDictQueryDTO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @ClassName : ISysDictService
+ * @Description : 字典操作类
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+
+public interface ISysDictService {
+    /**
+     * 根据条件查询
+     * @param query 查询参数
+     * @return
+     */
+    List<SysDictDTO> selectDictDataList(SysDictQueryDTO query);
+
+    /**
+     * 根据id查询字典
+     * @param id 字典id
+     * @return 字典
+     */
+    SysDictDTO selectDictById(String id);
+
+    /**
+     * 根据id集合查询字典
+     * @param ids 字典id
+     * @return 字典
+     */
+    List<SysDictDTO> selectDictByIds(Collection<String> ids);
+    /**
+     * 根据字典code查询字典
+     * @param id 字典
+     * @return 字典
+     */
+    SysDictDTO selectDictByCode(String id);
+
+    /**
+     * 新增日志
+     * @param source 新增日志
+     * @return true:新增成功
+     */
+    boolean insertDict(SysDictDTO source);
+
+    /**
+     * 根据id删除字典
+     * @param ids 字典id
+     * @return 删除数量
+     */
+    int deleteDictByIds(Collection<String> ids);
+
+    /**
+     * 根据id更新字典
+     * @param source
+     * @return
+     */
+    boolean updateDictById(SysDictDTO source);
+}

+ 148 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/impl/SysDictItemServiceImpl.java

@@ -0,0 +1,148 @@
+package cn.tr.module.sys.dict.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.dict.dto.SysDictDTO;
+import cn.tr.module.sys.dict.dto.SysDictItemDTO;
+import cn.tr.module.sys.dict.dto.SysDictItemQueryDTO;
+import cn.tr.module.sys.dict.dto.SysDictQueryDTO;
+import cn.tr.module.sys.dict.po.SysDictItemPO;
+import cn.tr.module.sys.dict.repository.SysDictItemRepository;
+import cn.tr.module.sys.dict.service.ISysDictItemService;
+import cn.tr.module.sys.dict.service.ISysDictService;
+import cn.tr.module.sys.mapper.DictItemMapper;
+import cn.tr.plugin.dict.bo.DictBO;
+import cn.tr.plugin.dict.config.cache.DictManager;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : SysDictServiceImpl
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Slf4j
+@AllArgsConstructor
+@Service
+public class SysDictItemServiceImpl implements ISysDictItemService, CommandLineRunner {
+    private final SysDictItemRepository dictItemRepository;
+    private final ISysDictService dictService;
+    private final DictManager dictManager;
+
+    @Override
+    public List<SysDictItemDTO> selectDictItemDataList(SysDictItemQueryDTO query) {
+        List<String> dictIds = Arrays.asList(query.getDictId());
+        if(StrUtil.isNotEmpty(query.getDictCode())){
+            SysDictDTO dict = dictService.selectDictByCode(query.getDictCode());
+            if(dict!=null){
+                dictIds.add(dict.getDictId());
+            }
+        }
+        return DictItemMapper.INSTANCE.toDictItemDtoList(
+                dictItemRepository.selectList(new LambdaQueryWrapper<SysDictItemPO>()
+                        .in(CollectionUtil.isNotEmpty(dictIds), SysDictItemPO::getDictId,dictIds)
+                )
+        );
+    }
+
+    @Override
+    public SysDictItemDTO selectDictItemById(String id) {
+        return DictItemMapper.INSTANCE.toDictItemDto(dictItemRepository.selectById(id));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertDictItem(SysDictItemDTO source) {
+        boolean result = dictItemRepository.insert(DictItemMapper.INSTANCE.toDictItemPO(source)) != 0;
+        if(result){
+            loadDict(source);
+        }
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteDictItemByIds(Collection<String> ids) {
+        List<SysDictItemPO> items = dictItemRepository.selectList(
+                new LambdaQueryWrapper<SysDictItemPO>()
+                        .in(SysDictItemPO::getDictItemId,ids)
+        );
+        if(CollectionUtil.isEmpty(items)){
+            return CollectionUtil.size(ids);
+        }
+        int result = dictItemRepository.deleteBatchIds(ids);
+
+        List<SysDictDTO> dicts = dictService.selectDictByIds(
+                items.stream().map(SysDictItemPO::getDictId).collect(Collectors.toSet())
+        );
+        Map< String, SysDictDTO> dictMap = dicts.stream().collect(Collectors.groupingBy(SysDictDTO::getDictId, Collectors.collectingAndThen(Collectors.toList(), CollUtil::getFirst)));
+        items.forEach(item->{
+            SysDictDTO dict = dictMap.get(item.getDictId());
+            if(dict==null){
+                return;
+            }
+            dictManager.evict(dict.getDictCode(),item.getValue());
+        });
+        return result;
+    }
+
+    @Override
+    public boolean updateDictItemById(SysDictItemDTO source) {
+        boolean result = dictItemRepository.updateById(DictItemMapper.INSTANCE.toDictItemPO(source)) != 0;
+        if(result){
+            loadDict(source);
+        }
+        return result;
+    }
+
+    @Override
+    public void reloadCache() {
+        List<SysDictDTO> allDict = dictService.selectDictDataList(new SysDictQueryDTO());
+        Map< String, SysDictDTO> dictMap = allDict.stream().collect(Collectors.groupingBy(SysDictDTO::getDictId, Collectors.collectingAndThen(Collectors.toList(), CollUtil::getFirst)));
+        List<SysDictItemDTO> allDictItems = this.selectDictItemDataList(new SysDictItemQueryDTO());
+        Map<String, List<DictBO>> loadMap = allDictItems.stream()
+                .collect(Collectors.groupingBy(dict->dictMap.get(dict.getDictId()).getDictCode(),
+                        Collectors.collectingAndThen(Collectors.toList(),
+                                value -> value.stream().map(item -> DictBO.builder()
+                                        .value(item.getValue())
+                                        .label(item.getLabel())
+                                        .color(item.getColor())
+                                        .sort(item.getSort())
+                                        .build()
+                                )
+                                        .collect(Collectors.toList())
+                        )
+                        )
+                );
+        dictManager.loadAll(loadMap);
+    }
+
+    private void loadDict(SysDictItemDTO source){
+        SysDictDTO dict = dictService.selectDictById(source.getDictId());
+        if(dict==null){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"所选字典不存在,添加失败");
+        }
+        dictManager.load(dict.getDictCode(),Arrays.asList( DictBO.builder()
+                .value(source.getValue())
+                .label(source.getLabel())
+                .color(source.getColor())
+                .sort(source.getSort())
+                .build()));
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        reloadCache();
+        log.info("================== 字典加载完毕  ==================");
+    }
+}

+ 98 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/service/impl/SysDictServiceImpl.java

@@ -0,0 +1,98 @@
+package cn.tr.module.sys.dict.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.dict.dto.SysDictDTO;
+import cn.tr.module.sys.dict.dto.SysDictQueryDTO;
+import cn.tr.module.sys.dict.po.SysDictPO;
+import cn.tr.module.sys.dict.repository.SysDictRepository;
+import cn.tr.module.sys.dict.service.ISysDictService;
+import cn.tr.module.sys.mapper.DictMapper;
+import cn.tr.plugin.dict.config.cache.DictManager;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @ClassName : SysDictServiceImpl
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Slf4j
+@AllArgsConstructor
+@Service
+public class SysDictServiceImpl implements ISysDictService {
+    private final SysDictRepository dictRepository;
+    private final DictManager dictManager;
+
+    @Override
+    public List<SysDictDTO> selectDictDataList(SysDictQueryDTO query) {
+        return DictMapper.INSTANCE.toDictDtoList(dictRepository.selectList(
+                new LambdaQueryWrapper<SysDictPO>()
+                        .like(StrUtil.isNotEmpty(query.getDictCode()), SysDictPO::getDictCode,query.getDictCode())
+                        .like(StrUtil.isNotEmpty(query.getDictName()), SysDictPO::getDictName,query.getDictName())
+                )
+        );
+    }
+
+    @Override
+    public SysDictDTO selectDictById(String id) {
+        return DictMapper.INSTANCE.toDictDto(dictRepository.selectById(id));
+    }
+
+    @Override
+    public List<SysDictDTO> selectDictByIds(Collection<String> ids) {
+        if(CollectionUtil.isEmpty(ids)){
+            return new ArrayList<>();
+        }
+        return DictMapper.INSTANCE.toDictDtoList(dictRepository.selectList(
+                new LambdaQueryWrapper<SysDictPO>()
+                        .in(SysDictPO::getDictId,ids)
+                )
+        );
+    }
+
+    @Override
+    public SysDictDTO selectDictByCode(String code) {
+        return DictMapper.INSTANCE.toDictDto(dictRepository.selectOne(
+                new LambdaQueryWrapper<SysDictPO>()
+                        .eq(SysDictPO::getDictCode,code)
+                        .last("limit 1")
+                )
+        );
+    }
+
+    @Override
+    public boolean insertDict(SysDictDTO source) {
+        //code不能重复
+        SysDictPO dict = DictMapper.INSTANCE.toDictPO(source);
+        SysDictDTO dictByCode = selectDictByCode(dict.getDictCode());
+        if(dictByCode!=null){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,String.format("字典编码{%s}不能重复",source.getDictCode()));
+        }
+        return dictRepository.insert(dict)!=0;
+    }
+
+    @Override
+    public int deleteDictByIds(Collection<String> ids) {
+        return dictRepository.deleteBatchIds(ids);
+    }
+
+    @Override
+    public boolean updateDictById(SysDictDTO source) {
+        SysDictPO dict = DictMapper.INSTANCE.toDictPO(source);
+        SysDictDTO dictByCode = selectDictByCode(dict.getDictCode());
+        if(dictByCode!=null&&!StrUtil.equals(source.getDictId(),dictByCode.getDictId())){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,String.format("字典编码{%s}不能重复",source.getDictCode()));
+        }
+        return dictRepository.updateById(dict)!=0;
+    }
+}

+ 2 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/config/OperateConfig.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/config/OperateConfig.java

@@ -1,8 +1,7 @@
-package cn.tr.module.sys.operatelog.config;
+package cn.tr.module.sys.log.config;
 
 
 import cn.tr.module.sys.mapper.OperLogMapper;
 import cn.tr.module.sys.mapper.OperLogMapper;
-import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operatelog.service.ISysOperLogService;
+import cn.tr.module.sys.log.service.ISysOperLogService;
 import cn.tr.plugin.operatelog.strategy.OperateStrategy;
 import cn.tr.plugin.operatelog.strategy.OperateStrategy;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;

+ 17 - 9
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/controller/SysOperLogController.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/controller/SysOperLogController.java

@@ -1,11 +1,13 @@
-package cn.tr.module.sys.operatelog.controller;
+package cn.tr.module.sys.log.controller;
 
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.pojo.TableDataInfo;
-import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operatelog.dto.query.SysOpeLogQueryDTO;
-import cn.tr.module.sys.operatelog.service.ISysOperLogService;
+import cn.tr.module.sys.log.dto.SysOperLogDTO;
+import cn.tr.module.sys.log.dto.SysOpeLogQueryDTO;
+import cn.tr.module.sys.log.service.ISysOperLogService;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.mybatis.base.BaseController;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -25,21 +27,27 @@ import java.util.*;
 public class SysOperLogController extends BaseController {
 public class SysOperLogController extends BaseController {
     private final ISysOperLogService operLogService;
     private final ISysOperLogService operLogService;
 
 
-    @PostMapping("/query")
-    @ApiOperation("根据条件查询操作日志")
+    @PostMapping("/query/page")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "根据条件查询操作日志",notes = "权限: sys:opeLog:query")
+    @SaCheckPermission("sys:opeLog:query")
     public TableDataInfo<SysOperLogDTO> selectList(@RequestBody SysOpeLogQueryDTO query){
     public TableDataInfo<SysOperLogDTO> selectList(@RequestBody SysOpeLogQueryDTO query){
         startPage();
         startPage();
         return getDataTable(operLogService.selectOperLogDataList(query));
         return getDataTable(operLogService.selectOperLogDataList(query));
     }
     }
 
 
-    @GetMapping("/{id}")
-    @ApiOperation("根据id查询操作日志")
+    @GetMapping("/detail/{id}")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "根据id查询操作日志",notes = "权限: sys:opeLog:query")
+    @SaCheckPermission("sys:opeLog:query")
     public CommonResult<SysOperLogDTO> findById(@PathVariable("id") String id){
     public CommonResult<SysOperLogDTO> findById(@PathVariable("id") String id){
         return CommonResult.success(operLogService.selectOperLogById(id));
         return CommonResult.success(operLogService.selectOperLogById(id));
     }
     }
 
 
     @PostMapping("/deleteByIds")
     @PostMapping("/deleteByIds")
-    @ApiOperation("删除查询日志")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "删除查询日志",notes = "权限: sys:opeLog:del")
+    @SaCheckPermission("sys:opeLog:del")
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
         return CommonResult.success(operLogService.deleteOperLogByIds(ids));
         return CommonResult.success(operLogService.deleteOperLogByIds(ids));
     }
     }

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/query/SysOpeLogQueryDTO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysOpeLogQueryDTO.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.operatelog.dto.query;
+package cn.tr.module.sys.log.dto;
 
 
 import lombok.Data;
 import lombok.Data;
 
 

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/SysOperLogDTO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysOperLogDTO.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.operatelog.dto;
+package cn.tr.module.sys.log.dto;
 
 
 
 
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/po/SysOperLogPO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/po/SysOperLogPO.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.operatelog.po;
+package cn.tr.module.sys.log.po;
 
 
 import cn.tr.core.annotation.Comment;
 import cn.tr.core.annotation.Comment;
 import cn.tr.plugin.mybatis.pojo.BasePO;
 import cn.tr.plugin.mybatis.pojo.BasePO;

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/repository/SysOperLogRepository.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/repository/SysOperLogRepository.java

@@ -1,6 +1,6 @@
-package cn.tr.module.sys.operatelog.repository;
+package cn.tr.module.sys.log.repository;
 
 
-import cn.tr.module.sys.operatelog.po.SysOperLogPO;
+import cn.tr.module.sys.log.po.SysOperLogPO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;

+ 8 - 7
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/service/SysOperLogServiceImpl.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/service/impl/SysOperLogServiceImpl.java

@@ -1,10 +1,10 @@
-package cn.tr.module.sys.operatelog.service;
+package cn.tr.module.sys.log.service.impl;
 
 
 import cn.tr.module.sys.mapper.OperLogMapper;
 import cn.tr.module.sys.mapper.OperLogMapper;
-import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operatelog.dto.query.SysOpeLogQueryDTO;
-import cn.tr.module.sys.operatelog.po.SysOperLogPO;
-import cn.tr.module.sys.operatelog.repository.SysOperLogRepository;
+import cn.tr.module.sys.log.dto.SysOperLogDTO;
+import cn.tr.module.sys.log.dto.SysOpeLogQueryDTO;
+import cn.tr.module.sys.log.repository.SysOperLogRepository;
+import cn.tr.module.sys.log.service.ISysOperLogService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -22,8 +22,9 @@ import java.util.List;
 @Slf4j
 @Slf4j
 @AllArgsConstructor
 @AllArgsConstructor
 @Service
 @Service
-public class SysOperLogServiceImpl implements ISysOperLogService{
-    private final SysOperLogRepository logRepository;
+public class SysOperLogServiceImpl implements ISysOperLogService {
+
+    private  final SysOperLogRepository logRepository;
     @Override
     @Override
     public List<SysOperLogDTO> selectOperLogDataList(SysOpeLogQueryDTO query) {
     public List<SysOperLogDTO> selectOperLogDataList(SysOpeLogQueryDTO query) {
         return OperLogMapper.INSTANCE.toOperLogDto(logRepository.selectList(new QueryWrapper<>()));
         return OperLogMapper.INSTANCE.toOperLogDto(logRepository.selectList(new QueryWrapper<>()));

+ 25 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/DictItemMapper.java

@@ -0,0 +1,25 @@
+package cn.tr.module.sys.mapper;
+
+import cn.tr.module.sys.dict.dto.SysDictItemDTO;
+import cn.tr.module.sys.dict.po.SysDictItemPO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @ClassName : OperateMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Mapper
+public interface DictItemMapper {
+    DictItemMapper INSTANCE = Mappers.getMapper(DictItemMapper.class);
+
+    SysDictItemPO toDictItemPO(SysDictItemDTO source);
+
+    SysDictItemDTO toDictItemDto(SysDictItemPO source);
+
+    List<SysDictItemDTO> toDictItemDtoList(List<SysDictItemPO> source);
+}

+ 25 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/DictMapper.java

@@ -0,0 +1,25 @@
+package cn.tr.module.sys.mapper;
+
+import cn.tr.module.sys.dict.dto.SysDictDTO;
+import cn.tr.module.sys.dict.po.SysDictPO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @ClassName : OperateMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Mapper
+public interface DictMapper {
+    DictMapper INSTANCE = Mappers.getMapper(DictMapper.class);
+
+    SysDictPO toDictPO(SysDictDTO source);
+
+    SysDictDTO toDictDto(SysDictPO source);
+
+    List<SysDictDTO> toDictDtoList(List<SysDictPO> source);
+}

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/OperLogMapper.java

@@ -1,7 +1,7 @@
 package cn.tr.module.sys.mapper;
 package cn.tr.module.sys.mapper;
 
 
-import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operatelog.po.SysOperLogPO;
+import cn.tr.module.sys.log.dto.SysOperLogDTO;
+import cn.tr.module.sys.log.po.SysOperLogPO;
 import cn.tr.plugin.operatelog.bo.OperateLogBO;
 import cn.tr.plugin.operatelog.bo.OperateLogBO;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 import org.mapstruct.factory.Mappers;

+ 0 - 120
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/controller/vo/SysOperLogVO.java

@@ -1,120 +0,0 @@
-package cn.tr.module.sys.operatelog.controller.vo;
-
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.ToString;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 操作日志记录对象 sys_oper_log
- *
- * @author tr
- * @date 2022-11-22 08:59:03
- */
-@Data
-@ToString
-public class SysOperLogVO implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "主键")
-    private String operId;
-    /**
-     * 用户id
-     */
-    @ApiModelProperty("操作用户id")
-    private String userId;
-
-
-    /**
-     * 操作模块
-     */
-    @ApiModelProperty("操作模块")
-    private String module;
-
-    /**
-     * 操作名
-     */
-    @ApiModelProperty("操作名称")
-    private String name;
-
-    /**
-     * 操作分类
-     */
-    @ApiModelProperty("操作分类")
-    private Integer type;
-
-    /**
-     * 操作明细
-     */
-    @ApiModelProperty("操作明细")
-    private String content;
-
-    /**
-     * 请求方法名
-     */
-    @ApiModelProperty("请求方法名")
-    private String requestMethod;
-
-    /**
-     * 请求地址
-     */
-    @ApiModelProperty("请求地址")
-    private String requestUrl;
-
-    /**
-     * 用户 IP
-     */
-    @ApiModelProperty("用户IP")
-    private String userIp;
-
-    /**
-     * 浏览器 UserAgent
-     */
-    @ApiModelProperty("浏览器UserAgent")
-    private String userAgent;
-
-    /**
-     * Java 方法名
-     */
-    @ApiModelProperty("Java方法名")
-    private String javaMethod;
-
-    /**
-     * Java 方法的参数
-     */
-    @ApiModelProperty("Java方法的参数")
-    private String javaMethodArgs;
-
-    /**
-     * 开始时间
-     */
-    @ApiModelProperty("开始时间")
-    private Date startTime;
-
-    /**
-     * 执行时长,单位:毫秒
-     */
-    @ApiModelProperty("执行时长,单位:毫秒")
-    private Integer duration;
-
-    /**
-     * 响应码
-     */
-    @ApiModelProperty("响应码")
-    private String resultCode;
-
-    /**
-     * 结果提示
-     */
-    @ApiModelProperty("响应信息")
-    private String resultMsg;
-
-    /**
-     * 结果数据
-     */
-    @ApiModelProperty("响应数据")
-    private String resultData;
-}

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

@@ -1,43 +0,0 @@
-package cn.tr.module.sys.operatelog.service;
-
-import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
-import cn.tr.module.sys.operatelog.dto.query.SysOpeLogQueryDTO;
-
-import java.util.*;
-/**
- * @ClassName : ISysOperLogService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月24日
- */
-
-public interface ISysOperLogService {
-    /**
-     * 根据条件查询
-     * @param query 查询参数
-     * @return
-     */
-    List<SysOperLogDTO> selectOperLogDataList(SysOpeLogQueryDTO query);
-
-    /**
-     * 根据id查询操作日志
-     * @param id 日志id
-     * @return 日志
-     */
-    SysOperLogDTO selectOperLogById(String id);
-
-    /**
-     * 新增日志
-     * @param source 新增日志
-     * @return true:新增成功
-     */
-    boolean insertOperLog(SysOperLogDTO source);
-
-    /**
-     * 根据id删除日志
-     * @param ids 日志id
-     * @return 删除数量
-     */
-    int deleteOperLogByIds(Collection<String> ids);
-
-}

+ 0 - 16
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/TrTenantAutoConfiguration.java

@@ -5,23 +5,18 @@ import cn.tr.plugin.biz.tenant.config.aop.TenantIgnoreAspect;
 import cn.tr.plugin.biz.tenant.config.db.TenantCreateAndUpdateMetaObjectHandler;
 import cn.tr.plugin.biz.tenant.config.db.TenantCreateAndUpdateMetaObjectHandler;
 import cn.tr.plugin.biz.tenant.config.db.TenantDatabaseInterceptor;
 import cn.tr.plugin.biz.tenant.config.db.TenantDatabaseInterceptor;
 import cn.tr.plugin.biz.tenant.config.ignore.TenantIgnoreUrlConfig;
 import cn.tr.plugin.biz.tenant.config.ignore.TenantIgnoreUrlConfig;
-import cn.tr.plugin.biz.tenant.config.secutiry.TenantSecurityWebFilter;
-import cn.tr.plugin.biz.tenant.config.service.TenantFrameworkService;
 import cn.tr.plugin.biz.tenant.config.web.TenantContextWebFilter;
 import cn.tr.plugin.biz.tenant.config.web.TenantContextWebFilter;
 import cn.tr.plugin.biz.tenant.properties.TenantProperties;
 import cn.tr.plugin.biz.tenant.properties.TenantProperties;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.annotation.Primary;
-import org.springframework.web.SpringServletContainerInitializer;
 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 
 
 import java.util.*;
 import java.util.*;
@@ -73,17 +68,6 @@ public class TrTenantAutoConfiguration implements BeanPostProcessor {
         return new TenantCreateAndUpdateMetaObjectHandler();
         return new TenantCreateAndUpdateMetaObjectHandler();
     }
     }
 
 
-    // ========== Security ==========
-    @Bean
-    @ConditionalOnClass(SpringServletContainerInitializer.class)
-    public FilterRegistrationBean<TenantSecurityWebFilter> tenantSecurityWebFilter(TenantProperties tenantProperties,
-                                                                                   @Autowired(required = false) TenantFrameworkService tenantFrameworkService) {
-        FilterRegistrationBean<TenantSecurityWebFilter> registrationBean = new FilterRegistrationBean<>();
-        registrationBean.setFilter(new TenantSecurityWebFilter(tenantProperties,
-                tenantFrameworkService));
-        registrationBean.setOrder(WebFilterOrderEnum.TENANT_SECURITY_FILTER);
-        return registrationBean;
-    }
 
 
     // ========== WEB ==========
     // ========== WEB ==========
     @Bean
     @Bean

+ 4 - 8
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantDatabaseInterceptor.java

@@ -36,15 +36,11 @@ public class TenantDatabaseInterceptor implements TenantLineHandler {
     @Override
     @Override
     public Expression getTenantId() {
     public Expression getTenantId() {
         HttpServletRequest request = ServletUtils.getRequest();
         HttpServletRequest request = ServletUtils.getRequest();
-        Boolean ignore = TenantContextHolder.isIgnore();
-        if(ignore==null){
-            if(request==null){
-                TenantContextHolder.setIgnore(true);
-            }else {
-                TenantContextHolder.setIgnore(false);
-            }
+        Boolean ignore = Boolean.TRUE.equals(TenantContextHolder.isIgnore());
+        if(request==null){
+            ignore=true;
         }
         }
-        return new StringValue(LoginUserStrategy.tr.getTenantId());
+        return ignore?new StringValue(""):new StringValue(LoginUserStrategy.tr.getTenantId());
     }
     }
 
 
     @Override
     @Override

+ 10 - 4
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java

@@ -22,11 +22,17 @@ public class TenantContextWebFilter extends OncePerRequestFilter {
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
             throws ServletException, IOException {
             throws ServletException, IOException {
         // 设置
         // 设置
-        String tenantId = LoginUserStrategy.tr.getTenantId();
-        if (tenantId != null) {
-            TenantContextHolder.setTenantId(tenantId);
-            TenantContextHolder.setIgnore(false);
+        try {
+            String tenantId = LoginUserStrategy.tr.getTenantId();
+            if (tenantId != null) {
+                TenantContextHolder.setTenantId(tenantId);
+                TenantContextHolder.setIgnore(false);
+            }
+        }catch (Exception e){
+            //用户未登录
+            TenantContextHolder.setIgnore(true);
         }
         }
+
         chain.doFilter(request, response);
         chain.doFilter(request, response);
     }
     }
 
 

+ 6 - 0
tr-plugins/tr-spring-boot-starter-plugin-dict/src/main/java/cn/tr/plugin/dict/bo/DictBO.java

@@ -1,7 +1,11 @@
 package cn.tr.plugin.dict.bo;
 package cn.tr.plugin.dict.bo;
 
 
 import cn.tr.plugin.dict.constant.DictConstant;
 import cn.tr.plugin.dict.constant.DictConstant;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 
 
@@ -11,6 +15,8 @@ import java.io.Serializable;
  * @Author : LF
  * @Author : LF
  * @Date: 2023年03月06日
  * @Date: 2023年03月06日
  */
  */
+@Builder
+@Accessors(chain = true)
 @Data
 @Data
 public class DictBO implements Serializable {
 public class DictBO implements Serializable {
     private static final long serialVersionUID = 5142288478671327671L;
     private static final long serialVersionUID = 5142288478671327671L;

+ 1 - 1
tr-test/src/main/java/cn/tr/test/WebApplication.java

@@ -25,7 +25,7 @@ import javax.annotation.PostConstruct;
  * @Date: 2023年02月22日
  * @Date: 2023年02月22日
  */
  */
 @SpringBootApplication(scanBasePackages = "cn.tr.module.*")
 @SpringBootApplication(scanBasePackages = "cn.tr.module.*")
-@MapperScan("cn.tr.module.**.repository.**")
+@MapperScan("cn.tr.module.sys.*.repository")
 public class WebApplication {
 public class WebApplication {
     static {
     static {
         AuthStrategy.tr
         AuthStrategy.tr

+ 6 - 9
tr-test/src/main/resources/application-doc.yml

@@ -1,16 +1,13 @@
 knife4j:
 knife4j:
   enable: true
   enable: true
   openapi:
   openapi:
-    title: Knife4j官方文档
-    description: "`我是测试`,**你知道吗**
-    # aaa"
-    email: xiaoymin@foxmail.com
-    concat: 八一菜刀
-    url: https://docs.xiaominfo.com
-    version: v4.0
+    title: 驼人基础设施功能开发文档
+    description: 该接口文档用于开发基础功能
+    email: 八一菜刀
+    concat: lf
+#    url: http://192.168.100.32:7070
+    version: V0.9
     license: Apache 2.0
     license: Apache 2.0
-    license-url: https://stackoverflow.com/
-    terms-of-service-url: https://stackoverflow.com/
     group:
     group:
       auth:
       auth:
         group-name: 认证和用户分组
         group-name: 认证和用户分组

+ 22 - 2
tr-test/src/main/resources/application.yml

@@ -6,11 +6,11 @@ server:
   shutdown: graceful
   shutdown: graceful
   port: 8083
   port: 8083
 
 
+#mybatis配置
 mybatis-plus:
 mybatis-plus:
   mapper-locations: classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml,classpath*:mapper/*/*.xml
   mapper-locations: classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml,classpath*:mapper/*/*.xml
   configuration:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
 spring:
 spring:
   datasource:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     type: com.alibaba.druid.pool.DruidDataSource
@@ -42,4 +42,24 @@ spring:
   cache:
   cache:
     type: caffeine
     type: caffeine
   profiles:
   profiles:
-    include: doc
+    include: doc
+
+
+sa-token:
+  is-read-header: true
+  # token名称 (同时也是cookie名称)
+  token-name: Authorization
+  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 一天
+  activity-timeout: 86400
+  # token有效期,单位s 默认30天, -1代表永不过期
+  timeout: -1
+  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
+  is-share: true
+  # 是否打开续签
+  auto-renew: true
+  # 是否输出操作日志
+  is-log: false
+  # 同一账号登录数量不做限制
+  max-login-count: -1