Преглед изворни кода

完善认证组件
更新数据库分页插件改为pagehelper
新增认证模块 用户认证、登出、续约、当前登录信息、当前账户中心
新增 操作日志模块
修改 @Table修饰的类属性不加注解依旧可以修改相应字段

18339543638 пре 2 година
родитељ
комит
72ba542626
42 измењених фајлова са 1348 додато и 133 уклоњено
  1. 13 0
      tr-dependencies/pom.xml
  2. 4 3
      tr-framework/src/main/java/cn/tr/core/strategy/LoginUserStrategy.java
  3. 41 0
      tr-framework/src/main/java/cn/tr/core/strategy/auth/AuthStrategy.java
  4. 19 0
      tr-framework/src/main/java/cn/tr/core/strategy/auth/LoginTypeMatcher.java
  5. 69 0
      tr-framework/src/main/java/cn/tr/core/strategy/auth/UserOperator.java
  6. 30 0
      tr-framework/src/main/java/cn/tr/core/strategy/auth/bo/AuthenticationDTO.java
  7. 84 0
      tr-framework/src/main/java/cn/tr/core/strategy/auth/bo/UserAccountInfoBO.java
  8. 34 0
      tr-framework/src/main/java/cn/tr/core/utils/PswUtils.java
  9. 5 0
      tr-modules/pom.xml
  10. 40 0
      tr-modules/tr-module-auth/pom.xml
  11. 21 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/bo/RoleSmartBO.java
  12. 33 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/bo/UserInfoInTokenBO.java
  13. 47 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/config/FillUserAccountConfig.java
  14. 12 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/constant/AuthConstant.java
  15. 68 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/AuthController.java
  16. 47 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/CurrentUserController.java
  17. 25 0
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/vo/AuthInfoVO.java
  18. 36 0
      tr-modules/tr-module-system/pom.xml
  19. 24 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/OperLogMapper.java
  20. 31 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/config/OperateConfig.java
  21. 46 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/controller/SysOperLogController.java
  22. 120 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/controller/vo/SysOperLogVO.java
  23. 120 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/SysOperLogDTO.java
  24. 13 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/query/SysOpeLogQueryDTO.java
  25. 141 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/po/SysOperLogPO.java
  26. 17 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/repository/SysOperLogRepository.java
  27. 43 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/service/ISysOperLogService.java
  28. 44 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/service/SysOperLogServiceImpl.java
  29. 1 0
      tr-plugins/pom.xml
  30. 23 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-bean-mapper/pom.xml
  31. 5 6
      tr-plugins/tr-spring-boot-starter-plugin-biz-data-permission/src/main/java/cn/tr/plugin/biz/data/permission/config/rule/dept/DeptDataPermissionRule.java
  32. 10 0
      tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/ActableAutoConfiguration.java
  33. 4 0
      tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/manager/TrSysMysqlCreateTableManagerImpl.java
  34. 7 6
      tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/utils/ColumnUtils.java
  35. 5 5
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BasePO.java
  36. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/annotation/OperateLog.java
  37. 43 0
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/utils/SaTokenUtils.java
  38. 12 0
      tr-test/pom.xml
  39. 0 93
      tr-test/src/main/java/cn/tr/test/TestController.java
  40. 0 14
      tr-test/src/main/java/cn/tr/test/UserMapper.java
  41. 2 2
      tr-test/src/main/java/cn/tr/test/WebApplication.java
  42. 8 3
      tr-test/src/main/resources/application-doc.yml

+ 13 - 0
tr-dependencies/pom.xml

@@ -98,6 +98,12 @@
                 <version>${satoken.version}</version>
             </dependency>
 
+            <!--使用mapstruct转换-->
+            <dependency>
+                <groupId>org.mapstruct</groupId>
+                <artifactId>mapstruct</artifactId>
+                <version>${mapstruct.version}</version>
+            </dependency>
 
             <!--hutool工具类包-->
             <dependency>
@@ -329,6 +335,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!--对象转换插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-biz-bean-mapper</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <!--在线文档插件-->
             <dependency>
                 <groupId>cn.tr</groupId>

+ 4 - 3
tr-framework/src/main/java/cn/tr/core/strategy/LoginUserStrategy.java

@@ -21,6 +21,7 @@ public class LoginUserStrategy {
     public static LoginUserStrategy tr =new LoginUserStrategy();
 
     public Supplier<? extends  ILoginUser> loginUserSupplier;
+
     /**
      * 当前地址是否允许匿名登录,默认不允许
      */
@@ -29,7 +30,7 @@ public class LoginUserStrategy {
     /**
      * 用户登录返回token
      */
-    public Function<? super ILoginUser, LoginResult> loginTokenSupplier;
+    public Function<? super ILoginUser, LoginResult> loginTokenSupplier=loginUser -> new LoginResult();
 
     public LoginResult login(ILoginUser loginUser){
         if(loginTokenSupplier==null){
@@ -43,11 +44,11 @@ public class LoginUserStrategy {
     }
 
     public String getCurrentUsername(){
-        return loginUserSupplier==null?null:loginUserSupplier.get().getUsername();
+        return loginUserSupplier.get().getUsername();
     }
 
     public String getTenantId(){
-        return loginUserSupplier==null?null:loginUserSupplier.get().getTenantId();
+        return loginUserSupplier.get().getTenantId();
     }
 
     public boolean isAnonymous(){

+ 41 - 0
tr-framework/src/main/java/cn/tr/core/strategy/auth/AuthStrategy.java

@@ -0,0 +1,41 @@
+package cn.tr.core.strategy.auth;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @ClassName : AuthStrategy
+ * @Description : 认证策略
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+public class AuthStrategy {
+    private AuthStrategy(){
+
+    }
+
+    private List<UserOperator> granters=new ArrayList<>();
+
+    public static AuthStrategy tr=new AuthStrategy();
+
+
+    public void addGranter(UserOperator... authGranters){
+        if(authGranters!=null){
+            granters.addAll(Stream.of(authGranters).collect(Collectors.toList()));
+        }
+    }
+
+    /**
+     * 根据loginType找到相应的处理器
+     * @param loginType
+     * @return
+     */
+    public UserOperator matchGranter(String loginType){
+        return granters
+                .stream()
+                .filter(auth-> auth.match(loginType))
+                .findFirst()
+                .orElse(null);
+    }
+}

+ 19 - 0
tr-framework/src/main/java/cn/tr/core/strategy/auth/LoginTypeMatcher.java

@@ -0,0 +1,19 @@
+package cn.tr.core.strategy.auth;
+
+/**
+ * @ClassName : LoginTypeMatcher
+ * @Description : 权限系统匹配符
+ * @Author : JR
+ * @Date: 2022年11月23日
+ */
+
+public interface LoginTypeMatcher {
+
+    /**
+     * 匹配登录系统
+     * @param loginType 匹配登录系统
+     * @return
+     */
+    boolean match(String loginType);
+
+}

+ 69 - 0
tr-framework/src/main/java/cn/tr/core/strategy/auth/UserOperator.java

@@ -0,0 +1,69 @@
+/**
+ * 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.core.strategy.auth;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import cn.tr.core.utils.IpUtil;
+import cn.tr.core.utils.ServletUtils;
+import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
+import cn.tr.core.strategy.auth.bo.AuthenticationDTO;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Optional;
+
+/**
+ * 用户操作接口.
+ *
+ * @author lifang
+ */
+public interface UserOperator extends LoginTypeMatcher {
+	/**
+	 *
+	 * @param authentication 认证参数
+	 * @return
+	 */
+	UserAccountInfoBO login(AuthenticationDTO authentication);
+
+	/**
+	 * 修改当前密码
+	 *
+	 * @param oldPassword 旧密码
+	 * @param newPassword 新密码
+	 * @return
+	 */
+	public boolean updatePassword(String oldPassword, String newPassword);
+
+	/**
+	 * 填充用户登录信息
+	 * @param loginUser
+	 */
+	default void fillUserAgentInfo(UserAccountInfoBO loginUser){
+		HttpServletRequest request = ServletUtils.getRequest();
+		UserAgent userAgent = Optional.ofNullable(UserAgentUtil.parse(request.getHeader("User-Agent"))).orElse(new UserAgent());
+		String ipAddress = ServletUtils.getClientIP();
+		loginUser.setIpAddress(ipAddress);
+		loginUser.setLoginLocation(IpUtil.getCityInfo(ipAddress));
+		loginUser.setBrowser(ObjectUtil.isEmpty(userAgent.getBrowser())?"未知":userAgent.getBrowser().getName());
+		loginUser.setOs(ObjectUtil.isEmpty(userAgent.getOs())?"未知":userAgent.getOs().getName());
+		loginUser.setLoginTime(new Date());
+	};
+
+
+
+}

+ 30 - 0
tr-framework/src/main/java/cn/tr/core/strategy/auth/bo/AuthenticationDTO.java

@@ -0,0 +1,30 @@
+package cn.tr.core.strategy.auth.bo;
+
+import lombok.Data;
+
+/**
+ * 用于登陆传递账号密码
+ *
+ * @author FrozenWatermelon
+ * @date 2020/7/1
+ */
+@Data
+public class AuthenticationDTO {
+
+	/**
+	 * 用户名
+	 */
+	protected String username;
+
+	/**
+	 * 密码
+	 */
+	protected String password;
+
+	private String codeKey;
+
+	/**
+	 * loginType 参考SysTypeEnum
+	 */
+	protected String loginType;
+}

+ 84 - 0
tr-framework/src/main/java/cn/tr/core/strategy/auth/bo/UserAccountInfoBO.java

@@ -0,0 +1,84 @@
+package cn.tr.core.strategy.auth.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户账户信息
+ *
+ * @author Kevin
+ */
+@Data
+@NoArgsConstructor
+public class UserAccountInfoBO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    private String loginType;
+
+    /**
+     * 用户头像
+     */
+    private String avatar;
+
+    /**
+     * token
+     */
+    private String token;
+
+    /**
+     * 用户平台
+     */
+    private String userPlatform;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 昵称
+     */
+    private String nickname;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 登录时间
+     */
+    private Date loginTime;
+
+    /**
+     * 登录IP地址
+     */
+    private String ipAddress;
+
+
+    /**
+     * 登录地点
+     */
+    private String loginLocation;
+
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+}

+ 34 - 0
tr-framework/src/main/java/cn/tr/core/utils/PswUtils.java

@@ -0,0 +1,34 @@
+package cn.tr.core.utils;
+
+import cn.hutool.crypto.digest.BCrypt;
+import lombok.experimental.UtilityClass;
+
+/**
+ * @ClassName : PswUtils
+ * @Description : 密码工具类
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@UtilityClass
+public class PswUtils {
+    /**
+     * 生成BCryptPasswordEncoder密码
+     *
+     * @param password 密码
+     * @return 加密字符串
+     */
+    public static String encryptPassword(String password) {
+        return BCrypt.hashpw(password);
+    }
+
+    /**
+     * 判断密码是否相同
+     *
+     * @param rawPassword     真实密码
+     * @param encodedPassword 加密后字符
+     * @return 结果
+     */
+    public static boolean matchesPassword(String rawPassword, String encodedPassword) {
+        return BCrypt.checkpw(rawPassword, encodedPassword);
+    }
+}

+ 5 - 0
tr-modules/pom.xml

@@ -10,7 +10,12 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>tr-modules</artifactId>
+    <packaging>pom</packaging>
     <version>${revision}</version>
+    <modules>
+        <module>tr-module-auth</module>
+        <module>tr-module-system</module>
+    </modules>
 
 
 </project>

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

@@ -0,0 +1,40 @@
+<?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-modules</artifactId>
+        <groupId>cn.tr</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <version>${revision}</version>
+    <artifactId>tr-module-auth</artifactId>
+
+
+    <description>认证模块</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-satoken</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-operatelog</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-banner</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 21 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/bo/RoleSmartBO.java

@@ -0,0 +1,21 @@
+package cn.tr.module.auth.bo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName : RoleSmartBO
+ * @Description :
+ * @Author : JR
+ * @Date: 2022年11月23日
+ */
+@Data
+@ApiModel("角色")
+@NoArgsConstructor
+@AllArgsConstructor(staticName = "of")
+public class RoleSmartBO {
+    private String roleName;
+    private String roleCode;
+}

+ 33 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/bo/UserInfoInTokenBO.java

@@ -0,0 +1,33 @@
+package cn.tr.module.auth.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName : UserInfoInTokenBO
+ * @Description : 与token绑定的用户信息
+ * @Author : JR
+ * @Date: 2022年11月22日
+ */
+@Data
+@NoArgsConstructor
+@Builder
+@Accessors(chain = true)
+@AllArgsConstructor
+public class UserInfoInTokenBO implements Serializable {
+
+    private static final long serialVersionUID = 8622890101502110767L;
+
+    private String userId;
+
+    private String username;
+
+    private String nickname;
+
+    private String avatar;
+}

+ 47 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/config/FillUserAccountConfig.java

@@ -0,0 +1,47 @@
+package cn.tr.module.auth.config;
+
+import cn.tr.core.enums.WebFilterOrderEnum;
+import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
+import cn.tr.module.auth.constant.AuthConstant;
+import cn.tr.plugin.security.bo.LoginUserBO;
+import cn.tr.plugin.security.context.LoginUserContextHolder;
+import cn.tr.plugin.security.utils.SaTokenUtils;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.*;
+import java.io.IOException;
+
+/**
+ * @ClassName : FillUserAccountFilter
+ * @Description : 填充当前用户账户信息
+ * @Author : LF
+ * @Date: 2023年03月02日
+ */
+@Configuration
+public class FillUserAccountConfig{
+    /**
+     * 过滤器设置登录方式
+     */
+    @Bean
+    public FilterRegistrationBean fillUserAccount(){
+        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new FillUserAccountFilter());
+        filterRegistrationBean.addUrlPatterns("/*");
+        filterRegistrationBean.setOrder(WebFilterOrderEnum.FILL_LOGIN_TYPE-100);
+        return filterRegistrationBean;
+    }
+
+
+    class FillUserAccountFilter implements Filter {
+        @Override
+        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+            try {
+                UserAccountInfoBO accountInfo = SaTokenUtils.getValue(AuthConstant.ACCOUNT_USER, UserAccountInfoBO.class);
+                LoginUserContextHolder.setUser(new LoginUserBO(accountInfo.getId(),accountInfo.getUsername(),accountInfo.getTenantId()));
+            }catch (Exception e){}
+            filterChain.doFilter(servletRequest,servletResponse);
+        }
+    }
+}
+

+ 12 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/constant/AuthConstant.java

@@ -0,0 +1,12 @@
+package cn.tr.module.auth.constant;
+
+/**
+ * @Interface : AuthConstant
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+
+public interface AuthConstant {
+    String ACCOUNT_USER="accountUser";
+}

+ 68 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/AuthController.java

@@ -0,0 +1,68 @@
+package cn.tr.module.auth.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.core.strategy.auth.AuthStrategy;
+import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
+import cn.tr.module.auth.constant.AuthConstant;
+import cn.tr.module.auth.controller.vo.AuthInfoVO;
+import cn.tr.core.strategy.auth.bo.AuthenticationDTO;
+import cn.tr.core.strategy.auth.UserOperator;
+import cn.tr.plugin.operatelog.annotation.OperateLog;
+import cn.tr.plugin.security.utils.SaTokenUtils;
+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.*;
+
+/**
+ * @ClassName : AuthController
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@RestController
+@RequestMapping("/ua")
+@Api(tags = "认证接口")
+@AllArgsConstructor
+public class AuthController {
+
+    @OperateLog( name = "登录认证", isLogin = true)
+    @PostMapping("/login")
+    @SaIgnore
+    @ApiOperation("登录认证")
+    public CommonResult<AuthInfoVO> login(@Validated @RequestBody AuthenticationDTO authentication) {
+        UserOperator authGranter = AuthStrategy.tr.matchGranter(authentication.getLoginType());
+        if(authGranter==null){
+            return CommonResult.error(TRExcCode.USER_ERROR_A0200,"登录方式错误");
+        }
+        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();
+        return CommonResult.success(true);
+    }
+
+    @OperateLog( name = "用户登出")
+    @ApiOperation(value = "用户登出",notes = "清除token,清除权限缓存")
+    @PostMapping("/logout")
+    public CommonResult<Boolean> logout() {
+        SaTokenUtils.logout();
+        return CommonResult.success(true);
+    }
+
+
+
+
+
+}

+ 47 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/CurrentUserController.java

@@ -0,0 +1,47 @@
+package cn.tr.module.auth.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
+import cn.tr.module.auth.bo.UserInfoInTokenBO;
+import cn.tr.module.auth.constant.AuthConstant;
+import cn.tr.plugin.security.utils.SaTokenUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ClassName : CurrentUserController
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@RestController
+@RequestMapping("/user")
+@Api(tags = "当前用户信息接口")
+@AllArgsConstructor
+public class CurrentUserController {
+
+    @ApiOperation(value = "获取账号中心信息")
+    @GetMapping("/accountInfo")
+    public CommonResult<UserAccountInfoBO> accountInfo(){
+        return CommonResult.success(SaTokenUtils.getValue(AuthConstant.ACCOUNT_USER, UserAccountInfoBO.class));
+    }
+
+
+
+    @ApiOperation(value = "当前用户账号信息")
+    @GetMapping("/basicInfo")
+    public CommonResult<UserInfoInTokenBO> userInfo() {
+        UserAccountInfoBO accountInfo = SaTokenUtils.getValue(AuthConstant.ACCOUNT_USER, UserAccountInfoBO.class);
+        return CommonResult.success(UserInfoInTokenBO.builder()
+                .userId(accountInfo.getId())
+                .username(accountInfo.getUsername())
+                .nickname(accountInfo.getNickname())
+                .avatar(accountInfo.getAvatar())
+                .build());
+    }
+}

+ 25 - 0
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/vo/AuthInfoVO.java

@@ -0,0 +1,25 @@
+package cn.tr.module.auth.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AuthInfoVo.java
+ * @Description TODO
+ * @createTime 2022年08月01日 14:28:00
+ */
+@Data
+@ApiModel("授权结果")
+@AllArgsConstructor(staticName = "of")
+public class AuthInfoVO {
+
+    @ApiModelProperty("令牌")
+    private String accessToken;
+
+    @ApiModelProperty("登录方式")
+    private String loginType;
+}

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

@@ -0,0 +1,36 @@
+<?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-modules</artifactId>
+        <groupId>cn.tr</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>tr-module-system</artifactId>
+    <version>${revision}</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-mp-enhance-actable</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-operatelog</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-biz-bean-mapper</artifactId>
+        </dependency>
+    </dependencies>
+</project>

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

@@ -0,0 +1,24 @@
+package cn.tr.module.sys.mapper;
+
+import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
+import cn.tr.module.sys.operatelog.po.SysOperLogPO;
+import cn.tr.plugin.operatelog.bo.OperateLogBO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * @ClassName : OperateMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Mapper
+public interface OperLogMapper {
+    OperLogMapper INSTANCE = Mappers.getMapper(OperLogMapper.class);
+
+    SysOperLogPO toOperLogPO(SysOperLogDTO source);
+
+    SysOperLogDTO toOperLogDto(OperateLogBO source);
+
+    SysOperLogDTO toOperLogDto(SysOperLogPO source);
+}

+ 31 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/config/OperateConfig.java

@@ -0,0 +1,31 @@
+package cn.tr.module.sys.operatelog.config;
+
+import cn.tr.module.sys.mapper.OperLogMapper;
+import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
+import cn.tr.module.sys.operatelog.service.ISysOperLogService;
+import cn.tr.plugin.operatelog.strategy.OperateStrategy;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * @ClassName : OperateConfig
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Slf4j
+@Configuration
+@AllArgsConstructor
+public class OperateConfig {
+    private final ISysOperLogService operLogService;
+    @PostConstruct
+    public void init(){
+        OperateStrategy.tr.logSaveConsumer=log->{
+            operLogService.insertOperLog( OperLogMapper.INSTANCE.toOperLogDto(log));
+        };
+    }
+
+}

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

@@ -0,0 +1,46 @@
+package cn.tr.module.sys.operatelog.controller;
+
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
+import cn.tr.module.sys.operatelog.dto.query.SysOpeLogQueryDTO;
+import cn.tr.module.sys.operatelog.service.ISysOperLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+/**
+ * @ClassName : SysOperLogController
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@RestController
+@RequestMapping("/sys/operLog")
+@Api(tags = "操作日志")
+@AllArgsConstructor
+public class SysOperLogController {
+    private final ISysOperLogService operLogService;
+
+    @PostMapping("/query")
+    @ApiOperation("根据条件查询操作日志")
+    public CommonResult<List<SysOperLogDTO>> selectList(@RequestBody SysOpeLogQueryDTO query){
+        return CommonResult.success(operLogService.selectOperLogDataList(query));
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation("根据id查询操作日志")
+    public CommonResult<SysOperLogDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(operLogService.selectOperLogById(id));
+    }
+
+    @PostMapping("/deleteByIds")
+    @ApiOperation("删除查询日志")
+    public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
+        return CommonResult.success(operLogService.deleteOperLogByIds(ids));
+    }
+
+    //todo 导出
+
+}

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

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

+ 120 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/SysOperLogDTO.java

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

+ 13 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/query/SysOpeLogQueryDTO.java

@@ -0,0 +1,13 @@
+package cn.tr.module.sys.operatelog.dto.query;
+
+import lombok.Data;
+
+/**
+ * @ClassName : SysOpeLogQueryDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Data
+public class SysOpeLogQueryDTO {
+}

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

@@ -0,0 +1,141 @@
+package cn.tr.module.sys.operatelog.po;
+
+import cn.tr.core.annotation.Comment;
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.Date;
+
+/**
+ * 操作日志记录对象 sys_oper_log
+ *
+ * @author tr
+ * @date 2022-11-22 08:59:03
+ */
+@Data
+@ToString
+@TableName("sys_oper_log")
+@EqualsAndHashCode(callSuper = true)
+public class SysOperLogPO extends BasePO {
+
+    @ApiModelProperty(value = "主键")
+    @TableId
+    private String operId;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty("操作用户id")
+    @Comment("操作用户id")
+    private String userId;
+
+
+    /**
+     * 操作模块
+     */
+    @ApiModelProperty("操作模块")
+    @Comment("操作模块")
+    private String module;
+
+    /**
+     * 操作名
+     */
+    @ApiModelProperty("操作名称")
+    @Comment("操作名称")
+    private String name;
+
+    /**
+     * 操作分类
+     */
+    @ApiModelProperty("操作分类")
+    @Comment("操作分类")
+    private Integer type;
+
+    /**
+     * 操作明细
+     */
+    @ApiModelProperty("操作明细")
+    @Comment("操作明细")
+    private String content;
+
+    /**
+     * 请求方法名
+     */
+    @ApiModelProperty("请求方法名")
+    @Comment("请求方法名")
+    private String requestMethod;
+
+    /**
+     * 请求地址
+     */
+    @ApiModelProperty("请求地址")
+    @Comment("请求地址")
+    private String requestUrl;
+
+    /**
+     * 用户 IP
+     */
+    @ApiModelProperty("用户IP")
+    @Comment("用户IP")
+    private String userIp;
+
+    /**
+     * 浏览器 UserAgent
+     */
+    @ApiModelProperty("浏览器UserAgent")
+    @Comment("浏览器UserAgent")
+    private String userAgent;
+
+    /**
+     * Java 方法名
+     */
+    @ApiModelProperty("Java方法名")
+    @Comment("Java方法名")
+    private String javaMethod;
+
+    /**
+     * Java 方法的参数
+     */
+    @ApiModelProperty("Java方法的参数")
+    @Comment("Java方法的参数")
+    private String javaMethodArgs;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty("开始时间")
+    @Comment("开始时间")
+    private Date startTime;
+
+    /**
+     * 执行时长,单位:毫秒
+     */
+    @ApiModelProperty("执行时长,单位:毫秒")
+    @Comment("执行时长,单位:毫秒")
+    private Integer duration;
+
+    /**
+     * 响应码
+     */
+    @ApiModelProperty("响应码")
+    @Comment("响应码")
+    private String resultCode;
+
+    /**
+     * 结果提示
+     */
+    @ApiModelProperty("响应信息")
+    @Comment("响应信息")
+    private String resultMsg;
+
+    /**
+     * 结果数据
+     */
+    @ApiModelProperty("响应数据")
+    @Comment("响应数据")
+    private String resultData;
+}

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

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

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

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

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

@@ -0,0 +1,44 @@
+package cn.tr.module.sys.operatelog.service;
+
+import cn.tr.module.sys.mapper.OperLogMapper;
+import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
+import cn.tr.module.sys.operatelog.dto.query.SysOpeLogQueryDTO;
+import cn.tr.module.sys.operatelog.repository.SysOperLogRepository;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @ClassName : ISysOperLogService
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月24日
+ */
+@Slf4j
+@AllArgsConstructor
+@Service
+public class SysOperLogServiceImpl implements ISysOperLogService{
+    private final SysOperLogRepository logRepository;
+    @Override
+    public List<SysOperLogDTO> selectOperLogDataList(SysOpeLogQueryDTO query) {
+        return null;
+    }
+
+    @Override
+    public SysOperLogDTO selectOperLogById(String id) {
+        return OperLogMapper.INSTANCE.toOperLogDto(logRepository.selectById(id));
+    }
+
+    @Override
+    public boolean insertOperLog(SysOperLogDTO source) {
+        return logRepository.insert(OperLogMapper.INSTANCE.toOperLogPO(source))!=0;
+    }
+
+    @Override
+    public int deleteOperLogByIds(Collection<String> ids) {
+        return logRepository.deleteBatchIds(ids);
+    }
+}

+ 1 - 0
tr-plugins/pom.xml

@@ -34,6 +34,7 @@
         <module>tr-spring-boot-starter-plugin-operatelog</module>
         <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>
     </modules>
 
 </project>

+ 23 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-bean-mapper/pom.xml

@@ -0,0 +1,23 @@
+<?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-bean-mapper</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 5 - 6
tr-plugins/tr-spring-boot-starter-plugin-biz-data-permission/src/main/java/cn/tr/plugin/biz/data/permission/config/rule/dept/DeptDataPermissionRule.java

@@ -4,11 +4,10 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.tr.core.strategy.DeptDataPermissionStrategy;
 import cn.tr.core.strategy.LoginUserStrategy;
-import cn.tr.core.utils.JsonUtils;
 import cn.tr.plugin.biz.data.permission.constant.DataPermissionConstant;
 import cn.tr.plugin.biz.data.permission.config.rule.DataPermissionRule;
 import cn.tr.plugin.mybatis.config.expression.OrExpressionX;
-import cn.tr.plugin.mybatis.pojo.BaseDO;
+import cn.tr.plugin.mybatis.pojo.BasePO;
 import cn.tr.plugin.mybatis.utils.MyBatisUtils;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import lombok.AllArgsConstructor;
@@ -139,11 +138,11 @@ public class DeptDataPermissionRule implements DataPermissionRule {
 
     // ==================== 添加配置 ====================
 
-    public void addDeptColumn(Class<? extends BaseDO> entityClass) {
+    public void addDeptColumn(Class<? extends BasePO> entityClass) {
         addDeptColumn(entityClass, DataPermissionConstant.DEPT_COLUMN_NAME);
     }
 
-    public void addDeptColumn(Class<? extends BaseDO> entityClass, String columnName) {
+    public void addDeptColumn(Class<? extends BasePO> entityClass, String columnName) {
         String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName();
         addDeptColumn(tableName, columnName);
     }
@@ -153,11 +152,11 @@ public class DeptDataPermissionRule implements DataPermissionRule {
         TABLE_NAMES.add(tableName);
     }
 
-    public void addUserColumn(Class<? extends BaseDO> entityClass) {
+    public void addUserColumn(Class<? extends BasePO> entityClass) {
         addUserColumn(entityClass, DataPermissionConstant.USER_COLUMN_NAME);
     }
 
-    public void addUserColumn(Class<? extends BaseDO> entityClass, String columnName) {
+    public void addUserColumn(Class<? extends BasePO> entityClass, String columnName) {
         String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName();
         addUserColumn(tableName, columnName);
     }

+ 10 - 0
tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/ActableAutoConfiguration.java

@@ -5,6 +5,8 @@ import cn.hutool.extra.spring.SpringUtil;
 import cn.tr.plugin.mp.enhance.actable.handler.TrStartUpHandlerImpl;
 import cn.tr.plugin.mp.enhance.actable.manager.TrSysMysqlCreateTableManagerImpl;
 import cn.tr.plugin.mp.enhance.actable.proxy.MybatisConfigurationProxy;
+import com.gitee.sunchenbin.mybatis.actable.command.JavaToMysqlType;
+import com.gitee.sunchenbin.mybatis.actable.constants.MySqlTypeConstant;
 import com.gitee.sunchenbin.mybatis.actable.manager.handler.StartUpHandlerImpl;
 import com.gitee.sunchenbin.mybatis.actable.manager.system.SysMysqlCreateTableManagerImpl;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -19,6 +21,9 @@ import org.springframework.jdbc.datasource.init.DataSourceInitializer;
 import org.springframework.jdbc.datasource.init.DatabasePopulator;
 import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
 import javax.sql.DataSource;
+
+import static com.gitee.sunchenbin.mybatis.actable.command.JavaToMysqlType.javaToMysqlTypeMap;
+
 /**
  * @ClassName : ActatbleAutoConfiguration
  * @Description :
@@ -34,6 +39,11 @@ public class ActableAutoConfiguration implements BeanPostProcessor {
     private boolean runActable;
     private SqlSessionFactory sqlSessionFactory;
 
+    static {
+        javaToMysqlTypeMap.put("class java.sql.Date", MySqlTypeConstant.DATETIME);
+        javaToMysqlTypeMap.put("class java.util.Date", MySqlTypeConstant.DATETIME);
+        javaToMysqlTypeMap.put("class java.time.LocalDate", MySqlTypeConstant.DATETIME);
+    }
     @Override
     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
         if(!runActable){

+ 4 - 0
tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/manager/TrSysMysqlCreateTableManagerImpl.java

@@ -1,6 +1,7 @@
 package cn.tr.plugin.mp.enhance.actable.manager;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.tr.plugin.mp.enhance.actable.utils.ColumnUtils;
 import com.gitee.sunchenbin.mybatis.actable.annotation.IgnoreUpdate;
@@ -598,6 +599,9 @@ public class TrSysMysqlCreateTableManagerImpl implements SysMysqlCreateTableMana
 		List<Object> fieldList = new ArrayList<Object>();
 		ReflectionUtils.doWithFields(clas,field->{
 			// 判断方法中是否有指定注解类型的注解
+			if(StrUtil.equals(field.getName(),"serialVersionUID")){
+				return;
+			}
 			if (ColumnUtils.hasColumnAnnotation(field,clas)) {
 				CreateTableParam param = new CreateTableParam();
 				param.setFieldName(ColumnUtils.getColumnName(field,clas));

+ 7 - 6
tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/utils/ColumnUtils.java

@@ -379,12 +379,13 @@ public class ColumnUtils {
     }
 
     private static boolean isSimple(Class<?> clasz) {
-        boolean isSimple = false;
-        Table tableName = clasz.getAnnotation(Table.class);
-        if (tableName != null){
-            isSimple = tableName.isSimple();
-        }
-        return isSimple;
+//        boolean isSimple = false;
+//        Table tableName = clasz.getAnnotation(Table.class);
+//        if (tableName != null){
+//            isSimple = tableName.isSimple();
+//        }
+//        return isSimple;
+        return true;
     }
 
 

+ 5 - 5
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BaseDO.java → tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BasePO.java

@@ -8,16 +8,16 @@ import lombok.Data;
 import org.apache.ibatis.type.JdbcType;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
- * @ClassName : BaseDO
+ * @ClassName : BasePO
  * @Description :
  * @Author : LF
  * @Date: 2023年03月03日
  */
 @Data
-public class BaseDO implements Serializable {
+public class BasePO implements Serializable {
     private static final long serialVersionUID = -4315985598485514817L;
 
     /**
@@ -25,14 +25,14 @@ public class BaseDO implements Serializable {
      */
     @Comment("创建时间")
     @TableField(fill = FieldFill.INSERT)
-    private LocalDateTime createTime;
+    private Date createTime;
 
     /**
      * 最后更新时间
      */
     @Comment("更新时间")
     @TableField(fill = FieldFill.INSERT_UPDATE)
-    private LocalDateTime updateTime;
+    private Date updateTime;
     /**
      * 创建者,目前使用 SysUser 的 id 编号
      *

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

@@ -57,6 +57,6 @@ public @interface OperateLog {
     /**
      * 是否为登录日志
      */
-    boolean isLog() default false;
+    boolean isLogin() default false;
 
 }

+ 43 - 0
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/utils/SaTokenUtils.java

@@ -13,7 +13,50 @@ import lombok.experimental.UtilityClass;
  */
 @UtilityClass
 public class SaTokenUtils {
+    /**
+     * 多登陆模式下获取相应的处理逻辑
+     * @return {@link StpLogic}
+     */
     public StpLogic getStpUtil(){
         return SaManager.getStpLogic(LoginUserContextHolder.getStpType());
     }
+
+    /**
+     * 获取登录类型
+     * @return stpType
+     */
+    public String getStpType(){
+        return LoginUserContextHolder.getStpType();
+    }
+
+    /**
+     * 退出登录
+     */
+    public void logout(){
+        getStpUtil().logout();
+    }
+
+
+
+    public void checkout(){
+        getStpUtil().checkLogin();
+    }
+
+    public void renew(){
+        StpLogic stpUtil = getStpUtil();
+        stpUtil.checkActivityTimeout();
+        stpUtil.updateLastActivityToNow();
+    }
+
+
+    public void set(String key,Object value){
+        getStpUtil().getSession().set(key,value);
+    }
+
+
+    public <T> T getValue(String key,Class<T> tClass){
+        return getStpUtil().getSession().getModel(key, tClass);
+    }
+
+
 }

+ 12 - 0
tr-test/pom.xml

@@ -79,6 +79,18 @@
                 </exclusion>
             </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-system</artifactId>
+            <version>0.0.9</version>
+        </dependency>
     </dependencies>
 
 

+ 0 - 93
tr-test/src/main/java/cn/tr/test/TestController.java

@@ -1,93 +0,0 @@
-package cn.tr.test;
-
-import cn.tr.core.enums.IEnum;
-import cn.tr.core.strategy.PageStrategy;
-import cn.tr.plugin.desensitize.config.slider.annotation.ChineseNameDesensitize;
-import cn.tr.plugin.dict.annotation.Dict;
-import cn.tr.plugin.dict.bo.DictBO;
-import cn.tr.plugin.dict.config.cache.DictManager;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.Authorization;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.PostConstruct;
-import javax.persistence.Column;
-import javax.validation.constraints.NotNull;
-import java.util.*;
-/**
- * @ClassName : TestController
- * @Description :
- * @Author : LF
- * @Date: 2023年02月22日
- */
-@RestController
-@RequestMapping("/test")
-@Slf4j
-@Api(tags = "测试接口")
-public class TestController {
-    @Autowired
-    private DictManager dictManager;
-
-    @Autowired
-    private UserMapper userMapper;
-    @PostConstruct
-    public void init(){
-        dictManager.load("gender",Arrays.asList(new DictBO("1","男"),new DictBO("2","女")));
-    }
-
-//    @GetMapping("/123")
-//    @ApiOperationSupport(author = "lf")
-//    @ApiOperation(value = "获取参数",authorizations = {@Authorization("ces")})
-//    public User test(@RequestParam("test")@NotNull String test){
-//        return User.of("id","1","上官吹雪",false,Grander.high);
-//    }
-
-    @GetMapping("/123")
-    @ApiOperationSupport(author = "lf")
-    @ApiOperation(value = "获取参数123",authorizations = {@Authorization("ces")})
-    public User test(@RequestBody(required = false) User test){
-        PageStrategy.tr.startPage.accept(PageStrategy.tr.createPage.get());
-        List<User> users = userMapper.selectList(new QueryWrapper<User>());
-        return User.of("id","1","上官吹雪",false);
-    }
-
-    @Data
-    @AllArgsConstructor(staticName = "of")
-    @NoArgsConstructor
-    @TableName("test")
-    public static class User{
-        @Column(name = "id")
-        private String id;
-
-        @Column(name = "name")
-        @Dict("gender")
-        private String name;
-
-        @Column(name = "nickname")
-        @ChineseNameDesensitize
-        private String nickname;
-
-        @Column(name = "test")
-        private Boolean test;
-    }
-
-    @Getter
-    @AllArgsConstructor
-    static enum  Grander implements IEnum<String> {
-        lower("1","低年级"),
-        middle("1","中年级"),
-        high("1","高年级");
-        private String value;
-        private String label;
-    }
-}

+ 0 - 14
tr-test/src/main/java/cn/tr/test/UserMapper.java

@@ -1,14 +0,0 @@
-package cn.tr.test;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.mybatis.spring.annotation.MapperScan;
-
-/**
- * @Interface : UserMapper
- * @Description :
- * @Author : LF
- * @Date: 2023年03月24日
- */
-@MapperScan
-public interface UserMapper extends BaseMapper<TestController.User> {
-}

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

@@ -18,8 +18,8 @@ import javax.annotation.PostConstruct;
  * @Author : LF
  * @Date: 2023年02月22日
  */
-@SpringBootApplication
-@MapperScan("cn.tr.test")
+@SpringBootApplication(scanBasePackages = "cn.tr.module.*")
+@MapperScan("cn.tr.module.**.repository.**")
 public class WebApplication {
     public static void main(String[] args) {
         SpringApplication.run(WebApplication.class);

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

@@ -12,11 +12,16 @@ knife4j:
     license-url: https://stackoverflow.com/
     terms-of-service-url: https://stackoverflow.com/
     group:
-      test1:
-        group-name: 测试分组
+      auth:
+        group-name: 认证和用户分组
         api-rule: package
         api-rule-resources:
-          - cn.tr.test
+          - cn.tr.module.auth
+      sys:
+        group-name: 系统分组
+        api-rule: package
+        api-rule-resources:
+          - cn.tr.module.sys
   setting:
     enable-footer: false
     enable-footer-custom: true