فهرست منبع

修改类结构

zhouzeyu 1 هفته پیش
والد
کامیت
9634d4d88f
15فایلهای تغییر یافته به همراه883 افزوده شده و 338 حذف شده
  1. 95 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/cache/ClusterConfigStorage.java
  2. 30 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/cache/ConfigStorage.java
  3. 31 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/menus/BizEnum.java
  4. 53 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/properties/AppProperties.java
  5. 42 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/common/utils/Constants.java
  6. 39 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bean/AuthInfo.java
  7. 94 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/AuthController.java
  8. 96 121
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java
  9. 169 170
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java
  10. 51 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/utils/AddressUtil.java
  11. 54 2
      tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/common/service/impl/BusHospitalServiceImpl.java
  12. 22 0
      tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/web/properties/CaptchaProperties.java
  13. 62 0
      tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/web/utils/CaptchaTool.java
  14. 38 38
      tr-plugins/tr-spring-boot-starter-plugin-cache/src/main/resources/application-redis.yml
  15. 7 7
      tr-test/.flattened-pom.xml

+ 95 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/cache/ClusterConfigStorage.java

@@ -0,0 +1,95 @@
+package cn.tr.module.common.cache;
+
+import cn.hutool.core.util.StrUtil;
+import cn.tr.module.common.Value;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import org.springframework.data.redis.core.BoundHashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ClusterConfigStorage implements ConfigStorage {
+    private BoundHashOperations<String, String, Object> boundHashOperations;
+
+    public ClusterConfigStorage(RedisTemplate redisTemplate,String name){
+        this.boundHashOperations = redisTemplate.boundHashOps(name);
+    }
+
+    @Override
+    public Value getConfig(String key) {
+        if (StrUtil.isEmpty(key)) {
+            return null;
+        }
+        return Value.simple(boundHashOperations.get(key));
+    }
+
+    @Override
+    public Boolean setConfigs(Map<String, Object> values) {
+        if (CollectionUtils.isEmpty(values)) {
+            return true;
+        }
+        HashMap<String, Object> map = new HashMap<>();
+        values.forEach((k,v)->{
+            if(v instanceof IEnum){
+                map.put(k,((IEnum) v).getValue());
+            }else {
+                map.put(k,v);
+            }
+        });
+        boundHashOperations.putAll(map);
+        return true;
+    }
+
+    @Override
+    public Boolean setConfig(String key, Object value) {
+        if (key == null) {
+            return true;
+        }
+        if(value==null){
+            boundHashOperations.delete(key);
+        }else {
+            if(value instanceof IEnum){
+                value=((IEnum) value).getValue();
+            }
+            boundHashOperations.put(key,value);
+        }
+        return true;
+    }
+
+    @Override
+    public Value getAndRemove(String key) {
+        Value value = Value.simple(boundHashOperations.get(key));
+        boundHashOperations.delete(key);
+        return value;
+    }
+
+    @Override
+    public Boolean remove(String key) {
+        boundHashOperations.delete(key);
+        return true;
+    }
+
+    @Override
+    public Boolean remove(Collection<String> key) {
+        boundHashOperations.delete(key);
+        return true;
+    }
+
+    @Override
+    public Boolean clear() {
+        boundHashOperations.delete(boundHashOperations.keys());
+        return true;
+    }
+
+    @Override
+    public Map<String, Value> getKeys(Collection<String> keys) {
+        Map<String, Value> result = new HashMap<>();
+        keys.parallelStream().forEach(key->{
+            result.put(key,getConfig(key));
+        });
+        return result;
+    }
+}

+ 30 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/cache/ConfigStorage.java

@@ -0,0 +1,30 @@
+package cn.tr.module.common.cache;
+
+
+
+import cn.tr.module.common.Value;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 配置存储
+ */
+public interface ConfigStorage {
+
+    Value getConfig(String key);
+
+    Boolean setConfigs(Map<String, Object> values);
+
+    Boolean setConfig(String key, Object value);
+
+    Boolean remove(String key);
+
+    Value getAndRemove(String key);
+
+    Boolean remove(Collection<String> key);
+
+    Boolean clear();
+
+    Map<String,Value> getKeys(Collection<String> keys);
+}

+ 31 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/menus/BizEnum.java

@@ -0,0 +1,31 @@
+package cn.tr.module.common.menus;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * 业务类型
+ *
+ * @author Kevin
+ */
+@Getter
+@AllArgsConstructor
+public enum BizEnum {
+    /**
+     * 临时文件
+     */
+    TEMP("temp", "临时文件"),
+    /**
+     * 图片
+     */
+    IMAGE("image", "图片"),
+    /**
+     * Excel
+     */
+    EXCEL("excel", "Excel");
+
+    private String code;
+    private String desc;
+
+}

+ 53 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/properties/AppProperties.java

@@ -0,0 +1,53 @@
+package cn.tr.module.common.properties;
+
+import lombok.Data;
+import lombok.Getter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ *
+ * @author Kevin
+ */
+@Component
+@ConfigurationProperties(prefix = "app")
+@Data
+public class AppProperties {
+
+    /**
+     * 项目名称
+     */
+    @Getter
+    private String name;
+
+    /**
+     * 实例演示开关
+     */
+//    @Getter
+//    private static boolean demoEnabled = false;
+
+    /**
+     * 获取地址开关
+     */
+    @Getter
+    private boolean addressEnabled = false;
+
+    /**
+     * 上传目录
+     */
+    @Getter
+    private String uploadType;
+
+    /**
+     * 上传目录
+     */
+    @Getter
+    private String uploadDir;
+
+    /**
+     * 缓存前缀
+     */
+    @Getter
+    private String cachePrefix;
+}

+ 42 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/common/utils/Constants.java

@@ -0,0 +1,42 @@
+package cn.tr.module.common.utils;
+
+/**
+ * 常量类
+ *
+ * @author Kevin
+ */
+public class Constants {
+
+    /**
+     * header token
+     */
+    public static final String HEADER_TOKEN = "Authorization";
+
+    /**
+     * sa token, token session, user key
+     */
+    public static final String LOGIN_USER_KEY = "loginUser";
+
+    public static final String HOSPITAL_ID = "hospital_id";
+
+    /**
+     * redis缓存,系统字典缓存模板
+     */
+    public static final String SYS_DICT_TPL = "sys_dict:%s";
+    /**
+     * redis缓存,系统参数缓存模板
+     */
+    public static final String SYS_CONFIG_TPL = "sys_config:%s";
+
+    /**
+     * 所有权限常量
+     */
+    public static final String ALL_PERMISSION = "*:*:*";
+
+    /**
+     * 默认短信验证码
+     */
+    public static final String DEFAULT_SMS_CODE = "000000";
+
+
+}

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

@@ -0,0 +1,39 @@
+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;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AuthInfo.java
+ * @Description TODO
+ * @createTime 2022年08月01日 14:28:00
+ */
+@Data
+@Tag(name = "授权结果")
+@Builder
+public class AuthInfo {
+
+    @Schema(description = "令牌")
+    private String token;
+    @Schema(description = "令牌在请求头中名称")
+    private String tokenName;
+    @Schema(description = "授权类型")
+    private GrantTypeEnum grantType;
+//    @Schema(description = "令牌失效时间")
+//    private long activityTimeout;
+    @Schema(description = "权限体系名称")
+    private String loginType;
+
+    private Date lastModifyPswTime;
+
+    @Schema(description = "是否需要修改密码")
+    private Boolean pswNeedReset;
+}

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

@@ -0,0 +1,94 @@
+package cn.tr.module.sys.oauth2.controller;
+
+
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.module.sys.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;
+import cn.tr.module.sys.oauth2.granter.TokenParameter;
+import cn.tr.module.sys.oauth2.utils.SecurityUtil;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Value;
+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;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AutController.java
+ * @Description 授权接口
+ * @createTime 2022年08月01日 13:33:00
+ */
+@RestController
+@Tag(name = "登录、授权接口")
+public class AuthController {
+
+    private final List<IAuthGranter> tokenGranter;
+
+    public AuthController(List<IAuthGranter> tokenGranter) {
+        this.tokenGranter = tokenGranter;
+    }
+
+    @Value("${sa-token.token-name}")
+    private String tokenName;
+
+//    @Value("${sa-token.activity-timeout}")
+//    private Long activityTimeout;
+
+    @PostMapping({"/login","/token"})
+    @Operation(summary = "登录")
+    public CommonResult<AuthInfo> login(@Validated @RequestBody TokenParameter req) {
+        if(req.getGrantType()==null){
+            throw new CustomException("授权类型不能为空");
+        }
+        Optional<IAuthGranter> granter = tokenGranter.stream().filter(grant -> req.getGrantType().equals(grant.getType()))
+                .findFirst();
+        if(!granter.isPresent()){
+            throw new CustomException("暂不支持该登录方式");
+        }
+        //对应web还是APP的登录方式
+        LoginUser grant = granter.get().grant(req);
+        return CommonResult.success(AuthInfo.builder()
+//                .activityTimeout(activityTimeout)
+                .grantType(req.getGrantType())//登录类型
+                .loginType(grant.getLoginType())//权限体系名称StpTypeEnum.DEFAULT.getText()
+                .token(grant.getToken())//toaken
+                .pswNeedReset(grant.getPswNeedReset())//密码是否重置
+                .lastModifyPswTime(grant.getLastModifyPswTime())//获取最后修改密码时间
+                .build());
+    }
+
+//    /*
+//     * 根据键值,获取value
+//     */
+//    @ApiOperation("刷新token时间")
+//    @GetMapping("/refresh")
+//    public R getTime() {
+//        if (SecurityUtil.getStpLogic().isLogin()) {
+//            try {
+//                SecurityUtil.getStpLogic().checkActivityTimeout();
+//                //手动续签
+//                SecurityUtil.getStpLogic().updateLastActivityToNow();
+//            }catch (Exception e){
+//
+//            }
+//        }
+//        return R.success();
+//    }
+
+    @Log(title = "退出")
+    @Operation(summary = "用户登出")
+    @PostMapping("/logout")
+    public CommonResult logout() {
+        SecurityUtil.getStpLogic().logout();
+        return CommonResult.success();
+    }
+}

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

@@ -1,122 +1,97 @@
-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;
-import cn.tr.core.tree.TreeBuilder;
-import cn.tr.module.sys.oauth2.dto.AccountUserInfoEditDTO;
-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;
-import cn.tr.plugin.security.utils.SaTokenUtils;
-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.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
- * @Description :
- * @Author : LF
- * @Date: 2023年04月01日
- */
-@RestController
-@RequestMapping("/user")
-@Tag(name = "当前账号用户操作")
-@AllArgsConstructor
-public class CurrentUserController {
-    private final OAuth2PswUserOperatorManager pswUserOperatorManager;
-    private final CurrentUserService currentUserService;
-    private final ISysMenuService menuService;
-
-    @Operation(summary = "当前用户的登陆信息", description = "获取当前登录用户的基本信息")
-    @GetMapping("/loginInfo")
-    public CommonResult loginInfo(){
-        SaTokenUtils.getStpUtil().checkLogin();
-        String stpType = LoginUserContextHolder.getStpType();
-        AbstractOAuth2PswUserOperator operator = pswUserOperatorManager.matchLoginType(stpType);
-        if(operator==null){
-            throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
-        }
-        return CommonResult.success(operator.getUserLoginInfo());
-    }
-
-    @Operation(summary = "获取登录用户的权限信息", description = "获取当前登录用户的所有权限标识集合")
-    @GetMapping("/getPermissionInfo")
-    public CommonResult<Collection<String>> getPermissionInfo() {
-        SaTokenUtils.getStpUtil().checkLogin();
-        return CommonResult.success(currentUserService.currentUserPermission(String.valueOf(SaTokenUtils.getStpUtil().getLoginId())));
-    }
-
-    @Operation(summary = "获得登录用户的菜单列表", description = "根据门户ID获取当前登录用户的菜单路由信息")
-    @GetMapping("/listMenus-{portalId}")
-    public CommonResult<List<RouteItemVO>> getMenus(@Parameter(description = "门户ID") @PathVariable(value = "portalId",required = false) String portalId) {
-        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())));
+//package cn.tr.module.sys.oauth2.controller;
+//
+//import cn.tr.core.exception.ServiceException;
+//import cn.tr.core.exception.TRExcCode;
+//import cn.tr.core.pojo.CommonResult;
+//import cn.tr.core.tree.TreeBuilder;
+//import cn.tr.module.sys.oauth2.dto.AccountUserInfoEditDTO;
+//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.SysUserPortalListDTO;
+//import cn.tr.module.sys.user.service.ISysMenuService;
+//import cn.tr.module.sys.user.vo.RouteItemVO;
+//import cn.tr.plugin.security.context.LoginUserContextHolder;
+//import cn.tr.plugin.security.utils.SaTokenUtils;
+//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 java.util.Collection;
+//import java.util.List;
+//
+///**
+// * @ClassName : CurrentUserController
+// * @Description :
+// * @Author : LF
+// * @Date: 2023年04月01日
+// */
+//@RestController
+//@RequestMapping("/user")
+//@Tag(name = "当前账号用户操作")
+//@AllArgsConstructor
+//public class CurrentUserController {
+//    private final OAuth2PswUserOperatorManager pswUserOperatorManager;
+//    private final CurrentUserService currentUserService;
+//    private final ISysMenuService menuService;
+//
+//    @Operation(summary = "当前用户的登陆信息", description = "获取当前登录用户的基本信息")
+//    @GetMapping("/loginInfo")
+//    public CommonResult loginInfo(){
+//        SaTokenUtils.getStpUtil().checkLogin();
+//        String stpType = LoginUserContextHolder.getStpType();
+//        AbstractOAuth2PswUserOperator operator = pswUserOperatorManager.matchLoginType(stpType);
+//        if(operator==null){
+//            throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
+//        }
+//        return CommonResult.success(operator.getUserLoginInfo());
 //    }
-
-    @Operation(summary = "获取登录用户的门户列表", description = "获取当前登录用户可访问的所有门户信息")
-    @GetMapping("/listPortal")
-    public CommonResult<List<SysUserPortalListDTO>> getPortals() {
-        SaTokenUtils.getStpUtil().checkLogin();
-        return CommonResult.success(currentUserService.currentUserPortals());
-    }
-
-    @Operation(summary = "当前用户的个人账户中心信息", description = "获取当前登录用户的个人账户详细信息")
-    @GetMapping("/accountInfo")
-    public CommonResult accountInfo(){
-        SaTokenUtils.getStpUtil().checkLogin();
-        String stpType = LoginUserContextHolder.getStpType();
-        AbstractOAuth2PswUserOperator operator = pswUserOperatorManager.matchLoginType(stpType);
-        if(operator==null){
-            throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
-        }
-        return CommonResult.success(operator.getAccountInfo());
-    }
-
-    @Operation(summary = "更新用户的个人账户中心信息", description = "更新当前登录用户的个人账户信息")
-    @PostMapping("/updateAccountInfo")
-    public CommonResult<Boolean> updateAccountInfo(@Parameter(description = "账户信息编辑DTO") @RequestBody AccountUserInfoEditDTO source){
-        SaTokenUtils.getStpUtil().checkLogin();
-        String stpType = LoginUserContextHolder.getStpType();
-        AbstractOAuth2PswUserOperator operator = pswUserOperatorManager.matchLoginType(stpType);
-        if(operator==null){
-            throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
-        }
-        operator.updateAccountUserInfo(LoginUserContextHolder.getUser().getUserId(),source);
-        return CommonResult.success(true);
-    }
-
-}
+//
+//    @Operation(summary = "获取登录用户的权限信息", description = "获取当前登录用户的所有权限标识集合")
+//    @GetMapping("/getPermissionInfo")
+//    public CommonResult<Collection<String>> getPermissionInfo() {
+//        SaTokenUtils.getStpUtil().checkLogin();
+//        return CommonResult.success(currentUserService.currentUserPermission(String.valueOf(SaTokenUtils.getStpUtil().getLoginId())));
+//    }
+//
+//    @Operation(summary = "获得登录用户的菜单列表", description = "根据门户ID获取当前登录用户的菜单路由信息")
+//    @GetMapping("/listMenus-{portalId}")
+//    public CommonResult<List<RouteItemVO>> getMenus(@Parameter(description = "门户ID") @PathVariable(value = "portalId",required = false) String portalId) {
+//        return CommonResult.success(TreeBuilder.buildTree(currentUserService.currentUserMenus(portalId)));
+//    }
+//
+//    @Operation(summary = "获取登录用户的门户列表", description = "获取当前登录用户可访问的所有门户信息")
+//    @GetMapping("/listPortal")
+//    public CommonResult<List<SysUserPortalListDTO>> getPortals() {
+//        SaTokenUtils.getStpUtil().checkLogin();
+//        return CommonResult.success(currentUserService.currentUserPortals());
+//    }
+//
+//    @Operation(summary = "当前用户的个人账户中心信息", description = "获取当前登录用户的个人账户详细信息")
+//    @GetMapping("/accountInfo")
+//    public CommonResult accountInfo(){
+//        SaTokenUtils.getStpUtil().checkLogin();
+//        String stpType = LoginUserContextHolder.getStpType();
+//        AbstractOAuth2PswUserOperator operator = pswUserOperatorManager.matchLoginType(stpType);
+//        if(operator==null){
+//            throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
+//        }
+//        return CommonResult.success(operator.getAccountInfo());
+//    }
+//
+//    @Operation(summary = "更新用户的个人账户中心信息", description = "更新当前登录用户的个人账户信息")
+//    @PostMapping("/updateAccountInfo")
+//    public CommonResult<Boolean> updateAccountInfo(@Parameter(description = "账户信息编辑DTO") @RequestBody AccountUserInfoEditDTO source){
+//        SaTokenUtils.getStpUtil().checkLogin();
+//        String stpType = LoginUserContextHolder.getStpType();
+//        AbstractOAuth2PswUserOperator operator = pswUserOperatorManager.matchLoginType(stpType);
+//        if(operator==null){
+//            throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
+//        }
+//        operator.updateAccountUserInfo(LoginUserContextHolder.getUser().getUserId(),source);
+//        return CommonResult.success(true);
+//    }
+//
+//}

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

@@ -1,171 +1,170 @@
-package cn.tr.module.sys.oauth2.service;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.tr.core.exception.ServiceException;
-import cn.tr.core.exception.TRExcCode;
-import cn.tr.module.sys.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;
-import cn.tr.module.sys.user.service.ISysMenuService;
-import cn.tr.module.sys.user.service.ISysPortalMenuService;
-import cn.tr.module.sys.user.service.ISysUserPortalService;
-import cn.tr.module.sys.user.service.ISysUserRoleService;
-import cn.tr.module.sys.user.vo.RouteItemVO;
-import cn.tr.plugin.security.utils.SaTokenUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @ClassName : CurrentUserService
- * @Description :
- * @Author : LF
- * @Date: 2023年04月07日
- */
-
-@Component
-public class CurrentUserService {
-    @Autowired
-    private  ISysTenantService tenantService;
-    @Autowired
-    private  ISysMenuService menuService;
-    @Autowired
-    private  ISysPortalMenuService portalMenuService;
-    @Autowired
-    private  ISysUserPortalService userPortalService;
-    @Autowired
-    private  ISysUserRoleService userRoleService;
-
-    @Value("${tr.tenant.enable}")
-    private Boolean tenantEnable;
-    /**
-     * 获取当前用户权限
-     * @return
-     */
-    public Collection<String> currentUserPermission(String userId){
-        if (Boolean.TRUE.equals(tenantEnable)) {
-            //用户所在租户拥有的权限
-            Set<String> tenantPermissions = tenantService.findTenantPermission();
-            ;
-            //用户角色所拥有的权限
-            Set<String> rolePermissions = menuService.findUserPermission(userId);
-
-            return CollectionUtil.intersection(tenantPermissions,rolePermissions);
-        }else {
-            return menuService.findUserPermission(userId);
-        }
-
-    };
-
-    public Collection<String> currentUserRoleCode(){
-        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
-        List<SysRoleDTO> roles = userRoleService.findAllRolesByUserId(currentUserId);
-        return roles.stream().
-                map(SysRoleDTO::getCode)
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * 获取当前用户菜单
-     * @return
-     */
-    public List<RouteItemVO> currentUserMenus(String portalId){
-        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
-        Set<SysMenuDTO> tenantMenus =null;
-        if (Boolean.TRUE.equals(tenantEnable)) {
-            tenantMenus = tenantService.currentTenantMenus();
-        }
-        //查询所有可匿名访问的菜单
-//        List<SysMenuDTO> anonymousMenus = menuService.findAnonymousMenus();
-        Set<SysMenuDTO> roleMenus = menuService.findUserMenus(currentUserId);
-        //当未传门户id时,使用默认门户
-        if(StrUtil.isEmpty(portalId)){
-            List<SysUserPortalListDTO> portalList = currentUserPortals();
-            if (CollectionUtil.isNotEmpty(portalList)) {
-                portalId=portalList.stream()
-                        .filter(portal->Boolean.TRUE.equals(portal.getIsDefault()))
-                        .map(SysUserPortalListDTO::getId)
-                        .findFirst()
-                        .orElse(CollectionUtil.getFirst(portalList).getId());
-            }
-        }
-        Set<SysMenuDTO> portalMenus =StrUtil.isEmpty(portalId)?Collections.emptySet():new HashSet<>(portalMenuService.findAllMenusByPortalId(portalId));
-        // 交集(门面菜单,租户菜单,角色菜单)
-        Collection<SysMenuDTO> allMenus=new ArrayList<>();
-        if(Boolean.TRUE.equals(tenantEnable)){
-            allMenus = CollectionUtil.intersection(tenantMenus, roleMenus,portalMenus);
-        }else if(CollectionUtil.isNotEmpty(portalMenus)){
-            allMenus = CollectionUtil.intersection(roleMenus,portalMenus);
-        }else {
-            allMenus=roleMenus;
-        }
-//        if(CollectionUtil.isNotEmpty(anonymousMenus)){
-//            allMenus.addAll(anonymousMenus);
+//package cn.tr.module.sys.oauth2.service;
+//
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.collection.CollectionUtil;
+//import cn.hutool.core.util.StrUtil;
+//import cn.tr.core.exception.ServiceException;
+//import cn.tr.core.exception.TRExcCode;
+//import cn.tr.module.sys.tenant.service.ISysTenantService;
+//import cn.tr.module.sys.user.dto.SysRoleDTO;
+//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.service.ISysPortalMenuService;
+//import cn.tr.module.sys.user.service.ISysUserPortalService;
+//import cn.tr.module.sys.user.service.ISysUserRoleService;
+//import cn.tr.module.sys.user.vo.RouteItemVO;
+//import cn.tr.plugin.security.utils.SaTokenUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.*;
+//import java.util.stream.Collectors;
+//
+///**
+// * @ClassName : CurrentUserService
+// * @Description :
+// * @Author : LF
+// * @Date: 2023年04月07日
+// */
+//
+//@Component
+//public class CurrentUserService {
+//    @Autowired
+//    private  ISysTenantService tenantService;
+//    @Autowired
+//    private ISysMenuService menuService;
+//    @Autowired
+//    private  ISysPortalMenuService portalMenuService;
+//    @Autowired
+//    private  ISysUserPortalService userPortalService;
+//    @Autowired
+//    private  ISysUserRoleService userRoleService;
+//
+//    @Value("${tr.tenant.enable}")
+//    private Boolean tenantEnable;
+//    /**
+//     * 获取当前用户权限
+//     * @return
+//     */
+//    public Collection<String> currentUserPermission(String userId){
+//        if (Boolean.TRUE.equals(tenantEnable)) {
+//            //用户所在租户拥有的权限
+//            Set<String> tenantPermissions = tenantService.findTenantPermission();
+//            ;
+//            //用户角色所拥有的权限
+//            Set<String> rolePermissions = menuService.findUserPermission(userId);
+//
+//            return CollectionUtil.intersection(tenantPermissions,rolePermissions);
+//        }else {
+//            return menuService.findUserPermission(userId);
 //        }
-        if(CollectionUtil.isEmpty(allMenus)){
-            return new ArrayList<>();
-        }
-        return allMenus
-                .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());
-    }
-
-    public List<SysUserPortalListDTO> currentUserPortals(){
-        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
-        List<SysUserPortalListDTO> portals = userPortalService.findPortalsByUserId(currentUserId);
-        if (CollectionUtil.size(portals)==0) {
-            if (Boolean.TRUE.equals(tenantEnable)) {
-                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户未设置门户信息");
-            }else {
-                return new ArrayList<>();
-            }
-
-        }
-        return portals;
-    }
-
-    /**
-     * 获取当前用户菜单
-     * @auth: lisen
-     * @return List<SysMenuDTO>
-     */
-    public Collection<SysMenuDTO> currentUserAllMenus(String portalId){
-        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
-        Set<SysMenuDTO> tenantMenus =null;
-        if (Boolean.TRUE.equals(tenantEnable)) {
-            tenantMenus = tenantService.currentTenantMenus();
-        }
-        Set<SysMenuDTO> roleMenus = menuService.findUserMenus(currentUserId);
-        //当未传门户id时,使用默认门户
-        if(StrUtil.isEmpty(portalId)){
-            List<SysUserPortalListDTO> portalList = currentUserPortals();
-            if (CollectionUtil.isNotEmpty(portalList)) {
-                portalId=portalList.stream()
-                        .filter(portal->Boolean.TRUE.equals(portal.getIsDefault()))
-                        .map(SysUserPortalListDTO::getId)
-                        .findFirst()
-                        .orElse(CollectionUtil.getFirst(portalList).getId());
-            }
-        }
-        Set<SysMenuDTO> portalMenus =StrUtil.isEmpty(portalId)?Collections.emptySet():new HashSet<>(portalMenuService.findAllMenusByPortalId(portalId));
-        // 交集(门面菜单,租户菜单,角色菜单)
-        if (Boolean.TRUE.equals(tenantEnable)) {
-            return CollectionUtil.intersection(tenantMenus, roleMenus,portalMenus);
-        }
-        return CollectionUtil.intersection(roleMenus,portalMenus);
-    }
-}
+//
+//    };
+//
+//    public Collection<String> currentUserRoleCode(){
+//        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
+//        List<SysRoleDTO> roles = userRoleService.findAllRolesByUserId(currentUserId);
+//        return roles.stream().
+//                map(SysRoleDTO::getCode)
+//                .collect(Collectors.toList());
+//    }
+//
+//    /**
+//     * 获取当前用户菜单
+//     * @return
+//     */
+//    public List<RouteItemVO> currentUserMenus(String portalId){
+//        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
+//        Set<SysMenuDTO> tenantMenus =null;
+//        if (Boolean.TRUE.equals(tenantEnable)) {
+//            tenantMenus = tenantService.currentTenantMenus();
+//        }
+//        //查询所有可匿名访问的菜单
+////        List<SysMenuDTO> anonymousMenus = menuService.findAnonymousMenus();
+//        Set<SysMenuDTO> roleMenus = menuService.findUserMenus(currentUserId);
+//        //当未传门户id时,使用默认门户
+//        if(StrUtil.isEmpty(portalId)){
+//            List<SysUserPortalListDTO> portalList = currentUserPortals();
+//            if (CollectionUtil.isNotEmpty(portalList)) {
+//                portalId=portalList.stream()
+//                        .filter(portal->Boolean.TRUE.equals(portal.getIsDefault()))
+//                        .map(SysUserPortalListDTO::getId)
+//                        .findFirst()
+//                        .orElse(CollectionUtil.getFirst(portalList).getId());
+//            }
+//        }
+//        Set<SysMenuDTO> portalMenus =StrUtil.isEmpty(portalId)?Collections.emptySet():new HashSet<>(portalMenuService.findAllMenusByPortalId(portalId));
+//        // 交集(门面菜单,租户菜单,角色菜单)
+//        Collection<SysMenuDTO> allMenus=new ArrayList<>();
+//        if(Boolean.TRUE.equals(tenantEnable)){
+//            allMenus = CollectionUtil.intersection(tenantMenus, roleMenus,portalMenus);
+//        }else if(CollectionUtil.isNotEmpty(portalMenus)){
+//            allMenus = CollectionUtil.intersection(roleMenus,portalMenus);
+//        }else {
+//            allMenus=roleMenus;
+//        }
+////        if(CollectionUtil.isNotEmpty(anonymousMenus)){
+////            allMenus.addAll(anonymousMenus);
+////        }
+//        if(CollectionUtil.isEmpty(allMenus)){
+//            return new ArrayList<>();
+//        }
+//        return allMenus
+//                .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());
+//    }
+//
+//    public List<SysUserPortalListDTO> currentUserPortals(){
+//        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
+//        List<SysUserPortalListDTO> portals = userPortalService.findPortalsByUserId(currentUserId);
+//        if (CollectionUtil.size(portals)==0) {
+//            if (Boolean.TRUE.equals(tenantEnable)) {
+//                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户未设置门户信息");
+//            }else {
+//                return new ArrayList<>();
+//            }
+//
+//        }
+//        return portals;
+//    }
+//
+//    /**
+//     * 获取当前用户菜单
+//     * @auth: lisen
+//     * @return List<SysMenuDTO>
+//     */
+//    public Collection<SysMenuDTO> currentUserAllMenus(String portalId){
+//        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
+//        Set<SysMenuDTO> tenantMenus =null;
+//        if (Boolean.TRUE.equals(tenantEnable)) {
+//            tenantMenus = tenantService.currentTenantMenus();
+//        }
+//        Set<SysMenuDTO> roleMenus = menuService.findUserMenus(currentUserId);
+//        //当未传门户id时,使用默认门户
+//        if(StrUtil.isEmpty(portalId)){
+//            List<SysUserPortalListDTO> portalList = currentUserPortals();
+//            if (CollectionUtil.isNotEmpty(portalList)) {
+//                portalId=portalList.stream()
+//                        .filter(portal->Boolean.TRUE.equals(portal.getIsDefault()))
+//                        .map(SysUserPortalListDTO::getId)
+//                        .findFirst()
+//                        .orElse(CollectionUtil.getFirst(portalList).getId());
+//            }
+//        }
+//        Set<SysMenuDTO> portalMenus =StrUtil.isEmpty(portalId)?Collections.emptySet():new HashSet<>(portalMenuService.findAllMenusByPortalId(portalId));
+//        // 交集(门面菜单,租户菜单,角色菜单)
+//        if (Boolean.TRUE.equals(tenantEnable)) {
+//            return CollectionUtil.intersection(tenantMenus, roleMenus,portalMenus);
+//        }
+//        return CollectionUtil.intersection(roleMenus,portalMenus);
+//    }
+//}

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

@@ -0,0 +1,51 @@
+package cn.tr.module.sys.oauth2.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 获取地址类
+ *
+ * @author Kevin
+ */
+@Slf4j
+public class AddressUtil {
+    /**
+     * IP地址查询
+     */
+    public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
+
+    /**
+     * 未知地址
+     */
+    public static final String UNKNOWN = "XX XX";
+
+    public static String getRealAddressByIp(String ip) {
+        String address = UNKNOWN;
+        // 内网不查询
+//        try {
+//            if (NetUtil.isInnerIP(ip)) {
+//                return "内网IP";
+//            }
+//            if (AppConfig.isAddressEnabled()) {
+//                try {
+//                    String rspStr = HttpUtil.get(IP_URL + "?ip=" + ip + "&json=true", CharsetUtil.CHARSET_GBK);
+//                    if (CharSequenceUtil.isEmpty(rspStr)) {
+//                        log.error("获取地理位置异常 {}", ip);
+//                        return UNKNOWN;
+//                    }
+//                    JSONObject obj = JSONUtil.parseObj(rspStr);
+//                    String region = obj.getStr("pro");
+//                    String city = obj.getStr("city");
+//                    return String.format("%s %s", region, city);
+//                } catch (Exception e) {
+//                    log.error("获取地理位置异常 {}", ip);
+//                }
+//            }
+//            return address;
+//        }catch (Exception e){
+//            return UNKNOWN;
+//        }
+        return address;
+
+    }
+}

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

@@ -1,5 +1,6 @@
 package cn.tr.module.phototherapy.common.service.impl;
 
+import cn.tr.module.common.Value;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import cn.tr.module.phototherapy.common.po.BusClinicPO;
@@ -17,6 +18,11 @@ 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接口实现类
@@ -25,8 +31,19 @@ import cn.tr.core.exception.TRExcCode;
  * @date 2026-01-12
  **/
 @Service
-public class BusHospitalServiceImpl extends ServiceImpl<BusHospitalRepository, BusHospitalPO> implements IBusHospitalService {
+public class BusHospitalServiceImpl extends ServiceImpl<BusHospitalRepository, BusHospitalPO> implements IBusHospitalService, GetNameInterface<String, String> {
 
+    @Autowired
+    private ConfigStorageManager configStorageManager;
+
+    private ConfigStorage nameCache;
+
+    private HashMap<String,String> codeMap=new HashMap<>();
+
+    @PostConstruct
+    public void init(){
+        nameCache = configStorageManager.getStorage("hospital_name");
+    }
 
     /**
     * 根据条件查询医院信息表
@@ -78,7 +95,12 @@ public class BusHospitalServiceImpl extends ServiceImpl<BusHospitalRepository, B
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean insertBusHospital(BusHospitalDTO source){
-        return this.save(BusHospitalMapper.INSTANCE.convertPO(source));
+        boolean result = this.save(BusHospitalMapper.INSTANCE.convertPO(source));
+        if (result) {
+            // 缓存医院名称
+            nameCache.setConfig(source.getTenantId(), source.getHospitalName());
+        }
+        return result;
     };
 
     /**
@@ -93,6 +115,36 @@ public class BusHospitalServiceImpl extends ServiceImpl<BusHospitalRepository, B
         if(CollectionUtil.isEmpty(ids)){
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
         }
+        // 清除缓存
+        for (String id : ids) {
+            nameCache.remove(id);
+        }
         return this.removeByIds(ids);
     };
+
+    /**
+     * 根据医院ID获取医院名称
+     * 实现GetNameInterface接口
+     */
+    @Override
+    public String getName(String id) {
+        if (id == null) {
+            return null;
+        }
+        // 先从缓存获取
+        Value cachedValue = nameCache.getConfig(id);
+        if (cachedValue != null && cachedValue.asString() != null) {
+            return cachedValue.asString();
+        }
+
+        // 缓存未命中,从数据库查询并放入缓存
+        BusHospitalPO hospital = this.getById(id);
+        if (hospital != null) {
+            String hospitalName = hospital.getHospitalName();
+            nameCache.setConfig(id, hospitalName);
+            return hospitalName;
+        }
+
+        return null;
+    }
 }

+ 22 - 0
tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/web/properties/CaptchaProperties.java

@@ -0,0 +1,22 @@
+package cn.tr.module.phototherapy.web.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CaptchaProperties.java
+ * @Description TODO
+ * @createTime 2022年06月10日 10:31:00
+ */
+@ConfigurationProperties("captcha")
+@Data
+@Configuration
+public class CaptchaProperties {
+    private boolean enable;
+    private int width;
+    private int height;
+    private int expire;
+}

+ 62 - 0
tr-modules/tr-modules-phototherapy/src/main/java/cn/tr/module/phototherapy/web/utils/CaptchaTool.java

@@ -0,0 +1,62 @@
+package cn.tr.module.phototherapy.web.utils;
+
+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 lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CaptchaTool.java
+ * @Description TODO
+ * @createTime 2022年06月10日 09:59:00
+ */
+@Component
+@AllArgsConstructor
+public class CaptchaTool {
+    private final RedisUtils redisUtils;
+
+    /**
+     * 输出验证码
+     * @param key
+     * @param captcha  Captcha
+     * @param request  HttpServletRequest
+     * @param response HttpServletResponse
+     * @throws IOException IO异常
+     */
+    public void out(String key,Captcha captcha, int expire,HttpServletRequest request, HttpServletResponse response)
+            throws IOException {
+        // 手动设置响应头,替代CaptchaUtil.setHeader(response)
+        response.setContentType("image/png");
+        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+        response.setHeader("Pragma", "no-cache");
+        response.setDateHeader("Expires", 0);
+        //验证码放入缓存30分钟
+        redisUtils.set(key,captcha.text().toLowerCase(), expire);
+        captcha.out(response.getOutputStream());
+    }
+
+
+    public boolean ver(String key,String code){
+        if(StrUtil.isBlank(code)){
+            throw new CustomException("验证码不能为空");
+        }
+        Object cacheCode = redisUtils.get(key);
+        if (Objects.nonNull(cacheCode)) {
+            if (Objects.equals(cacheCode,code)) {
+                return Boolean.TRUE.equals(redisUtils.del(key));
+            }
+            throw new CustomException("验证码错误");
+        }
+        throw new CustomException("验证码已失效");
+    }
+}

+ 38 - 38
tr-plugins/tr-spring-boot-starter-plugin-cache/src/main/resources/application-redis.yml

@@ -1,38 +1,38 @@
-spring:
-  data:
-    redis:
-      # Redis服务器地址
-      host: 192.168.100.32
-      # Redis服务器端口
-      port: 9736
-      # Redis数据库索引
-      database: 5
-      # Redis服务器密码(注意转义字符处理)
-      password: "6E6985E1F7CB40F24A\\."
-      # 连接超时时间
-      timeout: 30s
-      # 客户端名称
-      client-name:
-      lettuce:
-        pool:
-          # 连接池中的最小空闲连接
-          min-idle: 16
-          # 连接池中的最大空闲连接
-          max-idle: 16
-          # 连接池的最大数据库连接数
-          max-active: 16
-          # 连接池最大阻塞等待时间(使用负值表示没有限制)
-          max-wait: -1ms
-        # 关闭超时时间
-        shutdown-timeout: 100ms
-  cache:
-    type: redis
-    redis:
-      # 缓存过期时间(7天)
-      time-to-live: 604800000
-      # 缓存键前缀
-      key-prefix: cache
-      # 是否使用键前缀
-      use-key-prefix: true
-      # 是否缓存空值
-      cache-null-values: true
+#spring:
+#  data:
+#    redis:
+#      # Redis服务器地址
+#      host: 192.168.100.32
+#      # Redis服务器端口
+#      port: 9736
+#      # Redis数据库索引
+#      database: 5
+#      # Redis服务器密码(注意转义字符处理)
+#      password: "6E6985E1F7CB40F24A\\."
+#      # 连接超时时间
+#      timeout: 30s
+#      # 客户端名称
+#      client-name:
+#      lettuce:
+#        pool:
+#          # 连接池中的最小空闲连接
+#          min-idle: 16
+#          # 连接池中的最大空闲连接
+#          max-idle: 16
+#          # 连接池的最大数据库连接数
+#          max-active: 16
+#          # 连接池最大阻塞等待时间(使用负值表示没有限制)
+#          max-wait: -1ms
+#        # 关闭超时时间
+#        shutdown-timeout: 100ms
+#  cache:
+#    type: redis
+#    redis:
+#      # 缓存过期时间(7天)
+#      time-to-live: 604800000
+#      # 缓存键前缀
+#      key-prefix: cache
+#      # 是否使用键前缀
+#      use-key-prefix: true
+#      # 是否缓存空值
+#      cache-null-values: true

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

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