ソースを参照

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

18339543638 2 年 前
コミット
04aa050d39
58 ファイル変更1382 行追加111 行削除
  1. 8 1
      tr-dependencies/pom.xml
  2. 11 0
      tr-framework/pom.xml
  3. 26 2
      tr-framework/src/main/java/cn/tr/core/strategy/auth/bo/AuthenticationDTO.java
  4. 1 0
      tr-modules/tr-module-auth/pom.xml
  5. 5 6
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/AuthController.java
  6. 16 0
      tr-modules/tr-module-system/pom.xml
  7. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/package-info.java
  8. 6 6
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/controller/SysOperLogController.java
  9. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/package-info.java
  10. 3 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/po/SysOperLogPO.java
  11. 24 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/SysUserMapper.java
  12. 44 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bo/OAuth2PswReqBO.java
  13. 37 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bo/UserLoginInfoBO.java
  14. 21 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/constant/OAuth2Constant.java
  15. 48 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/OAuth2ServerController.java
  16. 28 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/enums/OAuth2ModelEnum.java
  17. 48 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/operator/OAuth2UserOperator.java
  18. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/package-info.java
  19. 15 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/properties/TrOAuth2Properties.java
  20. 52 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/OAuth2PswModelConfig.java
  21. 18 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/AbstractOAuth2PswUserOperator.java
  22. 78 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/LoginOAuth2PswUserOperator.java
  23. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/package-info.java
  24. 35 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/properties/TrOAuth2PswClientProperties.java
  25. 86 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserDTO.java
  26. 22 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/enums/UserStatusEnum.java
  27. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/package-info.java
  28. 75 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPO.java
  29. 17 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserRepository.java
  30. 55 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserService.java
  31. 55 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/SysUserServiceImpl.java
  32. 24 0
      tr-modules/tr-module-system/src/main/resources/META-INF/spring-configuration-metadata.json
  33. 3 0
      tr-plugins/pom.xml
  34. 47 0
      tr-plugins/tr-spring-boot-starter-plugin-auth2/pom.xml
  35. 15 0
      tr-plugins/tr-spring-boot-starter-plugin-auth2/src/main/java/cn/tr/plugin/auth2/server/SaOAuth2ServerApplication.java
  36. 62 0
      tr-plugins/tr-spring-boot-starter-plugin-auth2/src/main/java/cn/tr/plugin/auth2/server/SaOAuth2ServerController.java
  37. 35 0
      tr-plugins/tr-spring-boot-starter-plugin-auth2/src/main/java/cn/tr/plugin/auth2/server/SaOAuth2TemplateImpl.java
  38. 3 1
      tr-plugins/tr-spring-boot-starter-plugin-banner/src/main/java/cn/tr/plugin/banner/config/BannerConfig.java
  39. 28 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/pom.xml
  40. 19 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/TrConstantAutoConfiguration.java
  41. 21 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/annotation/Constant.java
  42. 26 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/bo/ConstantBO.java
  43. 59 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/config/ConstantInterceptor.java
  44. 33 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/strategy/ConstantStrategy.java
  45. 1 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  46. 0 1
      tr-plugins/tr-spring-boot-starter-plugin-biz-excel/pom.xml
  47. 23 13
      tr-plugins/tr-spring-boot-starter-plugin-biz-excel/src/test/java/cn/tr/plugin/excel/WordTest.java
  48. 9 8
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/config/OperateLogAspect.java
  49. 8 0
      tr-plugins/tr-spring-boot-starter-plugin-satoken/pom.xml
  50. 32 0
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/TrSaTokenAutoConfiguration.java
  51. 14 14
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/config/TrSaTokenWebConfig.java
  52. 2 3
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/properties/TrSaTokenProperties.java
  53. 27 0
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/resources/META-INF/additional-spring-configuration-metadata.json
  54. 16 0
      tr-plugins/tr-spring-boot-starter-plugin-tree/pom.xml
  55. 5 5
      tr-test/pom.xml
  56. 0 44
      tr-test/src/main/java/cn/tr/test/WebApplication.java
  57. 2 3
      tr-test/src/main/resources/application-doc.yml
  58. 24 4
      tr-test/src/main/resources/application.yml

+ 8 - 1
tr-dependencies/pom.xml

@@ -45,7 +45,7 @@
         <minio.version>8.5.1</minio.version>
         <qiniu.version>7.9.5</qiniu.version>
         <!--文件导入导出-->
-        <poi.version>4.1.2</poi.version>
+        <poi.version>5.2.2</poi.version>
         <!--websocket-->
         <tio-websocket.version>3.6.0.v20200315-RELEASE</tio-websocket.version>
 
@@ -360,6 +360,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!--常量业务插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-biz-constant</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <!--表格插件-->
             <dependency>
                 <groupId>cn.tr</groupId>

+ 11 - 0
tr-framework/pom.xml

@@ -36,11 +36,22 @@
             <artifactId>lombok</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-log4j2</artifactId>

+ 26 - 2
tr-framework/src/main/java/cn/tr/core/strategy/auth/bo/AuthenticationDTO.java

@@ -1,6 +1,11 @@
 package cn.tr.core.strategy.auth.bo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Pattern;
 
 /**
  * 用于登陆传递账号密码
@@ -14,17 +19,36 @@ public class AuthenticationDTO {
 	/**
 	 * 用户名
 	 */
+	@ApiModelProperty(value = "账号",required = true)
+	@NotEmpty(message = "登录账号不能为空")
+	@Length(min = 4, max = 16, message = "账号长度为 4-16 位")
+	@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
 	protected String username;
 
 	/**
 	 * 密码
 	 */
-	protected String password;
 
-	private String codeKey;
+	@ApiModelProperty(value = "密码", required = true)
+	@NotEmpty(message = "密码不能为空")
+	@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
+	private String password;
+
+	@ApiModelProperty(value = "验证码,验证码开启时,需要传递")
+	@NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class)
+	private String captchaVerification;
 
 	/**
 	 * loginType 参考SysTypeEnum
 	 */
+	@ApiModelProperty(value = "登录方式",required = true)
+	@NotEmpty(message = "登录方式不能为空")
 	protected String loginType;
+
+
+	/**
+	 * 开启验证码的 Group
+	 */
+	public interface CodeEnableGroup {
+	}
 }

+ 1 - 0
tr-modules/tr-module-auth/pom.xml

@@ -36,5 +36,6 @@
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-banner</artifactId>
         </dependency>
+
     </dependencies>
 </project>

+ 5 - 6
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/AuthController.java

@@ -40,16 +40,15 @@ public class AuthController {
         }
         UserAccountInfoBO accountInfo = authGranter.login(authentication);
         SaTokenUtils.set(AuthConstant.ACCOUNT_USER,accountInfo);
-
         return CommonResult.success(AuthInfoVO.of(accountInfo.getToken(),
                 authentication.getLoginType()));
     }
 
-
-    @ApiOperation(value = "token续签")
-    @PostMapping("/renew")
-    public CommonResult<Boolean> renew() {
-        SaTokenUtils.renew();
+    @ApiOperation(value = "刷新令牌")
+    @PostMapping("/refresh-token")
+    @SaIgnore
+    public CommonResult<Boolean> refreshToken(@RequestParam("refreshToken") String refreshToken) {
+        SaTokenUtils.getStpUtil().updateLastActivityToNow(refreshToken);
         return CommonResult.success(true);
     }
 

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

@@ -18,6 +18,11 @@
             <artifactId>tr-spring-boot-starter-plugin-dict</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-biz-constant</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
@@ -33,6 +38,11 @@
             <artifactId>tr-spring-boot-starter-plugin-mp-enhance-actable</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-biz-tenant</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-operatelog</artifactId>
@@ -42,5 +52,11 @@
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-biz-bean-mapper</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-oauth2</artifactId>
+            <version>1.34.0</version>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/package-info.java

@@ -0,0 +1,2 @@
+package cn.tr.module.sys.dict;
+//字典、常量相关包

+ 6 - 6
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/controller/SysOperLogController.java

@@ -29,8 +29,8 @@ public class SysOperLogController extends BaseController {
 
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "根据条件查询操作日志",notes = "权限: sys:opeLog:query")
-    @SaCheckPermission("sys:opeLog:query")
+    @ApiOperation(value = "根据条件查询操作日志",notes = "权限: sys:operLog:query")
+    @SaCheckPermission("sys:operLog:query")
     public TableDataInfo<SysOperLogDTO> selectList(@RequestBody SysOpeLogQueryDTO query){
         startPage();
         return getDataTable(operLogService.selectOperLogDataList(query));
@@ -38,16 +38,16 @@ public class SysOperLogController extends BaseController {
 
     @GetMapping("/detail/{id}")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "根据id查询操作日志",notes = "权限: sys:opeLog:query")
-    @SaCheckPermission("sys:opeLog:query")
+    @ApiOperation(value = "根据id查询操作日志",notes = "权限: sys:operLog:query")
+    @SaCheckPermission("sys:operLog:query")
     public CommonResult<SysOperLogDTO> findById(@PathVariable("id") String id){
         return CommonResult.success(operLogService.selectOperLogById(id));
     }
 
     @PostMapping("/deleteByIds")
     @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "删除查询日志",notes = "权限: sys:opeLog:del")
-    @SaCheckPermission("sys:opeLog:del")
+    @ApiOperation(value = "删除查询日志",notes = "权限: sys:operLog:del")
+    @SaCheckPermission("sys:operLog:del")
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
         return CommonResult.success(operLogService.deleteOperLogByIds(ids));
     }

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/package-info.java

@@ -0,0 +1,2 @@
+package cn.tr.module.sys.log;
+//日志相关包

+ 3 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/po/SysOperLogPO.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.log.po;
 
 import cn.tr.core.annotation.Comment;
+import cn.tr.plugin.constant.annotation.Constant;
 import cn.tr.plugin.mybatis.pojo.BasePO;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -27,7 +28,9 @@ public class SysOperLogPO extends BasePO {
 
     @ApiModelProperty(value = "主键")
     @TableId
+    @Constant(cate = "code")
     private String operId;
+
     /**
      * 用户id
      */

+ 24 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/SysUserMapper.java

@@ -0,0 +1,24 @@
+package cn.tr.module.sys.mapper;
+
+import cn.tr.module.sys.oauth2.bo.UserLoginInfoBO;
+import cn.tr.module.sys.user.po.SysUserPO;
+import org.mapstruct.Mapper;
+import cn.tr.module.sys.user.dto.SysUserDTO;
+import org.mapstruct.factory.Mappers;
+import java.util.*;
+/**
+ * @ClassName : SyUserMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Mapper
+public interface SysUserMapper {
+    SysUserMapper INSTANCE = Mappers.getMapper(SysUserMapper.class);
+
+    List<UserLoginInfoBO> toUserLoginValidateDTOList(List<SysUserPO> source);
+
+    SysUserDTO toUserDTO(SysUserPO source);
+
+    SysUserPO toUserPO(SysUserDTO source);
+}

+ 44 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bo/OAuth2PswReqBO.java

@@ -0,0 +1,44 @@
+package cn.tr.module.sys.oauth2.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * oauth认证参数
+ *
+ * @author lf
+ * @date 2020/7/1
+ */
+@Data
+@Accessors(chain = true)
+public class OAuth2PswReqBO {
+
+	@ApiModelProperty(value = "客户端id",required = true)
+	@NotEmpty(message = "客户端id不能为空")
+	private String client_id;
+
+	@ApiModelProperty(value = "账号",required = true)
+	@NotEmpty(message = "账号不能为空")
+	@Length(min = 4, max = 16, message = "账号长度为 4-16 位")
+	@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
+	protected String username;
+
+	@ApiModelProperty(value = "授权范围,可传空字符串",required = true)
+	@NotNull(message = "授权范围不能null")
+	private String grant_type;
+
+
+	@ApiModelProperty(value = "密码",required = true)
+	@NotEmpty(message = "密码不能为空")
+	@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
+	private String password;
+
+	@ApiModelProperty(value = "验证码,验证码开启时,需要传递")
+	private String captchaVerification;
+}

+ 37 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/bo/UserLoginInfoBO.java

@@ -0,0 +1,37 @@
+package cn.tr.module.sys.oauth2.bo;
+
+import lombok.Data;
+
+/**
+ * @ClassName : SysLoginUserInfoDTO
+ * @Description : 用户登录时需要的信息
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Data
+public class UserLoginInfoBO {
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 昵称
+     */
+    private String password;
+
+    /**
+     * 用户状态
+     */
+    private String status;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+}

+ 21 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/constant/OAuth2Constant.java

@@ -0,0 +1,21 @@
+package cn.tr.module.sys.oauth2.constant;
+
+/**
+ * @Interface : OAuth2Constant
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+
+public interface OAuth2Constant {
+    /**
+     * 当前token所绑定得到租户用户列表
+     */
+    String tenantUsers="Tenant_users";
+
+
+    /**
+     * 当前token所绑定的用户
+     */
+    String bindUser="Bind_User";
+}

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

@@ -0,0 +1,48 @@
+package cn.tr.module.sys.oauth2.controller;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.context.model.SaRequest;
+import cn.dev33.satoken.context.model.SaResponse;
+import cn.dev33.satoken.oauth2.SaOAuth2Manager;
+import cn.dev33.satoken.oauth2.config.SaOAuth2Config;
+import cn.dev33.satoken.oauth2.logic.SaOAuth2Handle;
+import cn.dev33.satoken.oauth2.model.SaClientModel;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.oauth2.bo.OAuth2PswReqBO;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ClassName : OAuth2ServerController
+ * @Description : oauth2接口
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@RestController
+@RequestMapping("/ua")
+@Api(tags = "认证接口")
+@AllArgsConstructor
+public class OAuth2ServerController {
+
+    @ApiOperation("OAuth2 密码模式")
+    @ApiOperationSupport(author = "lf")
+    @GetMapping("/oauth2/token")
+    public Object request(@Validated OAuth2PswReqBO source) {
+        SaRequest req = SaHolder.getRequest();
+        SaResponse res = SaHolder.getResponse();
+        SaOAuth2Config cfg = SaOAuth2Manager.getConfig();
+        SaClientModel cm = SaOAuth2Handle.currClientModel();
+        if(cfg.getIsPassword() && (cm.isPassword || cm.isAutoMode)) {
+            return SaOAuth2Handle.password(req, res, cfg);
+        }
+        System.out.println("------- 进入请求: " + SaHolder.getRequest().getUrl());
+        throw new ServiceException(TRExcCode.USER_ERROR_A0200,"暂未开放的授权模式");
+    }
+ }

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

@@ -0,0 +1,28 @@
+package cn.tr.module.sys.oauth2.enums;
+
+/**
+ * @ClassName : OAuth2ModelEnum
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+
+public enum  OAuth2ModelEnum {
+    /**
+     * 授权码模式
+     */
+    code,
+    /**
+     * 简化模式
+     */
+    implicit,
+    /**
+     * 客户端模式
+     */
+    client,
+    /**
+     * 密码模式
+     */
+    psw;
+
+}

+ 48 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/operator/OAuth2UserOperator.java

@@ -0,0 +1,48 @@
+/**
+ * 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.operator;
+
+import cn.tr.core.strategy.auth.LoginTypeMatcher;
+import cn.tr.module.sys.oauth2.bo.OAuth2PswReqBO;
+import cn.tr.module.sys.oauth2.enums.OAuth2ModelEnum;
+
+/**
+ * oauth2的用户接口操作接口
+ *
+ * @author lifang
+ */
+public interface OAuth2UserOperator extends LoginTypeMatcher {
+
+	/**
+	 * oauth2认证模式
+	 * @return {@link OAuth2ModelEnum}
+	 */
+	OAuth2ModelEnum oauth2Model();
+
+	/**
+	 * @param source 认证参数
+	 * @return token 或 code
+	 */
+	String auth(OAuth2PswReqBO source);
+
+	/**
+	 * 更新账号密码
+	 * @param oldPsw 旧密码
+	 * @param newPsw 新密码
+	 * @return
+	 */
+	boolean updatePsw(String oldPsw,String newPsw);
+}

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/package-info.java

@@ -0,0 +1,2 @@
+package cn.tr.module.sys.oauth2;
+//oauth2 认证相关包

+ 15 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/properties/TrOAuth2Properties.java

@@ -0,0 +1,15 @@
+package cn.tr.module.sys.oauth2.properties;
+
+import lombok.Data;
+
+/**
+ * @ClassName : TrOAuthProperties
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+
+@Data
+public class TrOAuth2Properties {
+
+}

+ 52 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/OAuth2PswModelConfig.java

@@ -0,0 +1,52 @@
+package cn.tr.module.sys.oauth2.psw;
+
+import cn.dev33.satoken.oauth2.config.SaOAuth2Config;
+import cn.dev33.satoken.util.SaResult;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.oauth2.bo.OAuth2PswReqBO;
+import cn.tr.module.sys.oauth2.psw.operator.LoginOAuth2PswUserOperator;
+import cn.tr.module.sys.oauth2.psw.properties.TrOAuth2PswClientProperties;
+import cn.tr.plugin.security.context.LoginUserContextHolder;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Optional;
+/**
+ * @ClassName : Oauth2PswConfig
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties(TrOAuth2PswClientProperties.class)
+public class OAuth2PswModelConfig {
+    private final SaOAuth2Config cfg;
+    private final List<LoginOAuth2PswUserOperator> operators;
+
+    @PostConstruct
+    public void init(){
+        //todo oss-client配置
+        cfg.setDoLoginHandle((username,psw)->{
+            String stpType = LoginUserContextHolder.getStpType();
+            if (StrUtil.isEmpty(stpType)) {
+                throw new ServiceException(TRExcCode.USER_ERROR_A0200,"账号体系不能为空");
+            }
+            Optional<LoginOAuth2PswUserOperator> operator = operators.stream()
+                    .filter(o -> o.match(stpType))
+                    .findFirst();
+            if(!operator.isPresent()){
+                throw new ServiceException(TRExcCode.USER_ERROR_A0200,String.format("账号体系[{%s}]不存在",stpType));
+            }
+            OAuth2PswReqBO parm = new OAuth2PswReqBO()
+                    .setPassword(username)
+                    .setUsername(psw);
+            return SaResult.ok(operator.get().auth(parm));
+        });
+    }
+}

+ 18 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/AbstractOAuth2PswUserOperator.java

@@ -0,0 +1,18 @@
+package cn.tr.module.sys.oauth2.psw.operator;
+
+import cn.tr.module.sys.oauth2.enums.OAuth2ModelEnum;
+import cn.tr.module.sys.oauth2.operator.OAuth2UserOperator;
+
+/**
+ * @ClassName : OAuth2PswUserOperator
+ * @Description : 账号、密码模式下的用户操作
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+
+public abstract class AbstractOAuth2PswUserOperator implements OAuth2UserOperator {
+    @Override
+    public OAuth2ModelEnum oauth2Model() {
+        return OAuth2ModelEnum.psw;
+    }
+}

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

@@ -0,0 +1,78 @@
+package cn.tr.module.sys.oauth2.psw.operator;
+
+import cn.dev33.satoken.stp.StpLogic;
+import cn.dev33.satoken.stp.StpUtil;
+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.core.utils.PswUtils;
+import cn.tr.module.sys.oauth2.bo.OAuth2PswReqBO;
+import cn.tr.module.sys.oauth2.bo.UserLoginInfoBO;
+import cn.tr.module.sys.oauth2.constant.OAuth2Constant;
+import cn.tr.module.sys.user.enums.UserStatusEnum;
+import cn.tr.module.sys.user.service.ISysUserService;
+import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
+import cn.tr.plugin.security.utils.SaTokenUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : LoginOauth2PswUserOperator
+ * @Description : 默认账号体系登录操作
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Component
+@AllArgsConstructor
+public class LoginOAuth2PswUserOperator extends AbstractOAuth2PswUserOperator{
+    private final ISysUserService sysUserService;
+    @Override
+    public String auth(OAuth2PswReqBO source) {
+        String username = source.getUsername();
+        String psw = source.getPassword();
+        TenantContextHolder.setIgnore(true);
+        //对账号进行校验
+        List<UserLoginInfoBO> users = sysUserService.findByUsernameWhenLogin(username);
+        if(CollectionUtil.isEmpty(users)){
+            //账户不存在
+            throw new ServiceException(TRExcCode.USER_ERROR_A0201);
+        }
+        //对密码进行校验找到匹配的用户
+        List<UserLoginInfoBO> matchUsers = users.stream()
+                .filter(user -> PswUtils.matchesPassword(psw, user.getPassword()))
+                .collect(Collectors.toList());
+        if(CollectionUtil.isEmpty(matchUsers)){
+            //密码错误
+            throw new ServiceException(TRExcCode.USER_ERROR_A0210);
+        }
+        //查看所有用户是否被禁用
+        List<UserLoginInfoBO> normalUsers = matchUsers.stream()
+                .filter(user -> StrUtil.equals(UserStatusEnum.normal.getValue(), user.getStatus()))
+                .collect(Collectors.toList());
+        if(CollectionUtil.isEmpty(normalUsers)){
+            //用户都被禁用
+            throw new ServiceException(TRExcCode.USER_ERROR_A0202);
+        }
+        StpLogic stpUtil = SaTokenUtils.getStpUtil();
+        stpUtil.login(username);
+        //如果只有一个用户,则默认登录该用户,若绑定多个用户,在选择完成用户后进行token的绑定,多租户模式下先使用username进行登录
+        String tokenValue =stpUtil.getTokenValue();
+        SaTokenUtils.set(OAuth2Constant.tenantUsers,matchUsers);
+        return tokenValue;
+    }
+
+    @Override
+    public boolean updatePsw(String oldPsw, String newPsw) {
+        return false;
+    }
+
+    @Override
+    public boolean match(String loginType) {
+        //默认登录体系
+        return StrUtil.equals(StpUtil.TYPE,loginType);
+    }
+}

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/package-info.java

@@ -0,0 +1,2 @@
+package cn.tr.module.sys.oauth2.psw;
+//账号/密码认证

+ 35 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/properties/TrOAuth2PswClientProperties.java

@@ -0,0 +1,35 @@
+package cn.tr.module.sys.oauth2.psw.properties;
+
+import cn.dev33.satoken.oauth2.model.SaClientModel;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @ClassName : TrOAuth2PswProperties
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Data
+@ConfigurationProperties(prefix = "tr.oauth2.psw")
+public class TrOAuth2PswClientProperties {
+    /**
+     * 应用id
+     */
+    public String clientId;
+
+    /**
+     * 应用秘钥
+     */
+    public String clientSecret;
+
+//    /**
+//     * 应用签约的所有权限, 多个用逗号隔开
+//     */
+//    public String contractScope;
+
+//    /**
+//     * 应用允许授权的所有URL, 多个用逗号隔开
+//     */
+//    public String allowUrl;
+}

+ 86 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserDTO.java

@@ -0,0 +1,86 @@
+package cn.tr.module.sys.user.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @ClassName : SysUserPO
+ * @Description : 系统用户实体类
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Data
+public class SysUserDTO {
+    /**
+     * 用户主键Id
+     */
+    private String userId;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 昵称
+     */
+    private String nickname;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 部门id
+     */
+    private String deptId;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 邮箱地址
+     */
+    private String email;
+
+    /**
+     * 出生日期
+     */
+    private Date birthday;
+
+    /**
+     * 岗位id
+     */
+    private String postIds;
+
+    /**
+     * 用户头像
+     */
+    private String avatar;
+
+    /**
+     * 用户状态
+     */
+    private String status;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private LocalDateTime loginDate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 22 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/enums/UserStatusEnum.java

@@ -0,0 +1,22 @@
+package cn.tr.module.sys.user.enums;
+
+import cn.tr.core.enums.IEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @ClassName : UserStatusEnum
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@AllArgsConstructor
+public enum UserStatusEnum implements IEnum<String> {
+    normal("1","正常"),
+    ban("2","被禁用")
+    ;
+    @Getter
+    private String value;
+    @Getter
+    private String label;
+}

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/package-info.java

@@ -0,0 +1,2 @@
+package cn.tr.module.sys.user;
+//用户信息 相关包

+ 75 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPO.java

@@ -0,0 +1,75 @@
+package cn.tr.module.sys.user.po;
+
+import cn.tr.module.sys.user.enums.UserStatusEnum;
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gitee.sunchenbin.mybatis.actable.annotation.ColumnComment;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @ClassName : SysUserPO
+ * @Description : 系统用户实体类
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Data
+@TableName("sys_user")
+public class SysUserPO extends BasePO {
+    @ColumnComment("用户主键Id")
+    @TableId
+    private String userId;
+
+    @ColumnComment("用户名")
+    private String username;
+
+    /**
+     * {@link cn.tr.core.utils.PswUtils#encryptPassword(String)} 加密
+     * {@link cn.tr.core.utils.PswUtils#matchesPassword(String, String)} (String)} 匹配密码
+     */
+    @ColumnComment("密码")
+    private String password;
+
+    @ColumnComment("昵称")
+    private String nickname;
+
+    @ColumnComment("性别")
+    private String gender;
+
+    @ColumnComment("部门id")
+    private String deptId;
+
+    @ColumnComment("手机号")
+    private String phone;
+
+    @ColumnComment("邮箱地址")
+    private String email;
+
+    @ColumnComment("出生日期")
+    private Date birthday;
+
+    @ColumnComment("岗位id")
+    private String postIds;
+
+    @ColumnComment("用户头像")
+    private String avatar;
+
+    /**
+     * {@link UserStatusEnum#getValue()}
+     */
+    @ColumnComment("用户状态")
+    private String status;
+
+    @ColumnComment("最后登录IP")
+    private String loginIp;
+
+    @ColumnComment("最后登录时间")
+    private LocalDateTime loginDate;
+
+    @ColumnComment("备注")
+    private String remark;
+
+}

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

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

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

@@ -0,0 +1,55 @@
+package cn.tr.module.sys.user.service;
+import cn.tr.module.sys.user.dto.SysUserDTO;
+import cn.tr.module.sys.oauth2.bo.UserLoginInfoBO;
+
+import java.util.*;
+/**
+ * @ClassName : ISysUserService
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+
+public interface ISysUserService {
+    /**
+     * 根据条件查询
+     * @param query 查询参数
+     * @return
+     */
+    List<SysUserDTO> selectSysUerList();
+
+    /**
+     * 根据id查询操作用户
+     * @param id 用户id
+     * @return 用户
+     */
+    SysUserDTO selectSysUserById(String id);
+
+    /**
+     * 更新用户
+     * @param source 更新用户
+     * @return true:更新成功
+     */
+    boolean updateSysUerById(SysUserDTO source);
+
+    /**
+     * 登录时根据用户名查询用户
+     * @param username 用户名
+     * @return
+     */
+    List<UserLoginInfoBO> findByUsernameWhenLogin(String username);
+
+    /**
+     * 新增用户
+     * @param source 新增用户
+     * @return true:新增成功
+     */
+    boolean insertSysUer(SysUserDTO source);
+
+    /**
+     * 根据id删除用户
+     * @param ids 用户id
+     * @return 删除数量
+     */
+    int deleteSysUerByIds(Collection<String> ids);
+}

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

@@ -0,0 +1,55 @@
+package cn.tr.module.sys.user.service;
+
+import cn.tr.module.sys.mapper.SysUserMapper;
+import cn.tr.module.sys.user.dto.SysUserDTO;
+import cn.tr.module.sys.oauth2.bo.UserLoginInfoBO;
+import cn.tr.module.sys.user.po.SysUserPO;
+import cn.tr.module.sys.user.repository.SysUserRepository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @ClassName : SysUserServiceImpl
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Service
+@AllArgsConstructor
+public class SysUserServiceImpl implements ISysUserService {
+    private final SysUserRepository userRepository;
+    @Override
+    public List<SysUserDTO> selectSysUerList() {
+        return null;
+    }
+
+    @Override
+    public SysUserDTO selectSysUserById(String id) {
+        return SysUserMapper.INSTANCE.toUserDTO(userRepository.selectById(id));
+    }
+
+    @Override
+    public boolean updateSysUerById(SysUserDTO source) {
+        return userRepository.updateById(SysUserMapper.INSTANCE.toUserPO(source))!=0;
+    }
+
+    @Override
+    public List<UserLoginInfoBO> findByUsernameWhenLogin(String username) {
+        return SysUserMapper.INSTANCE.toUserLoginValidateDTOList(userRepository.selectList(new LambdaQueryWrapper<SysUserPO>()
+                .eq(SysUserPO::getUsername,username)));
+    }
+
+    @Override
+    public boolean insertSysUer(SysUserDTO source) {
+        return false;
+    }
+
+    @Override
+    public int deleteSysUerByIds(Collection<String> ids) {
+        return userRepository.deleteBatchIds(ids);
+    }
+}

+ 24 - 0
tr-modules/tr-module-system/src/main/resources/META-INF/spring-configuration-metadata.json

@@ -0,0 +1,24 @@
+{
+  "groups": [
+    {
+      "name": "tr.oauth2.psw",
+      "type": "cn.tr.module.sys.oauth2.psw.properties.TrOAuth2PswClientProperties",
+      "sourceType": "cn.tr.module.sys.oauth2.psw.properties.TrOAuth2PswClientProperties"
+    }
+  ],
+  "properties": [
+    {
+      "name": "tr.oauth2.psw.client-id",
+      "type": "java.lang.String",
+      "description": "应用id",
+      "sourceType": "cn.tr.module.sys.oauth2.psw.properties.TrOAuth2PswClientProperties"
+    },
+    {
+      "name": "tr.oauth2.psw.client-secret",
+      "type": "java.lang.String",
+      "description": "应用秘钥",
+      "sourceType": "cn.tr.module.sys.oauth2.psw.properties.TrOAuth2PswClientProperties"
+    }
+  ],
+  "hints": []
+}

+ 3 - 0
tr-plugins/pom.xml

@@ -35,6 +35,9 @@
         <module>tr-spring-boot-starter-plugin-doc</module>
         <module>tr-spring-boot-starter-plugin-mp-enhance-actable</module>
         <module>tr-spring-boot-starter-plugin-biz-bean-mapper</module>
+        <module>tr-spring-boot-starter-plugin-biz-constant</module>
+        <module>tr-spring-boot-starter-plugin-tree</module>
+        <module>tr-spring-boot-starter-plugin-auth2</module>
     </modules>
 
 </project>

+ 47 - 0
tr-plugins/tr-spring-boot-starter-plugin-auth2/pom.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tr-plugins</artifactId>
+        <groupId>cn.tr</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <version>${revision}</version>
+    <artifactId>tr-spring-boot-starter-plugin-auth2</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- Sa-Token 权限认证, 在线文档:https://sa-token.cc -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.34.0</version>
+        </dependency>
+
+        <!-- Sa-Token-OAuth2.0 模块 -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-oauth2</artifactId>
+            <version>1.34.0</version>
+        </dependency>
+
+    </dependencies>
+</project>

+ 15 - 0
tr-plugins/tr-spring-boot-starter-plugin-auth2/src/main/java/cn/tr/plugin/auth2/server/SaOAuth2ServerApplication.java

@@ -0,0 +1,15 @@
+package cn.tr.plugin.auth2.server;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 启动:Sa-OAuth2 Server端 
+ */
+@SpringBootApplication
+public class SaOAuth2ServerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(SaOAuth2ServerApplication.class, args);
+        System.out.println("\nSa-Token-OAuth Server端启动成功");
+    }
+}

+ 62 - 0
tr-plugins/tr-spring-boot-starter-plugin-auth2/src/main/java/cn/tr/plugin/auth2/server/SaOAuth2ServerController.java

@@ -0,0 +1,62 @@
+package cn.tr.plugin.auth2.server;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.oauth2.config.SaOAuth2Config;
+import cn.dev33.satoken.oauth2.logic.SaOAuth2Handle;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.util.SaResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Sa-OAuth2 Server端 控制器 
+ */
+@RestController
+public class SaOAuth2ServerController {
+
+    // 处理所有OAuth相关请求 
+    @RequestMapping("/oauth2/*")
+    public Object request() {
+        System.out.println("------- 进入请求: " + SaHolder.getRequest().getUrl());
+        return SaOAuth2Handle.serverRequest();
+    }
+
+    // Sa-OAuth2 定制化配置 
+    @Autowired
+    public void setSaOAuth2Config(SaOAuth2Config cfg) {
+        cfg.
+            // 配置:未登录时返回的View 
+            setNotLoginView(() -> {
+                String msg = "当前会话在OAuth-Server端尚未登录,请先访问"
+                            + "<a href='/oauth2/doLogin?name=sa&pwd=123456' target='_blank'> doLogin登录 </a>"
+                            + "进行登录之后,刷新页面开始授权";
+                return msg;
+            }).
+            // 配置:登录处理函数 
+            setDoLoginHandle((name, pwd) -> {
+                if("sa".equals(name) && "123456".equals(pwd)) {
+                    StpUtil.login(10001);
+                    return SaResult.ok();
+                }
+                return SaResult.error("账号名或密码错误");
+            }).
+            // 配置:确认授权时返回的View 
+            setConfirmView((clientId, scope) -> {
+                String msg = "<p>应用 " + clientId + " 请求授权:" + scope + "</p>"
+                        + "<p>请确认:<a href='/oauth2/doConfirm?client_id=" + clientId + "&scope=" + scope + "' target='_blank'> 确认授权 </a></p>"
+                        + "<p>确认之后刷新页面</p>";
+                return msg;
+            })
+            ;
+    }
+
+    // 全局异常拦截  
+    @ExceptionHandler
+    public SaResult handlerException(Exception e) {
+        e.printStackTrace(); 
+        return SaResult.error(e.getMessage());
+    }
+
+}

+ 35 - 0
tr-plugins/tr-spring-boot-starter-plugin-auth2/src/main/java/cn/tr/plugin/auth2/server/SaOAuth2TemplateImpl.java

@@ -0,0 +1,35 @@
+package cn.tr.plugin.auth2.server;
+
+import cn.dev33.satoken.oauth2.logic.SaOAuth2Template;
+import cn.dev33.satoken.oauth2.model.SaClientModel;
+import org.springframework.stereotype.Component;
+
+/**
+ * Sa-Token OAuth2.0 整合实现 
+ */
+@Component
+public class SaOAuth2TemplateImpl extends SaOAuth2Template {
+
+    // 根据 id 获取 Client 信息 
+    @Override
+    public SaClientModel getClientModel(String clientId) {
+        // 此为模拟数据,真实环境需要从数据库查询 
+        if("1001".equals(clientId)) {
+            return new SaClientModel()
+                    .setClientId("1001")
+                    .setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
+                    .setAllowUrl("*")
+                    .setContractScope("userinfo")
+                    .setIsAutoMode(true);
+        }
+        return null;
+    }
+
+    // 根据ClientId 和 LoginId 获取openid 
+    @Override
+    public String getOpenid(String clientId, Object loginId) {
+        // 此为模拟数据,真实环境需要从数据库查询 
+        return "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__";
+    }
+
+}

+ 3 - 1
tr-plugins/tr-spring-boot-starter-plugin-banner/src/main/java/cn/tr/plugin/banner/config/BannerConfig.java

@@ -27,8 +27,10 @@ public class BannerConfig implements ApplicationListener<WebServerInitializedEve
         String applicationName = env.getProperty("spring.application.name");
         String profilesActive = env.getProperty("spring.profiles.active");
         String localhostStr = NetUtil.getLocalhostStr();
+        contextPath=StrUtil.startWith(contextPath,"/")?StrUtil.replaceFirst(contextPath,"/",""):contextPath;
         int port = server.getPort();
-        String urlPrefix= StrUtil.isNullOrUndefined(contextPath)? "http://"+localhostStr+":"+port:"http://"+localhostStr+":"+port+"/"+contextPath;
+        String urlPrefix= StrUtil.isNullOrUndefined(contextPath)? "http://"+localhostStr+":"+port:
+                "http://"+localhostStr+":"+port+"/"+contextPath;
         log.info("\n----------------------------------------------------------\n\t" +
                         "项目启动成功!\n\t" +
                         "项目名称: \t{}\n\t" +

+ 28 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tr-plugins</artifactId>
+        <groupId>cn.tr</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <version>${revision}</version>
+    <artifactId>tr-spring-boot-starter-plugin-biz-constant</artifactId>
+
+    <description>常量控制插件</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
+        </dependency>
+
+    </dependencies>
+</project>

+ 19 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/TrConstantAutoConfiguration.java

@@ -0,0 +1,19 @@
+package cn.tr.plugin.constant;
+
+import cn.tr.plugin.constant.config.ConstantInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * @ClassName : TrConstantAutoConfiguration
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+
+public class TrConstantAutoConfiguration {
+    @Bean
+    public InnerInterceptor constantInterceptor(){
+        return new ConstantInterceptor();
+    }
+}

+ 21 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/annotation/Constant.java

@@ -0,0 +1,21 @@
+package cn.tr.plugin.constant.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+
+import java.lang.annotation.*;
+
+/**
+ * @ClassName : Constant
+ * @Description : 常量注解,用于标记常量属性,当常量值发生变化时,
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Constant {
+    /**
+     * 常量所属目录
+     */
+    String cate() default "";
+}

+ 26 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/bo/ConstantBO.java

@@ -0,0 +1,26 @@
+package cn.tr.plugin.constant.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName : ConstantBO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+@NoArgsConstructor
+public class ConstantBO {
+    /**
+     * 常量目录
+     */
+    private String constantCate;
+
+    /**
+     * 常量值
+     */
+    private String constantValue;
+}

+ 59 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/config/ConstantInterceptor.java

@@ -0,0 +1,59 @@
+package cn.tr.plugin.constant.config;
+
+import cn.hutool.core.util.StrUtil;
+import cn.tr.plugin.constant.annotation.Constant;
+import cn.tr.plugin.constant.bo.ConstantBO;
+import cn.tr.plugin.constant.strategy.ConstantStrategy;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.springframework.aop.support.AopUtils;
+import org.springframework.util.ReflectionUtils;
+
+import java.sql.SQLException;
+
+/**
+ * @ClassName : ConstantIntercepter
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+@Slf4j
+public class ConstantInterceptor implements InnerInterceptor {
+    @Override
+    public boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
+        //找到是否存在常量注解,存在的话,执行相应操作
+        Class<?> targetClass = AopUtils.getTargetClass(parameter);
+        ReflectionUtils.doWithFields(targetClass,field->{
+            Constant constant = field.getAnnotation(Constant.class);
+            if(constant!=null){
+                Object value = ReflectionUtils.getField(field, parameter);
+                String constantValue="";
+                if(value!=null){
+                    if(value.getClass()==String.class){
+                        constantValue= (String) value;
+                    }else {
+                        constantValue=String.valueOf(value);
+                    }
+                }
+                if(StrUtil.isNotEmpty(constantValue)&&StrUtil.isNotEmpty(constant.cate())){
+                    try {
+                        ConstantStrategy.tr.triggerListener(ConstantBO.of(constant.cate(),constantValue));
+                    }catch (Exception e){
+                        log.warn("[ConstantInterceptor] objClass:{},field:{},constantValue:{},常量自增失败,",parameter.getClass(),field.getName(),constantValue,e.getMessage());
+                    }
+
+                }
+            }
+        });
+        return true;
+    }
+
+    @Override
+    public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
+        System.out.println("13");
+    }
+
+
+}

+ 33 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/strategy/ConstantStrategy.java

@@ -0,0 +1,33 @@
+package cn.tr.plugin.constant.strategy;
+
+import cn.tr.plugin.constant.bo.ConstantBO;
+
+import java.util.function.Consumer;
+
+/**
+ * @ClassName : ConstantStrategy
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+
+public class ConstantStrategy {
+
+    private ConstantStrategy(){
+
+    }
+
+    /**
+     * 常量变化监听器
+     */
+    public Consumer<ConstantBO> constantChangedListener=c->{};
+
+    public static ConstantStrategy tr=new ConstantStrategy();
+
+
+    public void triggerListener(ConstantBO source){
+        constantChangedListener.accept(source);
+    }
+
+
+}

+ 1 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+cn.tr.plugin.constant.TrConstantAutoConfiguration

+ 0 - 1
tr-plugins/tr-spring-boot-starter-plugin-biz-excel/pom.xml

@@ -52,7 +52,6 @@
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
-            <version>5.2.2</version>
         </dependency>
 
         <dependency>

+ 23 - 13
tr-plugins/tr-spring-boot-starter-plugin-biz-excel/src/test/java/cn/tr/plugin/excel/WordTest.java

@@ -19,6 +19,7 @@ import com.deepoove.poi.data.PictureType;
 import com.deepoove.poi.data.Pictures;
 import com.deepoove.poi.plugin.table.LoopColumnTableRenderPolicy;
 import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.deepoove.poi.policy.ListRenderPolicy;
 import com.deepoove.poi.util.ByteUtils;
 import com.deepoove.poi.util.PoitlIOUtils;
 import com.deepoove.poi.xwpf.NiceXWPFDocument;
@@ -1272,17 +1273,24 @@ public class WordTest extends BaseMockitoUnitTest {
                 .anaType("全麻")
                 .surgeryName("股骨骨折切开复位钢板内固定术")
                 .build();
-        Map<String, Object> exampleData = JsonUtils.parseMap(JsonUtils.toJsonString(clinic));
-        NiceXWPFDocument  document=XWPFTemplate.compile(new FileInputStream(file))
+//        Map<String, Object> exampleData = JsonUtils.parseMap(JsonUtils.toJsonString(clinic));
+        Map<String, Object> exampleData = new HashMap<>();
+        Configure config = Configure.builder()
+                .bind("modifies", new LoopRowTableRenderPolicy())
+                .bind("evaluations",new LoopColumnTableRenderPolicy())
+                .build();
+        String base64= FileUtil.readString("E:\\Project\\tr-footstone\\tr-plugins\\tr-spring-boot-starter-plugin-biz-excel\\src\\main\\resources\\base64", Charset.defaultCharset());
+        exampleData.put("clinic",clinic);
+        exampleData.put("infusionRecords",JSONUtil.parseArray(str));
+        exampleData.put("evaluations",JSONUtil.parseArray(evalStr));
+        exampleData.put("image",Pictures.ofBase64(base64,PictureType.PNG)
+                .size(687, 500).create());
+        NiceXWPFDocument  document=XWPFTemplate.compile(new FileInputStream(file),config)
                 .render(exampleData)
                 .getXWPFDocument();
-
-        BufferedInputStream inputStream = FileUtil.getInputStream(FileUtil.file(pathPrefix + "EXXT.jpg"));
-        byte[] bytes = IoUtil.readBytes(inputStream);
-        String encode = cn.hutool.core.codec.Base64.encode(bytes);
-        document=infusionInfo(document);
-        document=eval(document);
-        document=image(document,encode);
+//        document=infusionInfo(document);
+//        document=eval(document);
+//        document=image(document,encode);
         //文件输出流
         FileOutputStream out = new FileOutputStream(pathPrefix+"patient.docx");
         BufferedOutputStream bos = new BufferedOutputStream(out);
@@ -1332,15 +1340,17 @@ public class WordTest extends BaseMockitoUnitTest {
     @Test
     public  NiceXWPFDocument infusionInfo(NiceXWPFDocument xwpfDocument) throws Exception {
         xwpfDocument.createParagraph().createRun().addBreak(BreakType.PAGE);
-        LoopRowTableRenderPolicy policy  = new LoopRowTableRenderPolicy();
+        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
         File file= FileUtil.touch(pathPrefix+"infusionHistoryTmp.docx");
         JSONArray jsonArray = JSONUtil.parseArray(str);
         Configure config = Configure.builder()
                 .bind("modifies", policy)
                 .build();
-        for (Object o : jsonArray) {
-            xwpfDocument=xwpfDocument.merge(XWPFTemplate.compile(new FileInputStream(file), config).render(o).getXWPFDocument());
-        }
+        HashMap<String, JSONArray> infusions = MapUtil.of("infusions", jsonArray);
+        XWPFTemplate compile = XWPFTemplate.compile(new FileInputStream(file), config);
+//        for (Object o : jsonArray) {
+            xwpfDocument=xwpfDocument.merge(compile.render(infusions).getXWPFDocument());
+//        }
         return xwpfDocument;
     }
     @Data

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

@@ -44,15 +44,16 @@ import java.util.stream.IntStream;
 @Aspect
 @Slf4j
 public class OperateLogAspect {
-    @Around("@annotation(operation)")
-    public Object around(ProceedingJoinPoint joinPoint, ApiOperation operation) throws Throwable {
-        // 可能也添加了 @ApiOperation 注解
-        OperateLog operateLog = getMethodAnnotation(joinPoint,
-                OperateLog.class);
-        return around0(joinPoint, operateLog, operation);
-    }
+//    @Around("@annotation(operation)")
+//    public Object around(ProceedingJoinPoint joinPoint, ApiOperation operation) throws Throwable {
+//        // 可能也添加了 @ApiOperation 注解
+//        OperateLog operateLog = getMethodAnnotation(joinPoint,
+//                OperateLog.class);
+//        return around0(joinPoint, operateLog, operation);
+//    }
 
-    @Around("!@annotation(io.swagger.annotations.ApiOperation) && @annotation(operateLog)")
+//    @Around("!@annotation(io.swagger.annotations.ApiOperation) && @annotation(operateLog)")
+    @Around("@annotation(operateLog)")
     // 兼容处理,只添加 @OperateLog 注解的情况
     public Object around(ProceedingJoinPoint joinPoint,
                          OperateLog operateLog) throws Throwable {

+ 8 - 0
tr-plugins/tr-spring-boot-starter-plugin-satoken/pom.xml

@@ -39,6 +39,14 @@
             </exclusions>
         </dependency>
 
+        <!-- Sa-Token-OAuth2.0 模块 -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-oauth2</artifactId>
+            <version>1.34.0</version>
+        </dependency>
+
+
         <dependency>
             <groupId>cn.dev33</groupId>
             <artifactId>sa-token-spring-boot-starter</artifactId>

+ 32 - 0
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/TrSaTokenAutoConfiguration.java

@@ -1,5 +1,7 @@
 package cn.tr.plugin.security;
 
+import cn.dev33.satoken.oauth2.logic.SaOAuth2Template;
+import cn.dev33.satoken.oauth2.model.SaClientModel;
 import cn.tr.core.enums.WebFilterOrderEnum;
 import cn.tr.plugin.security.config.LoginUserStrategyConfig;
 import cn.tr.plugin.security.config.TrSaTokenExceptionConfig;
@@ -54,4 +56,34 @@ public class TrSaTokenAutoConfiguration {
         return filterRegistrationBean;
     }
 
+    /**
+     * Sa-Token OAuth2.0 整合实现
+     */
+    public class SaOAuth2TemplateImpl extends SaOAuth2Template {
+
+        // 根据 id 获取 Client 信息
+        @Override
+        public SaClientModel getClientModel(String clientId) {
+            // 此为模拟数据,真实环境需要从数据库查询
+            if("1001".equals(clientId)) {
+                return new SaClientModel()
+                        .setClientId("1001")
+                        .setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
+                        .setAllowUrl("*")
+                        .setContractScope("userinfo")
+                        .setIsAutoMode(true);
+            }
+            return null;
+        }
+
+        // 根据ClientId 和 LoginId 获取openid
+        @Override
+        public String getOpenid(String clientId, Object loginId) {
+            // 此为模拟数据,真实环境需要从数据库查询
+            return "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__";
+        }
+
+    }
+
+
 }

+ 14 - 14
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/config/TrSaTokenWebConfig.java

@@ -55,19 +55,19 @@ public class TrSaTokenWebConfig implements WebMvcConfigurer {
 
     private static final List<String> IGNORE_URL = new ArrayList<>();
 
-    static {
-        IGNORE_URL.add("/actuator/**");
-        IGNORE_URL.add("/druid/**");
-        IGNORE_URL.add("/favicon.ico");
-        IGNORE_URL.add("/**.html");
-        IGNORE_URL.add("/**/*.html");
-        IGNORE_URL.add("/error");
-        IGNORE_URL.add("/swagger-resources/**");
-        IGNORE_URL.add("/swagger-ui/**");
-        IGNORE_URL.add("/webjars/**");
-        IGNORE_URL.add("/v2/api-docs/*");
-        IGNORE_URL.add("/v2/api-docs");
-        IGNORE_URL.add("/v1/**");;
-    }
+//    static {
+//        IGNORE_URL.add("/actuator/**");
+//        IGNORE_URL.add("/druid/**");
+//        IGNORE_URL.add("/favicon.ico");
+//        IGNORE_URL.add("/**.html");
+//        IGNORE_URL.add("/**/*.html");
+//        IGNORE_URL.add("/error");
+//        IGNORE_URL.add("/swagger-resources/**");
+//        IGNORE_URL.add("/swagger-ui/**");
+//        IGNORE_URL.add("/webjars/**");
+//        IGNORE_URL.add("/v2/api-docs/*");
+//        IGNORE_URL.add("/v2/api-docs");
+//        IGNORE_URL.add("/v1/**");;
+//    }
 
 }

+ 2 - 3
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/properties/TrSaTokenProperties.java

@@ -5,8 +5,7 @@ import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 import java.util.Collections;
-import java.util.Set;
-
+import java.util.*;
 /**
  * @ClassName : TrSaTokenProperties
  * @Description :
@@ -25,5 +24,5 @@ public class TrSaTokenProperties {
      * 需要忽略登录的url
      *
      */
-    private Set<String> ignoreUrls = Collections.emptySet();
+    private List<String> ignoreUrls = Collections.emptyList();
 }

+ 27 - 0
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/resources/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,27 @@
+{
+  "groups": [
+    {
+      "name": "tr.satoken",
+      "type": "cn.tr.plugin.security.properties.TrSaTokenProperties",
+      "sourceType": "cn.tr.plugin.security.properties.TrSaTokenProperties"
+    }
+  ],
+  "properties": [
+    {
+      "defaultValue": true,
+      "name": "tr.satoken.enable",
+      "type": "java.lang.Boolean",
+      "description": "是否开启SaToken认证",
+      "sourceType": "cn.tr.plugin.security.properties.TrSaTokenProperties",
+      "sourceMethod": "getEnable()"
+    },
+    {
+      "name": "tr.satoken.ignore-urls",
+      "type": "java.util.ArrayList<java.lang.String>",
+      "description": "需要忽略登录的url",
+      "sourceType": "cn.tr.plugin.security.properties.TrSaTokenProperties",
+      "sourceMethod": "getIgnoreUrls()"
+    }
+  ],
+  "hints": []
+}

+ 16 - 0
tr-plugins/tr-spring-boot-starter-plugin-tree/pom.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tr-plugins</artifactId>
+        <groupId>cn.tr</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <version>${revision}</version>
+    <artifactId>tr-spring-boot-starter-plugin-tree</artifactId>
+
+    <description>树结构插件</description>
+
+</project>

+ 5 - 5
tr-test/pom.xml

@@ -79,11 +79,11 @@
             </exclusions>
         </dependency>
 
-        <dependency>
-            <groupId>cn.tr</groupId>
-            <artifactId>tr-module-auth</artifactId>
-            <version>0.0.9</version>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>cn.tr</groupId>-->
+            <!--<artifactId>tr-module-auth</artifactId>-->
+            <!--<version>0.0.9</version>-->
+        <!--</dependency>-->
 
         <dependency>
             <groupId>cn.tr</groupId>

+ 0 - 44
tr-test/src/main/java/cn/tr/test/WebApplication.java

@@ -1,18 +1,6 @@
 package cn.tr.test;
 
-import cn.dev33.satoken.stp.StpLogic;
-import cn.hutool.core.thread.ThreadUtil;
-import cn.tr.core.strategy.auth.AuthStrategy;
-import cn.tr.core.strategy.auth.UserOperator;
-import cn.tr.core.strategy.auth.bo.AuthenticationDTO;
-import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
-import cn.tr.plugin.eventbus.config.EventBus;
-import cn.tr.plugin.eventbus.constant.EventBusConstant;
-import cn.tr.plugin.security.utils.SaTokenUtils;
 import org.mybatis.spring.annotation.MapperScan;
-import org.redisson.api.RTopic;
-import org.redisson.api.RedissonClient;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@@ -27,38 +15,6 @@ import javax.annotation.PostConstruct;
 @SpringBootApplication(scanBasePackages = "cn.tr.module.*")
 @MapperScan("cn.tr.module.sys.*.repository")
 public class WebApplication {
-    static {
-        AuthStrategy.tr
-                .addGranter(new UserOperator() {
-                    @Override
-                    public UserAccountInfoBO login(AuthenticationDTO authentication) {
-                        UserAccountInfoBO loginUser = new UserAccountInfoBO();
-                        StpLogic stpLogic = SaTokenUtils.getStpUtil();
-                        //  调用方法 stpLogic.login(${userId})产生token; 然后对LoginUserBo中参数进行赋值
-                        stpLogic.login("1");
-                        String tokenValue = stpLogic.getTokenValue();
-                        loginUser.setId("1");
-                        loginUser.setToken(tokenValue);
-                        loginUser.setUsername("测试账号");
-                        loginUser.setNickname("昵称");
-                        loginUser.setLoginType("login");
-                        loginUser.setSex(loginUser.getSex());
-                        loginUser.setTenantId("1");
-                        fillUserAgentInfo(loginUser);
-                        return loginUser;
-                    }
-
-                    @Override
-                    public boolean updatePassword(String oldPassword, String newPassword) {
-                        return true;
-                    }
-
-                    @Override
-                    public boolean match(String loginType) {
-                        return true;
-                    }
-                });
-    }
     public static void main(String[] args) {
         SpringApplication.run(WebApplication.class);
     }

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

@@ -3,19 +3,18 @@ knife4j:
   openapi:
     title: 驼人基础设施功能开发文档
     description: 该接口文档用于开发基础功能
-    email: 八一菜刀
     concat: lf
 #    url: http://192.168.100.32:7070
     version: V0.9
     license: Apache 2.0
     group:
       auth:
-        group-name: 认证和用户分组
+        group-name: 认证授权
         api-rule: package
         api-rule-resources:
           - cn.tr.module.auth
       sys:
-        group-name: 系统分组
+        group-name: 系统管理
         api-rule: package
         api-rule-resources:
           - cn.tr.module.sys

+ 24 - 4
tr-test/src/main/resources/application.yml

@@ -1,10 +1,8 @@
-tr:
-  satoken:
-    enable: true
-    ignoreUrls: /test/**
 server:
   shutdown: graceful
   port: 8083
+  servlet:
+    context-path: /api
 
 #mybatis配置
 mybatis-plus:
@@ -45,6 +43,26 @@ spring:
     include: doc
 
 
+tr:
+  satoken:
+    enable: true
+    ignore-urls:
+      - /actuator/**
+      - /druid/**
+      - /*.html
+      - /**/*.html
+      - /swagger-resources/**
+      - /swagger-ui/**
+      - /v2/api-docs/*
+      - /v2/api-docs
+      - /webjars/**
+      - /**
+  oauth2:
+    psw:
+      allow-url:
+      client-id:
+      client-secret:
+      contract-scope:
 sa-token:
   is-read-header: true
   # token名称 (同时也是cookie名称)
@@ -63,3 +81,5 @@ sa-token:
   is-log: false
   # 同一账号登录数量不做限制
   max-login-count: -1
+  oauth2:
+    is-client: true