zhouzeyu před 1 týdnem
rodič
revize
55e0f1b5b1
43 změnil soubory, kde provedl 1880 přidání a 1065 odebrání
  1. 22 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/annotation/ExcelDict.java
  2. 24 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/annotation/Log.java
  3. 17 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/bo/DictModel.java
  4. 2 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/cache/ClusterConfigStorage.java
  5. 50 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/convert/ExcelDictConverter.java
  6. 30 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/entity/Entity.java
  7. 48 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/entity/GenericEntity.java
  8. 20 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/exception/CustomException.java
  9. 28 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/menus/DelFlagEnum.java
  10. 28 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/menus/LinkExternalEnum.java
  11. 12 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/mybatisplus/interceptor/GetNameInterface.java
  12. 68 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/utils/DictUtil.java
  13. 70 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/utils/ExcelUtil.java
  14. 20 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/exception/CustomException.java
  15. 0 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bean/AuthInfo.java
  16. 101 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bean/LoginUser.java
  17. 2 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/AuthController.java
  18. 46 46
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CaptchaController.java
  19. 25 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java
  20. 51 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/enums/GrantTypeEnum.java
  21. 68 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/granter/IAccountOperator.java
  22. 70 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/granter/IAuthGranter.java
  23. 269 270
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/LoginOAuth2PswUserOperator.java
  24. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java
  25. 53 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/utils/IpUtil.java
  26. 49 50
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageMenuService.java
  27. 53 53
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageService.java
  28. 81 82
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantService.java
  29. 85 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysDeptService.java
  30. 57 131
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysMenuService.java
  31. 75 75
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysOrgService.java
  32. 46 47
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalMenuService.java
  33. 83 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPostService.java
  34. 16 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleDeptService.java
  35. 9 51
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleMenuService.java
  36. 88 46
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleService.java
  37. 16 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPostService.java
  38. 9 59
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserRoleService.java
  39. 0 134
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserService.java
  40. 74 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/ISysUserService.java
  41. 4 5
      tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/common/service/impl/BusHospitalServiceImpl.java
  42. 2 1
      tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/web/utils/CaptchaTool.java
  43. 7 7
      tr-test/.flattened-pom.xml

+ 22 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/annotation/ExcelDict.java

@@ -0,0 +1,22 @@
+package cn.tr.module.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据字典注解
+ *
+ * @author Kevin
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface ExcelDict {
+
+    /**
+     * 字典编码
+     *
+     * @return
+     */
+    String value() default "";
+
+}

+ 24 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/annotation/Log.java

@@ -0,0 +1,24 @@
+package cn.tr.module.common.annotation;
+
+
+import cn.tr.module.common.menus.UserPlatformEnum;
+
+import java.lang.annotation.*;
+
+/**
+ * 日志注解
+ *
+ * @author Kevin
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log {
+    String title() default "";
+
+    /**
+     * 用户平台
+     */
+    UserPlatformEnum userPlatform() default UserPlatformEnum.WEB;
+
+}

+ 17 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/bo/DictModel.java

@@ -0,0 +1,17 @@
+package cn.tr.module.common.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 字典模型
+ *
+ * @author Kevin
+ */
+@Data
+public class DictModel implements Serializable {
+
+    String label;
+    String value;
+}

+ 2 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/cache/ClusterConfigStorage.java

@@ -12,10 +12,9 @@ import java.util.HashMap;
 import java.util.Map;
 
 public class ClusterConfigStorage implements ConfigStorage {
-    private BoundHashOperations<String, String, Object> boundHashOperations;
-
+    private  BoundHashOperations boundHashOperations;
     public ClusterConfigStorage(RedisTemplate redisTemplate,String name){
-        this.boundHashOperations = redisTemplate.boundHashOps(name);
+        boundHashOperations = redisTemplate.opsForSet().getOperations().boundHashOps(name);
     }
 
     @Override

+ 50 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/convert/ExcelDictConverter.java

@@ -0,0 +1,50 @@
+package cn.tr.module.common.convert;
+
+import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.module.common.annotation.ExcelDict;
+import cn.tr.module.common.utils.DictUtil;
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+
+import java.lang.reflect.Field;
+
+/**
+ * Excel数据字典转换器
+ *
+ * @author Kevin
+ */
+public class ExcelDictConverter implements Converter<String> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return String.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public String convertToJavaData(ReadCellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        Field field = excelContentProperty.getField();
+        String dictCode = AnnotationUtil.getAnnotationValue(field, ExcelDict.class);
+        String dictValue = DictUtil.getDictValue(dictCode, cellData.getStringValue());
+        return StrUtil.isBlank(dictValue) ? cellData.getStringValue() : dictValue;
+    }
+
+    @Override
+    public WriteCellData convertToExcelData(String s, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        Field field = excelContentProperty.getField();
+        String dictCode = AnnotationUtil.getAnnotationValue(field, ExcelDict.class);
+        String dictLabel = DictUtil.getDictLabel(dictCode, s);
+        return new WriteCellData(StrUtil.isBlank(dictLabel) ? s : dictLabel);
+    }
+
+}

+ 30 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/entity/Entity.java

@@ -0,0 +1,30 @@
+package cn.tr.module.common.entity;
+
+import cn.hutool.core.bean.BeanUtil;
+
+import java.io.Serializable;
+import java.util.function.Predicate;
+
+
+public interface Entity extends Serializable {
+    long serialVersionUID = 1L;
+
+    default boolean tryValidate(Predicate<? super Entity> predicate) {
+        return predicate.test(this);
+    }
+
+    default <T> T copyTo(Class<T> target, String... ignoreProperties) {
+        return BeanUtil.copyProperties(this, target, ignoreProperties);
+    }
+
+    default <T> T copyTo(T target, String... ignoreProperties) {
+        BeanUtil.copyProperties(this, target, ignoreProperties);
+        return target;
+    }
+
+
+    default Entity copyFrom(Object target, String... ignoreProperties) {
+        BeanUtil.copyProperties(target, this, ignoreProperties);
+        return this;
+    }
+}

+ 48 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/entity/GenericEntity.java

@@ -0,0 +1,48 @@
+package cn.tr.module.common.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import jakarta.validation.constraints.NotNull;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public abstract class GenericEntity<PK> implements Entity,RecordModifierEntity,RecordCreationEntity, Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(groups = Update.class,message = "id不可为空")
+    private PK id;
+
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "创建时间",readOnly = true)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "创建人",readOnly = true)
+    private String createBy;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @Schema(description = "修改人",readOnly = true)
+    private String updateBy;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @Schema(description = "修改时间",readOnly = true)
+    private Date updateTime;
+
+    /* 分组校验 */
+    public static @interface Update {
+    }
+
+    public static @interface Insert {
+    }
+}

+ 20 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/exception/CustomException.java

@@ -0,0 +1,20 @@
+package cn.tr.module.common.exception;
+
+import lombok.Data;
+
+/**
+ * 自定义异常
+ *
+ * @author Kevin
+ */
+@Data
+public class CustomException extends RuntimeException {
+
+    private Integer code;
+
+    private String message;
+
+    public CustomException(String message) {
+        this.message = message;
+    }
+}

+ 28 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/menus/DelFlagEnum.java

@@ -0,0 +1,28 @@
+package cn.tr.module.common.menus;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * 删除标记
+ *
+ * @author Kevin
+ */
+@Getter
+@AllArgsConstructor
+public enum DelFlagEnum {
+
+    /**
+     * 存在
+     */
+    NO("0", "存在"),
+    /**
+     * 删除
+     */
+    YES("1", "删除");
+
+    private String code;
+    private String desc;
+
+}

+ 28 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/menus/LinkExternalEnum.java

@@ -0,0 +1,28 @@
+package cn.tr.module.common.menus;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * 是否外链
+ *
+ * @author Kevin
+ */
+@Getter
+@AllArgsConstructor
+public enum LinkExternalEnum {
+
+    /**
+     * 是
+     */
+    YES("0", "是"),
+    /**
+     * 否
+     */
+    NO("1", "否");
+
+    private String code;
+    private String desc;
+
+}

+ 12 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/mybatisplus/interceptor/GetNameInterface.java

@@ -0,0 +1,12 @@
+package cn.tr.module.common.mybatisplus.interceptor;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName GetNameInterface.java
+ * @Description TODO
+ * @createTime 2022年03月22日 17:22:00
+ */
+public interface GetNameInterface<PK,T> {
+    T getName(PK id);
+}

+ 68 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/utils/DictUtil.java

@@ -0,0 +1,68 @@
+package cn.tr.module.common.utils;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+
+import cn.tr.module.common.bo.DictModel;
+import cn.tr.module.common.redis.RedisUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 字典缓存工具类
+ *
+ * @author Kevin
+ */
+@Component
+public class DictUtil {
+
+
+    public static String getCacheKey(String key) {
+        return String.format(Constants.SYS_DICT_TPL, key);
+    }
+
+    public static List<DictModel> getDictList(String dictCode) {
+        Object obj = SpringUtil.getBean(RedisUtils.class).get(getCacheKey(dictCode));
+        return Objects.nonNull(obj) ? (List<DictModel>) obj : new ArrayList<>();
+    }
+
+
+    public static void clearDict(String dictCode) {
+         SpringUtil.getBean(RedisUtils.class).del(getCacheKey(dictCode));
+    }
+
+    public static String getDictLabel(String dictCode, String dictValue) {
+        if (StrUtil.isBlank(dictCode) || StrUtil.isBlank(dictValue)) {
+            return "";
+        }
+        List<DictModel> dictModelList = getDictList(dictCode);
+        DictModel dictModel = dictModelList.stream().filter(x -> x.getValue().equals(dictValue)).findFirst().orElse(null);
+        return Objects.nonNull(dictModel) ? dictModel.getLabel() : "";
+    }
+
+    public static String getDictValue(String dictCode, String dictLabel) {
+        if (StrUtil.isBlank(dictCode) || StrUtil.isBlank(dictLabel)) {
+            return "";
+        }
+        List<DictModel> dictModelList = getDictList(dictCode);
+        DictModel dictModel = dictModelList.stream().filter(x -> x.getLabel().equals(dictLabel)).findFirst().orElse(null);
+        return Objects.nonNull(dictModel) ? dictModel.getValue() : "";
+    }
+
+    public static void setDictCache(String dictCode, List<DictModel> dictModelList) {
+        if (StrUtil.isBlank(dictCode) || Objects.isNull(dictModelList) || dictModelList.isEmpty()) {
+            return;
+        }
+        SpringUtil.getBean(RedisUtils.class).set(getCacheKey(dictCode), dictModelList);
+    }
+
+    public static void clearDictCache() {
+        Collection<String> keys = SpringUtil.getBean(RedisUtils.class).keys(getCacheKey("*"));
+        SpringUtil.getBean(RedisUtils.class).del(keys.toArray(new String[0]));
+    }
+
+}

+ 70 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/utils/ExcelUtil.java

@@ -0,0 +1,70 @@
+package cn.tr.module.common.utils;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.tr.module.common.menus.BizEnum;
+import cn.tr.module.common.properties.AppProperties;
+import cn.tr.module.excel.core.handler.write.CustomHorizontalCellStyleStrategy;
+import cn.tr.module.excel.core.utils.StyleUtils;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
+import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy;
+
+import lombok.extern.slf4j.Slf4j;
+
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Excel工具类
+ *
+ * @author Kevin
+ */
+@Slf4j
+public class ExcelUtil {
+    private static HorizontalCellStyleStrategy horizontalCellStyleStrategy =
+            new CustomHorizontalCellStyleStrategy(StyleUtils.getHeadStyle(), StyleUtils.getContentStyle());
+
+    public static String export(String filename, Class clazz, List list) {
+        return export(filename, clazz, list, filename);
+    }
+
+    public static String export(String filename, Class clazz, List list, String sheetName) {
+        filename = filename + "_" + IdUtil.fastSimpleUUID() + ".xlsx";
+        String filepath = "/" + BizEnum.TEMP.getCode() + "/" + DateUtil.today() + "/" + filename;
+        String absoluteFilepath = SpringUtil.getBean(AppProperties.class).getUploadDir() + filepath;
+        log.info("导出文件路径,{}", absoluteFilepath);
+        FileUtil.touch(absoluteFilepath);
+        EasyExcel.write(absoluteFilepath, clazz).head(clazz).sheet(sheetName).doWrite(list);
+        return filepath;
+    }
+
+    public static void exportResponse(HttpServletResponse response, String filename, Class clazz, List list) throws IOException {
+        ServletOutputStream outputStream = response.getOutputStream();
+        response.setHeader("content-type", "application/octet-stream;charset=UTF-8");
+        response.setContentType("application/octet-stream;charset=UTF-8");
+        ExcelWriter write = EasyExcel.write(outputStream, clazz).build();
+        createSheet(write,0,"全部数据",clazz,list);
+        IoUtil.flush(outputStream);
+        write.finish();
+        IoUtil.close(outputStream);
+    }
+
+    private static <T> void createSheet(ExcelWriter excelWriter, int sheetNo, String sheetName, Class<T> aClass, Collection<T> data){
+        WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheetName)
+                .registerWriteHandler(horizontalCellStyleStrategy)
+                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(13))
+                .registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 20, (short) 20))
+                .head(aClass).build();
+        excelWriter.write(data,writeSheet);
+    }
+}

+ 20 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/exception/CustomException.java

@@ -0,0 +1,20 @@
+package cn.tr.module.sys.exception;
+
+import lombok.Data;
+
+/**
+ * 自定义异常
+ *
+ * @author Kevin
+ */
+@Data
+public class CustomException extends RuntimeException {
+
+    private Integer code;
+
+    private String message;
+
+    public CustomException(String message) {
+        this.message = message;
+    }
+}

+ 0 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bean/AuthInfo.java

@@ -1,6 +1,5 @@
 package cn.tr.module.sys.oauth2.bean;
 
-
 import cn.tr.module.sys.oauth2.enums.GrantTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;

+ 101 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bean/LoginUser.java

@@ -0,0 +1,101 @@
+package cn.tr.module.sys.oauth2.bean;
+
+import cn.tr.module.sys.oauth2.enums.GrantTypeEnum;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 登录用户
+ *
+ * @author Kevin
+ */
+@Data
+public class LoginUser<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private T Id;
+    /**
+     * token
+     */
+    private String token;
+
+    /**
+     * 用户平台
+     */
+    private String userPlatform;
+
+    /**
+     * 授权类型
+     */
+    private GrantTypeEnum grantType;
+
+    /**
+     * 用户名 或者 appkey
+     */
+    private String username;
+
+    private String nickName;
+    /**
+     * 登录时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date loginTime;
+
+    /**
+     * 登录IP地址
+     */
+    private String ipAddress;
+
+    /**
+     * 登录地点
+     */
+    private String loginLocation;
+
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 权限列表
+     */
+    private Set<String> permissions;
+
+    /**
+     * 角色列表
+     */
+    private List<SysRoleInfo> roles;
+
+    @Schema(defaultValue = "权限体系名称")
+    private String loginType;
+
+    private T tenantId;
+
+    /**
+     * 是否为系统级别用户
+     *
+     **/
+    private boolean isSys;
+
+    /**
+     * 是否为超级管理员
+     */
+    private boolean isSuperAdmin;
+
+    private Boolean pswNeedReset=false;
+
+    private Date lastModifyPswTime;
+}

+ 2 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/AuthController.java

@@ -1,8 +1,8 @@
 package cn.tr.module.sys.oauth2.controller;
 
-
 import cn.tr.core.pojo.CommonResult;
-import cn.tr.module.sys.exception.CustomException;
+import cn.tr.module.common.annotation.Log;
+import cn.tr.module.common.exception.CustomException;
 import cn.tr.module.sys.oauth2.bean.AuthInfo;
 import cn.tr.module.sys.oauth2.bean.LoginUser;
 import cn.tr.module.sys.oauth2.granter.IAuthGranter;
@@ -15,7 +15,6 @@ import org.springframework.validation.annotation.Validated;
 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.common.annotation.Log;
 
 import java.util.List;
 import java.util.Optional;

+ 46 - 46
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CaptchaController.java

@@ -1,46 +1,46 @@
-package cn.tr.module.sys.oauth2.controller;
-
-import cn.dev33.satoken.annotation.SaIgnore;
-import cn.tr.core.exception.ServiceException;
-import cn.tr.core.exception.TRExcCode;
-import cn.tr.module.sys.oauth2.config.CaptchaOperator;
-import com.wf.captcha.ArithmeticCaptcha;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import java.awt.*;
-import java.io.IOException;
-
-/**
- * 验证码
- *
- * @author tr
- */
-@Tag(name = "验证码")
-@RestController
-@RequestMapping("/auth/captcha")
-@AllArgsConstructor
-public class CaptchaController {
-
-    private final CaptchaOperator captchaTool;
-
-    @GetMapping
-    @SaIgnore
-    @Operation(summary = "获取验证码", description = "生成并返回算术验证码图片")
-    public void get(@Parameter(description = "验证码key") @RequestParam("key") String key,
-                    HttpServletRequest request, HttpServletResponse response) {
-        // 算术类型
-        ArithmeticCaptcha captcha = new ArithmeticCaptcha(140, 38);
-        // 设置字体
-        captcha.setFont(new Font("Verdana", Font.PLAIN, 32));
-        try {
-            captchaTool.out(key, captcha, response);
-        } catch (IOException e) {
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "系统繁忙,请稍后再试");
-        }
-    }
-}
+//package cn.tr.module.sys.oauth2.controller;
+//
+//import cn.dev33.satoken.annotation.SaIgnore;
+//import cn.tr.core.exception.ServiceException;
+//import cn.tr.core.exception.TRExcCode;
+//import cn.tr.module.sys.oauth2.config.CaptchaOperator;
+//import com.wf.captcha.ArithmeticCaptcha;
+//import io.swagger.v3.oas.annotations.tags.Tag;
+//import io.swagger.v3.oas.annotations.Operation;
+//import io.swagger.v3.oas.annotations.Parameter;
+//import lombok.AllArgsConstructor;
+//import org.springframework.web.bind.annotation.*;
+//import jakarta.servlet.http.HttpServletRequest;
+//import jakarta.servlet.http.HttpServletResponse;
+//import java.awt.*;
+//import java.io.IOException;
+//
+///**
+// * 验证码
+// *
+// * @author tr
+// */
+//@Tag(name = "验证码")
+//@RestController
+//@RequestMapping("/auth/captcha")
+//@AllArgsConstructor
+//public class CaptchaController {
+//
+//    private final CaptchaOperator captchaTool;
+//
+//    @GetMapping
+//    @SaIgnore
+//    @Operation(summary = "获取验证码", description = "生成并返回算术验证码图片")
+//    public void get(@Parameter(description = "验证码key") @RequestParam("key") String key,
+//                    HttpServletRequest request, HttpServletResponse response) {
+//        // 算术类型
+//        ArithmeticCaptcha captcha = new ArithmeticCaptcha(140, 38);
+//        // 设置字体
+//        captcha.setFont(new Font("Verdana", Font.PLAIN, 32));
+//        try {
+//            captchaTool.out(key, captcha, response);
+//        } catch (IOException e) {
+//            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "系统繁忙,请稍后再试");
+//        }
+//    }
+//}

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

@@ -1,5 +1,8 @@
 //package cn.tr.module.sys.oauth2.controller;
 //
+//import cn.dev33.satoken.annotation.SaIgnore;
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.util.StrUtil;
 //import cn.tr.core.exception.ServiceException;
 //import cn.tr.core.exception.TRExcCode;
 //import cn.tr.core.pojo.CommonResult;
@@ -8,7 +11,9 @@
 //import cn.tr.module.sys.oauth2.psw.operator.AbstractOAuth2PswUserOperator;
 //import cn.tr.module.sys.oauth2.psw.operator.OAuth2PswUserOperatorManager;
 //import cn.tr.module.sys.oauth2.service.CurrentUserService;
+//import cn.tr.module.sys.user.dto.SysMenuDTO;
 //import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
+//import cn.tr.module.sys.user.enums.MenuEnum;
 //import cn.tr.module.sys.user.service.ISysMenuService;
 //import cn.tr.module.sys.user.vo.RouteItemVO;
 //import cn.tr.plugin.security.context.LoginUserContextHolder;
@@ -17,10 +22,12 @@
 //import io.swagger.v3.oas.annotations.Operation;
 //import io.swagger.v3.oas.annotations.Parameter;
 //import lombok.AllArgsConstructor;
+//import org.springframework.beans.factory.annotation.Autowired;
 //import org.springframework.web.bind.annotation.*;
 //
 //import java.util.Collection;
 //import java.util.List;
+//import java.util.stream.Collectors;
 //
 ///**
 // * @ClassName : CurrentUserController
@@ -62,6 +69,24 @@
 //        return CommonResult.success(TreeBuilder.buildTree(currentUserService.currentUserMenus(portalId)));
 //    }
 //
+//    //C端程序无用
+////    @Operation(summary = "查询匿名菜单树", description = "查询匿名菜单树")
+////    @PostMapping("/listAnonymousMenus")
+////    @SaIgnore
+////    public CommonResult<List<RouteItemVO>> getListAnonymousMenus() {
+////        List<SysMenuDTO> anonymousMenus = menuService.findAnonymousMenus();
+////        return CommonResult.success(TreeBuilder.buildTree(anonymousMenus
+////                .stream()
+////                .collect(Collectors.groupingBy(SysMenuDTO::getId, Collectors.collectingAndThen(Collectors.toList(), CollUtil::getFirst)))
+////                //未重复的菜单
+////                .values()
+////                .stream()
+////                .filter(menu -> !StrUtil.equals(MenuEnum.button.name(), menu.getMenuType()))
+////                .filter(menu-> Boolean.TRUE.equals(menu.getVisible()))
+////                .map(menuService::convertToRoute)
+////                .collect(Collectors.toList())));
+////    }
+//
 //    @Operation(summary = "获取登录用户的门户列表", description = "获取当前登录用户可访问的所有门户信息")
 //    @GetMapping("/listPortal")
 //    public CommonResult<List<SysUserPortalListDTO>> getPortals() {

+ 51 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/enums/GrantTypeEnum.java

@@ -0,0 +1,51 @@
+package cn.tr.module.sys.oauth2.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * 授权类型
+ *
+ * @author Kevin
+ */
+@Getter
+@AllArgsConstructor
+public enum GrantTypeEnum{
+
+    /**
+     * 网页端用户名密码模式
+     */
+    WEB_USERNAME_PASSWORD("1", "用户名密码模式"),
+    /**
+     * 手机号短信模式
+     */
+    MOBILE_CODE("2", "手机号短信模式"),
+
+    /**
+     * appkey、appSecret模式
+     */
+    APPKEY_APPSECRET("3", "第三方应用登录"),
+
+    /**
+     * appkey、appSecret模式
+     */
+    APP_DOCTOR("4", "app医生登录");
+
+
+    private String code;
+    private String desc;
+
+
+    public static Boolean contains(String code) {
+        return Arrays.stream(GrantTypeEnum.values()).anyMatch(temp -> temp.getCode().equals(code));
+    }
+
+    public static GrantTypeEnum valueOfCode(String code) {
+        Optional<GrantTypeEnum> first = Arrays.stream(GrantTypeEnum.values()).filter(temp -> temp.getCode().equals(code)).findFirst();
+        return
+                first.isPresent()?first.get():null;
+    }
+}

+ 68 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/granter/IAccountOperator.java

@@ -0,0 +1,68 @@
+package cn.tr.module.sys.oauth2.granter;
+
+
+
+import cn.tr.module.sys.oauth2.enums.GrantTypeEnum;
+import cn.tr.module.sys.oauth2.vo.UserInfoVO;
+import cn.tr.module.sys.user.vo.RouteItemVO;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName IAccountOperator.java
+ * @Description 账户操作符
+ * @createTime 2022年08月01日 14:45:00
+ */
+public interface IAccountOperator<T> {
+
+    /**
+     * 描述: 匹配登录方式
+     * @author lifang
+     * @date 2022/8/9 22:08
+     * @param type
+     * @return boolean
+     */
+    boolean matchGrantType(GrantTypeEnum type);
+
+    /**
+     * 描述: 获取当前用户信息
+     * @author lifang
+     * @date 2022/8/1 14:39
+     * @param
+     * @return UserInfoVO
+     */
+    UserInfoVO getUserInfo();
+
+    /**
+     * 描述: 获取当前用户权限标识
+     * @author lifang
+     * @date 2022/8/1 14:39
+     * @return Set<String>
+     */
+    Set<String> getPermCode();
+
+    /**
+     * 描述: 获取当前用户菜单列表
+     * @author lifang
+     * @date 2022/8/1 14:39
+     * @return Set<String>
+     */
+    List<RouteItemVO> getMenuList();
+
+
+//    AccountInfoVO<T> getAccountInfo();
+
+    /**
+     * 描述: 设置当前用户账户信息
+     * @author lifang
+     * @date 2022/8/1 14:39
+     * @param req 账户信息
+     * @return Set<String>
+     */
+//    void saveAccountInfo(AccountInfoVO<T> req);
+
+    boolean updatePass(String oldPass, String newPass);
+}

+ 70 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/granter/IAuthGranter.java

@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.tr.module.sys.oauth2.granter;
+
+
+import cn.dev33.satoken.spring.SpringMVCUtil;
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import cn.tr.module.sys.oauth2.bean.LoginUser;
+import cn.tr.module.sys.oauth2.enums.GrantTypeEnum;
+
+
+import cn.tr.module.sys.oauth2.utils.AddressUtil;
+import cn.tr.module.sys.oauth2.utils.IpUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+/**
+ * 授权认证统一接口.
+ *IAuthGranter
+ * @author Chill
+ */
+public interface IAuthGranter {
+
+	/**
+	 * 描述: 授权类型
+	 * @author lifang
+	 * @date 2022/8/1 14:46
+	 * @param
+	 */
+	GrantTypeEnum getType();
+	/**
+	 * 获取用户信息
+	 *
+	 * @param source 授权参数
+	 * @return UserInfo
+	 */
+	LoginUser grant(TokenParameter source);
+
+	/**
+	 * 描述: 填充用户登录信息
+	 * @author lifang
+	 * @date 2022/8/1 15:22
+	 * @param loginUser
+	 * @return void
+	 */
+	default void fillUserAgentInfo(LoginUser loginUser){
+		HttpServletRequest request = SpringMVCUtil.getRequest();
+		UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
+		String ipAddress = IpUtil.getClientIp(request);
+		loginUser.setIpAddress(ipAddress);
+		loginUser.setLoginLocation(AddressUtil.getRealAddressByIp(ipAddress));
+		loginUser.setBrowser(userAgent.getBrowser().getName());
+		loginUser.setOs(userAgent.getOs().getName());
+		loginUser.setLoginTime(new Date());
+	};
+}

+ 269 - 270
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/LoginOAuth2PswUserOperator.java

@@ -1,270 +1,269 @@
-package cn.tr.module.sys.oauth2.psw.operator;
-
-import cn.dev33.satoken.stp.StpLogic;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.useragent.UserAgent;
-import cn.hutool.http.useragent.UserAgentUtil;
-import cn.tr.core.annotation.TenantIgnore;
-import cn.tr.core.enums.LoginScopeType;
-import cn.tr.core.exception.ServiceException;
-import cn.tr.core.exception.TRExcCode;
-import cn.tr.core.utils.IpUtil;
-import cn.tr.core.utils.PswUtils;
-import cn.tr.core.utils.ServletUtils;
-import cn.tr.module.api.sys.log.enums.LoginType;
-import cn.tr.module.sys.config.SysConfigManager;
-import cn.tr.module.sys.config.SysConfigProperties;
-import cn.tr.module.sys.oauth2.config.CaptchaOperator;
-import cn.tr.module.sys.oauth2.dto.AccountUserInfoDTO;
-import cn.tr.module.sys.oauth2.dto.AccountUserInfoEditDTO;
-import cn.tr.module.sys.oauth2.mapper.OAuth2Mapper;
-import cn.tr.module.sys.oauth2.dto.OAuth2PswReqDTO;
-import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
-import cn.tr.module.sys.tenant.service.ISysTenantService;
-import cn.tr.module.sys.user.dto.SysOrgDTO;
-import cn.tr.module.sys.user.dto.SysPositionDTO;
-import cn.tr.module.sys.user.dto.SysRoleDTO;
-import cn.tr.module.sys.user.dto.SysUserDTO;
-import cn.tr.module.sys.user.enums.UserStatusEnum;
-import cn.tr.module.sys.user.mapper.SysOrgMapper;
-import cn.tr.module.sys.user.mapper.SysPositionMapper;
-import cn.tr.module.sys.user.mapper.SysRoleMapper;
-import cn.tr.module.sys.user.po.SysUserPO;
-import cn.tr.module.sys.user.repository.SysUserRepository;
-import cn.tr.module.sys.user.service.ISysOrgService;
-import cn.tr.module.sys.user.service.ISysPositionService;
-import cn.tr.module.sys.user.service.ISysRoleService;
-import cn.tr.module.sys.user.service.ISysUserService;
-import cn.tr.plugin.security.bo.UserLoginInfoBO;
-import cn.tr.plugin.security.constant.SecurityConstant;
-import cn.tr.plugin.security.context.LoginUserContextHolder;
-import cn.tr.plugin.security.utils.SaTokenUtils;
-import jakarta.annotation.Resource;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * 默认账号体系登录操作
- *
- * @author lf
- * @date  2023/11/06 10:12
- */
-@Component
-public class LoginOAuth2PswUserOperator extends AbstractOAuth2PswUserOperator{
-    @Resource
-    @Lazy
-    private LoginOAuth2PswUserOperator self;
-    @Resource
-    private ISysUserService sysUserService;
-
-    @Resource
-    private SysUserRepository sysUserRepository;
-
-    @Resource
-    private ISysTenantService tenantService;
-
-    @Resource
-    private SysConfigManager configManager;
-
-    @Resource
-    private CaptchaOperator captchaOperator;
-
-    @Resource
-    private ISysOrgService orgService;
-
-    @Resource
-    private ISysRoleService roleService;
-
-    @Resource
-    private ISysPositionService positionService;
-
-    @Value("${tr.tenant.enable}")
-    private Boolean tenantEnable;
-
-    @Override
-    @TenantIgnore
-    public String auth(OAuth2PswReqDTO source) {
-        validate(source);
-        String username = source.getUsername();
-        String psw = source.getPassword();
-        //对账号进行校验
-        SysUserDTO user = sysUserService.selectUserByUsername(username);
-        if(user==null){
-            //账户不存在
-            throw new ServiceException(TRExcCode.USER_ERROR_A0201);
-        }
-        //对密码进行校验
-        if(!PswUtils.matchesPassword(psw, user.getPassword())){
-            throw new ServiceException(TRExcCode.USER_ERROR_A0210);
-        }
-        //查看用户是否被禁用
-        if(!StrUtil.equals(UserStatusEnum.normal.getValue(), user.getStatus())){
-            //用户都被禁用
-            throw new ServiceException(TRExcCode.USER_ERROR_A0202);
-        }
-        if(Boolean.TRUE.equals(tenantEnable)){
-            //查看租户是否被禁用
-            String tenantId = user.getTenantId();
-            SysTenantCommonDTO tenant = tenantService.selectSysTenantById(tenantId);
-            if(tenant==null){
-                throw new ServiceException(TRExcCode.USER_ERROR_A0205);
-            }
-            if (Boolean.TRUE.equals(tenant.getDisable())) {
-                throw new ServiceException(TRExcCode.USER_ERROR_A0204);
-            }
-        }
-        //验证码校验
-        SysConfigProperties current = configManager.getCurrent();
-        if (Boolean.TRUE.equals(current.getCaptchaOpen())) {
-            String captchaCode = source.getCaptchaCode();
-            if(StrUtil.isEmpty(captchaCode)){
-                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"验证码不能为空");
-            }
-            if(!captchaOperator.ver(source.getCaptchaKey(),source.getCaptchaCode())){
-                throw new ServiceException(TRExcCode.USER_ERROR_A0240);
-            }
-        }
-        StpLogic stpUtil = SaTokenUtils.getStpUtil();
-        stpUtil.login(user.getId());
-        String tokenValue = stpUtil.getTokenValue();
-        Date loginTime = new Date();
-        //更新最后登录信息
-        String ip = ServletUtils.getClientIP();
-        String cityInfo = IpUtil.getCityInfo(ip);
-        SysUserDTO updateUser = new SysUserDTO();
-        updateUser.setId(user.getId());
-        updateUser.setLastLoginDate(loginTime);
-        updateUser.setLastLoginIp(ip);
-        updateUser.setLastLoginAddress(cityInfo);
-        sysUserService.updateLastLoginInfo(user.getId(),loginTime,ip,cityInfo);
-        //清除缓存
-        self.delUserLoginInfoCache(user.getId());
-
-        UserAgent userAgent = Optional.ofNullable(UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"))).orElse(new UserAgent());
-        String browser = ObjectUtil.isEmpty(userAgent.getBrowser()) ? "未知" : userAgent.getBrowser().getName();
-        String os = ObjectUtil.isEmpty(userAgent.getOs()) ? "未知" : userAgent.getOs().getName();
-
-        UserLoginInfoBO loginInfo = UserLoginInfoBO.builder()
-                .userId(user.getId())
-                .nickname(user.getNickname())
-                .username(username)
-                .tenantId(user.getTenantId())
-                .token(tokenValue)
-                .loginType(StpUtil.TYPE)
-                .loginIp(updateUser.getLastLoginIp())
-                .loginLocation(cityInfo)
-                .loginTime(loginTime)
-                .browser(browser)
-                .os(os)
-                .signature(user.getSignature())
-                .build();
-        setSessionUser(tokenValue,loginInfo);
-        return tokenValue;
-    }
-
-    @Override
-    public boolean updatePsw(String oldPsw, String newPsw) {
-        return  sysUserService.updatePsw(LoginUserContextHolder.getUser().getUserId(),oldPsw,newPsw);
-    }
-
-    @Override
-    public Object getUserLoginInfo() {
-        String loginId =String.valueOf( SaTokenUtils.getStpUtil().getLoginId());
-        return OAuth2Mapper.INSTANCE.toPswLoginInfo(sysUserService.selectSysUserById(loginId));
-    }
-
-    @Override
-    public AccountUserInfoDTO getAccountInfo() {
-        AccountUserInfoDTO result = new AccountUserInfoDTO();
-        String loginId =String.valueOf( SaTokenUtils.getStpUtil().getLoginId());
-        SysUserDTO user = sysUserService.selectSysUserById(loginId);
-
-        AccountUserInfoDTO.BasicInfo basicInfo = AccountUserInfoDTO.BasicInfo.builder()
-                .userId(user.getId())
-                .avatar(user.getAvatar())
-                .username(user.getUsername())
-                .nickname(user.getNickname())
-                .gender(user.getGender())
-                .phone(user.getPhone())
-                .email(user.getEmail())
-                .createTime(user.getCreateTime())
-                .lastLoginIp(user.getLastLoginIp())
-                .lastLoginAddress(user.getLastLoginAddress())
-                .lastLoginDate(user.getLastLoginDate())
-                .signature(user.getSignature())
-                .build();
-        //填充角色信息
-        List<SysRoleDTO> roles = roleService.selectSysRoleByIds(user.getRoleIds());
-        basicInfo.setRoles(SysRoleMapper.INSTANCE.convertSmallList(roles));
-        //填充岗位信息
-        List<SysPositionDTO> positions = positionService.selectSysPositionByIds(user.getPostIds());
-        basicInfo.setPositions(SysPositionMapper.INSTANCE.convertSmallList(positions));
-        //填充机构信息
-        SysOrgDTO sysOrgDTO = orgService.selectSysOrgById(user.getOrgId());
-        basicInfo.setOrg(SysOrgMapper.INSTANCE.convertSmall(sysOrgDTO));
-        result.setBasicInfo(basicInfo);
-        return result;
-    }
-
-    @Override
-    public void updateAccountUserInfo(String userId, AccountUserInfoEditDTO source) {
-        if(StrUtil.isBlank(source.getAvatar())
-                &&StrUtil.isBlank(source.getNickname())
-                &&StrUtil.isBlank(source.getGender())
-                &&StrUtil.isBlank(source.getPhone())
-                &&StrUtil.isBlank(source.getEmail())
-                &&StrUtil.isBlank(source.getSignature())){
-            return;
-        }
-
-        SysUserPO sysUserPO = OAuth2Mapper.INSTANCE.toSysUser(source);
-        sysUserPO.setId(userId);
-        UserLoginInfoBO user = LoginUserContextHolder.getUser();
-        user.setAvatar(source.getAvatar());
-        user.setNickname(source.getNickname());
-        user.setSignature(source.getSignature());
-        sysUserRepository.updateById(sysUserPO);
-        sysUserService.delUserIdAndNickNameCache();
-        SaTokenUtils.set(SecurityConstant.LOGIN_USER,user);
-    }
-
-    @Override
-    public String matchLoginType() {
-        return LoginScopeType.LOGIN_SCOPE_TYPE_NORMAL;
-    }
-
-
-    /**
-     * 验证用户名和密码的有效性
-     * @throws IllegalArgumentException 当验证失败时抛出
-     */
-    public void validate(OAuth2PswReqDTO source) throws IllegalArgumentException {
-        // 验证用户名
-        if (source.getUsername() == null || source.getUsername() .trim().isEmpty()) {
-            throw new IllegalArgumentException("账号不能为空");
-        }
-
-        if (source.getUsername() .length() < 4 || source.getUsername() .length() > 16) {
-            throw new IllegalArgumentException("账号长度为 4-16 位");
-        }
-
-        if (!source.getUsername() .matches("^[A-Za-z0-9]+$")) {
-            throw new IllegalArgumentException("账号格式为数字以及字母");
-        }
-
-        // 验证密码
-        if (source.getPassword() == null || source.getPassword().trim().isEmpty()) {
-            throw new IllegalArgumentException("密码不能为空");
-        }
-
-        if (source.getPassword().length() < 4 || source.getPassword().length() > 16) {
-            throw new IllegalArgumentException("密码长度为 4-16 位");
-        }
-    }
-}
+//package cn.tr.module.sys.oauth2.psw.operator;
+//
+//import cn.dev33.satoken.stp.StpLogic;
+//import cn.dev33.satoken.stp.StpUtil;
+//import cn.hutool.core.util.ObjectUtil;
+//import cn.hutool.core.util.StrUtil;
+//import cn.hutool.http.useragent.UserAgent;
+//import cn.hutool.http.useragent.UserAgentUtil;
+//import cn.tr.core.annotation.TenantIgnore;
+//import cn.tr.core.enums.LoginScopeType;
+//import cn.tr.core.exception.ServiceException;
+//import cn.tr.core.exception.TRExcCode;
+//import cn.tr.core.utils.IpUtil;
+//import cn.tr.core.utils.PswUtils;
+//import cn.tr.core.utils.ServletUtils;
+//import cn.tr.module.sys.config.SysConfigManager;
+//import cn.tr.module.sys.config.SysConfigProperties;
+//import cn.tr.module.sys.oauth2.config.CaptchaOperator;
+//import cn.tr.module.sys.oauth2.dto.AccountUserInfoDTO;
+//import cn.tr.module.sys.oauth2.dto.AccountUserInfoEditDTO;
+//import cn.tr.module.sys.oauth2.mapper.OAuth2Mapper;
+//import cn.tr.module.sys.oauth2.dto.OAuth2PswReqDTO;
+//import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
+//import cn.tr.module.sys.tenant.service.ISysTenantService;
+//import cn.tr.module.sys.user.dto.SysOrgDTO;
+//import cn.tr.module.sys.user.dto.SysPositionDTO;
+//import cn.tr.module.sys.user.dto.SysRoleDTO;
+//import cn.tr.module.sys.user.dto.SysUserDTO;
+//import cn.tr.module.sys.user.enums.UserStatusEnum;
+//import cn.tr.module.sys.user.mapper.SysOrgMapper;
+//import cn.tr.module.sys.user.mapper.SysPositionMapper;
+//import cn.tr.module.sys.user.mapper.SysRoleMapper;
+//import cn.tr.module.sys.user.po.SysUserPO;
+//import cn.tr.module.sys.user.repository.SysUserRepository;
+//import cn.tr.module.sys.user.service.ISysOrgService;
+//import cn.tr.module.sys.user.service.ISysPositionService;
+//import cn.tr.module.sys.user.service.ISysRoleService;
+//import cn.tr.module.sys.user.service.ISysUserService;
+//import cn.tr.plugin.security.bo.UserLoginInfoBO;
+//import cn.tr.plugin.security.constant.SecurityConstant;
+//import cn.tr.plugin.security.context.LoginUserContextHolder;
+//import cn.tr.plugin.security.utils.SaTokenUtils;
+//import jakarta.annotation.Resource;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Lazy;
+//import org.springframework.stereotype.Component;
+//import java.util.Date;
+//import java.util.List;
+//import java.util.Optional;
+//
+///**
+// * 默认账号体系登录操作
+// *
+// * @author lf
+// * @date  2023/11/06 10:12
+// */
+//@Component
+//public class LoginOAuth2PswUserOperator extends AbstractOAuth2PswUserOperator{
+//    @Resource
+//    @Lazy
+//    private LoginOAuth2PswUserOperator self;
+//    @Resource
+//    private ISysUserService sysUserService;
+//
+//    @Resource
+//    private SysUserRepository sysUserRepository;
+//
+//    @Resource
+//    private ISysTenantService tenantService;
+//
+//    @Resource
+//    private SysConfigManager configManager;
+//
+//    @Resource
+//    private CaptchaOperator captchaOperator;
+//
+//    @Resource
+//    private ISysOrgService orgService;
+//
+//    @Resource
+//    private ISysRoleService roleService;
+//
+//    @Resource
+//    private ISysPositionService positionService;
+//
+//    @Value("${tr.tenant.enable}")
+//    private Boolean tenantEnable;
+//
+//    @Override
+//    @TenantIgnore
+//    public String auth(OAuth2PswReqDTO source) {
+//        validate(source);
+//        String username = source.getUsername();
+//        String psw = source.getPassword();
+//        //对账号进行校验
+//        SysUserDTO user = sysUserService.selectUserByUsername(username);
+//        if(user==null){
+//            //账户不存在
+//            throw new ServiceException(TRExcCode.USER_ERROR_A0201);
+//        }
+//        //对密码进行校验
+//        if(!PswUtils.matchesPassword(psw, user.getPassword())){
+//            throw new ServiceException(TRExcCode.USER_ERROR_A0210);
+//        }
+//        //查看用户是否被禁用
+//        if(!StrUtil.equals(UserStatusEnum.normal.getValue(), user.getStatus())){
+//            //用户都被禁用
+//            throw new ServiceException(TRExcCode.USER_ERROR_A0202);
+//        }
+//        if(Boolean.TRUE.equals(tenantEnable)){
+//            //查看租户是否被禁用
+//            String tenantId = user.getTenantId();
+//            SysTenantCommonDTO tenant = tenantService.selectSysTenantById(tenantId);
+//            if(tenant==null){
+//                throw new ServiceException(TRExcCode.USER_ERROR_A0205);
+//            }
+//            if (Boolean.TRUE.equals(tenant.getDisable())) {
+//                throw new ServiceException(TRExcCode.USER_ERROR_A0204);
+//            }
+//        }
+//        //验证码校验
+//        SysConfigProperties current = configManager.getCurrent();
+//        if (Boolean.TRUE.equals(current.getCaptchaOpen())) {
+//            String captchaCode = source.getCaptchaCode();
+//            if(StrUtil.isEmpty(captchaCode)){
+//                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"验证码不能为空");
+//            }
+//            if(!captchaOperator.ver(source.getCaptchaKey(),source.getCaptchaCode())){
+//                throw new ServiceException(TRExcCode.USER_ERROR_A0240);
+//            }
+//        }
+//        StpLogic stpUtil = SaTokenUtils.getStpUtil();
+//        stpUtil.login(user.getId());
+//        String tokenValue = stpUtil.getTokenValue();
+//        Date loginTime = new Date();
+//        //更新最后登录信息
+//        String ip = ServletUtils.getClientIP();
+//        String cityInfo = IpUtil.getCityInfo(ip);
+//        SysUserDTO updateUser = new SysUserDTO();
+//        updateUser.setId(user.getId());
+//        updateUser.setLastLoginDate(loginTime);
+//        updateUser.setLastLoginIp(ip);
+//        updateUser.setLastLoginAddress(cityInfo);
+//        sysUserService.updateLastLoginInfo(user.getId(),loginTime,ip,cityInfo);
+//        //清除缓存
+//        self.delUserLoginInfoCache(user.getId());
+//
+//        UserAgent userAgent = Optional.ofNullable(UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"))).orElse(new UserAgent());
+//        String browser = ObjectUtil.isEmpty(userAgent.getBrowser()) ? "未知" : userAgent.getBrowser().getName();
+//        String os = ObjectUtil.isEmpty(userAgent.getOs()) ? "未知" : userAgent.getOs().getName();
+//
+//        UserLoginInfoBO loginInfo = UserLoginInfoBO.builder()
+//                .userId(user.getId())
+//                .nickname(user.getNickname())
+//                .username(username)
+//                .tenantId(user.getTenantId())
+//                .token(tokenValue)
+//                .loginType(StpUtil.TYPE)
+//                .loginIp(updateUser.getLastLoginIp())
+//                .loginLocation(cityInfo)
+//                .loginTime(loginTime)
+//                .browser(browser)
+//                .os(os)
+//                .signature(user.getSignature())
+//                .build();
+//        setSessionUser(tokenValue,loginInfo);
+//        return tokenValue;
+//    }
+//
+//    @Override
+//    public boolean updatePsw(String oldPsw, String newPsw) {
+//        return  sysUserService.updatePsw(LoginUserContextHolder.getUser().getUserId(),oldPsw,newPsw);
+//    }
+//
+//    @Override
+//    public Object getUserLoginInfo() {
+//        String loginId =String.valueOf( SaTokenUtils.getStpUtil().getLoginId());
+//        return OAuth2Mapper.INSTANCE.toPswLoginInfo(sysUserService.selectSysUserById(loginId));
+//    }
+//
+//    @Override
+//    public AccountUserInfoDTO getAccountInfo() {
+//        AccountUserInfoDTO result = new AccountUserInfoDTO();
+//        String loginId =String.valueOf( SaTokenUtils.getStpUtil().getLoginId());
+//        SysUserDTO user = sysUserService.selectSysUserById(loginId);
+//
+//        AccountUserInfoDTO.BasicInfo basicInfo = AccountUserInfoDTO.BasicInfo.builder()
+//                .userId(user.getId())
+//                .avatar(user.getAvatar())
+//                .username(user.getUsername())
+//                .nickname(user.getNickname())
+//                .gender(user.getGender())
+//                .phone(user.getPhone())
+//                .email(user.getEmail())
+//                .createTime(user.getCreateTime())
+//                .lastLoginIp(user.getLastLoginIp())
+//                .lastLoginAddress(user.getLastLoginAddress())
+//                .lastLoginDate(user.getLastLoginDate())
+//                .signature(user.getSignature())
+//                .build();
+//        //填充角色信息
+//        List<SysRoleDTO> roles = roleService.selectSysRoleByIds(user.getRoleIds());
+//        basicInfo.setRoles(SysRoleMapper.INSTANCE.convertSmallList(roles));
+//        //填充岗位信息
+//        List<SysPositionDTO> positions = positionService.selectSysPositionByIds(user.getPostIds());
+//        basicInfo.setPositions(SysPositionMapper.INSTANCE.convertSmallList(positions));
+//        //填充机构信息
+//        SysOrgDTO sysOrgDTO = orgService.selectSysOrgById(user.getOrgId());
+//        basicInfo.setOrg(SysOrgMapper.INSTANCE.convertSmall(sysOrgDTO));
+//        result.setBasicInfo(basicInfo);
+//        return result;
+//    }
+//
+//    @Override
+//    public void updateAccountUserInfo(String userId, AccountUserInfoEditDTO source) {
+//        if(StrUtil.isBlank(source.getAvatar())
+//                &&StrUtil.isBlank(source.getNickname())
+//                &&StrUtil.isBlank(source.getGender())
+//                &&StrUtil.isBlank(source.getPhone())
+//                &&StrUtil.isBlank(source.getEmail())
+//                &&StrUtil.isBlank(source.getSignature())){
+//            return;
+//        }
+//
+//        SysUserPO sysUserPO = OAuth2Mapper.INSTANCE.toSysUser(source);
+//        sysUserPO.setId(userId);
+//        UserLoginInfoBO user = LoginUserContextHolder.getUser();
+//        user.setAvatar(source.getAvatar());
+//        user.setNickname(source.getNickname());
+//        user.setSignature(source.getSignature());
+//        sysUserRepository.updateById(sysUserPO);
+//        sysUserService.delUserIdAndNickNameCache();
+//        SaTokenUtils.set(SecurityConstant.LOGIN_USER,user);
+//    }
+//
+//    @Override
+//    public String matchLoginType() {
+//        return LoginScopeType.LOGIN_SCOPE_TYPE_NORMAL;
+//    }
+//
+//
+//    /**
+//     * 验证用户名和密码的有效性
+//     * @throws IllegalArgumentException 当验证失败时抛出
+//     */
+//    public void validate(OAuth2PswReqDTO source) throws IllegalArgumentException {
+//        // 验证用户名
+//        if (source.getUsername() == null || source.getUsername() .trim().isEmpty()) {
+//            throw new IllegalArgumentException("账号不能为空");
+//        }
+//
+//        if (source.getUsername() .length() < 4 || source.getUsername() .length() > 16) {
+//            throw new IllegalArgumentException("账号长度为 4-16 位");
+//        }
+//
+//        if (!source.getUsername() .matches("^[A-Za-z0-9]+$")) {
+//            throw new IllegalArgumentException("账号格式为数字以及字母");
+//        }
+//
+//        // 验证密码
+//        if (source.getPassword() == null || source.getPassword().trim().isEmpty()) {
+//            throw new IllegalArgumentException("密码不能为空");
+//        }
+//
+//        if (source.getPassword().length() < 4 || source.getPassword().length() > 16) {
+//            throw new IllegalArgumentException("密码长度为 4-16 位");
+//        }
+//    }
+//}

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java

@@ -6,6 +6,7 @@
 //import cn.tr.core.exception.ServiceException;
 //import cn.tr.core.exception.TRExcCode;
 //import cn.tr.module.sys.tenant.service.ISysTenantService;
+//import cn.tr.module.sys.user.dto.SysMenuDTO;
 //import cn.tr.module.sys.user.dto.SysRoleDTO;
 //import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 //import cn.tr.module.sys.user.enums.MenuEnum;
@@ -34,7 +35,7 @@
 //    @Autowired
 //    private  ISysTenantService tenantService;
 //    @Autowired
-//    private ISysMenuService menuService;
+//    private  ISysMenuService menuService;
 //    @Autowired
 //    private  ISysPortalMenuService portalMenuService;
 //    @Autowired

+ 53 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/utils/IpUtil.java

@@ -0,0 +1,53 @@
+package cn.tr.module.sys.oauth2.utils;
+
+import cn.hutool.core.util.StrUtil;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * IP获取工具
+ *
+ * @author Kevin
+ */
+public class IpUtil {
+
+    public static String getClientIp(HttpServletRequest request) {
+//        // natapp穿透工具搭建的环境,通过header,X-Natapp-Ip,获取
+//        String ipAddress = ServletUtil.getClientIPByHeader(request, "X-Natapp-Ip");
+//        if (StrUtil.isBlank(ipAddress)) {
+//            ipAddress = ServletUtil.getClientIP(request);
+//        }
+//        // 本地开发,客户端和服务器在同一台机器,获取到是0:0:0:0:0:0:0:1,ip6地址,需要进行转换
+//        ipAddress = "0:0:0:0:0:0:0:1".equals(ipAddress) ? "127.0.0.1" : ipAddress;
+        return getIpAddress(request);
+    }
+
+    public static String getIpAddress(HttpServletRequest request) {
+
+        String sourceIp = null;
+
+        String ipAddresses = request.getHeader("x-forwarded-for");
+
+        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
+            ipAddresses = request.getHeader("Proxy-Client-IP");
+        }
+        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
+            ipAddresses = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
+            ipAddresses = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
+            ipAddresses = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
+            ipAddresses = request.getRemoteAddr();
+        }
+        if (!StrUtil.isEmpty(ipAddresses)) {
+            sourceIp = ipAddresses.split(",")[0];
+        }
+
+        return sourceIp;
+    }
+
+}

+ 49 - 50
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageMenuService.java

@@ -1,50 +1,49 @@
-package cn.tr.module.sys.tenant.service;
-
-import cn.tr.module.sys.user.dto.SysMenuDTO;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.util.*;
-/**
- * @ClassName : ISysTenantPackageMenuService
- * @Description :
- * @Author : LF
- * @Date: 2023年04月07日
- */
-
-public interface ISysTenantPackageMenuService {
-    /**
-     * 为租户套餐分配菜单
-     * @param packageId 套餐id
-     * @param
-     * @return
-     */
-    void assignPackageMenu(String packageId,List<String> menuIds);
-
-    /**
-     * 通过菜单id找到所有持有该菜单的套餐
-     * @param menuIds
-     * @param containsSys 是否包含系统套餐
-     * @return
-     */
-    Set<String> findPackageIdByMenuId(Collection<String> menuIds,boolean containsSys);
-
-    /**
-     * 删除套餐缓存
-     * {@link ISysTenantPackageMenuService#assignPackageMenu(String,List)}
-     * {@link cn.tr.module.sys.user.service.ISysMenuService#deleteSysMenuByIds(Collection)}
-     * {@link cn.tr.module.sys.user.service.ISysMenuService#updateSysMenuById(SysMenuDTO)}
-     * @param packageId
-     */
-    @CacheEvict(value = "global:menu:package",key = "#packageId")
-    default void delCacheMenuIdByPackageId(String packageId){
-
-    }
-    /**
-     * 找到套餐下所有的菜单id
-     * @param packageId
-     * @return
-     */
-    @Cacheable(value = "global:menu:package",key = "#packageId")
-    Set<SysMenuDTO> findMenuIdByPackageId(String packageId);
-}
+//package cn.tr.module.sys.tenant.service;
+//
+//import org.springframework.cache.annotation.CacheEvict;
+//import org.springframework.cache.annotation.Cacheable;
+//
+//import java.util.*;
+///**
+// * @ClassName : ISysTenantPackageMenuService
+// * @Description :
+// * @Author : LF
+// * @Date: 2023年04月07日
+// */
+//
+//public interface ISysTenantPackageMenuService {
+//    /**
+//     * 为租户套餐分配菜单
+//     * @param packageId 套餐id
+//     * @param
+//     * @return
+//     */
+//    void assignPackageMenu(String packageId,List<String> menuIds);
+//
+//    /**
+//     * 通过菜单id找到所有持有该菜单的套餐
+//     * @param menuIds
+//     * @param containsSys 是否包含系统套餐
+//     * @return
+//     */
+//    Set<String> findPackageIdByMenuId(Collection<String> menuIds,boolean containsSys);
+//
+//    /**
+//     * 删除套餐缓存
+//     * {@link ISysTenantPackageMenuService#assignPackageMenu(String,List)}
+//     * {@link cn.tr.module.sys.user.service.ISysMenuService#deleteSysMenuByIds(Collection)}
+//     * {@link cn.tr.module.sys.user.service.ISysMenuService#updateSysMenuById(SysMenuDTO)}
+//     * @param packageId
+//     */
+//    @CacheEvict(value = "global:menu:package",key = "#packageId")
+//    default void delCacheMenuIdByPackageId(String packageId){
+//
+//    }
+//    /**
+//     * 找到套餐下所有的菜单id
+//     * @param packageId
+//     * @return
+//     */
+//    @Cacheable(value = "global:menu:package",key = "#packageId")
+//    Set<SysMenuDTO> findMenuIdByPackageId(String packageId);
+//}

+ 53 - 53
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageService.java

@@ -1,53 +1,53 @@
-package cn.tr.module.sys.tenant.service;
-
-import cn.tr.module.sys.tenant.dto.SysTenantPackageDTO;
-import cn.tr.module.sys.tenant.dto.SysTenantPackageQueryDTO;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @ClassName : ISysTenantPackageService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
- */
-public interface ISysTenantPackageService {
-
-    /**
-     * 根据条件查询
-     * @param query 查询参数
-     * @return
-     */
-    List<SysTenantPackageDTO> selectSysTenantPackageList(SysTenantPackageQueryDTO query);
-
-    /**
-     * 根据id查询操作租户套餐
-     * @param id 租户套餐id
-     * @return 租户套餐
-     */
-    SysTenantPackageDTO selectSysTenantPackageById(String id);
-
-    /**
-     * 更新租户套餐
-     * @param source 更新租户套餐
-     * @return true:更新成功
-     */
-    boolean updateSysTenantPackageById(SysTenantPackageDTO source);
-
-    /**
-     * 新增租户套餐
-     * @param source 新增租户套餐
-     * @return true:新增成功
-     */
-    boolean insertSysTenantPackage(SysTenantPackageDTO source);
-
-    /**
-     * 根据id删除租户套餐
-     * @param ids 租户套餐id
-     * @return 删除数量
-     */
-    int removeSysTenantPackageByIds(Collection<String> ids);
-
-    Collection<SysTenantPackageDTO> findAllSysPackages();
-}
+//package cn.tr.module.sys.tenant.service;
+//
+//import cn.tr.module.sys.tenant.dto.SysTenantPackageDTO;
+//import cn.tr.module.sys.tenant.dto.SysTenantPackageQueryDTO;
+//
+//import java.util.Collection;
+//import java.util.List;
+//
+///**
+// * @ClassName : ISysTenantPackageService
+// * @Description :
+// * @Author : LF
+// * @Date: 2023年03月31日
+// */
+//public interface ISysTenantPackageService {
+//
+//    /**
+//     * 根据条件查询
+//     * @param query 查询参数
+//     * @return
+//     */
+//    List<SysTenantPackageDTO> selectSysTenantPackageList(SysTenantPackageQueryDTO query);
+//
+//    /**
+//     * 根据id查询操作租户套餐
+//     * @param id 租户套餐id
+//     * @return 租户套餐
+//     */
+//    SysTenantPackageDTO selectSysTenantPackageById(String id);
+//
+//    /**
+//     * 更新租户套餐
+//     * @param source 更新租户套餐
+//     * @return true:更新成功
+//     */
+//    boolean updateSysTenantPackageById(SysTenantPackageDTO source);
+//
+//    /**
+//     * 新增租户套餐
+//     * @param source 新增租户套餐
+//     * @return true:新增成功
+//     */
+//    boolean insertSysTenantPackage(SysTenantPackageDTO source);
+//
+//    /**
+//     * 根据id删除租户套餐
+//     * @param ids 租户套餐id
+//     * @return 删除数量
+//     */
+//    int removeSysTenantPackageByIds(Collection<String> ids);
+//
+//    Collection<SysTenantPackageDTO> findAllSysPackages();
+//}

+ 81 - 82
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantService.java

@@ -1,82 +1,81 @@
-package cn.tr.module.sys.tenant.service;
-
-import cn.hutool.core.util.StrUtil;
-import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
-import cn.tr.module.sys.tenant.dto.SysTenantQueryDTO;
-import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
-import cn.tr.module.sys.user.dto.SysMenuDTO;
-import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @ClassName : ISysTenantService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
- */
-
-public interface ISysTenantService {
-    /**
-     * 根据条件查询
-     * @param query 查询参数
-     * @return
-     */
-    List<SysTenantCommonDTO> selectSysTenantList(SysTenantQueryDTO query);
-
-    /**
-     * 根据id查询操作租户
-     * @param id 租户id
-     * @return 租户
-     */
-    SysTenantCommonDTO selectSysTenantById(String id);
-
-    /**
-     * 更新租户
-     * @param source 更新租户
-     * @return true:更新成功
-     */
-    boolean updateSysTenantById(SysTenantCommonDTO source);
-
-    /**
-     * 新增租户
-     * @param source 新增租户
-     * @return true:新增成功
-     */
-    boolean insertSysTenant(SysTenantAddDTO source);
-
-    /**
-     * 根据id删除租户
-     * @param ids 租户id
-     * @return 删除数量
-     */
-    int removeSysTenantByIds(Collection<String> ids);
-    /**
-     * 获取当前租户的菜单id
-     * @return
-     */
-
-    /**
-     * 查询租户的权限
-     * @return
-     */
-    default Set<String>  findTenantPermission(){
-        return currentTenantMenus()
-                .stream()
-                .filter(Objects::nonNull)
-                .filter(menu->Boolean.FALSE.equals(menu.getDisable()))
-                .map(SysMenuDTO::getPermission)
-                .filter(StrUtil::isNotEmpty)
-                .collect(Collectors.toSet());
-    };
-
-    default Set<SysMenuDTO> currentTenantMenus(){
-        return getTenantMenus(TenantContextHolder.getTenantId());
-    };
-
-    Set<SysMenuDTO> getTenantMenus(String tenantId);
-}
+//package cn.tr.module.sys.tenant.service;
+//
+//import cn.hutool.core.util.StrUtil;
+//import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
+//import cn.tr.module.sys.tenant.dto.SysTenantQueryDTO;
+//import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
+//import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
+//
+//import java.util.Collection;
+//import java.util.List;
+//import java.util.Objects;
+//import java.util.Set;
+//import java.util.stream.Collectors;
+//
+///**
+// * @ClassName : ISysTenantService
+// * @Description :
+// * @Author : LF
+// * @Date: 2023年03月31日
+// */
+//
+//public interface ISysTenantService {
+//    /**
+//     * 根据条件查询
+//     * @param query 查询参数
+//     * @return
+//     */
+//    List<SysTenantCommonDTO> selectSysTenantList(SysTenantQueryDTO query);
+//
+//    /**
+//     * 根据id查询操作租户
+//     * @param id 租户id
+//     * @return 租户
+//     */
+//    SysTenantCommonDTO selectSysTenantById(String id);
+//
+//    /**
+//     * 更新租户
+//     * @param source 更新租户
+//     * @return true:更新成功
+//     */
+//    boolean updateSysTenantById(SysTenantCommonDTO source);
+//
+//    /**
+//     * 新增租户
+//     * @param source 新增租户
+//     * @return true:新增成功
+//     */
+//    boolean insertSysTenant(SysTenantAddDTO source);
+//
+//    /**
+//     * 根据id删除租户
+//     * @param ids 租户id
+//     * @return 删除数量
+//     */
+//    int removeSysTenantByIds(Collection<String> ids);
+//    /**
+//     * 获取当前租户的菜单id
+//     * @return
+//     */
+//
+//    /**
+//     * 查询租户的权限
+//     * @return
+//     */
+//    default Set<String>  findTenantPermission(){
+//        return currentTenantMenus()
+//                .stream()
+//                .filter(Objects::nonNull)
+//                .filter(menu->Boolean.FALSE.equals(menu.getDisable()))
+//                .map(SysMenuDTO::getPermission)
+//                .filter(StrUtil::isNotEmpty)
+//                .collect(Collectors.toSet());
+//    };
+//
+//    default Set<SysMenuDTO> currentTenantMenus(){
+//        return getTenantMenus(TenantContextHolder.getTenantId());
+//    };
+//
+//    Set<SysMenuDTO> getTenantMenus(String tenantId);
+//}

+ 85 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysDeptService.java

@@ -0,0 +1,85 @@
+package cn.tr.module.sys.user.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import cn.tr.module.sys.user.dto.SysDeptAddDTO;
+import cn.tr.module.sys.user.dto.SysDeptEditDTO;
+import cn.tr.module.sys.user.dto.SysDeptQueryDTO;
+import cn.tr.module.sys.user.po.SysDeptPO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+
+import java.util.List;
+
+/**
+ * <p>
+ * 部门表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
+ */
+public interface ISysDeptService extends IService<SysDeptPO> {
+
+    /**
+     * 分页查询
+     *
+     * @param reqPage
+     * @param req
+     * @return
+     */
+    IPage<SysDeptPO> page(Page reqPage, SysDeptQueryDTO req);
+
+    /**
+     * 新增
+     *
+     * @param req
+     */
+    void add(SysDeptAddDTO req);
+
+    /**
+     * 修改
+     *
+     * @param req
+     */
+    void edit(SysDeptEditDTO req);
+
+    /**
+     * 删除
+     *
+     * @param ids
+     */
+    void remove(String ids);
+
+    /**
+     * 查看
+     *
+     * @param id
+     * @return
+     */
+    SysDeptPO view(String id);
+
+    /**
+     * 查询部门树
+     *
+     * @return
+     */
+    List<Tree<String>> listDeptTree();
+
+    /**
+     * 查询下拉部门树,排除当前节点以及子节点
+     *
+     * @param nodeId
+     * @return
+     */
+    List<Tree<String>> selectDeptTreeAndExcludeNode(String nodeId);
+
+    /**
+     * 查询下拉部门树
+     *
+     * @return
+     */
+    List<Tree<String>> selectDeptTree();
+
+}

+ 57 - 131
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysMenuService.java

@@ -1,176 +1,102 @@
 package cn.tr.module.sys.user.service;
 
-import cn.hutool.core.lang.Pair;
-import cn.hutool.core.lang.Tuple;
-import cn.hutool.core.util.StrUtil;
-import cn.tr.module.sys.user.mapper.SysMenuMapper;
-import cn.tr.module.sys.user.constant.MenuConstants;
-import cn.tr.module.sys.user.dto.SysMenuDTO;
+import cn.hutool.core.lang.tree.Tree;
+import cn.tr.module.sys.user.dto.SysMenuAddDTO;
+import cn.tr.module.sys.user.dto.SysMenuEditDTO;
 import cn.tr.module.sys.user.dto.SysMenuQueryDTO;
-import cn.tr.module.sys.user.enums.MenuEnum;
-import cn.tr.module.sys.user.vo.RouteItemVO;
-import cn.tr.module.sys.user.vo.RouteMetoVO;
-import cn.tr.plugin.mybatis.service.ITreeService;
-import org.springframework.cache.annotation.CacheEvict;
+import cn.tr.module.sys.user.po.SysMenuPO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
- * @ClassName : ISysMenuService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
+ * <p>
+ * 菜单表  服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-19
  */
-
-public interface ISysMenuService extends ITreeService {
+public interface ISysMenuService extends IService<SysMenuPO> {
 
     /**
-     * 根据条件查询构造树结构
-     * @param query 查询参数
+     * 分页查询
+     *
+     * @param reqPage
+     * @param req
      * @return
      */
-    default List<SysMenuDTO> selectSysMenuTree(SysMenuQueryDTO query){
-        return buildTree(selectSysMenuList(query));
-    };
+    IPage<SysMenuPO> page(Page reqPage, SysMenuQueryDTO req);
 
     /**
-     * 根据条件查询构造树结构
-     * @param query 查询参数
-     * @param excludeIds 构造树时排除的节点id
-     * @return
+     * 新增
+     *
+     * @param req
      */
-    default List<SysMenuDTO> selectSysMenuTree(SysMenuQueryDTO query,List<String> excludeIds){
-        return buildTree(selectSysMenuList(query),excludeIds);
-    };
+    void add(SysMenuAddDTO req);
 
     /**
-     * 根据条件查询
-     * @param query 查询参数
-     * @return
+     * 修改
+     *
+     * @param req
      */
-    List<SysMenuDTO> selectSysMenuList(SysMenuQueryDTO query);
-
+    void edit(SysMenuEditDTO req);
 
     /**
-     * 根据id查询操作菜单
-     * @param id 菜单id
-     * @return 菜单
+     * 删除
+     *
+     * @param ids
      */
-    SysMenuDTO selectSysMenuById(String id);
-
-    Tuple selectNameById(String menuId);
+    void remove(String ids);
 
     /**
-     * 更新菜单
-     * @param source 更新菜单
-     * @return true:更新成功
+     * 查看
+     *
+     * @param id
+     * @return
      */
-    boolean updateSysMenuById(SysMenuDTO source);
+    SysMenuPO view(String id);
 
     /**
-     * 新增菜单
-     * @param source 新增菜单
-     * @return true:新增成功
+     * 查询菜单树
+     *
+     * @return
      */
-    boolean insertSysMenu(SysMenuDTO source);
+    List<Tree<String>> listMenuTree();
 
     /**
-     * 批量新增菜单
-     * @param source 新增菜单
-     * @return true:新增成功
-     */
-    boolean insertBatchSysMenu(List<SysMenuDTO> source);
-    /**
-     * 根据id删除菜单
-     * @param ids 菜单id
-     * @return 删除数量
+     * 查询下拉菜单树,排除当前节点以及子节点
+     *
+     * @param nodeId
+     * @return
      */
-    int deleteSysMenuByIds(Collection<String> ids);
+    List<Tree<String>> selectMenuTreeAndExcludeNode(String nodeId);
 
     /**
-     * 查询所有菜单
+     * 查询下拉菜单树
+     *
      * @return
      */
-    public List<SysMenuDTO> findAllMenu();
+    List<Tree<String>> selectMenuTree();
 
     /**
-     * 查询用户的菜单
-     * @param userId 菜单id
+     * 根据用户ID,查询权限标识
+     *
+     * @param userId
      * @return
      */
-    Set<SysMenuDTO>  findUserMenus(String userId);
+    Set<String> getPermissionsByUserId(Long userId);
 
     /**
-     * 查询菜单的权限
-     * @param userId 菜单id
+     * 根据用户ID,查询菜单列表
+     *
+     * @param userId
      * @return
      */
-    default Set<String>  findUserPermission(String userId){
-        return findUserMenus(userId)
-                .stream()
-                .filter(Objects::nonNull)
-                .filter(menu->Boolean.FALSE.equals(menu.getDisable()))
-                .map(SysMenuDTO::getPermission)
-                .filter(StrUtil::isNotEmpty)
-                .collect(Collectors.toSet());
-    };
-
-    @CacheEvict(value = "menu:role:",key = "#roleId")
-    default void delRoleMenusCache(String roleId){
-
-    };
-
-    default RouteItemVO convertToRoute(SysMenuDTO item) {
-        RouteItemVO node = SysMenuMapper.INSTANCE.toRouteItemVO(item);
-        node.setPath(item.getRoutePath());
-        node.setName(item.getRoutePath());
-        node.setSort(item.getOrder());
-        // 一级目录
-//        if (Objects.equals(item.getMenuType(), MenuEnum.dir.name()) && (StrUtil.equals(item.getParentId(),"0")||StrUtil.isEmpty(item.getParentId()))) {
-//            node.setPath("/" + item.getRoutePath());
-//            node.setComponent(MenuConstants.LAYOUT);
-//        }
-        // 外部链接
-        if (Objects.equals(item.getMenuType(), MenuEnum.menu.name()) && Boolean.TRUE.equals(item.getLinkExternal())) {
-            node.setComponent(MenuConstants.IFRAME);
-        }
-        RouteMetoVO routeMetoVO = new RouteMetoVO();
-        routeMetoVO.setTitle(item.getName());
-        routeMetoVO.setIcon(item.getIcon());
-        routeMetoVO.setHideMenu(!Boolean.TRUE.equals(item.getVisible()));
-        // 菜单
-        if (Objects.equals(item.getMenuType(), MenuEnum.menu.name())) {
-            routeMetoVO.setIgnoreKeepAlive(!Boolean.TRUE.equals(item.getKeepalive()));
-        }
-        // 外部链接
-        if (Objects.equals(item.getMenuType(), MenuEnum.menu.name()) && Boolean.TRUE.equals(item.getLinkExternal())) {
-            // 内嵌
-            if (Boolean.TRUE.equals(item.getFrame())) {
-                routeMetoVO.setFrameSrc(item.getLinkUrl());
-            }else {
-                node.setPath(item.getLinkUrl());
-            }
-        }
-        routeMetoVO.setAuthority(item.getAuthority());
-        routeMetoVO.setNoBasicLayout(item.getNoBasicLayout());
-        routeMetoVO.setOrder(item.getOrder());
-        routeMetoVO.setBadge(item.getBadge());
-        routeMetoVO.setBadgeType(item.getBadgeType());
-        routeMetoVO.setBadgeVariants(item.getBadgeVariants());
-        routeMetoVO.setBadgeVariants(item.getBadgeVariants());
-//        routeMetoVO.setHideChildrenInMenu(item.getHideChildrenInMenu());
-//        routeMetoVO.setHideInMenu(item.getHideInMenu());
-        node.setMeta(routeMetoVO);
-        return node;
-    }
-
-    List<SysMenuDTO> selectBatchIds(Set<String> menuIds);
-
-    List<Pair<String, String>> selectAllMenuIdAndName();
+    List<SysMenuPO> listGrantMenuByUserId(Long userId);
 
-//    List<SysMenuDTO> findAnonymousMenus();
 }

+ 75 - 75
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysOrgService.java

@@ -1,75 +1,75 @@
-package cn.tr.module.sys.user.service;
-
-import cn.tr.module.sys.user.mapper.SysOrgMapper;
-import cn.tr.module.sys.user.dto.SysOrgDTO;
-import cn.tr.module.sys.user.dto.SysOrgQueryDTO;
-import cn.tr.module.sys.user.dto.SysOrgTreeDTO;
-import cn.tr.plugin.mybatis.service.ITreeService;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @ClassName : ISysOrgService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
- */
-
-public interface ISysOrgService extends ITreeService {
-
-    
-    /**
-     * 根据条件查询构造树结构
-     * @return
-     */
-    @Cacheable(value = "sys:org",key = "'default'")
-    default List<SysOrgTreeDTO> selectSysOrgTree(){
-        SysOrgQueryDTO query = new SysOrgQueryDTO();
-        query.setDisable(false);
-        return buildTree(SysOrgMapper.INSTANCE.toSysOrgTree(selectSysOrgList(query)));
-    };
-    
-    @CacheEvict(value = "sys:org",key = "'default'")
-    default void delSysOrgTreeCache(){
-        
-    }
-    /**
-     * 根据条件查询
-     * @param query 查询参数
-     * @return
-     */
-    List<SysOrgDTO> selectSysOrgList(SysOrgQueryDTO query);
-
-
-    /**
-     * 根据id查询操作组织
-     * @param id 组织id
-     * @return 组织
-     */
-    SysOrgDTO selectSysOrgById(String id);
-
-    /**
-     * 更新组织
-     * @param source 更新组织
-     * @return true:更新成功
-     */
-    boolean updateSysOrgById(SysOrgDTO source);
-
-    /**
-     * 新增组织
-     * @param source 新增组织
-     * @return true:新增成功
-     */
-    boolean insertSysOrg(SysOrgDTO source);
-
-    /**
-     * 根据id删除组织
-     * @param ids 组织id
-     * @return 删除数量
-     */
-    int deleteSysOrgByIds(Collection<String> ids);
-
-}
+//package cn.tr.module.sys.user.service;
+//
+//import cn.tr.module.sys.user.mapper.SysOrgMapper;
+//import cn.tr.module.sys.user.dto.SysOrgDTO;
+//import cn.tr.module.sys.user.dto.SysOrgQueryDTO;
+//import cn.tr.module.sys.user.dto.SysOrgTreeDTO;
+//import cn.tr.plugin.mybatis.service.ITreeService;
+//import org.springframework.cache.annotation.CacheEvict;
+//import org.springframework.cache.annotation.Cacheable;
+//
+//import java.util.Collection;
+//import java.util.List;
+//
+///**
+// * @ClassName : ISysOrgService
+// * @Description :
+// * @Author : LF
+// * @Date: 2023年03月31日
+// */
+//
+//public interface ISysOrgService extends ITreeService {
+//
+//
+//    /**
+//     * 根据条件查询构造树结构
+//     * @return
+//     */
+//    @Cacheable(value = "sys:org",key = "'default'")
+//    default List<SysOrgTreeDTO> selectSysOrgTree(){
+//        SysOrgQueryDTO query = new SysOrgQueryDTO();
+//        query.setDisable(false);
+//        return buildTree(SysOrgMapper.INSTANCE.toSysOrgTree(selectSysOrgList(query)));
+//    };
+//
+//    @CacheEvict(value = "sys:org",key = "'default'")
+//    default void delSysOrgTreeCache(){
+//
+//    }
+//    /**
+//     * 根据条件查询
+//     * @param query 查询参数
+//     * @return
+//     */
+//    List<SysOrgDTO> selectSysOrgList(SysOrgQueryDTO query);
+//
+//
+//    /**
+//     * 根据id查询操作组织
+//     * @param id 组织id
+//     * @return 组织
+//     */
+//    SysOrgDTO selectSysOrgById(String id);
+//
+//    /**
+//     * 更新组织
+//     * @param source 更新组织
+//     * @return true:更新成功
+//     */
+//    boolean updateSysOrgById(SysOrgDTO source);
+//
+//    /**
+//     * 新增组织
+//     * @param source 新增组织
+//     * @return true:新增成功
+//     */
+//    boolean insertSysOrg(SysOrgDTO source);
+//
+//    /**
+//     * 根据id删除组织
+//     * @param ids 组织id
+//     * @return 删除数量
+//     */
+//    int deleteSysOrgByIds(Collection<String> ids);
+//
+//}

+ 46 - 47
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalMenuService.java

@@ -1,47 +1,46 @@
-package cn.tr.module.sys.user.service;
-
-import cn.tr.module.sys.user.dto.SysMenuDTO;
-import cn.tr.module.sys.user.dto.SysPortalMenuDTO;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @ClassName : ISysPortalMenuService
- * @Description : 门户菜单关联关系
- * @Author : LF
- * @Date: 2023年03月31日
- */
-
-public interface ISysPortalMenuService {
-
-    /**
-     * 为门户分配菜单
-     * @param portalId 门户id
-     * @return
-     */
-    void assignPortalMenu(String portalId,List<String> menuIds);
-
-    /**
-     * 找到所给门户下的所有菜单
-     * @param portalId
-     * @return
-     */
-    @Cacheable(value = "sys:portal:menu",key = "#portalId")
-    List<SysMenuDTO> findAllMenusByPortalId(String portalId);
-
-    /**
-     * 删除门户菜单缓存
-     * {@link ISysPortalMenuService#assignPortalMenu(String,List)} (List)} /
-     * @param portalId
-     */
-    @CacheEvict(value = "sys:portal:menu",key = "#portalId")
-    default void delCacheMenusByPortalId(String portalId){
-
-    };
-
-    Set<String> findPortalIdByMenuId(Collection<String> source, boolean containsSys);
-}
+//package cn.tr.module.sys.user.service;
+//
+//import cn.tr.module.sys.user.dto.SysMenuDTO;
+//import org.springframework.cache.annotation.CacheEvict;
+//import org.springframework.cache.annotation.Cacheable;
+//
+//import java.util.Collection;
+//import java.util.List;
+//import java.util.Set;
+//
+///**
+// * @ClassName : ISysPortalMenuService
+// * @Description : 门户菜单关联关系
+// * @Author : LF
+// * @Date: 2023年03月31日
+// */
+//
+//public interface ISysPortalMenuService {
+//
+//    /**
+//     * 为门户分配菜单
+//     * @param portalId 门户id
+//     * @return
+//     */
+//    void assignPortalMenu(String portalId,List<String> menuIds);
+//
+//    /**
+//     * 找到所给门户下的所有菜单
+//     * @param portalId
+//     * @return
+//     */
+//    @Cacheable(value = "sys:portal:menu",key = "#portalId")
+//    List<SysMenuDTO> findAllMenusByPortalId(String portalId);
+//
+//    /**
+//     * 删除门户菜单缓存
+//     * {@link ISysPortalMenuService#assignPortalMenu(String,List)} (List)} /
+//     * @param portalId
+//     */
+//    @CacheEvict(value = "sys:portal:menu",key = "#portalId")
+//    default void delCacheMenusByPortalId(String portalId){
+//
+//    };
+//
+//    Set<String> findPortalIdByMenuId(Collection<String> source, boolean containsSys);
+//}

+ 83 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPostService.java

@@ -0,0 +1,83 @@
+package cn.tr.module.sys.user.service;
+
+import cn.tr.module.sys.user.dto.SysPostAddDTO;
+import cn.tr.module.sys.user.dto.SysPostEditDTO;
+import cn.tr.module.sys.user.dto.SysPostQueryDTO;
+import cn.tr.module.sys.user.po.SysPostPO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 岗位表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-22
+ */
+public interface ISysPostService extends IService<SysPostPO> {
+
+    /**
+     * 分页查询
+     *
+     * @param reqPage
+     * @param req
+     * @return
+     */
+    IPage<SysPostPO> page(Page reqPage, SysPostQueryDTO req);
+
+    /**
+     * 查询列表
+     *
+     * @param req
+     * @return
+     */
+    List<SysPostPO> list(SysPostQueryDTO req);
+
+    /**
+     * 新增
+     *
+     * @param req
+     */
+    void add(SysPostAddDTO req);
+
+    /**
+     * 修改
+     *
+     * @param req
+     */
+    void edit(SysPostEditDTO req);
+
+    /**
+     * 删除
+     *
+     * @param ids
+     */
+    void remove(String ids);
+
+    /**
+     * 查看
+     *
+     * @param id
+     * @return
+     */
+    SysPostPO view(String id);
+
+    /**
+     * 查询下拉框列表
+     *
+     * @return
+     */
+    List<SysPostPO> listOptions();
+
+    /**
+     * 下拉列表
+     *
+     * @return
+     */
+    List<SysPostPO> selectOptions();
+
+}

+ 16 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleDeptService.java

@@ -0,0 +1,16 @@
+package cn.tr.module.sys.user.service;
+
+import cn.tr.module.sys.user.po.SysRoleDeptPO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 角色部门表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
+ */
+public interface ISysRoleDeptService extends IService<SysRoleDeptPO> {
+
+}

+ 9 - 51
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleMenuService.java

@@ -1,58 +1,16 @@
 package cn.tr.module.sys.user.service;
 
-import cn.tr.module.sys.user.dto.SysMenuDTO;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.util.*;
+import cn.tr.module.sys.user.po.SysRoleMenuPO;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * @ClassName : ISysRoleMenuService
- * @Description : 角色菜单关联关系
- * @Author : LF
- * @Date: 2023年03月31日
+ * <p>
+ * 角色菜单表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-07-05
  */
+public interface ISysRoleMenuService extends IService<SysRoleMenuPO> {
 
-public interface ISysRoleMenuService {
-    /**
-     * 为角色分配菜单
-     * @param roleId 角色id
-     * @param menuIds 菜单id
-     * @return
-     */
-    void assignRoleMenu(String roleId,List<String> menuIds);
-
-    /**
-     * 找到角色id下的所有菜单信息
-     * 使用{@link Cacheable} 对role相应数据进行缓存
-     * {@link ISysRoleMenuService#assignRoleMenu(String,List)}
-     * @param roleId
-     * @return
-     */
-    @Cacheable(value = "menu:role",key = "#roleId")
-    List<SysMenuDTO> findAllMenuByRoleId(String roleId);
-
-
-    /**
-     * 删除缓存
-     * 当调用
-     {@link ISysRoleMenuService#assignRoleMenu(String,List)} /
-     {@link ISysMenuService#insertSysMenu(SysMenuDTO)} /
-     {@link ISysMenuService#updateSysMenuById(SysMenuDTO)} /
-     {@link ISysMenuService#deleteSysMenuByIds(Collection)}
-     等方法时刷新相应的角色缓存
-     * @param roleId
-     */
-    @CacheEvict(value = "menu:role",key = "#roleId")
-    default void delRoleMenusCache(String roleId){
-
-    };
-
-    /**
-     * 通过菜单id找到所有持有该菜单的角色
-     * @param menuIds
-     * @param containsSys 是否包含系统角色
-     * @return
-     */
-    Set<String> findRoleByMenuId(Collection<String> menuIds,boolean containsSys);
 }

+ 88 - 46
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleService.java

@@ -1,78 +1,120 @@
 package cn.tr.module.sys.user.service;
 
-import cn.hutool.core.util.StrUtil;
-import cn.tr.core.annotation.TenantIgnore;
-import cn.tr.module.sys.user.dto.SysMenuDTO;
-import cn.tr.module.sys.user.dto.SysRoleDTO;
+import cn.tr.module.sys.user.dto.SysRoleAddDTO;
+import cn.tr.module.sys.user.dto.SysRoleAssignMenuDTO;
+import cn.tr.module.sys.user.dto.SysRoleEditDTO;
 import cn.tr.module.sys.user.dto.SysRoleQueryDTO;
-import cn.tr.module.sys.user.vo.RouteItemVO;
-import cn.tr.plugin.mybatis.service.ITreeService;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
+import cn.tr.module.sys.user.po.SysDeptPO;
+import cn.tr.module.sys.user.po.SysMenuPO;
+import cn.tr.module.sys.user.po.SysRolePO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
- * @ClassName : ISysRoleService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
+ * <p>
+ * 角色表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
  */
+public interface ISysRoleService extends IService<SysRolePO> {
 
-public interface ISysRoleService {
+    /**
+     * 分页查询
+     *
+     * @param reqPage
+     * @param req
+     * @return
+     */
+    IPage<SysRolePO> page(Page reqPage, SysRoleQueryDTO req);
 
     /**
-     * 根据条件查询
-     * @param query 查询参数
+     * 查询列表
+     *
+     * @param req
      * @return
      */
-    List<SysRoleDTO> selectSysRoleList(SysRoleQueryDTO query);
+    List<SysRolePO> list(SysRoleQueryDTO req);
+
+    /**
+     * 新增
+     *
+     * @param req
+     */
+    void add(SysRoleAddDTO req);
+
+    /**
+     * 修改
+     *
+     * @param req
+     */
+    void edit(SysRoleEditDTO req);
 
-    @TenantIgnore
-    Collection<SysRoleDTO> findAllSysRoles();
+    /**
+     * 删除
+     *
+     * @param id
+     */
+    void remove(Long id);
 
     /**
-     * 根据id查询操作角色
-     * @param id 角色id
-     * @return 角色
+     * 查看
+     *
+     * @param id
+     * @return
      */
-    SysRoleDTO selectSysRoleById(String id);
+    SysRolePO view(String id);
 
+    /**
+     * 查询下拉框列表
+     *
+     * @return
+     */
+    List<SysRolePO> listOptions();
 
     /**
-     * 根据id查询操作角色
-     * @param ids 角色id集合
-     * @return 角色
+     * 分配菜单
+     *
+     * @param req
      */
-    List<SysRoleDTO> selectSysRoleByIds(Collection<String> ids);
+    void assignMenu(SysRoleAssignMenuDTO req);
+
     /**
-     * 更新角色
-     * @param source 更新角色
-     * @return true:更新成功
+     * 查询角色关联的菜单
+     *
+     * @param roleId
+     * @return
      */
-    boolean updateSysRoleById(SysRoleDTO source);
+    List<SysMenuPO> listRoleMenus(String roleId);
 
     /**
-     * 新增角色
-     * @param source 新增角色
-     * @return true:新增成功
+     * 查询角色关联的部门
+     *
+     * @param roleId
+     * @return
      */
-    boolean insertSysRole(SysRoleDTO source);
+    List<SysDeptPO> listRoleDepts(String roleId);
 
     /**
-     * 新增角色(系统内部调用)
-     * @param source 新增角色
-     * @return true:新增成功
+     * 根据用户ID,查询角色
+     *
+     * @param userId
+     * @return
      */
-    boolean insertInnerSysRole(SysRoleDTO source);
+    List<SysRolePO> listSysRoleByUserId(Long userId);
+
+    List<SysRolePO> listSysRoleByUserId(Long userId, String tenantId);
+
     /**
-     * 根据id删除角色
-     * @param ids 角色id
-     * @return 删除数量
+     * 下拉列表
+     *
+     * @return
      */
-    int deleteSysRoleByIds(Collection<String> ids);
+    List<SysRolePO> selectOptions();
+
 }

+ 16 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPostService.java

@@ -0,0 +1,16 @@
+package cn.tr.module.sys.user.service;
+
+import cn.tr.module.sys.user.po.SysUserPostPO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户岗位表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
+ */
+public interface ISysUserPostService extends IService<SysUserPostPO> {
+
+}

+ 9 - 59
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserRoleService.java

@@ -1,66 +1,16 @@
 package cn.tr.module.sys.user.service;
 
-import cn.tr.module.sys.user.dto.SysRoleDTO;
-import cn.tr.module.sys.user.dto.SysUserRoleDTO;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
+import cn.tr.module.sys.user.po.SysUserRolePO;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * @ClassName : ISysRoleMenuService
- * @Description : 角色菜单关联关系
- * @Author : LF
- * @Date: 2023年03月31日
+ * <p>
+ * 用户角色表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
  */
+public interface ISysUserRoleService extends IService<SysUserRolePO> {
 
-public interface ISysUserRoleService {
-
-    /**
-     * 为用户分配角色
-     * @param userId 用户id
-     * @param roleIds 用户关联角色
-     * @return
-     */
-    void assignUserRole(String userId,Collection<String> roleIds);
-
-    /**
-     * 通过角色id找到所有持有该角色的用户
-     * @param roleIds
-     * @return
-     */
-    Set<String> findUserByRoleId(Collection<String> roleIds);
-
-    /**
-     * 通过用户id找到该用户所持有的所有角色id
-     * @param userId
-     * @return
-     */
-    default Set<String> findRoleIdsByUserId(String userId){
-        return findAllRolesByUserId(userId)
-                .stream().map(SysRoleDTO::getId).collect(Collectors.toSet());
-    };
-
-
-    /**
-     * 找到所给用户下的所有角色
-     * @param userId
-     * @return
-     */
-    @Cacheable(value = "sys:user:role",key = "#userId")
-    List<SysRoleDTO> findAllRolesByUserId(String userId);
-
-    /**
-     * 删除用户角色缓存
-     * {@link ISysRoleService#updateSysRoleById(SysRoleDTO)} /
-     * {@link ISysRoleService#deleteSysRoleByIds(Collection)}
-     * @param userId
-     */
-    @CacheEvict(value = "sys:user:role",key = "#userId")
-    default void delUserRoleCache(String userId){
-
-    };
 }

+ 0 - 134
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserService.java

@@ -1,134 +0,0 @@
-package cn.tr.module.sys.user.service;
-import cn.tr.module.sys.user.dto.SysUserDTO;
-import cn.tr.module.sys.user.dto.SysUserEditDTO;
-import cn.tr.module.sys.user.dto.SysUserQueryDTO;
-import cn.hutool.core.lang.Pair;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.util.*;
-/**
- * @ClassName : ISysUserService
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
- */
-
-public interface ISysUserService {
-    /**
-     * 根据条件查询
-     * @param query 查询参数
-     * @return
-     */
-    List<SysUserDTO> selectSysUserList(SysUserQueryDTO query);
-
-    /**
-     * 根据id查询操作用户
-     * @param id 用户id
-     * @return 用户
-     */
-    SysUserDTO selectSysUserById(String id);
-
-
-    /**
-     * 根据id查询用户昵称
-     * @param userId 用户id
-     * @return 用户
-     */
-    @Cacheable(value = "user:nickname&avatar",key = "#userId")
-    Pair<String, String> selectNickNameAndAvatarById(String userId);
-
-    @CacheEvict(value = "user:nickname&avatar",key = "#userId")
-    default void delNickNameAndAvatarCache(String userId){
-
-    };
-    /**
-     * 更新用户
-     * @param source 更新用户
-     * @return true:更新成功
-     */
-    boolean updateSysUserById(SysUserEditDTO source);
-
-    /**
-     * 根据用户名查询
-     * @param username 用户名
-     * @return
-     */
-    SysUserDTO selectUserByUsername(String username);
-
-    /**
-     * 更新密码
-     * @param username  用户名
-     * @param oldPsw    旧密码
-     * @param newPsw    新密码
-     * @return   更新结果
-     */
-    boolean updatePsw(String username,String oldPsw,String newPsw);
-
-    /**
-     * 新增用户
-     * @param source 新增用户
-     * @return true:新增成功
-     */
-    boolean insertSysUser(SysUserDTO source);
-
-
-    /**
-     * 新增用户
-     * @param source 新增用户
-     * @return true:新增成功
-     */
-    String insertWxUserAndReturnId(SysUserDTO source,String appId);
-
-    /**
-     * 忽略租户,根据用户名查询
-     * @param username 用户名
-     * @return
-     */
-    List<SysUserDTO> selectUserByUsernameIgnoreTenant(String username);
-
-    /**
-     * 根据id删除用户
-     * @param ids 用户id
-     * @return 删除数量
-     */
-    int deleteSysUserByIds(Collection<String> ids);
-
-    /**
-     * 判断用户名是否重复
-     * @param userId
-     * @param username
-     * @return true 不重复 false 重复
-     */
-    boolean isValidUsername(String userId,String username);
-
-    /**
-     * 重置密码
-     * @param userIds
-     */
-    boolean resetPsw(Collection<String> userIds);
-
-    /**
-     * 更新用户最后登录信息
-     * @param id
-     * @param loginTime
-     * @param ip
-     * @param cityInfo
-     */
-    void updateLastLoginInfo(String id, Date loginTime, String ip, String cityInfo);
-
-    @Cacheable(value = "user:nickname&avatar",key = "'all'")
-    List<Pair<String, String>> selectAllUserIdAndNickName();
-
-    @CacheEvict(value = "user:nickname&id",key = "'all'")
-    default void delUserIdAndNickNameCache(){
-
-    }
-
-    /**
-     * 根据openId查询用户
-     * @param openId 微信openId
-     * @return 用户信息
-     */
-    SysUserDTO selectUserByOpenId(String openId);
-}

+ 74 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/ISysUserService.java

@@ -0,0 +1,74 @@
+package cn.tr.module.sys.user.service.impl;
+
+import cn.tr.module.sys.user.dto.*;
+import cn.tr.module.sys.user.po.SysUserPO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * <p>
+ * 用户表 服务类
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
+ */
+public interface ISysUserService extends IService<SysUserPO> {
+
+    /**
+     * 分页查询
+     *
+     * @param reqPage
+     * @param req
+     * @return
+     */
+    IPage<SysUserPO> page(Page reqPage, SysUserQueryDTO req);
+
+    /**
+     * 查询列表
+     *
+     * @param req
+     * @return
+     */
+    List<SysUserPO> list(SysUserQueryDTO req);
+
+    /**
+     * 新增
+     *
+     * @param req
+     */
+    void add(SysUserAddDTO req);
+
+    /**
+     * 修改
+     *
+     * @param req
+     */
+    void edit(SysUserEditDTO req);
+
+    /**
+     * 删除
+     *
+     * @param ids
+     */
+    void remove(Long ids);
+
+    /**
+     * 查看
+     *
+     * @param id
+     * @return
+     */
+    SysUserPO view(String id);
+
+    /**
+     * 重置密码
+     *
+     * @param req
+     */
+    void resetPwd(SysUserResetPwdDTO<Long> req);
+
+    SysUserDTO selectSysUserById(String userId);
+}

+ 4 - 5
tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/common/service/impl/BusHospitalServiceImpl.java

@@ -1,7 +1,11 @@
 package cn.tr.module.phototherapy.common.service.impl;
 
 import cn.tr.module.common.Value;
+import cn.tr.module.common.cache.ConfigStorage;
+import cn.tr.module.common.cache.manager.ConfigStorageManager;
+import cn.tr.module.common.mybatisplus.interceptor.GetNameInterface;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.PostConstruct;
 import org.springframework.beans.factory.annotation.Autowired;
 import cn.tr.module.phototherapy.common.po.BusClinicPO;
 import org.springframework.stereotype.Service;
@@ -18,11 +22,6 @@ import java.util.*;
 import cn.tr.module.phototherapy.common.service.IBusHospitalService;
 import cn.tr.module.phototherapy.common.mapper.BusHospitalMapper;
 import cn.tr.core.exception.TRExcCode;
-import cn.tr.module.common.mybatisplus.interceptor.GetNameInterface;
-import cn.tr.module.common.cache.ConfigStorage;
-import cn.tr.module.common.cache.manager.ConfigStorageManager;
-import jakarta.annotation.PostConstruct;
-import java.util.HashMap;
 
 /**
  * 医院信息表Service接口实现类

+ 2 - 1
tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/web/utils/CaptchaTool.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.tr.module.common.redis.RedisUtils;
 import cn.tr.module.sys.exception.CustomException;
 import com.wf.captcha.base.Captcha;
+import com.wf.captcha.utils.CaptchaUtil;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
 
@@ -59,4 +60,4 @@ public class CaptchaTool {
         }
         throw new CustomException("验证码已失效");
     }
-}
+}

+ 7 - 7
tr-test/.flattened-pom.xml

@@ -20,16 +20,16 @@
       <artifactId>spring-boot-starter-data-redis</artifactId>
       <exclusions>
         <exclusion>
-          <artifactId>spring-boot-starter-logging</artifactId>
           <groupId>org.springframework.boot</groupId>
+          <artifactId>spring-boot-starter-logging</artifactId>
         </exclusion>
         <exclusion>
-          <artifactId>logback-classic</artifactId>
           <groupId>ch.qos.logback</groupId>
+          <artifactId>logback-classic</artifactId>
         </exclusion>
         <exclusion>
-          <artifactId>log4j-to-slf4j</artifactId>
           <groupId>org.apache.logging.log4j</groupId>
+          <artifactId>log4j-to-slf4j</artifactId>
         </exclusion>
       </exclusions>
     </dependency>
@@ -38,16 +38,16 @@
       <artifactId>spring-boot-starter</artifactId>
       <exclusions>
         <exclusion>
-          <artifactId>spring-boot-starter-logging</artifactId>
           <groupId>org.springframework.boot</groupId>
+          <artifactId>spring-boot-starter-logging</artifactId>
         </exclusion>
         <exclusion>
-          <artifactId>logback-classic</artifactId>
           <groupId>ch.qos.logback</groupId>
+          <artifactId>logback-classic</artifactId>
         </exclusion>
         <exclusion>
-          <artifactId>log4j-to-slf4j</artifactId>
           <groupId>org.apache.logging.log4j</groupId>
+          <artifactId>log4j-to-slf4j</artifactId>
         </exclusion>
       </exclusions>
     </dependency>
@@ -56,8 +56,8 @@
       <artifactId>spring-boot-starter-log4j2</artifactId>
       <exclusions>
         <exclusion>
-          <artifactId>log4j-to-slf4j</artifactId>
           <groupId>org.apache.logging.log4j</groupId>
+          <artifactId>log4j-to-slf4j</artifactId>
         </exclusion>
       </exclusions>
     </dependency>