- Change Mybatis to JPA
- Change groupId
This commit is contained in:
2024-06-13 23:18:16 +08:00
parent 2c82c3b57a
commit 04ff87544e
61 changed files with 262 additions and 547 deletions

38
pom.xml
View File

@@ -8,7 +8,7 @@
<version>3.3.0</version> <version>3.3.0</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.rainbus</groupId> <groupId>com.dlp.admin</groupId>
<artifactId>dlp-admin-backend</artifactId> <artifactId>dlp-admin-backend</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>dlp-admin-backend</name> <name>dlp-admin-backend</name>
@@ -45,21 +45,21 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> </dependency>
<!-- <dependency>--> <dependency>
<!-- <groupId>org.springframework.boot</groupId>--> <groupId>org.springframework.boot</groupId>
<!-- <artifactId>spring-boot-starter-data-jpa</artifactId>--> <artifactId>spring-boot-starter-data-jpa</artifactId>
<!-- </dependency>--> </dependency>
<dependency> <!-- <dependency>-->
<groupId>com.baomidou</groupId> <!-- <groupId>com.baomidou</groupId>-->
<artifactId>mybatis-plus-spring-boot3-starter</artifactId> <!-- <artifactId>mybatis-plus-spring-boot3-starter</artifactId>-->
<version>${mybatis-plus.version}</version> <!-- <version>${mybatis-plus.version}</version>-->
</dependency> <!-- </dependency>-->
<dependency> <!-- <dependency>-->
<groupId>com.github.pagehelper</groupId> <!-- <groupId>com.github.pagehelper</groupId>-->
<artifactId>pagehelper-spring-boot-starter</artifactId> <!-- <artifactId>pagehelper-spring-boot-starter</artifactId>-->
<version>${page-helper.version}</version> <!-- <version>${page-helper.version}</version>-->
</dependency> <!-- </dependency>-->
<dependency> <dependency>
<groupId>com.mysql</groupId> <groupId>com.mysql</groupId>
@@ -121,10 +121,10 @@
<groupId>com.fasterxml.jackson.datatype</groupId> <groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId> <artifactId>jackson-datatype-jsr310</artifactId>
</dependency> </dependency>
<!-- <dependency>--> <dependency>
<!-- <groupId>com.fasterxml.jackson.datatype</groupId>--> <groupId>com.fasterxml.jackson.datatype</groupId>
<!-- <artifactId>jackson-datatype-hibernate6</artifactId>--> <artifactId>jackson-datatype-hibernate6</artifactId>
<!-- </dependency>--> </dependency>
</dependencies> </dependencies>

View File

@@ -1,12 +1,10 @@
package com.rainbus.dlp; package com.dlp.admin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) @SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@MapperScan("com.rainbus.dlp.repository.mapper")
public class DlpAdminBackendApplication { public class DlpAdminBackendApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@@ -1,8 +1,8 @@
package com.rainbus.dlp.config; package com.dlp.admin.config;
import com.rainbus.dlp.entity.dto.user.TokenClaims; import com.dlp.admin.entity.dto.user.TokenClaims;
import com.rainbus.dlp.service.UserServ; import com.dlp.admin.service.UserServ;
import com.rainbus.dlp.util.JwtUtil; import com.dlp.admin.util.JwtUtil;
import jakarta.servlet.FilterChain; import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@@ -12,8 +12,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
@@ -21,9 +19,7 @@ import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.config; package com.dlp.admin.config;
import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.Info;

View File

@@ -1,8 +1,9 @@
package com.rainbus.dlp.config; package com.dlp.admin.config;
import com.rainbus.dlp.repository.dao.UserDao; import com.dlp.admin.entity.pojo.user.SysRole;
import com.rainbus.dlp.service.UserServ; import com.dlp.admin.repository.user.SysRoleRepo;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@@ -18,13 +19,16 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.stereotype.Service;
import java.util.List;
@Configuration @Configuration
@EnableWebSecurity @EnableWebSecurity
@RequiredArgsConstructor @RequiredArgsConstructor
public class SecurityConf { public class SecurityConf {
private final UserDao userDao; private final SecurityDataService securityDataService;
@Bean @Bean
public SecurityFilterChain filterChain(HttpSecurity http, JwtFilter jwtFilter) throws Exception { public SecurityFilterChain filterChain(HttpSecurity http, JwtFilter jwtFilter) throws Exception {
@@ -32,7 +36,8 @@ public class SecurityConf {
.csrf(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable)
.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests((authorizeHttpRequests) -> { .authorizeHttpRequests((authorizeHttpRequests) -> {
userDao.listRoleResource().forEach(role -> { //TODO: Lazy load problem
securityDataService.fetchAllRoles().forEach(role -> {
role.getResources().forEach(resource -> { role.getResources().forEach(resource -> {
authorizeHttpRequests.requestMatchers( authorizeHttpRequests.requestMatchers(
HttpMethod.valueOf(resource.getRequestMethod().name()), HttpMethod.valueOf(resource.getRequestMethod().name()),
@@ -58,4 +63,18 @@ public class SecurityConf {
return new BCryptPasswordEncoder(); return new BCryptPasswordEncoder();
} }
@Service
@RequiredArgsConstructor
static class SecurityDataService {
private final SysRoleRepo roleRepo;
@Transactional
public List<SysRole> fetchAllRoles() {
return roleRepo.findAll().stream().filter(role -> !role.getResources().isEmpty()).toList();
}
}
} }

View File

@@ -1,7 +1,7 @@
package com.rainbus.dlp.controller; package com.dlp.admin.controller;
import com.rainbus.dlp.entity.exception.UsernameOrPasswordExcp; import com.dlp.admin.entity.exception.UsernameOrPasswordExcp;
import com.rainbus.dlp.entity.resp.Resp; import com.dlp.admin.entity.resp.Resp;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;

View File

@@ -1,16 +1,16 @@
package com.rainbus.dlp.controller; package com.dlp.admin.controller;
import com.github.pagehelper.PageInfo; import com.dlp.admin.entity.pojo.user.SysResource;
import com.rainbus.dlp.entity.pojo.user.SysResource; import com.dlp.admin.entity.pojo.user.SysRole;
import com.rainbus.dlp.entity.req.user.*; import com.dlp.admin.entity.req.user.*;
import com.rainbus.dlp.entity.resp.Resp; import com.dlp.admin.entity.resp.PageResp;
import com.rainbus.dlp.entity.resp.user.GetTagResp; import com.dlp.admin.entity.resp.Resp;
import com.rainbus.dlp.entity.resp.user.GetUserResp; import com.dlp.admin.entity.resp.user.GetTagResp;
import com.rainbus.dlp.entity.resp.user.LoginResp; import com.dlp.admin.entity.resp.user.GetUserResp;
import com.rainbus.dlp.repository.mapper.user.SysResourceMapper; import com.dlp.admin.entity.resp.user.LoginResp;
import com.rainbus.dlp.repository.mapper.user.SysRoleMapper; import com.dlp.admin.repository.user.SysRoleRepo;
import com.rainbus.dlp.service.UserServ; import com.dlp.admin.service.UserServ;
import com.rainbus.dlp.util.RedisUtil; import com.dlp.admin.util.RedisUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -24,8 +24,7 @@ public class UserCtrl {
private final RedisUtil redisUtil; private final RedisUtil redisUtil;
private final UserServ userServ; private final UserServ userServ;
private final SysRoleMapper sysRoleMapper; private final SysRoleRepo sysRoleRepo;
private final SysResourceMapper sysResourceMapper;
@PostMapping("/login") @PostMapping("/login")
@Operation(summary = "登录接口") @Operation(summary = "登录接口")
@@ -35,7 +34,7 @@ public class UserCtrl {
@PostMapping("/list") @PostMapping("/list")
@Operation(summary = "搜索用户") @Operation(summary = "搜索用户")
public Resp<PageInfo<GetUserResp>> listUser(@RequestBody ListUserReq req) { public Resp<PageResp<GetUserResp>> listUser(@RequestBody ListUserReq req) {
return Resp.success(null); return Resp.success(null);
} }
@@ -93,8 +92,11 @@ public class UserCtrl {
resource.setResource("/user/test"); resource.setResource("/user/test");
resource.setRequestMethod(RequestMethod.GET); resource.setRequestMethod(RequestMethod.GET);
List<SysResource> resources = List.of(resource); List<SysResource> resources = List.of(resource);
return Resp.success(sysResourceMapper.batchInsert(resources)); // return Resp.success(sysResourceMapper.batchInsert(resources));
// return Resp.success(sysRoleMapper.selectRoleIdsByUserId(List.of(1L, 2L))); // return Resp.success(sysRoleMapper.selectRoleIdsByUserId(List.of(1L, 2L)));
List<SysRole> roles = sysRoleRepo.findAll();
roles.stream().forEach(role -> role.getResources().stream().forEach(resource1 -> System.out.println(resource1.getResource())));
return Resp.success();
} }
} }

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity; package com.dlp.admin.entity;
import java.lang.annotation.*; import java.lang.annotation.*;

View File

@@ -1,7 +1,7 @@
package com.rainbus.dlp.entity.converter; package com.dlp.admin.entity.converter;
import com.rainbus.dlp.entity.dto.system.ApiInfo; import com.dlp.admin.entity.pojo.user.SysResource;
import com.rainbus.dlp.entity.pojo.user.SysResource; import com.dlp.admin.entity.dto.system.ApiInfo;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;

View File

@@ -1,9 +1,9 @@
package com.rainbus.dlp.entity.converter; package com.dlp.admin.entity.converter;
import com.rainbus.dlp.entity.dto.user.CustomUserDetails; import com.dlp.admin.entity.dto.user.CustomUserDetails;
import com.rainbus.dlp.entity.dto.user.TokenClaims; import com.dlp.admin.entity.dto.user.TokenClaims;
import com.rainbus.dlp.entity.pojo.user.SysUser; import com.dlp.admin.entity.pojo.user.SysUser;
import com.rainbus.dlp.entity.req.user.AddUserReq; import com.dlp.admin.entity.req.user.AddUserReq;
import org.mapstruct.InheritInverseConfiguration; import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
@@ -14,13 +14,13 @@ public interface UserConv {
@InheritInverseConfiguration @InheritInverseConfiguration
SysUser RegisterReq2Pojo(AddUserReq req, String password); SysUser RegisterReq2Pojo(AddUserReq req, String password);
@Mapping(target = "roles", expression = "java(user.getRoles().stream().map(com.rainbus.dlp.entity.pojo.user.SysRole::getRole).toList())") @Mapping(target = "roles", expression = "java(user.getRoles().stream().map(com.dlp.admin.entity.pojo.user.SysRole::getRole).toList())")
@Mapping(target = "orgId", expression = "java(user.getOrg().getId())") @Mapping(target = "orgId", expression = "java(user.getOrg().getId())")
TokenClaims ClaimsPojo2Dto(SysUser user); TokenClaims ClaimsPojo2Dto(SysUser user);
@Mapping(target = "orgId", expression = "java(user.getOrg().getId())") @Mapping(target = "orgId", expression = "java(user.getOrg().getId())")
@Mapping(target = "authorities", ignore = true) @Mapping(target = "authorities", ignore = true)
@Mapping(target = "roles", expression = "java(user.getRoles().stream().map(com.rainbus.dlp.entity.pojo.user.SysRole::getRole).toList())") @Mapping(target = "roles", expression = "java(user.getRoles().stream().map(com.dlp.admin.entity.pojo.user.SysRole::getRole).toList())")
CustomUserDetails UserDetailsPojo2Dto(SysUser user); CustomUserDetails UserDetailsPojo2Dto(SysUser user);
} }

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.dto; package com.dlp.admin.entity.dto;
public record Pair<T1, T2>(T1 v1, T2 v2) { public record Pair<T1, T2>(T1 v1, T2 v2) {
} }

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.dto; package com.dlp.admin.entity.dto;
public record Tuple<T1, T2, T3>(T1 v1, T2 v2, T3 v3) { public record Tuple<T1, T2, T3>(T1 v1, T2 v2, T3 v3) {
} }

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.dto.system; package com.dlp.admin.entity.dto.system;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;

View File

@@ -1,11 +1,8 @@
package com.rainbus.dlp.entity.dto.user; package com.dlp.admin.entity.dto.user;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.rainbus.dlp.entity.enums.UserStatusEnum;
import com.rainbus.dlp.entity.pojo.user.SysOrg;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -13,7 +10,6 @@ import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Data @Data
@NoArgsConstructor @NoArgsConstructor

View File

@@ -1,8 +1,7 @@
package com.rainbus.dlp.entity.dto.user; package com.dlp.admin.entity.dto.user;
import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.Claim;
import com.rainbus.dlp.entity.pojo.user.SysOrg; import com.dlp.admin.util.ConvertUtil;
import com.rainbus.dlp.util.ConvertUtil;
import lombok.Data; import lombok.Data;
import java.lang.reflect.Field; import java.lang.reflect.Field;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.enums; package com.dlp.admin.entity.enums;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.enums; package com.dlp.admin.entity.enums;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.enums; package com.dlp.admin.entity.enums;
public enum RoleEnum { public enum RoleEnum {
// system admin // system admin

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.enums; package com.dlp.admin.entity.enums;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.exception; package com.dlp.admin.entity.exception;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,6 +1,6 @@
package com.rainbus.dlp.entity.exception; package com.dlp.admin.entity.exception;
import com.rainbus.dlp.entity.enums.ExceptionEnum; import com.dlp.admin.entity.enums.ExceptionEnum;
import lombok.Getter; import lombok.Getter;
@Getter @Getter

View File

@@ -1,6 +1,6 @@
package com.rainbus.dlp.entity.exception; package com.dlp.admin.entity.exception;
import com.rainbus.dlp.entity.enums.ExceptionEnum; import com.dlp.admin.entity.enums.ExceptionEnum;
import lombok.Getter; import lombok.Getter;
@Getter @Getter

View File

@@ -0,0 +1,49 @@
package com.dlp.admin.entity.pojo.user;
import com.dlp.admin.entity.enums.OrgTypeEnum;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Data;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import java.time.LocalDateTime;
@Data
@Entity
@EnableJpaAuditing
public class SysOrg {
@Id
private Long id;
private String org;
private OrgTypeEnum type;
private String fullPathName;
private String fullPath;
private Long parentId;
private String region;
private String area;
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
@CreatedBy
private Long createdBy;
@LastModifiedBy
private Long updatedBy;
}

View File

@@ -1,24 +1,29 @@
package com.rainbus.dlp.entity.pojo.user; package com.dlp.admin.entity.pojo.user;
import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Data @Data
@Entity
public class SysResource { public class SysResource {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
private String resource; private String resource;
@Enumerated(EnumType.STRING)
private RequestMethod requestMethod; private RequestMethod requestMethod;
private String description; private String description;
private LocalDateTime createdAt = LocalDateTime.now(); private LocalDateTime createdAt;
private LocalDateTime updatedAt = LocalDateTime.now(); private LocalDateTime updatedAt;
} }

View File

@@ -1,18 +1,23 @@
package com.rainbus.dlp.entity.pojo.user; package com.dlp.admin.entity.pojo.user;
import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@Data @Data
@Entity
public class SysRole { public class SysRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
private String role; private String role;
private String description; private String description;
@ManyToMany
private List<SysResource> resources; private List<SysResource> resources;
private Long createdBy; private Long createdBy;

View File

@@ -1,18 +1,18 @@
package com.rainbus.dlp.entity.pojo.user; package com.dlp.admin.entity.pojo.user;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.dlp.admin.entity.enums.UserStatusEnum;
import com.rainbus.dlp.entity.enums.UserStatusEnum; import jakarta.persistence.*;
import com.rainbus.dlp.entity.exception.UserDisabledExcp;
import com.rainbus.dlp.entity.exception.UsernameOrPasswordExcp;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional;
@Data @Data
@Entity
public class SysUser { public class SysUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
private String username; private String username;
@@ -21,8 +21,10 @@ public class SysUser {
private String email; private String email;
@ManyToMany
private List<SysRole> roles; private List<SysRole> roles;
@ManyToOne
private SysOrg org; private SysOrg org;
private UserStatusEnum status; private UserStatusEnum status;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.req; package com.dlp.admin.entity.req;
import lombok.Data; import lombok.Data;

View File

@@ -1,10 +1,9 @@
package com.rainbus.dlp.entity.req.user; package com.dlp.admin.entity.req.user;
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import lombok.Data; import lombok.Data;
import lombok.NonNull;
@Data @Data
public class AddUserReq { public class AddUserReq {

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.req.user; package com.dlp.admin.entity.req.user;
import lombok.Data; import lombok.Data;

View File

@@ -1,9 +1,8 @@
package com.rainbus.dlp.entity.req.user; package com.dlp.admin.entity.req.user;
import com.rainbus.dlp.entity.req.PageReq; import com.dlp.admin.entity.req.PageReq;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.req.user; package com.dlp.admin.entity.req.user;
import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.req.user; package com.dlp.admin.entity.req.user;
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.resp; package com.dlp.admin.entity.resp;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.resp; package com.dlp.admin.entity.resp;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.resp.user; package com.dlp.admin.entity.resp.user;
import lombok.Data; import lombok.Data;

View File

@@ -1,11 +1,10 @@
package com.rainbus.dlp.entity.resp.user; package com.dlp.admin.entity.resp.user;
import com.rainbus.dlp.entity.enums.UserStatusEnum; import com.dlp.admin.entity.enums.UserStatusEnum;
import com.rainbus.dlp.entity.pojo.user.SysOrg; import com.dlp.admin.entity.pojo.user.SysOrg;
import com.rainbus.dlp.entity.pojo.user.SysRole; import com.dlp.admin.entity.pojo.user.SysRole;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.entity.resp.user; package com.dlp.admin.entity.resp.user;
import lombok.Data; import lombok.Data;

View File

@@ -0,0 +1,7 @@
package com.dlp.admin.repository.user;
import com.dlp.admin.entity.pojo.user.SysOrg;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SysOrgRepo extends JpaRepository<SysOrg, Long> {
}

View File

@@ -0,0 +1,7 @@
package com.dlp.admin.repository.user;
import com.dlp.admin.entity.pojo.user.SysResource;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SysResourceRepo extends JpaRepository<SysResource, Long> {
}

View File

@@ -0,0 +1,7 @@
package com.dlp.admin.repository.user;
import com.dlp.admin.entity.pojo.user.SysRole;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SysRoleRepo extends JpaRepository<SysRole, Long> {
}

View File

@@ -0,0 +1,10 @@
package com.dlp.admin.repository.user;
import com.dlp.admin.entity.pojo.user.SysUser;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface SysUserRepo extends JpaRepository<SysUser, Long> {
Optional<SysUser> findByUsername(String username);
}

View File

@@ -1,10 +1,10 @@
package com.rainbus.dlp.service; package com.dlp.admin.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dlp.admin.entity.converter.SystemConv;
import com.rainbus.dlp.entity.ApiDescription; import com.dlp.admin.entity.dto.system.ApiInfo;
import com.rainbus.dlp.entity.converter.SystemConv;
import com.rainbus.dlp.entity.dto.system.ApiInfo; import com.dlp.admin.entity.pojo.user.SysResource;
import com.rainbus.dlp.entity.pojo.user.SysResource; import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -15,7 +15,6 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl
import org.springframework.web.util.pattern.PathPattern; import org.springframework.web.util.pattern.PathPattern;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -38,10 +37,10 @@ public class SystemServ {
Set<PathPattern> patterns = info.getPathPatternsCondition().getPatterns(); Set<PathPattern> patterns = info.getPathPatternsCondition().getPatterns();
Set<RequestMethod> methods = info.getMethodsCondition().getMethods(); Set<RequestMethod> methods = info.getMethodsCondition().getMethods();
Optional<ApiDescription> desc = Optional.ofNullable(func.getMethod().getAnnotation(ApiDescription.class)); Optional<Operation> desc = Optional.ofNullable(func.getMethod().getAnnotation(Operation.class));
for (PathPattern url : patterns) { for (PathPattern url : patterns) {
for (RequestMethod method : methods) { for (RequestMethod method : methods) {
apiInfos.add(new ApiInfo(url.getPatternString(), method, desc.map(ApiDescription::value).orElse(null))); apiInfos.add(new ApiInfo(url.getPatternString(), method, desc.map(Operation::summary).orElse(null)));
} }
} }
}); });

View File

@@ -1,21 +1,20 @@
package com.rainbus.dlp.service; package com.dlp.admin.service;
import com.rainbus.dlp.entity.converter.UserConv; import com.dlp.admin.entity.converter.UserConv;
import com.rainbus.dlp.entity.dto.user.CustomUserDetails; import com.dlp.admin.entity.dto.user.CustomUserDetails;
import com.rainbus.dlp.entity.dto.user.TokenClaims; import com.dlp.admin.entity.dto.user.TokenClaims;
import com.rainbus.dlp.entity.enums.UserStatusEnum; import com.dlp.admin.entity.enums.UserStatusEnum;
import com.rainbus.dlp.entity.exception.OrgNotExistExcp; import com.dlp.admin.entity.exception.OrgNotExistExcp;
import com.rainbus.dlp.entity.exception.UserDisabledExcp; import com.dlp.admin.entity.exception.UserDisabledExcp;
import com.rainbus.dlp.entity.exception.UsernameOrPasswordExcp; import com.dlp.admin.entity.exception.UsernameOrPasswordExcp;
import com.rainbus.dlp.entity.pojo.user.SysOrg; import com.dlp.admin.entity.pojo.user.SysOrg;
import com.rainbus.dlp.entity.pojo.user.SysRole; import com.dlp.admin.entity.pojo.user.SysUser;
import com.rainbus.dlp.entity.pojo.user.SysUser; import com.dlp.admin.entity.req.user.LoginReq;
import com.rainbus.dlp.entity.req.user.LoginReq; import com.dlp.admin.entity.resp.user.LoginResp;
import com.rainbus.dlp.entity.resp.user.LoginResp; import com.dlp.admin.repository.user.SysUserRepo;
import com.rainbus.dlp.repository.dao.UserDao; import com.dlp.admin.util.AuthUtil;
import com.rainbus.dlp.util.AuthUtil; import com.dlp.admin.util.JwtUtil;
import com.rainbus.dlp.util.JwtUtil; import com.dlp.admin.util.RedisUtil;
import com.rainbus.dlp.util.RedisUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
@@ -23,7 +22,6 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -32,7 +30,7 @@ import java.util.Optional;
public class UserServ implements UserDetailsService { public class UserServ implements UserDetailsService {
private final UserConv userConv; private final UserConv userConv;
private final UserDao userDao; private final SysUserRepo userRepo;
public static final String REDIS_USER_DETAILS = "user_details_%s"; public static final String REDIS_USER_DETAILS = "user_details_%s";
public static final long REDIS_USER_DETAILS_EXPIRE = 1 * 60 * 60; public static final long REDIS_USER_DETAILS_EXPIRE = 1 * 60 * 60;
@@ -41,7 +39,7 @@ public class UserServ implements UserDetailsService {
private final AuthUtil authUtil; private final AuthUtil authUtil;
public SysUser getUserByUsername(String username) { public SysUser getUserByUsername(String username) {
Optional<SysUser> user = userDao.findUserByUsername(username); Optional<SysUser> user = userRepo.findByUsername(username);
if (user.isEmpty()) { if (user.isEmpty()) {
throw new UsernameNotFoundException("用户不存在"); throw new UsernameNotFoundException("用户不存在");
} }
@@ -49,7 +47,7 @@ public class UserServ implements UserDetailsService {
} }
public LoginResp login(LoginReq req) { public LoginResp login(LoginReq req) {
Optional<SysUser> userOpt = userDao.findUserRoleOrgByUsername(req.getUsername()); Optional<SysUser> userOpt = userRepo.findByUsername(req.getUsername());
SysUser user = validUserAvailable(userOpt); SysUser user = validUserAvailable(userOpt);
validPassword(req.getPassword(), user.getPassword()); validPassword(req.getPassword(), user.getPassword());
TokenClaims claims = userConv.ClaimsPojo2Dto(user); TokenClaims claims = userConv.ClaimsPojo2Dto(user);
@@ -57,12 +55,12 @@ public class UserServ implements UserDetailsService {
resp.setToken(JwtUtil.generateToken(claims)); resp.setToken(JwtUtil.generateToken(claims));
return resp; return resp;
} }
//
public Object listUser() { // public Object listUser() {
Long orgId = authUtil.getUserDetails().getOrgId(); // Long orgId = authUtil.getUserDetails().getOrgId();
List<Long> subOrgIds = userDao.listOrgWithSubOrg(orgId).stream().map(SysOrg::getId).toList(); // List<Long> subOrgIds = userDao.listOrgWithSubOrg(orgId).stream().map(SysOrg::getId).toList();
return userDao.listUserByOrgIds(subOrgIds); // return userDao.listUserByOrgIds(subOrgIds);
} // }
@Override @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
@@ -73,7 +71,7 @@ public class UserServ implements UserDetailsService {
} }
// 读数据库 // 读数据库
Optional<SysUser> userOpt = userDao.findUserRoleOrgByUsername(username); Optional<SysUser> userOpt = userRepo.findByUsername(username);
SysUser user = validUserAvailable(userOpt); SysUser user = validUserAvailable(userOpt);
CustomUserDetails userDetails = userConv.UserDetailsPojo2Dto(user); CustomUserDetails userDetails = userConv.UserDetailsPojo2Dto(user);

View File

@@ -1,9 +1,7 @@
package com.rainbus.dlp.util; package com.dlp.admin.util;
import com.rainbus.dlp.entity.dto.user.CustomUserDetails; import com.dlp.admin.entity.dto.user.CustomUserDetails;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.util; package com.dlp.admin.util;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.util; package com.dlp.admin.util;
import com.auth0.jwt.JWT; import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator; import com.auth0.jwt.JWTCreator;
@@ -6,7 +6,7 @@ import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import com.rainbus.dlp.entity.dto.user.TokenClaims; import com.dlp.admin.entity.dto.user.TokenClaims;
import java.time.Instant; import java.time.Instant;

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp.util; package com.dlp.admin.util;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@@ -1,54 +0,0 @@
package com.rainbus.dlp.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.rainbus.dlp.entity.dto.user.CustomUserDetails;
import com.rainbus.dlp.util.AuthUtil;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.context.SecurityContextHolder;
import java.time.LocalDateTime;
@Configuration
public class MybatisMetaObjectHandler implements MetaObjectHandler {
private final AuthUtil authUtil;
public MybatisMetaObjectHandler(AuthUtil authUtil) {
this.authUtil = authUtil;
}
@Override
public void insertFill(MetaObject metaObject) {
if (metaObject.hasSetter("createAt")) {
this.fillStrategy(metaObject, "createAt", LocalDateTime.now());
}
if (metaObject.hasSetter("updateAt")) {
this.fillStrategy(metaObject, "updateAt", LocalDateTime.now());
}
if (metaObject.hasSetter("createBy")) {
this.fillStrategy(metaObject, "createBy", this.getCurrentUserId());
}
if (metaObject.hasSetter("updateBy")) {
this.fillStrategy(metaObject, "updateBy", this.getCurrentUserId());
}
if (metaObject.hasSetter("isDeleted")) {
this.fillStrategy(metaObject, "isDeleted", false);
}
}
@Override
public void updateFill(MetaObject metaObject) {
if (metaObject.hasSetter("updateAt")) {
this.fillStrategy(metaObject, "updateAt", LocalDateTime.now());
}
if (metaObject.hasSetter("updateBy")) {
this.fillStrategy(metaObject, "updateBy", this.getCurrentUserId());
}
}
private Long getCurrentUserId() {
CustomUserDetails userDetails = authUtil.getUserDetails();
return userDetails.getId();
}
}

View File

@@ -1,19 +0,0 @@
package com.rainbus.dlp.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConf {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

View File

@@ -1,35 +0,0 @@
package com.rainbus.dlp.entity.pojo.user;
import com.rainbus.dlp.entity.enums.OrgTypeEnum;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class SysOrg {
private Long id;
private String org;
private OrgTypeEnum type;
private String fullPathName;
private String fullPath;
private Long parentId;
private String region;
private String area;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private Long createdBy;
private Long updatedBy;
}

View File

@@ -1,27 +0,0 @@
package com.rainbus.dlp.repository.dao;
import com.baomidou.mybatisplus.core.batch.MybatisBatch;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.rainbus.dlp.entity.pojo.user.SysResource;
import com.rainbus.dlp.repository.mapper.user.SysResourceMapper;
import com.rainbus.dlp.repository.mapper.user.SysUserMapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SystemDao {
private final SysResourceMapper resourceMapper;
private final SqlSessionFactory sqlSessionFactory;
private final SysUserMapper sysUserMapper;
public SystemDao(SysResourceMapper sysResourceMapper, SqlSessionFactory sqlSessionFactory, SysUserMapper sysUserMapper) {
this.resourceMapper = sysResourceMapper;
this.sqlSessionFactory = sqlSessionFactory;
this.sysUserMapper = sysUserMapper;
}
}

View File

@@ -1,63 +0,0 @@
package com.rainbus.dlp.repository.dao;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.rainbus.dlp.entity.pojo.user.SysOrg;
import com.rainbus.dlp.entity.pojo.user.SysRole;
import com.rainbus.dlp.entity.pojo.user.SysUser;
import com.rainbus.dlp.repository.mapper.user.SysOrgMapper;
import com.rainbus.dlp.repository.mapper.user.SysRoleMapper;
import com.rainbus.dlp.repository.mapper.user.SysUserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@Component
@RequiredArgsConstructor
public class UserDao {
private final SysUserMapper userMapper;
private final SysRoleMapper roleMapper;
private final SysOrgMapper orgMapper;
public Optional<SysUser> findUserByUsername(String username) {
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getUsername, username);
return Optional.ofNullable(userMapper.selectOne(wrapper));
}
public Optional<SysUser> findUserRoleOrgByUsername(String username) {
return Optional.ofNullable(userMapper.selectUserRoleOrgByUsername(username));
}
public List<SysRole> listRoleResource() {
return roleMapper.selectAllRoleResource();
}
public Optional<SysOrg> findOrgById(Long orgId) {
return Optional.ofNullable(orgMapper.selectById(orgId));
}
public List<SysOrg> listOrgWithSubOrg(Long orgId) {
SysOrg org = orgMapper.selectById(orgId);
if (Objects.isNull(org)) {
return List.of();
}
LambdaQueryWrapper<SysOrg> subQueryWrapper = new LambdaQueryWrapper<SysOrg>()
.like(SysOrg::getFullPath, org.getFullPath() + "%");
return orgMapper.selectList(subQueryWrapper);
}
public List<SysUser> listUserByOrgIds(List<Long> orgIds) {
LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<SysUser>()
.in(SysUser::getOrg, orgIds);
return userMapper.selectList(lqw);
}
}

View File

@@ -1,7 +0,0 @@
package com.rainbus.dlp.repository.mapper.user;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rainbus.dlp.entity.pojo.user.SysOrg;
public interface SysOrgMapper extends BaseMapper<SysOrg> {
}

View File

@@ -1,34 +0,0 @@
package com.rainbus.dlp.repository.mapper.user;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rainbus.dlp.entity.pojo.user.SysResource;
import com.rainbus.dlp.util.SqlUtil;
import com.rainbus.dlp.util.TextUtil;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.mapstruct.Mapping;
import java.util.List;
public interface SysResourceMapper extends BaseMapper<SysResource> {
@Select("""
select * from sys_resource sr
left join sys_role_resources srr
on sr.id = srr.resources_id
where srr.sys_role_id = #{roleId}
""")
List<SysResource> selectListByRoleId(Long roleId);
@Insert("""
<script>
insert into sys_resource (request_method, resource, created_at, description, updated_at) values
<foreach collection="resources" item="item" index="index" separator=",">
(#{item.requestMethod}, #{item.resource}, #{item.createdAt}, #{item.description}, #{item.updatedAt})
</foreach>
</script>
""")
Long batchInsert(List<SysResource> resources);
}

View File

@@ -1,46 +0,0 @@
package com.rainbus.dlp.repository.mapper.user;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rainbus.dlp.entity.dto.Pair;
import com.rainbus.dlp.entity.pojo.user.SysRole;
import org.apache.ibatis.annotations.*;
import javax.management.relation.Role;
import java.util.List;
public interface SysRoleMapper extends BaseMapper<SysRole> {
@Select("""
select * from sys_role sr
left join sys_user_roles sur
on sr.id = sur.roles_id
where sur.sys_user_id = #{userId}
""")
List<SysRole> selectListByUserId(Long userId);
@Select("""
select * from sys_role where id = 4
""")
@Results(
@Result(
property = "resources",
column = "id",
many = @Many(
select = "com.rainbus.dlp.repository.mapper.user.SysResourceMapper.selectListByRoleId"
)
)
)
List<SysRole> selectAllRoleResource();
@Select("""
select * from sys_user_roles where sys_user_id in #{userId}
""")
@Results({
@Result(property = "v1", column = "sys_user_id"),
@Result(property = "v2", column = "roles_id")
})
List<Pair<Long, Long>> selectRoleIdsByUserId(List<Long> userId);
}

View File

@@ -1,32 +0,0 @@
package com.rainbus.dlp.repository.mapper.user;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rainbus.dlp.entity.pojo.user.SysUser;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface SysUserMapper extends BaseMapper<SysUser> {
@Select("""
select * from sys_user where username = #{username}
""")
@Results({
@Result(column = "id", property = "id"),
@Result(
column = "id",
property = "roles",
many = @Many(
select = "com.rainbus.dlp.repository.mapper.user.SysRoleMapper.selectListByUserId"
)
),
@Result(
column = "org_id",
property = "org",
one = @One(
select = "com.rainbus.dlp.repository.mapper.user.SysOrgMapper.selectById"
)
)
})
SysUser selectUserRoleOrgByUsername(@Param("username") String username);
}

View File

@@ -1,28 +0,0 @@
package com.rainbus.dlp.util;
import java.util.Arrays;
import java.util.List;
public class SqlUtil {
record TableInfo(String tableName, List<String> columName) {}
public static <T> String generateBatchInsertSql(String fieldName, Class<T> tClass) {
TableInfo tableInfo = getTableInfo(tClass);
return STR."""
INSERT INTO \{tableInfo.tableName} (\{String.join(", ", tableInfo.columName)})
VALUES
<foreach collection="\{fieldName}" item="item" index="index" separator=",">
(\{String.join(", ", tableInfo.columName.stream().map(colum -> STR."#{item.\{colum}}").toList())})
</foreach>
""";
}
private static <T> TableInfo getTableInfo(Class<T> tClass) {
String tableName = TextUtil.camelToSnake(tClass.getSimpleName());
List<String> columName = Arrays.stream(tClass.getDeclaredFields())
.map(field -> TextUtil.camelToSnake(field.getName()))
.toList();
return new TableInfo(tableName, columName);
}
}

View File

@@ -1,25 +0,0 @@
package com.rainbus.dlp.util;
import org.apache.commons.lang3.StringUtils;
import java.nio.charset.StandardCharsets;
public class TextUtil {
public static String camelToSnake(String camel) {
if (StringUtils.isBlank(camel)) {
return camel;
}
camel = Character.toLowerCase(camel.charAt(0)) + camel.substring(1);
StringBuilder result = new StringBuilder();
for (Character c: camel.toCharArray()) {
if (Character.isUpperCase(c)) {
result.append("_");
result.append(Character.toLowerCase(c));
} else {
result.append(c);
}
}
return result.toString();
}
}

View File

@@ -7,6 +7,13 @@ spring:
username: root username: root
password: 13291004986@lm password: 13291004986@lm
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
# properties:
# hibernate:
# enable_lazy_load_no_trans: true
data: data:
@@ -15,11 +22,4 @@ spring:
port: 6379 port: 6379
password: 13291004986 password: 13291004986
timeout: 10000 timeout: 10000
database: 0 database: 0
logging:
level:
com:
rainbus:
dlp:
repository:
mapper: debug

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rainbus.dlp.repository.mapper.user.SysResourceMapper">
<!-- <insert id="batchInsert">-->
<!-- ${@com.rainbus.dlp.util.SqlUtil@generateBatchInsertSql("resources", @com.rainbus.dlp.entity.pojo.user.SysResource@class)}-->
<!-- </insert>-->
</mapper>

View File

@@ -1,4 +1,4 @@
package com.rainbus.dlp; package com.dlp.admin;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;