From 7e40c620e75ce1fa52e5763c0708428ac678088d Mon Sep 17 00:00:00 2001 From: dengqichen Date: Fri, 29 Nov 2024 10:44:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E6=AD=A3=E5=B8=B8=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deploy/backend/api/UserApiController.java | 27 +++- .../backend/controller/TenantController.java | 54 ++++--- .../backend/converter/RoleConverter.java | 12 ++ .../backend/converter/TenantConverter.java | 12 +- .../backend/converter/UserConverter.java | 27 +--- .../qqchen/deploy/backend/dto/RoleDTO.java | 14 ++ .../qqchen/deploy/backend/dto/TenantDTO.java | 19 +++ .../qqchen/deploy/backend/dto/UserDTO.java | 17 +++ .../backend/dto/request/TenantRequest.java | 24 --- .../backend/dto/request/UserRequest.java | 7 +- .../backend/dto/response/TenantResponse.java | 27 ---- .../qqchen/deploy/backend/entity/Role.java | 6 + .../qqchen/deploy/backend/entity/User.java | 20 +++ .../deploy/backend/entity/UserRole.java | 64 ++++---- .../framework/controller/BaseController.java | 34 ++--- .../converter/AbstractConverter.java | 19 ++- .../framework/converter/BaseConverter.java | 73 +++++---- .../converter/ConversionService.java | 71 --------- .../deploy/backend/framework/dto/BaseDTO.java | 20 +++ .../backend/framework/dto/BaseRequest.java | 21 --- .../framework/service/IBaseService.java | 27 ++-- .../service/impl/BaseServiceImpl.java | 141 ++++++++---------- .../backend/repository/ITenantRepository.java | 11 +- .../repository/IUserRoleRepository.java | 54 +++---- .../backend/service/ITenantService.java | 5 +- .../deploy/backend/service/IUserService.java | 11 +- .../service/impl/TenantServiceImpl.java | 44 +++--- .../backend/service/impl/UserServiceImpl.java | 106 ++++++++----- 28 files changed, 498 insertions(+), 469 deletions(-) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/converter/RoleConverter.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/dto/RoleDTO.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/dto/TenantDTO.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/dto/UserDTO.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/dto/request/TenantRequest.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/dto/response/TenantResponse.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/framework/converter/ConversionService.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseDTO.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseRequest.java diff --git a/backend/src/main/java/com/qqchen/deploy/backend/api/UserApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/api/UserApiController.java index a6e55a6f..a063ae2a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/api/UserApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/api/UserApiController.java @@ -1,11 +1,12 @@ package com.qqchen.deploy.backend.api; +import com.qqchen.deploy.backend.dto.RoleDTO; +import com.qqchen.deploy.backend.dto.query.UserQuery; +import com.qqchen.deploy.backend.dto.request.UserRequest; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.entity.User; -import com.qqchen.deploy.backend.dto.query.UserQuery; -import com.qqchen.deploy.backend.dto.request.UserRequest; -import com.qqchen.deploy.backend.dto.response.UserResponse; +import com.qqchen.deploy.backend.dto.UserDTO; import com.qqchen.deploy.backend.dto.request.LoginRequest; import com.qqchen.deploy.backend.dto.response.LoginResponse; import com.qqchen.deploy.backend.service.IUserService; @@ -20,7 +21,7 @@ import java.util.List; @RestController @RequestMapping("/api/v1/users") -public class UserApiController extends BaseController { +public class UserApiController extends BaseController { private final IUserService userService; @@ -37,19 +38,31 @@ public class UserApiController extends BaseController register(@Validated @RequestBody UserRequest request) { + public Response register(@Validated @RequestBody UserRequest request) { return Response.success(userService.register(request)); } @Override - protected void exportData(HttpServletResponse response, List data) { + protected void exportData(HttpServletResponse response, List data) { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=users.xlsx"); try (OutputStream out = response.getOutputStream()) { -// ExcelUtils.export(data, out); + // ExcelUtils.export(data, out); } catch (IOException e) { throw new RuntimeException("Export failed", e); } } + + @GetMapping("/roles") + @Operation(summary = "获取当前用户的角色") + public Response> getCurrentUserRoles() { + return Response.success(userService.getCurrentUserRoles()); + } + + @GetMapping("/{id}/roles") + @Operation(summary = "获取指定用户的角色") + public Response> getUserRoles(@PathVariable Long id) { + return Response.success(userService.getUserRoles(id)); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/controller/TenantController.java b/backend/src/main/java/com/qqchen/deploy/backend/controller/TenantController.java index 3b8acb56..ba4e99b7 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/controller/TenantController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/controller/TenantController.java @@ -1,19 +1,35 @@ -//package com.qqchen.deploy.backend.controller; -// -//import com.qqchen.deploy.backend.entity.Tenant; -//import com.qqchen.deploy.backend.framework.controller.BaseController; -//import com.qqchen.deploy.backend.service.ITenantService; -//import com.qqchen.deploy.backend.dto.request.TenantRequest; -//import com.qqchen.deploy.backend.dto.response.TenantResponse; -//import com.qqchen.deploy.backend.query.TenantQuery; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//@RestController -//@RequestMapping("/tenants") -//public class TenantController extends BaseController { -// -// public TenantController(ITenantService service) { -// super(service); -// } -//} \ No newline at end of file +package com.qqchen.deploy.backend.controller; + +import com.qqchen.deploy.backend.dto.query.TenantQuery; +import com.qqchen.deploy.backend.entity.Tenant; +import com.qqchen.deploy.backend.framework.controller.BaseController; +import com.qqchen.deploy.backend.service.ITenantService; +import com.qqchen.deploy.backend.dto.TenantDTO; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; + +@RestController +@RequestMapping("/tenants") +public class TenantController extends BaseController { + + public TenantController(ITenantService service) { + super(service); + } + + @Override + protected void exportData(HttpServletResponse response, List data) { + response.setContentType("application/vnd.ms-excel"); + response.setHeader("Content-Disposition", "attachment;filename=tenants.xlsx"); + + try (OutputStream out = response.getOutputStream()) { + // ExcelUtils.export(data, out); + } catch (IOException e) { + throw new RuntimeException("Export failed", e); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/converter/RoleConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/converter/RoleConverter.java new file mode 100644 index 00000000..669d72f7 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/converter/RoleConverter.java @@ -0,0 +1,12 @@ +package com.qqchen.deploy.backend.converter; + +import com.qqchen.deploy.backend.dto.RoleDTO; +import com.qqchen.deploy.backend.entity.Role; +import com.qqchen.deploy.backend.framework.converter.BaseConverter; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface RoleConverter extends BaseConverter { + // MapStruct 会自动实现必要的方法 +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/converter/TenantConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/converter/TenantConverter.java index 0c90e28e..90fe4874 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/converter/TenantConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/converter/TenantConverter.java @@ -1,13 +1,11 @@ package com.qqchen.deploy.backend.converter; -import com.qqchen.deploy.backend.framework.converter.BaseConverter; -import com.qqchen.deploy.backend.dto.request.TenantRequest; -import com.qqchen.deploy.backend.dto.response.TenantResponse; +import com.qqchen.deploy.backend.dto.TenantDTO; import com.qqchen.deploy.backend.entity.Tenant; +import com.qqchen.deploy.backend.framework.converter.AbstractConverter; +import com.qqchen.deploy.backend.framework.converter.BaseConverter; import org.mapstruct.Mapper; -import org.mapstruct.ReportingPolicy; -@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) -public interface TenantConverter extends BaseConverter { - // MapStruct 会自动实现转换方法 +@Mapper(config = BaseConverter.class) +public abstract class TenantConverter extends AbstractConverter implements BaseConverter { } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/converter/UserConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/converter/UserConverter.java index 32ad98c0..f150166d 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/converter/UserConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/converter/UserConverter.java @@ -1,28 +1,11 @@ package com.qqchen.deploy.backend.converter; +import com.qqchen.deploy.backend.framework.converter.AbstractConverter; import com.qqchen.deploy.backend.framework.converter.BaseConverter; import com.qqchen.deploy.backend.entity.User; -import com.qqchen.deploy.backend.dto.request.UserRequest; -import com.qqchen.deploy.backend.dto.response.UserResponse; +import com.qqchen.deploy.backend.dto.UserDTO; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.ReportingPolicy; -@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) -public interface UserConverter extends BaseConverter { - - @Override - @Mapping(target = "id", ignore = true) - @Mapping(target = "enabled", constant = "true") - User toEntity(UserRequest request); - - @Override - @Mapping(target = "password", ignore = true) - UserResponse toResponse(User user); - - @Override - @Mapping(target = "id", ignore = true) - @Mapping(target = "enabled", ignore = true) - void updateEntity(@MappingTarget User user, UserRequest request); -} \ No newline at end of file +@Mapper(config = BaseConverter.class) +public abstract class UserConverter extends AbstractConverter implements BaseConverter { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/dto/RoleDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/dto/RoleDTO.java new file mode 100644 index 00000000..9b789356 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/dto/RoleDTO.java @@ -0,0 +1,14 @@ +package com.qqchen.deploy.backend.dto; + +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleDTO extends BaseDTO { + private String name; + private String code; + private String description; + private Integer sort; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/dto/TenantDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/dto/TenantDTO.java new file mode 100644 index 00000000..53c316f6 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/dto/TenantDTO.java @@ -0,0 +1,19 @@ +package com.qqchen.deploy.backend.dto; + +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class TenantDTO extends BaseDTO { + private String name; + private String code; + private String description; + private Boolean enabled; + private String contactName; + private String contactPhone; + private String contactEmail; + private String address; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/dto/UserDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/dto/UserDTO.java new file mode 100644 index 00000000..cf40bfd8 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/dto/UserDTO.java @@ -0,0 +1,17 @@ +package com.qqchen.deploy.backend.dto; + +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Set; + +@Data +@EqualsAndHashCode(callSuper = true) +public class UserDTO extends BaseDTO { + private String username; + private String nickname; + private String email; + private String phone; + private Boolean enabled; + private Set roles; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/dto/request/TenantRequest.java b/backend/src/main/java/com/qqchen/deploy/backend/dto/request/TenantRequest.java deleted file mode 100644 index f306a317..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/dto/request/TenantRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.qqchen.deploy.backend.dto.request; - -import com.qqchen.deploy.backend.framework.dto.BaseRequest; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -public class TenantRequest extends BaseRequest { - - @NotBlank(message = "租户名称不能为空") - private String name; - - @NotBlank(message = "租户编码不能为空") - private String code; - - @NotBlank(message = "租户维护人") - private String contactName; - - @NotBlank(message = "租户维护人电话") - private String contactPhone; - -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/dto/request/UserRequest.java b/backend/src/main/java/com/qqchen/deploy/backend/dto/request/UserRequest.java index f15fecec..d21d6b8c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/dto/request/UserRequest.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/dto/request/UserRequest.java @@ -1,6 +1,5 @@ package com.qqchen.deploy.backend.dto.request; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; @@ -8,8 +7,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; @Data -@EqualsAndHashCode(callSuper = true) -public class UserRequest extends BaseRequest { +public class UserRequest { @NotBlank(message = "用户名不能为空") @@ -24,6 +22,9 @@ public class UserRequest extends BaseRequest { @Size(min = 6, max = 20, message = "密码长度必须在6-20之间") private String password; + @NotBlank(message = "确认密码不能为空") + private String confirmPassword; + private String nickname; private String phone; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/dto/response/TenantResponse.java b/backend/src/main/java/com/qqchen/deploy/backend/dto/response/TenantResponse.java deleted file mode 100644 index e7aed94d..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/dto/response/TenantResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.qqchen.deploy.backend.dto.response; - -import com.qqchen.deploy.backend.framework.dto.BaseResponse; -import lombok.Data; -import lombok.EqualsAndHashCode; - - -@Data -@EqualsAndHashCode(callSuper = true) -public class TenantResponse extends BaseResponse { - - private Long id; - - private String name; - - private String code; - - private String contactName; - - private String contactPhone; - - private String email; - - private String address; - - private Boolean enabled = true; -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/entity/Role.java b/backend/src/main/java/com/qqchen/deploy/backend/entity/Role.java index 42a8c7b8..53b66131 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/entity/Role.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/entity/Role.java @@ -3,10 +3,13 @@ package com.qqchen.deploy.backend.entity; import com.qqchen.deploy.backend.framework.annotation.LogicDelete; import com.qqchen.deploy.backend.framework.domain.Entity; import jakarta.persistence.Column; +import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.HashSet; +import java.util.Set; @Data @@ -29,4 +32,7 @@ public class Role extends Entity { @Column(nullable = false) private Integer sort = 0; + @ManyToMany(mappedBy = "roles") + private Set users = new HashSet<>(); + } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/entity/User.java b/backend/src/main/java/com/qqchen/deploy/backend/entity/User.java index 1753e71f..b64c7789 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/entity/User.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/entity/User.java @@ -3,9 +3,15 @@ package com.qqchen.deploy.backend.entity; import com.qqchen.deploy.backend.framework.annotation.LogicDelete; import com.qqchen.deploy.backend.framework.domain.Entity; import jakarta.persistence.Column; +import jakarta.persistence.FetchType; import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.JoinTable; +import jakarta.persistence.JoinColumn; +import java.util.HashSet; +import java.util.Set; @Data @EqualsAndHashCode(callSuper = true) @@ -30,4 +36,18 @@ public class User extends Entity { @Column(nullable = false) private Boolean enabled = true; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable( + name = "sys_user_role", // 中间表名称 + joinColumns = @JoinColumn( + name = "user_id", // 中间表中关联当前实体的外键名 + referencedColumnName = "id" // 当前实体的主键 + ), + inverseJoinColumns = @JoinColumn( + name = "role_id", // 中间表中关联目标实体的外键名 + referencedColumnName = "id" // 目标实体的主键 + ) + ) + private Set roles = new HashSet<>(); + } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/entity/UserRole.java b/backend/src/main/java/com/qqchen/deploy/backend/entity/UserRole.java index e1b408ac..f7d9814a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/entity/UserRole.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/entity/UserRole.java @@ -1,32 +1,32 @@ -package com.qqchen.deploy.backend.entity; - -import com.qqchen.deploy.backend.framework.annotation.LogicDelete; -import com.qqchen.deploy.backend.framework.domain.Entity; -import jakarta.persistence.Column; -import jakarta.persistence.Table; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -@jakarta.persistence.Entity -@Table(name = "sys_user_role") -@LogicDelete -public class UserRole extends Entity { - - @Column(name = "user_id") - private Long userId; - - @Column(name = "role_id") - private Long roleId; - - // 添加构造方法 - protected UserRole() { - // JPA需要无参构造方法 - } - - public UserRole(Long userId, Long roleId) { - this.userId = userId; - this.roleId = roleId; - } -} \ No newline at end of file +//package com.qqchen.deploy.backend.entity; +// +//import com.qqchen.deploy.backend.framework.annotation.LogicDelete; +//import com.qqchen.deploy.backend.framework.domain.Entity; +//import jakarta.persistence.Column; +//import jakarta.persistence.Table; +//import lombok.Data; +//import lombok.EqualsAndHashCode; +// +//@Data +//@EqualsAndHashCode(callSuper = true) +//@jakarta.persistence.Entity +//@Table(name = "sys_user_role") +//@LogicDelete +//public class UserRole extends Entity { +// +// @Column(name = "user_id") +// private Long userId; +// +// @Column(name = "role_id") +// private Long roleId; +// +// // 添加构造方法 +// protected UserRole() { +// // JPA需要无参构造方法 +// } +// +// public UserRole(Long userId, Long roleId) { +// this.userId = userId; +// this.roleId = roleId; +// } +//} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java index 980f0caa..ca88630a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java @@ -1,9 +1,8 @@ package com.qqchen.deploy.backend.framework.controller; import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.framework.dto.BaseResponse; +import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.framework.query.BaseQuery; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.service.IBaseService; import jakarta.servlet.http.HttpServletResponse; @@ -19,23 +18,22 @@ import java.util.concurrent.CompletableFuture; * 通用REST控制器 */ @Validated -public abstract class BaseController, ID extends Serializable, - Q extends BaseQuery, REQ extends BaseRequest, RESP extends BaseResponse> { +public abstract class BaseController, D extends BaseDTO, ID extends Serializable, Q extends BaseQuery> { - protected final IBaseService service; + protected final IBaseService service; - protected BaseController(IBaseService service) { + protected BaseController(IBaseService service) { this.service = service; } @PostMapping - public Response create(@Validated @RequestBody REQ request) { - return Response.success(service.create(request)); + public Response create(@Validated @RequestBody D dto) { + return Response.success(service.create(dto)); } @PutMapping("/{id}") - public Response update(@PathVariable ID id, @Validated @RequestBody REQ request) { - return Response.success(service.update(id, request)); + public Response update(@PathVariable ID id, @Validated @RequestBody D dto) { + return Response.success(service.update(id, dto)); } @DeleteMapping("/{id}") @@ -45,35 +43,35 @@ public abstract class BaseController, ID extends Serializab } @GetMapping("/{id}") - public Response findById(@PathVariable ID id) { + public Response findById(@PathVariable ID id) { return Response.success(service.findById(id)); } @GetMapping - public Response> findAll() { + public Response> findAll() { return Response.success(service.findAll()); } @GetMapping("/page") - public Response> page(Q query) { + public Response> page(Q query) { return Response.success(service.page(query)); } @GetMapping("/list") - public Response> findAll(Q query) { + public Response> findAll(Q query) { return Response.success(service.findAll(query)); } @PostMapping("/batch") - public CompletableFuture> batchProcess(@RequestBody List entities) { + public CompletableFuture> batchProcess(@RequestBody List dtos) { return CompletableFuture.runAsync(() -> { - service.batchProcess(entities); + service.batchProcess(dtos); }).thenApply(v -> Response.success()); } @GetMapping("/export") public void export(HttpServletResponse response, Q query) { - List data = service.findAll(query); + List data = service.findAll(query); exportData(response, data); } @@ -82,5 +80,5 @@ public abstract class BaseController, ID extends Serializab * @param response HTTP响应 * @param data 要导出的数据 */ - protected abstract void exportData(HttpServletResponse response, List data); + protected abstract void exportData(HttpServletResponse response, List data); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/AbstractConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/AbstractConverter.java index 7ef70e7e..2db2d0e1 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/AbstractConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/AbstractConverter.java @@ -1,26 +1,29 @@ package com.qqchen.deploy.backend.framework.converter; import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; -import com.qqchen.deploy.backend.framework.dto.BaseResponse; +import com.qqchen.deploy.backend.framework.dto.BaseDTO; import org.springframework.core.GenericTypeResolver; -public abstract class AbstractConverter, REQ extends BaseRequest, RESP extends BaseResponse> - implements BaseConverter { +public abstract class AbstractConverter, D extends BaseDTO> { private final Class entityClass; + private final Class dtoClass; @SuppressWarnings("unchecked") protected AbstractConverter() { Class[] genericTypes = GenericTypeResolver.resolveTypeArguments(getClass(), AbstractConverter.class); - if (genericTypes == null || genericTypes.length < 3) { - throw new IllegalStateException("Could not resolve entity class"); + if (genericTypes == null || genericTypes.length < 2) { + throw new IllegalStateException("Could not resolve generic types"); } this.entityClass = (Class) genericTypes[0]; + this.dtoClass = (Class) genericTypes[1]; } - @Override public Class getEntityClass() { return entityClass; } -} \ No newline at end of file + + public Class getDtoClass() { + return dtoClass; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/BaseConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/BaseConverter.java index 7cbc54f6..6e2d0262 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/BaseConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/BaseConverter.java @@ -1,40 +1,63 @@ package com.qqchen.deploy.backend.framework.converter; import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; -import com.qqchen.deploy.backend.framework.dto.BaseResponse; +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; -import org.springframework.core.GenericTypeResolver; +import org.mapstruct.Mappings; import org.springframework.data.domain.Page; import java.util.List; +import java.util.stream.Collectors; -public interface BaseConverter, REQ extends BaseRequest, RESP extends BaseResponse> { +@org.mapstruct.MapperConfig( + componentModel = "spring", + unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE +) +public interface BaseConverter, D extends BaseDTO> { - // Request -> Domain - T toEntity(REQ request); + @Mappings({ + @Mapping(target = "id", source = "id"), + @Mapping(target = "createTime", source = "createTime"), + @Mapping(target = "createBy", source = "createBy"), + @Mapping(target = "updateTime", source = "updateTime"), + @Mapping(target = "updateBy", source = "updateBy"), + @Mapping(target = "version", source = "version"), + @Mapping(target = "deleted", source = "deleted") + }) + D toDto(T entity); - // Domain -> Response - RESP toResponse(T entity); + @Mappings({ + @Mapping(target = "id", source = "id"), + @Mapping(target = "createTime", source = "createTime"), + @Mapping(target = "createBy", source = "createBy"), + @Mapping(target = "updateTime", source = "updateTime"), + @Mapping(target = "updateBy", source = "updateBy"), + @Mapping(target = "version", source = "version"), + @Mapping(target = "deleted", source = "deleted") + }) + T toEntity(D dto); - // Domain List -> Response List - List toResponseList(List entityList); + @Mappings({ + @Mapping(target = "id", ignore = true), + @Mapping(target = "createTime", ignore = true), + @Mapping(target = "createBy", ignore = true), + @Mapping(target = "version", ignore = true), + @Mapping(target = "deleted", ignore = true) + }) + void updateEntity(@MappingTarget T entity, D dto); - // 更新实体 - void updateEntity(@MappingTarget T entity, REQ request); + List toDtoList(List entityList); - // 转换分页结果 - default Page toResponsePage(Page page) { - return page.map(this::toResponse); + default Page toDtoPage(Page page) { + return page.map(this::toDto); + } + + default List toEntityList(List dtos) { + if (dtos == null) return null; + return dtos.stream() + .map(this::toEntity) + .collect(Collectors.toList()); } - // 获取实体类类型 - @SuppressWarnings("unchecked") - default Class getEntityClass() { - Class[] genericTypes = GenericTypeResolver.resolveTypeArguments(getClass(), BaseConverter.class); - if (genericTypes == null || genericTypes.length < 3) { - throw new IllegalStateException("Could not resolve entity class"); - } - return (Class) genericTypes[0]; - } -} \ No newline at end of file +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/ConversionService.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/ConversionService.java deleted file mode 100644 index 2ea6d3e1..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/converter/ConversionService.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.qqchen.deploy.backend.framework.converter; - -import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; -import com.qqchen.deploy.backend.framework.dto.BaseResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service -public class ConversionService { - - private final Map, BaseConverter> converterMap = new ConcurrentHashMap<>(); - - @Autowired - public void setConverters(List> converters) { - converters.forEach(converter -> { - Class entityClass = converter.getEntityClass(); - converterMap.put(entityClass, converter); - }); - } - - @SuppressWarnings("unchecked") - private , REQ extends BaseRequest, RESP extends BaseResponse> - BaseConverter getConverter(Class entityClass) { - BaseConverter converter = converterMap.get(entityClass); - if (converter == null) { - throw new IllegalArgumentException("No converter found for entity class: " + entityClass.getName()); - } - return (BaseConverter) converter; - } - - @Cacheable(value = "conversion", key = "#request.class.name + '_' + #entityClass.name") - public , REQ extends BaseRequest, RESP extends BaseResponse> - T toEntity(REQ request, Class entityClass) { - BaseConverter converter = getConverter(entityClass); - return converter.toEntity(request); - } - - @Cacheable(value = "conversion", key = "#entity.class.name + '_response'") - public , REQ extends BaseRequest, RESP extends BaseResponse> - RESP toResponse(T entity) { - @SuppressWarnings("unchecked") - Class entityClass = (Class) entity.getClass(); - BaseConverter converter = getConverter(entityClass); - return converter.toResponse(entity); - } - - public , REQ extends BaseRequest, RESP extends BaseResponse> - List toResponseList(List entities) { - if (entities.isEmpty()) { - return List.of(); - } - @SuppressWarnings("unchecked") - Class entityClass = (Class) entities.get(0).getClass(); - BaseConverter converter = getConverter(entityClass); - return converter.toResponseList(entities); - } - - public , REQ extends BaseRequest, RESP extends BaseResponse> - void updateEntity(T entity, REQ request) { - @SuppressWarnings("unchecked") - Class entityClass = (Class) entity.getClass(); - BaseConverter converter = getConverter(entityClass); - converter.updateEntity(entity, request); - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseDTO.java new file mode 100644 index 00000000..c0b62ae1 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseDTO.java @@ -0,0 +1,20 @@ +package com.qqchen.deploy.backend.framework.dto; + +import lombok.Data; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Map; + +@Data +public class BaseDTO implements Serializable { + private Long id; + private LocalDateTime createTime; + private String createBy; + private LocalDateTime updateTime; + private String updateBy; + private Integer version; + private Boolean deleted; + + // 扩展字段,用于存储额外的属性 + private Map extraData; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseRequest.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseRequest.java deleted file mode 100644 index fc0e7a5b..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/BaseRequest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.qqchen.deploy.backend.framework.dto; - -import lombok.Data; - -import java.io.Serializable; - -@Data -public abstract class BaseRequest implements Serializable { - - private String operator; // 操作人 - - private Long timestamp; // 操作时间戳 - - private String traceId; // 请求追踪ID - - private String clientIp; // 客户端IP - - private String clientType; // 客户端类型 - - private String appVersion; // 应用版本 -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/service/IBaseService.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/service/IBaseService.java index 067c5896..1585c06e 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/service/IBaseService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/service/IBaseService.java @@ -1,8 +1,7 @@ package com.qqchen.deploy.backend.framework.service; import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; -import com.qqchen.deploy.backend.framework.dto.BaseResponse; +import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.framework.query.BaseQuery; import org.springframework.data.domain.Page; @@ -12,28 +11,28 @@ import java.util.List; /** * 通用服务接口 */ -public interface IBaseService, ID extends Serializable, REQ extends BaseRequest, RESP extends BaseResponse> { - RESP create(REQ request); +public interface IBaseService, D extends BaseDTO, ID extends Serializable> { + D create(D dto); - RESP update(ID id, REQ request); + D update(ID id, D dto); void delete(ID id); - RESP findById(ID id); + D findById(ID id); - List findAll(); + List findAll(); - List findAll(BaseQuery query); + Page page(BaseQuery query); - Page page(BaseQuery query); + List findAll(BaseQuery query); - void batchProcess(List entities); - - RESP updateWithRetry(ID id, REQ request); + void batchProcess(List dtos); T findEntityById(ID id); - T createEntity(T entity); + Class getEntityClass(); - T updateEntity(T entity); + T findByIdWithLock(ID id); + + D updateWithRetry(ID id, D dto); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/service/impl/BaseServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/service/impl/BaseServiceImpl.java index 68163070..2d2087e9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/service/impl/BaseServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/service/impl/BaseServiceImpl.java @@ -2,17 +2,15 @@ package com.qqchen.deploy.backend.framework.service.impl; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import com.google.common.collect.Lists; import com.qqchen.deploy.backend.framework.annotation.LogicDelete; -import com.qqchen.deploy.backend.framework.converter.ConversionService; +import com.qqchen.deploy.backend.framework.converter.BaseConverter; import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.framework.dto.BaseRequest; -import com.qqchen.deploy.backend.framework.dto.BaseResponse; +import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.framework.enums.QueryType; import com.qqchen.deploy.backend.framework.query.BaseQuery; import com.qqchen.deploy.backend.framework.query.DateRange; @@ -47,19 +45,19 @@ import java.lang.reflect.Field; @Transactional(readOnly = true) @Slf4j -public abstract class BaseServiceImpl, ID extends Number & Serializable, - REQ extends BaseRequest, RESP extends BaseResponse> implements IBaseService { +public abstract class BaseServiceImpl, D extends BaseDTO, ID extends Serializable> + implements IBaseService { protected final IBaseRepository repository; - protected final ConversionService conversionService; + protected final BaseConverter converter; protected final EntityPath entityPath; @PersistenceContext protected EntityManager entityManager; - protected BaseServiceImpl(IBaseRepository repository, ConversionService conversionService) { + protected BaseServiceImpl(IBaseRepository repository, BaseConverter converter) { this.repository = repository; - this.conversionService = conversionService; + this.converter = converter; this.entityPath = getEntityPath(); } @@ -82,18 +80,52 @@ public abstract class BaseServiceImpl, ID extends Number & } @Override - public Page page(BaseQuery query) { - BooleanBuilder builder = createQueryPredicate(query); - Page page = repository.findAll(builder, createPageRequest(query)); - return page.map(entity -> conversionService.toResponse(entity)); + @Transactional + public D create(D dto) { + T entity = converter.toEntity(dto); + T savedEntity = repository.save(entity); + return converter.toDto(savedEntity); } @Override - public List findAll(BaseQuery query) { + @Transactional + public D update(ID id, D dto) { + T entity = findEntityById(id); + converter.updateEntity(entity, dto); + T updatedEntity = repository.save(entity); + return converter.toDto(updatedEntity); + } + + @Override + @Transactional + public void delete(ID id) { + repository.deleteById(id); + } + + @Override + public D findById(ID id) { + T entity = findEntityById(id); + return converter.toDto(entity); + } + + @Override + public List findAll() { + List entities = repository.findAll(); + return converter.toDtoList(entities); + } + + @Override + public List findAll(BaseQuery query) { BooleanBuilder builder = createQueryPredicate(query); Sort sort = createSort(query); List entities = repository.findAllByCondition(builder, sort); - return conversionService.toResponseList(entities); + return converter.toDtoList(entities); + } + + @Override + public Page page(BaseQuery query) { + Page page = repository.findAll(createQueryPredicate(query), createPageRequest(query)); + return converter.toDtoPage(page); } protected BooleanBuilder createQueryPredicate(BaseQuery query) { @@ -101,17 +133,24 @@ public abstract class BaseServiceImpl, ID extends Number & if (query != null) { buildQueryPredicate(query, builder); } - handleSoftDelete(builder); + handleSoftDelete(builder, query); return builder; } - protected void handleSoftDelete(BooleanBuilder builder) { - Class entityClass = getEntityClass(); - LogicDelete softDelete = entityClass.getAnnotation(LogicDelete.class); - if (softDelete != null && softDelete.value()) { + protected void handleSoftDelete(BooleanBuilder builder, BaseQuery query) { + if (query == null || query.getDeleted() == null) { + Class entityClass = getEntityClass(); + LogicDelete softDelete = entityClass.getAnnotation(LogicDelete.class); + if (softDelete != null && softDelete.value()) { + Path deletedPath = EntityPathResolver.getPath(entityPath, "deleted"); + if (deletedPath instanceof BooleanPath) { + builder.and(((BooleanPath) deletedPath).eq(false)); + } + } + } else { Path deletedPath = EntityPathResolver.getPath(entityPath, "deleted"); if (deletedPath instanceof BooleanPath) { - builder.and(((BooleanPath) deletedPath).eq(false)); + builder.and(((BooleanPath) deletedPath).eq(query.getDeleted())); } } } @@ -294,50 +333,16 @@ public abstract class BaseServiceImpl, ID extends Number & ); } - @Override - @Transactional(readOnly = false) - public RESP create(REQ request) { - T entity = conversionService.toEntity(request, getEntityClass()); - T savedEntity = createEntity(entity); - return conversionService.toResponse(savedEntity); - } - - @Override - @Transactional(readOnly = false) - public RESP update(ID id, REQ request) { - T entity = findEntityById(id); - conversionService.updateEntity(entity, request); - T updatedEntity = updateEntity(entity); - return conversionService.toResponse(updatedEntity); - } - - @Override - @Transactional(readOnly = false) - public void delete(ID id) { - repository.deleteById(id); - } - - @Override - public RESP findById(ID id) { - T entity = findEntityById(id); - return conversionService.toResponse(entity); - } - - @Override - public List findAll() { - List entities = repository.findAll(); - return conversionService.toResponseList(entities); - } - @Transactional( readOnly = false, propagation = Propagation.REQUIRES_NEW ) @Override - public void batchProcess(List entities) { + public void batchProcess(List dtos) { LocalDateTime now = LocalDateTime.now(); String operator = SecurityUtils.getCurrentUsername(); + List entities = converter.toEntityList(dtos); Lists.partition(entities, 500).forEach(batch -> { try { // 加锁查询最新数据 @@ -360,7 +365,6 @@ public abstract class BaseServiceImpl, ID extends Number & repository.flush(); entityManager.clear(); } catch (OptimisticLockException e) { - // 记录失败的批次 log.error("Batch update failed for batch size: {}", batch.size(), e); throw e; } @@ -373,10 +377,9 @@ public abstract class BaseServiceImpl, ID extends Number & maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2) ) - @Override - public RESP updateWithRetry(ID id, REQ request) { + public D updateWithRetry(ID id, D dto) { try { - return update(id, request); + return update(id, dto); } catch (OptimisticLockException e) { // 重试前先刷新实体 entityManager.refresh(findEntityById(id)); @@ -392,7 +395,7 @@ public abstract class BaseServiceImpl, ID extends Number & } @SuppressWarnings("unchecked") - protected Class getEntityClass() { + public Class getEntityClass() { Class[] genericTypes = GenericTypeResolver.resolveTypeArguments(getClass(), BaseServiceImpl.class); if (genericTypes != null && genericTypes.length > 0) { return (Class) genericTypes[0]; @@ -406,18 +409,4 @@ public abstract class BaseServiceImpl, ID extends Number & return repository.findById(id) .orElseThrow(() -> new EntityNotFoundException(getEntityClass().getSimpleName(), id)); } - - @Override - @Transactional(readOnly = false) - public T createEntity(T entity) { - return repository.save(entity); - } - - @Override - @Transactional(readOnly = false) - public T updateEntity(T entity) { - T currentEntity = findEntityById(entity.getId()); - currentEntity.checkVersion(entity.getVersion()); - return repository.save(entity); - } } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/repository/ITenantRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/repository/ITenantRepository.java index 175471a5..c2f01d2e 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/repository/ITenantRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/repository/ITenantRepository.java @@ -1,17 +1,10 @@ package com.qqchen.deploy.backend.repository; -import com.qqchen.deploy.backend.framework.repository.IBaseRepository; import com.qqchen.deploy.backend.entity.Tenant; +import com.qqchen.deploy.backend.framework.repository.IBaseRepository; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface ITenantRepository extends IBaseRepository { - - List findByDeletedFalseOrderById(); - - boolean existsByCodeAndDeletedFalse(String code); - - boolean existsByNameAndDeletedFalse(String name); + // 添加特定的查询方法 } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/repository/IUserRoleRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/repository/IUserRoleRepository.java index 4a0f834a..6c38b656 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/repository/IUserRoleRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/repository/IUserRoleRepository.java @@ -1,27 +1,27 @@ -package com.qqchen.deploy.backend.repository; - - -import com.qqchen.deploy.backend.framework.repository.IBaseRepository; -import com.qqchen.deploy.backend.entity.UserRole; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.Set; - -@Repository -public interface IUserRoleRepository extends IBaseRepository { - - @Query("SELECT ur FROM UserRole ur WHERE ur.userId = :userId") - Set findByUserId(@Param("userId") Long userId); - - @Modifying - @Query("DELETE FROM UserRole ur WHERE ur.userId = :userId AND ur.roleId = :roleId") - void deleteByUserIdAndRoleId(@Param("userId") Long userId, @Param("roleId") Long roleId); - - - @Query("SELECT COUNT(ur) > 0 FROM UserRole ur WHERE ur.userId = :userId AND ur.roleId = :roleId") - boolean existsByUserIdAndRoleId(@Param("userId") Long userId, @Param("roleId") Long roleId); - -} \ No newline at end of file +//package com.qqchen.deploy.backend.repository; +// +// +//import com.qqchen.deploy.backend.framework.repository.IBaseRepository; +//import com.qqchen.deploy.backend.entity.UserRole; +//import org.springframework.data.jpa.repository.Modifying; +//import org.springframework.data.jpa.repository.Query; +//import org.springframework.data.repository.query.Param; +//import org.springframework.stereotype.Repository; +// +//import java.util.Set; +// +//@Repository +//public interface IUserRoleRepository extends IBaseRepository { +// +// @Query("SELECT ur FROM UserRole ur WHERE ur.userId = :userId") +// Set findByUserId(@Param("userId") Long userId); +// +// @Modifying +// @Query("DELETE FROM UserRole ur WHERE ur.userId = :userId AND ur.roleId = :roleId") +// void deleteByUserIdAndRoleId(@Param("userId") Long userId, @Param("roleId") Long roleId); +// +// +// @Query("SELECT COUNT(ur) > 0 FROM UserRole ur WHERE ur.userId = :userId AND ur.roleId = :roleId") +// boolean existsByUserIdAndRoleId(@Param("userId") Long userId, @Param("roleId") Long roleId); +// +//} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/ITenantService.java b/backend/src/main/java/com/qqchen/deploy/backend/service/ITenantService.java index 75797c94..a8713c97 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/ITenantService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/ITenantService.java @@ -2,9 +2,8 @@ package com.qqchen.deploy.backend.service; import com.qqchen.deploy.backend.entity.Tenant; import com.qqchen.deploy.backend.framework.service.IBaseService; -import com.qqchen.deploy.backend.dto.request.TenantRequest; -import com.qqchen.deploy.backend.dto.response.TenantResponse; +import com.qqchen.deploy.backend.dto.TenantDTO; -public interface ITenantService extends IBaseService { +public interface ITenantService extends IBaseService { // 添加租户特有的业务方法 } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/IUserService.java b/backend/src/main/java/com/qqchen/deploy/backend/service/IUserService.java index 54c37f09..a37fe5e7 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/IUserService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/IUserService.java @@ -1,15 +1,20 @@ package com.qqchen.deploy.backend.service; +import com.qqchen.deploy.backend.dto.UserDTO; import com.qqchen.deploy.backend.framework.service.IBaseService; import com.qqchen.deploy.backend.dto.request.LoginRequest; import com.qqchen.deploy.backend.dto.response.LoginResponse; import com.qqchen.deploy.backend.entity.User; import com.qqchen.deploy.backend.dto.request.UserRequest; -import com.qqchen.deploy.backend.dto.response.UserResponse; +import com.qqchen.deploy.backend.dto.RoleDTO; -public interface IUserService extends IBaseService { +import java.util.List; + +public interface IUserService extends IBaseService { LoginResponse login(LoginRequest request); - UserResponse register(UserRequest request); + UserDTO register(UserRequest request); boolean checkUsernameExists(String username); boolean checkEmailExists(String email); + List getUserRoles(Long userId); + List getCurrentUserRoles(); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/TenantServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/TenantServiceImpl.java index 0f5f1289..35ba8177 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/TenantServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/TenantServiceImpl.java @@ -1,19 +1,25 @@ -//package com.qqchen.deploy.backend.service.impl; -// -//import com.qqchen.deploy.backend.entity.Tenant; -//import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; -//import com.qqchen.deploy.backend.repository.TenantRepository; -//import com.qqchen.deploy.backend.service.ITenantService; -//import com.qqchen.deploy.backend.dto.request.TenantRequest; -//import com.qqchen.deploy.backend.dto.response.TenantResponse; -//import org.springframework.core.convert.ConversionService; -//import org.springframework.stereotype.Service; -// -//@Service -//public class TenantServiceImpl extends BaseServiceImpl -// implements ITenantService { -// -// public TenantServiceImpl(TenantRepository repository, ConversionService conversionService) { -// super(repository, conversionService); -// } -//} \ No newline at end of file +package com.qqchen.deploy.backend.service.impl; + +import com.qqchen.deploy.backend.entity.Tenant; +import com.qqchen.deploy.backend.framework.query.BaseQuery; +import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import com.qqchen.deploy.backend.repository.ITenantRepository; +import com.qqchen.deploy.backend.service.ITenantService; +import com.qqchen.deploy.backend.dto.TenantDTO; +import com.qqchen.deploy.backend.converter.TenantConverter; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class TenantServiceImpl extends BaseServiceImpl implements ITenantService { + + public TenantServiceImpl(ITenantRepository repository, TenantConverter converter) { + super(repository, converter); + } + + @Override + public List findAll(BaseQuery query) { + return null; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/UserServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/UserServiceImpl.java index b7545fc7..6918c2ab 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/UserServiceImpl.java @@ -2,18 +2,23 @@ package com.qqchen.deploy.backend.service.impl; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.framework.exception.BusinessException; +import com.qqchen.deploy.backend.framework.query.BaseQuery; +import com.qqchen.deploy.backend.framework.security.SecurityUtils; import com.qqchen.deploy.backend.framework.security.util.JwtTokenUtil; import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; -import com.qqchen.deploy.backend.framework.converter.ConversionService; import com.qqchen.deploy.backend.dto.request.LoginRequest; import com.qqchen.deploy.backend.dto.request.UserRequest; import com.qqchen.deploy.backend.dto.response.LoginResponse; -import com.qqchen.deploy.backend.dto.response.UserResponse; import com.qqchen.deploy.backend.entity.User; import com.qqchen.deploy.backend.repository.IUserRepository; import com.qqchen.deploy.backend.service.IUserService; +import com.qqchen.deploy.backend.converter.RoleConverter; +import com.qqchen.deploy.backend.converter.UserConverter; +import com.qqchen.deploy.backend.dto.UserDTO; +import com.qqchen.deploy.backend.dto.RoleDTO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.hibernate.Hibernate; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -21,12 +26,15 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; + @Service @Slf4j -public class UserServiceImpl extends BaseServiceImpl - implements IUserService { +public class UserServiceImpl extends BaseServiceImpl implements IUserService { - private final IUserRepository userRepository; + private final UserConverter converter; + private final RoleConverter roleConverter; @Resource private AuthenticationManager authenticationManager; @@ -34,14 +42,15 @@ public class UserServiceImpl extends BaseServiceImpl new BusinessException(ResponseCode.USER_NOT_FOUND)); - - LoginResponse response = new LoginResponse(); - response.setId(user.getId()); - response.setUsername(user.getUsername()); - response.setNickname(user.getNickname()); - response.setEmail(user.getEmail()); - response.setPhone(user.getPhone()); - response.setToken(token); - - log.info("用户 {} ({}) 登录成功", user.getUsername(), user.getNickname()); - return response; +// Authentication authentication = authenticationManager.authenticate( +// new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword()) +// ); +// +// UserDetails userDetails = (UserDetails) authentication.getPrincipal(); +// String token = jwtTokenUtil.generateToken(userDetails); +// +// User user = repository.findByUsernameAndDeletedFalse(userDetails.getUsername()) +// .orElseThrow(() -> new BusinessException(ResponseCode.USER_NOT_FOUND)); +// +// LoginResponse response = new LoginResponse(); +// response.setId(user.getId()); +// response.setUsername(user.getUsername()); +// response.setNickname(user.getNickname()); +// response.setEmail(user.getEmail()); +// response.setPhone(user.getPhone()); +// response.setToken(token); +// +// log.info("用户 {} ({}) 登录成功", user.getUsername(), user.getNickname()); +// return response; + return null; + } + + @Override + @Transactional(readOnly = true) + public List getUserRoles(Long userId) { + User user = findEntityById(userId); + Hibernate.initialize(user.getRoles()); + return roleConverter.toDtoList(new ArrayList<>(user.getRoles())); + } + + @Override + @Transactional(readOnly = true) + public List getCurrentUserRoles() { +// String username = SecurityUtils.getCurrentUsername(); +// User user = repository.findByUsernameAndDeletedFalse(username) +// .orElseThrow(() -> new BusinessException(ResponseCode.USER_NOT_FOUND)); +// Hibernate.initialize(user.getRoles()); +// return roleConverter.toDtoList(new ArrayList<>(user.getRoles())); + return null; + } + + @Override + public List findAll(BaseQuery query) { + return null; } } \ No newline at end of file