From b01f91541582a6bf39f68bd12a66c39a9ab4300f Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Mon, 14 Jul 2025 13:54:45 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E4=B8=BA=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=88=86=E9=85=8D=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step2/controller/RoleController.java | 7 ++ .../step2/controller/UserController.java | 2 +- .../step2/controller/UserRoleController.java | 17 +++- .../domain/dto/user/AssignUserRoleDto.java | 28 ++++++ .../step2/domain/dto/{ => user}/UserDto.java | 2 +- .../domain/dto/{ => user}/UserRoleDto.java | 19 +--- .../step2/domain/entity/PermissionEntity.java | 1 + .../step2/domain/entity/RoleEntity.java | 1 + .../domain/entity/RolePermissionEntity.java | 1 + .../step2/domain/entity/UserEntity.java | 1 + .../step2/domain/entity/UserRoleEntity.java | 1 + .../domain/entity/{ => base}/BaseEntity.java | 2 +- .../spring/step2/domain/vo/PermissionVo.java | 27 ++---- .../step2/domain/vo/RolePermissionVo.java | 27 ++---- .../com/spring/step2/domain/vo/RoleVo.java | 22 +---- .../spring/step2/domain/vo/UserRoleVo.java | 31 +++--- .../com/spring/step2/domain/vo/UserVo.java | 19 +--- .../spring/step2/domain/vo/base/BaseVo.java | 23 +++++ .../domain/vo/result/ResultCodeEnum.java | 2 +- .../com/spring/step2/mapper/UserMapper.java | 2 +- .../spring/step2/mapper/UserRoleMapper.java | 20 +++- .../com/spring/step2/service/RoleService.java | 8 ++ .../spring/step2/service/UserRoleService.java | 19 +++- .../com/spring/step2/service/UserService.java | 2 +- .../step2/service/impl/RoleServiceImpl.java | 16 ++++ .../service/impl/UserRoleServiceImpl.java | 43 ++++++++- .../step2/service/impl/UserServiceImpl.java | 2 +- .../main/resources/mapper/UserRoleMapper.xml | 19 ++++ .../static/src/views/user/AssignRoles.js | 94 +++++++++++++++++++ .../src/main/resources/templates/index.html | 5 +- .../main/resources/templates/userPage.html | 17 ++++ 31 files changed, 361 insertions(+), 119 deletions(-) create mode 100644 spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/AssignUserRoleDto.java rename spring-security/step-2/src/main/java/com/spring/step2/domain/dto/{ => user}/UserDto.java (94%) rename spring-security/step-2/src/main/java/com/spring/step2/domain/dto/{ => user}/UserRoleDto.java (51%) rename spring-security/step-2/src/main/java/com/spring/step2/domain/entity/{ => base}/BaseEntity.java (97%) create mode 100644 spring-security/step-2/src/main/java/com/spring/step2/domain/vo/base/BaseVo.java create mode 100644 spring-security/step-2/src/main/resources/static/src/views/user/AssignRoles.js diff --git a/spring-security/step-2/src/main/java/com/spring/step2/controller/RoleController.java b/spring-security/step-2/src/main/java/com/spring/step2/controller/RoleController.java index b06230e..c6b1b18 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/controller/RoleController.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/controller/RoleController.java @@ -46,6 +46,13 @@ public class RoleController { return Result.success(pageResult); } + @Operation(summary = "获取全部角色列表", description = "获取全部角色列表") + @GetMapping("all") + public Result> getRoleList() { + List roleVoList = roleService.getRoleList(); + return Result.success(roleVoList); + } + @Operation(summary = "添加系统角色表", description = "添加系统角色表") @PostMapping() public Result addRole(@Valid @RequestBody RoleDto dto) { diff --git a/spring-security/step-2/src/main/java/com/spring/step2/controller/UserController.java b/spring-security/step-2/src/main/java/com/spring/step2/controller/UserController.java index 5109987..fafa911 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/controller/UserController.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/controller/UserController.java @@ -2,7 +2,7 @@ package com.spring.step2.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.spring.step2.domain.dto.UserDto; +import com.spring.step2.domain.dto.user.UserDto; import com.spring.step2.domain.entity.UserEntity; import com.spring.step2.domain.vo.UserVo; import com.spring.step2.domain.vo.result.PageResult; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/controller/UserRoleController.java b/spring-security/step-2/src/main/java/com/spring/step2/controller/UserRoleController.java index f7381c5..700d04e 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/controller/UserRoleController.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/controller/UserRoleController.java @@ -2,7 +2,8 @@ package com.spring.step2.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.spring.step2.domain.dto.UserRoleDto; +import com.spring.step2.domain.dto.user.AssignUserRoleDto; +import com.spring.step2.domain.dto.user.UserRoleDto; import com.spring.step2.domain.entity.UserRoleEntity; import com.spring.step2.domain.vo.UserRoleVo; import com.spring.step2.domain.vo.result.PageResult; @@ -47,6 +48,13 @@ public class UserRoleController { return Result.success(pageResult); } + @Operation(summary = "根据用户id获取当前用户角色列表", description = "根据用户id获取当前用户角色列表") + @GetMapping("roles") + public Result> getRoleListByUserId(Long userId) { + List voList = userRoleService.getRoleListByUserId(userId); + return Result.success(voList); + } + @Operation(summary = "添加用户角色关联表", description = "添加用户角色关联表") @PostMapping() public Result addUserRole(@Valid @RequestBody UserRoleDto dto) { @@ -54,6 +62,13 @@ public class UserRoleController { return Result.success(ResultCodeEnum.ADD_SUCCESS); } + @Operation(summary = "为用户分配角色id", description = "根据用户id分配用户角色") + @PostMapping("assign-role") + public Result assignUserRole(@Valid @RequestBody AssignUserRoleDto dto) { + userRoleService.assignUserRole(dto); + return Result.success(ResultCodeEnum.SUCCESS); + } + @Operation(summary = "更新用户角色关联表", description = "更新用户角色关联表") @PutMapping() public Result updateUserRole(@Valid @RequestBody UserRoleDto dto) { diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/AssignUserRoleDto.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/AssignUserRoleDto.java new file mode 100644 index 0000000..4cbe09d --- /dev/null +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/AssignUserRoleDto.java @@ -0,0 +1,28 @@ +package com.spring.step2.domain.dto.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "AssignUserRoleDTO对象", title = "用户分配角色DTO", description = "根据用户id分配用户角色") +public class AssignUserRoleDto { + + @Schema(name = "userId", title = "用户ID") + @NotNull(message = "用户id为空") + private Long userId; + + @Schema(name = "roleId", title = "角色ID") + @NotEmpty(message = "角色ID为空") + private List roleIds; + +} diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/UserDto.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/UserDto.java similarity index 94% rename from spring-security/step-2/src/main/java/com/spring/step2/domain/dto/UserDto.java rename to spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/UserDto.java index 9531939..9842265 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/UserDto.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/UserDto.java @@ -1,4 +1,4 @@ -package com.spring.step2.domain.dto; +package com.spring.step2.domain.dto.user; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/UserRoleDto.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/UserRoleDto.java similarity index 51% rename from spring-security/step-2/src/main/java/com/spring/step2/domain/dto/UserRoleDto.java rename to spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/UserRoleDto.java index d72f2de..0c4ed8a 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/UserRoleDto.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/dto/user/UserRoleDto.java @@ -1,4 +1,4 @@ -package com.spring.step2.domain.dto; +package com.spring.step2.domain.dto.user; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -6,8 +6,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - @Data @AllArgsConstructor @NoArgsConstructor @@ -24,19 +22,4 @@ public class UserRoleDto { @Schema(name = "userId", title = "用户ID") private Long userId; - @Schema(name = "createTime", title = "创建时间") - private LocalDateTime createTime; - - @Schema(name = "updateTime", title = "更新时间") - private LocalDateTime updateTime; - - @Schema(name = "createUser", title = "创建用户ID") - private Long createUser; - - @Schema(name = "updateUser", title = "更新用户ID") - private Long updateUser; - - @Schema(name = "isDeleted", title = "是否删除:0-未删除,1-已删除") - private Boolean isDeleted; - } \ No newline at end of file diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/PermissionEntity.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/PermissionEntity.java index 0f923c3..2f2a2c8 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/PermissionEntity.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/PermissionEntity.java @@ -2,6 +2,7 @@ package com.spring.step2.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.spring.step2.domain.entity.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RoleEntity.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RoleEntity.java index b03408e..c9f061b 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RoleEntity.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RoleEntity.java @@ -2,6 +2,7 @@ package com.spring.step2.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.spring.step2.domain.entity.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RolePermissionEntity.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RolePermissionEntity.java index 43aec32..254bf4c 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RolePermissionEntity.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/RolePermissionEntity.java @@ -2,6 +2,7 @@ package com.spring.step2.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.spring.step2.domain.entity.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserEntity.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserEntity.java index c3f2183..027f5af 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserEntity.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserEntity.java @@ -2,6 +2,7 @@ package com.spring.step2.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.spring.step2.domain.entity.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserRoleEntity.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserRoleEntity.java index 386fd1f..ee63f7a 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserRoleEntity.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/UserRoleEntity.java @@ -2,6 +2,7 @@ package com.spring.step2.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.spring.step2.domain.entity.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/BaseEntity.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/base/BaseEntity.java similarity index 97% rename from spring-security/step-2/src/main/java/com/spring/step2/domain/entity/BaseEntity.java rename to spring-security/step-2/src/main/java/com/spring/step2/domain/entity/base/BaseEntity.java index 9087675..8f14696 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/BaseEntity.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/entity/base/BaseEntity.java @@ -1,4 +1,4 @@ -package com.spring.step2.domain.entity; +package com.spring.step2.domain.entity.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/PermissionVo.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/PermissionVo.java index 77311b5..d0f025e 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/PermissionVo.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/PermissionVo.java @@ -1,19 +1,25 @@ package com.spring.step2.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.spring.step2.domain.vo.base.BaseVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor @Schema(name = "PermissionVO对象", title = "系统权限表", description = "系统权限表的VO对象") -public class PermissionVo { +public class PermissionVo extends BaseVo { @Schema(name = "id", title = "主键ID") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JsonSerialize(using = ToStringSerializer.class) private Long id; @Schema(name = "permissionCode", title = "权限编码") @@ -25,20 +31,5 @@ public class PermissionVo { @Schema(name = "remark", title = "备注信息") private String remark; - @Schema(name = "createTime", title = "创建时间") - private LocalDateTime createTime; - - @Schema(name = "updateTime", title = "更新时间") - private LocalDateTime updateTime; - - @Schema(name = "createUser", title = "创建用户ID") - private Long createUser; - - @Schema(name = "updateUser", title = "更新用户ID") - private Long updateUser; - - @Schema(name = "isDeleted", title = "是否删除:0-未删除,1-已删除") - private Boolean isDeleted; - } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RolePermissionVo.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RolePermissionVo.java index 610e42c..c3e3648 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RolePermissionVo.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RolePermissionVo.java @@ -1,19 +1,25 @@ package com.spring.step2.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.spring.step2.domain.vo.base.BaseVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor @Schema(name = "RolePermissionVO对象", title = "角色权限关联表", description = "角色权限关联表的VO对象") -public class RolePermissionVo { +public class RolePermissionVo extends BaseVo { @Schema(name = "id", title = "主键ID") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JsonSerialize(using = ToStringSerializer.class) private Long id; @Schema(name = "roleId", title = "角色ID") @@ -22,20 +28,5 @@ public class RolePermissionVo { @Schema(name = "permissionId", title = "权限ID") private Long permissionId; - @Schema(name = "createTime", title = "创建时间") - private LocalDateTime createTime; - - @Schema(name = "updateTime", title = "更新时间") - private LocalDateTime updateTime; - - @Schema(name = "createUser", title = "创建用户ID") - private Long createUser; - - @Schema(name = "updateUser", title = "更新用户ID") - private Long updateUser; - - @Schema(name = "isDeleted", title = "是否删除:0-未删除,1-已删除") - private Boolean isDeleted; - } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RoleVo.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RoleVo.java index 4f2fc89..d231a71 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RoleVo.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/RoleVo.java @@ -3,18 +3,19 @@ package com.spring.step2.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.spring.step2.domain.vo.base.BaseVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor @Schema(name = "RoleVO对象", title = "系统角色表", description = "系统角色表的VO对象") -public class RoleVo { +public class RoleVo extends BaseVo { @Schema(name = "id", title = "主键ID") @JsonFormat(shape = JsonFormat.Shape.STRING) @@ -30,20 +31,5 @@ public class RoleVo { @Schema(name = "remark", title = "备注信息") private String remark; - @Schema(name = "createTime", title = "创建时间") - private LocalDateTime createTime; - - @Schema(name = "updateTime", title = "更新时间") - private LocalDateTime updateTime; - - @Schema(name = "createUser", title = "创建用户ID") - private Long createUser; - - @Schema(name = "updateUser", title = "更新用户ID") - private Long updateUser; - - @Schema(name = "isDeleted", title = "是否删除:0-未删除,1-已删除") - private Boolean isDeleted; - } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserRoleVo.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserRoleVo.java index d76136c..d6892f6 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserRoleVo.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserRoleVo.java @@ -1,41 +1,36 @@ package com.spring.step2.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.spring.step2.domain.vo.base.BaseVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor @Schema(name = "UserRoleVO对象", title = "用户角色关联表", description = "用户角色关联表的VO对象") -public class UserRoleVo { +public class UserRoleVo extends BaseVo { @Schema(name = "id", title = "主键") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JsonSerialize(using = ToStringSerializer.class) private Long id; @Schema(name = "roleId", title = "角色ID") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JsonSerialize(using = ToStringSerializer.class) private Long roleId; @Schema(name = "userId", title = "用户ID") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JsonSerialize(using = ToStringSerializer.class) private Long userId; - @Schema(name = "createTime", title = "创建时间") - private LocalDateTime createTime; - - @Schema(name = "updateTime", title = "更新时间") - private LocalDateTime updateTime; - - @Schema(name = "createUser", title = "创建用户ID") - private Long createUser; - - @Schema(name = "updateUser", title = "更新用户ID") - private Long updateUser; - - @Schema(name = "isDeleted", title = "是否删除:0-未删除,1-已删除") - private Boolean isDeleted; - } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserVo.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserVo.java index 5516655..176006d 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserVo.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/UserVo.java @@ -3,18 +3,19 @@ package com.spring.step2.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.spring.step2.domain.vo.base.BaseVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor @Schema(name = "UserVO对象", title = "用户基本信息表", description = "用户基本信息表的VO对象") -public class UserVo { +public class UserVo extends BaseVo { @Schema(name = "id", title = "主键") @JsonFormat(shape = JsonFormat.Shape.STRING) @@ -27,17 +28,5 @@ public class UserVo { @Schema(name = "email", title = "邮箱") private String email; - @Schema(name = "createTime", title = "创建时间") - private LocalDateTime createTime; - - @Schema(name = "updateTime", title = "更新时间") - private LocalDateTime updateTime; - - @Schema(name = "createUser", title = "创建用户ID") - private Long createUser; - - @Schema(name = "updateUser", title = "更新用户ID") - private Long updateUser; - } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/base/BaseVo.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/base/BaseVo.java new file mode 100644 index 0000000..435ac76 --- /dev/null +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/base/BaseVo.java @@ -0,0 +1,23 @@ +package com.spring.step2.domain.vo.base; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class BaseVo { + + @Schema(name = "createTime", title = "创建时间") + private LocalDateTime createTime; + + @Schema(name = "updateTime", title = "更新时间") + private LocalDateTime updateTime; + + @Schema(name = "createUser", title = "创建用户ID") + private Long createUser; + + @Schema(name = "updateUser", title = "更新用户ID") + private Long updateUser; + +} diff --git a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/result/ResultCodeEnum.java b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/result/ResultCodeEnum.java index cd9e4a6..0c64a6c 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/result/ResultCodeEnum.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/domain/vo/result/ResultCodeEnum.java @@ -13,7 +13,7 @@ public enum ResultCodeEnum { ADD_SUCCESS(200, "添加成功"), UPDATE_SUCCESS(200, "修改成功"), DELETE_SUCCESS(200, "删除成功"), - SORT_SUCCESS(200, "排序成功"), + ASSIGN_SUCCESS(200, "排序成功"), SUCCESS_UPLOAD(200, "上传成功"), SUCCESS_LOGOUT(200, "退出成功"), EMAIL_CODE_REFRESH(200, "邮箱验证码已刷新"), diff --git a/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserMapper.java b/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserMapper.java index fd66cf4..ddd8099 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserMapper.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserMapper.java @@ -3,7 +3,7 @@ package com.spring.step2.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.spring.step2.domain.dto.UserDto; +import com.spring.step2.domain.dto.user.UserDto; import com.spring.step2.domain.entity.PermissionEntity; import com.spring.step2.domain.entity.UserEntity; import com.spring.step2.domain.vo.UserVo; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserRoleMapper.java b/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserRoleMapper.java index b5c004d..a4454a7 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserRoleMapper.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/mapper/UserRoleMapper.java @@ -3,12 +3,15 @@ package com.spring.step2.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.spring.step2.domain.dto.UserRoleDto; +import com.spring.step2.domain.dto.user.AssignUserRoleDto; +import com.spring.step2.domain.dto.user.UserRoleDto; import com.spring.step2.domain.entity.UserRoleEntity; import com.spring.step2.domain.vo.UserRoleVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 用户角色关联表 Mapper 接口 @@ -29,4 +32,19 @@ public interface UserRoleMapper extends BaseMapper { */ IPage selectListByPage(@Param("page") Page pageParams, @Param("dto") UserRoleDto dto); + /** + * 根据用户id获取当前用户角色列表 + * + * @param userId 用户id + * @return 用户和角色列表 + */ + List getRoleListByUserId(Long userId); + + /** + * 根据用户id删除用户相关分配角色 + * + * @param dto 用户分配角色DTO {@link AssignUserRoleDto} + */ + void deleteByUserId(AssignUserRoleDto dto); + } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/service/RoleService.java b/spring-security/step-2/src/main/java/com/spring/step2/service/RoleService.java index de11f89..dc37d18 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/service/RoleService.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/service/RoleService.java @@ -47,4 +47,12 @@ public interface RoleService extends IService { * @param ids 删除id列表 */ void deleteRole(List ids); + + /** + * 获取全部角色列表 + * + * @return 角色列表 + */ + List getRoleList(); + } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/service/UserRoleService.java b/spring-security/step-2/src/main/java/com/spring/step2/service/UserRoleService.java index 4ec70f3..33b5af8 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/service/UserRoleService.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/service/UserRoleService.java @@ -2,10 +2,12 @@ package com.spring.step2.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.spring.step2.domain.dto.UserRoleDto; +import com.spring.step2.domain.dto.user.AssignUserRoleDto; +import com.spring.step2.domain.dto.user.UserRoleDto; import com.spring.step2.domain.entity.UserRoleEntity; import com.spring.step2.domain.vo.UserRoleVo; import com.spring.step2.domain.vo.result.PageResult; +import jakarta.validation.Valid; import java.util.List; @@ -46,4 +48,19 @@ public interface UserRoleService extends IService { * @param ids 删除id列表 */ void deleteUserRole(List ids); + + /** + * 根据用户id获取当前用户角色列表 + * + * @param userId 用户id + * @return 用户和角色列表 + */ + List getRoleListByUserId(Long userId); + + /** + * 根据用户id分配用户角色 + * + * @param dto 用户分配角色DTO {@link AssignUserRoleDto} + */ + void assignUserRole(@Valid AssignUserRoleDto dto); } diff --git a/spring-security/step-2/src/main/java/com/spring/step2/service/UserService.java b/spring-security/step-2/src/main/java/com/spring/step2/service/UserService.java index 12cda6c..ea5dfc1 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/service/UserService.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/service/UserService.java @@ -2,7 +2,7 @@ package com.spring.step2.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.spring.step2.domain.dto.UserDto; +import com.spring.step2.domain.dto.user.UserDto; import com.spring.step2.domain.entity.UserEntity; import com.spring.step2.domain.vo.UserVo; import com.spring.step2.domain.vo.result.PageResult; diff --git a/spring-security/step-2/src/main/java/com/spring/step2/service/impl/RoleServiceImpl.java b/spring-security/step-2/src/main/java/com/spring/step2/service/impl/RoleServiceImpl.java index 9040e6e..50d5da3 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/service/impl/RoleServiceImpl.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/service/impl/RoleServiceImpl.java @@ -84,4 +84,20 @@ public class RoleServiceImpl extends ServiceImpl impleme public void deleteRole(List ids) { removeByIds(ids); } + + /** + * 获取全部角色列表 + * + * @return 角色列表 + */ + @Override + public List getRoleList() { + return list().stream() + .map(roleEntity -> { + RoleVo roleVo = new RoleVo(); + BeanUtils.copyProperties(roleEntity, roleVo); + return roleVo; + }) + .toList(); + } } \ No newline at end of file diff --git a/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserRoleServiceImpl.java b/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserRoleServiceImpl.java index 58ad1cb..b488912 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserRoleServiceImpl.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserRoleServiceImpl.java @@ -4,7 +4,8 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.spring.step2.domain.dto.UserRoleDto; +import com.spring.step2.domain.dto.user.AssignUserRoleDto; +import com.spring.step2.domain.dto.user.UserRoleDto; import com.spring.step2.domain.entity.UserRoleEntity; import com.spring.step2.domain.vo.UserRoleVo; import com.spring.step2.domain.vo.result.PageResult; @@ -84,4 +85,44 @@ public class UserRoleServiceImpl extends ServiceImpl ids) { removeByIds(ids); } + + /** + * 根据用户id获取当前用户角色列表 + * + * @param userId 用户id + * @return 用户和角色列表 + */ + @Override + public List getRoleListByUserId(Long userId) { + List userRoleEntityList = baseMapper.getRoleListByUserId(userId); + return userRoleEntityList.stream().map(userRoleEntity -> { + UserRoleVo userRoleVo = new UserRoleVo(); + BeanUtils.copyProperties(userRoleEntity, userRoleVo); + return userRoleVo; + }) + .toList(); + } + + /** + * 根据用户id分配用户角色 + * + * @param dto 用户分配角色DTO {@link AssignUserRoleDto} + */ + @Override + public void assignUserRole(AssignUserRoleDto dto) { + Long userId = dto.getUserId(); + List roleIds = dto.getRoleIds(); + + // 先删除已经分配的角色 + baseMapper.deleteByUserId(dto); + + // 为用户分配角色 + List entityList = roleIds.stream().map(roleId -> { + UserRoleEntity userRoleEntity = new UserRoleEntity(); + userRoleEntity.setUserId(userId); + userRoleEntity.setRoleId(roleId); + return userRoleEntity; + }).toList(); + saveBatch(entityList); + } } \ No newline at end of file diff --git a/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserServiceImpl.java b/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserServiceImpl.java index 35dae8d..a548715 100644 --- a/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserServiceImpl.java +++ b/spring-security/step-2/src/main/java/com/spring/step2/service/impl/UserServiceImpl.java @@ -4,7 +4,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.spring.step2.domain.dto.UserDto; +import com.spring.step2.domain.dto.user.UserDto; import com.spring.step2.domain.entity.UserEntity; import com.spring.step2.domain.vo.UserVo; import com.spring.step2.domain.vo.result.PageResult; diff --git a/spring-security/step-2/src/main/resources/mapper/UserRoleMapper.xml b/spring-security/step-2/src/main/resources/mapper/UserRoleMapper.xml index 5609e22..b04dccc 100644 --- a/spring-security/step-2/src/main/resources/mapper/UserRoleMapper.xml +++ b/spring-security/step-2/src/main/resources/mapper/UserRoleMapper.xml @@ -19,6 +19,13 @@ id,role_id,user_id,create_time,update_time,create_user,update_user,is_deleted + + + delete + from t_user_role + where user_id = #{userId} + + + + + diff --git a/spring-security/step-2/src/main/resources/static/src/views/user/AssignRoles.js b/spring-security/step-2/src/main/resources/static/src/views/user/AssignRoles.js new file mode 100644 index 0000000..e1da9c4 --- /dev/null +++ b/spring-security/step-2/src/main/resources/static/src/views/user/AssignRoles.js @@ -0,0 +1,94 @@ +const AssignRoles = defineComponent({ + name: "AssignRoles", + template: ` +

+
+
+ 为用户分配角色 + + + 保存 + +
+ +
+
+
+ + +
+
+
+ `, + props: { + userinfo: {type: Object, required: true}, + }, + data() { + return { + // 所有的角色列表 + roleList: ref([]), + // 用户角色列表 + userRoleIds: ref([]), + modalInstance: ref(null) + }; + }, + methods: { + /* 获取角色列表 */ + async getRoleList() { + const {data} = await axiosInstance.get("/role/all"); + this.roleList = data; + }, + + /* 保存分配用户角色 */ + async onSave() { + // 过滤出已经被选择的角色 + const checkedRoleList = this.roleList + .filter(role => role.checked) + .map(role => role.id); + + // 分配的数据内容 + const data = { + userId: this.userinfo.id, + roleIds: checkedRoleList, + } + + // 为用户分配角色 + const {code, message} = await axiosInstance.post("/user-role/assign-role", data) + if (code === 200) { + this.modalInstance.hide(); + this.userRoleIds = []; + antd.message.success(message); + } + }, + }, + watch: { + /* 监视用户信息 */ + async userinfo(value) { + const {id} = value; + // 如果没有id直接返回 + if (!id) return; + console.log(id) + // 获取角色列表 + await this.getRoleList(); + + // 获取用户拥有的角色 + const {data} = await axiosInstance.get("/user-role/roles", {params: {userId: id}}); + // 提取用户拥有的角色ID数组 + const userRoleIds = data.map(role => role.roleId + ""); + + // 遍历所有角色,检查用户是否拥有该角色 + this.roleList.forEach(role => { + const hasRole = userRoleIds.includes(role.id); + if (hasRole) role.checked = true; + }) + } + }, + mounted() { + // 初始化模态框实例 + const modalEl = this.$refs.assignRoleOffCanvasRef; + this.modalInstance = new bootstrap.Offcanvas(modalEl); + } +}); \ No newline at end of file diff --git a/spring-security/step-2/src/main/resources/templates/index.html b/spring-security/step-2/src/main/resources/templates/index.html index ded9c55..5aed25b 100644 --- a/spring-security/step-2/src/main/resources/templates/index.html +++ b/spring-security/step-2/src/main/resources/templates/index.html @@ -378,10 +378,9 @@ Spring Security 6 diff --git a/spring-security/step-2/src/main/resources/templates/userPage.html b/spring-security/step-2/src/main/resources/templates/userPage.html index 1cad195..0fbd861 100644 --- a/spring-security/step-2/src/main/resources/templates/userPage.html +++ b/spring-security/step-2/src/main/resources/templates/userPage.html @@ -35,7 +35,12 @@
+ + + + +
@@ -103,6 +108,10 @@ data-bs-target="#userBackdrop" data-bs-toggle="modal"> 修改 + @@ -130,6 +139,8 @@ + + \ No newline at end of file