From 110f802a1f45953c6cb0a9af295b201696d00c2e Mon Sep 17 00:00:00 2001 From: BenjaminNH <1249376374@qq.com> Date: Wed, 2 Jul 2025 17:07:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E3=80=81=E8=A7=92=E8=89=B2=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E3=80=81=E5=9B=A2=E9=98=9F=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E3=80=81=E7=94=A8=E6=88=B7=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RoleController.java | 24 ++++++++++ .../controller/TeamController.java | 26 +++++++++++ .../controller/UserController.java | 26 ++++++++++- .../equipreservebackend/dto/UserDTO.java | 3 ++ .../equipreservebackend/entity/User.java | 11 +++++ .../equipreservebackend/entity/UserRole.java | 17 +++++++ .../mapper/UserRoleMapper.java | 9 ++++ .../service/RoleService.java | 7 +++ .../service/TeamService.java | 5 +++ .../service/UserService.java | 7 +++ .../service/impl/RoleServiceImpl.java | 11 +++++ .../service/impl/TeamServiceImpl.java | 25 +++++++++++ .../service/impl/UserServiceImpl.java | 44 ++++++++++++++++++- .../equipreservebackend/vo/RoleVO.java | 19 ++++++++ .../equipreservebackend/vo/TeamVO.java | 18 ++++++++ .../equipreservebackend/vo/UserVO.java | 22 ++++++++++ 16 files changed, 272 insertions(+), 2 deletions(-) create mode 100644 src/main/java/github/benjamin/equipreservebackend/controller/RoleController.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/controller/TeamController.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/entity/UserRole.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/mapper/UserRoleMapper.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/service/RoleService.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/service/impl/RoleServiceImpl.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/service/impl/TeamServiceImpl.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/vo/RoleVO.java create mode 100644 src/main/java/github/benjamin/equipreservebackend/vo/TeamVO.java diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/RoleController.java b/src/main/java/github/benjamin/equipreservebackend/controller/RoleController.java new file mode 100644 index 0000000..663191d --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/controller/RoleController.java @@ -0,0 +1,24 @@ +package github.benjamin.equipreservebackend.controller; + +import github.benjamin.equipreservebackend.response.ResponseResult; +import github.benjamin.equipreservebackend.service.RoleService; +import github.benjamin.equipreservebackend.vo.RoleVO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/role") +@RequiredArgsConstructor +public class RoleController { + + private final RoleService roleService; + @GetMapping + public ResponseResult> getRoles() { + return ResponseResult.success(roleService.list().stream().map(RoleVO::new).toList()); + } + +} diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/TeamController.java b/src/main/java/github/benjamin/equipreservebackend/controller/TeamController.java new file mode 100644 index 0000000..45ed233 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/controller/TeamController.java @@ -0,0 +1,26 @@ +package github.benjamin.equipreservebackend.controller; + +import github.benjamin.equipreservebackend.mapper.TeamMapper; +import github.benjamin.equipreservebackend.response.ResponseResult; +import github.benjamin.equipreservebackend.service.TeamService; +import github.benjamin.equipreservebackend.vo.TeamVO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping +@RequiredArgsConstructor +public class TeamController { + + private final TeamService teamService; + + @GetMapping("/teams") + public ResponseResult> getTeams() { + return ResponseResult.success(teamService.getTeams()); + } + +} diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/UserController.java b/src/main/java/github/benjamin/equipreservebackend/controller/UserController.java index daf3f96..36d8d53 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/UserController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/UserController.java @@ -1,5 +1,6 @@ package github.benjamin.equipreservebackend.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import github.benjamin.equipreservebackend.dto.LoginRequest; import github.benjamin.equipreservebackend.dto.UserDTO; import github.benjamin.equipreservebackend.entity.Role; @@ -11,6 +12,7 @@ import github.benjamin.equipreservebackend.utils.JwtUtil; import github.benjamin.equipreservebackend.vo.LoginResponse; import github.benjamin.equipreservebackend.vo.UserVO; import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -37,11 +39,33 @@ public class UserController { return ResponseResult.success(userService.getUserVO(id)); } - @PatchMapping("/user/{id}") + @PutMapping("/user/{id}") public ResponseResult updateUser(@PathVariable Long id, @RequestBody UserDTO dto) { userService.updateUser(id, dto); return ResponseResult.success(userService.getUserVO(id)); } + @PreAuthorize("hasRole('ADMIN')") + @PostMapping("/user") + public ResponseResult addUser(@RequestBody UserDTO dto) { + userService.addUser(dto); + return ResponseResult.success(); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/user") + public ResponseResult> getUserVOs(@RequestParam(defaultValue = "1") Integer page, + @RequestParam(defaultValue = "10") Integer size, + @RequestParam(required = false) String name) { + Page pageRequest = new Page<>(page, size); + return ResponseResult.success(userService.getUserVOs(pageRequest, name)); + } + + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/user/{userId}") + public ResponseResult deleteUser(@PathVariable("userId") Long userId) { + userService.deleteById(userId); + return ResponseResult.success(); + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/dto/UserDTO.java b/src/main/java/github/benjamin/equipreservebackend/dto/UserDTO.java index 29f0c21..ce0c8a7 100644 --- a/src/main/java/github/benjamin/equipreservebackend/dto/UserDTO.java +++ b/src/main/java/github/benjamin/equipreservebackend/dto/UserDTO.java @@ -5,8 +5,11 @@ import lombok.Data; @Data public class UserDTO { + private String username; private String name; private String phone; private String password; + private Long teamId; + private Long roleId; } diff --git a/src/main/java/github/benjamin/equipreservebackend/entity/User.java b/src/main/java/github/benjamin/equipreservebackend/entity/User.java index 6b4fe9e..03da5d5 100644 --- a/src/main/java/github/benjamin/equipreservebackend/entity/User.java +++ b/src/main/java/github/benjamin/equipreservebackend/entity/User.java @@ -1,12 +1,15 @@ package github.benjamin.equipreservebackend.entity; import com.baomidou.mybatisplus.annotation.TableName; +import github.benjamin.equipreservebackend.dto.UserDTO; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data @TableName("users") +@NoArgsConstructor public class User { private Long id; @@ -19,4 +22,12 @@ public class User { private LocalDateTime createdTime; private LocalDateTime updatedTime; + public User(UserDTO dto) { + this.username = dto.getUsername(); + this.password = dto.getPassword(); + this.name = dto.getName(); + this.phone = dto.getPhone(); + this.teamId = dto.getTeamId(); + } + } diff --git a/src/main/java/github/benjamin/equipreservebackend/entity/UserRole.java b/src/main/java/github/benjamin/equipreservebackend/entity/UserRole.java new file mode 100644 index 0000000..b01c8b5 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/entity/UserRole.java @@ -0,0 +1,17 @@ +package github.benjamin.equipreservebackend.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@TableName("user_roles") +@NoArgsConstructor +@AllArgsConstructor +public class UserRole { + + private Long userId; + private Long roleId; + +} diff --git a/src/main/java/github/benjamin/equipreservebackend/mapper/UserRoleMapper.java b/src/main/java/github/benjamin/equipreservebackend/mapper/UserRoleMapper.java new file mode 100644 index 0000000..42a7d0b --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/mapper/UserRoleMapper.java @@ -0,0 +1,9 @@ +package github.benjamin.equipreservebackend.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import github.benjamin.equipreservebackend.entity.UserRole; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRoleMapper extends BaseMapper { +} diff --git a/src/main/java/github/benjamin/equipreservebackend/service/RoleService.java b/src/main/java/github/benjamin/equipreservebackend/service/RoleService.java new file mode 100644 index 0000000..e1bdbb0 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/service/RoleService.java @@ -0,0 +1,7 @@ +package github.benjamin.equipreservebackend.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import github.benjamin.equipreservebackend.entity.Role; + +public interface RoleService extends IService { +} diff --git a/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java b/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java index 0d2eac4..6e6810a 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java @@ -1,4 +1,9 @@ package github.benjamin.equipreservebackend.service; +import github.benjamin.equipreservebackend.vo.TeamVO; + +import java.util.List; + public interface TeamService { + List getTeams(); } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/UserService.java b/src/main/java/github/benjamin/equipreservebackend/service/UserService.java index 50ff9c2..0699bdd 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/UserService.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/UserService.java @@ -1,5 +1,6 @@ package github.benjamin.equipreservebackend.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import github.benjamin.equipreservebackend.dto.UserDTO; import github.benjamin.equipreservebackend.entity.User; import github.benjamin.equipreservebackend.security.SecurityUser; @@ -14,4 +15,10 @@ public interface UserService { UserVO getUserVO(Long id); void updateUser(Long id, UserDTO dto); + + Page getUserVOs(Page pageRequest, String name); + + void deleteById(Long userId); + + void addUser(UserDTO dto); } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/impl/RoleServiceImpl.java b/src/main/java/github/benjamin/equipreservebackend/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..f9ae1c1 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/RoleServiceImpl.java @@ -0,0 +1,11 @@ +package github.benjamin.equipreservebackend.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import github.benjamin.equipreservebackend.entity.Role; +import github.benjamin.equipreservebackend.mapper.RoleMapper; +import github.benjamin.equipreservebackend.service.RoleService; +import org.springframework.stereotype.Service; + +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { +} diff --git a/src/main/java/github/benjamin/equipreservebackend/service/impl/TeamServiceImpl.java b/src/main/java/github/benjamin/equipreservebackend/service/impl/TeamServiceImpl.java new file mode 100644 index 0000000..ca75333 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/TeamServiceImpl.java @@ -0,0 +1,25 @@ +package github.benjamin.equipreservebackend.service.impl; + +import github.benjamin.equipreservebackend.entity.Team; +import github.benjamin.equipreservebackend.mapper.TeamMapper; +import github.benjamin.equipreservebackend.service.TeamService; +import github.benjamin.equipreservebackend.vo.TeamVO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class TeamServiceImpl implements TeamService { + + private final TeamMapper teamMapper; + + @Override + public List getTeams() { + + List teams = teamMapper.selectList(null); + + return teams.stream().map(TeamVO::new).toList(); + } +} diff --git a/src/main/java/github/benjamin/equipreservebackend/service/impl/UserServiceImpl.java b/src/main/java/github/benjamin/equipreservebackend/service/impl/UserServiceImpl.java index 3452711..77e7d7f 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/UserServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/UserServiceImpl.java @@ -2,18 +2,22 @@ package github.benjamin.equipreservebackend.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import github.benjamin.equipreservebackend.dto.UserDTO; import github.benjamin.equipreservebackend.entity.Role; import github.benjamin.equipreservebackend.entity.Team; import github.benjamin.equipreservebackend.entity.User; +import github.benjamin.equipreservebackend.entity.UserRole; import github.benjamin.equipreservebackend.exception.ApiException; import github.benjamin.equipreservebackend.mapper.RoleMapper; import github.benjamin.equipreservebackend.mapper.TeamMapper; import github.benjamin.equipreservebackend.mapper.UserMapper; +import github.benjamin.equipreservebackend.mapper.UserRoleMapper; import github.benjamin.equipreservebackend.response.ResponseCode; import github.benjamin.equipreservebackend.security.SecurityUser; import github.benjamin.equipreservebackend.service.UserService; import github.benjamin.equipreservebackend.utils.JwtUtil; +import github.benjamin.equipreservebackend.utils.PageUtil; import github.benjamin.equipreservebackend.utils.PasswordUtil; import github.benjamin.equipreservebackend.vo.UserVO; import lombok.RequiredArgsConstructor; @@ -21,7 +25,10 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -33,6 +40,8 @@ public class UserServiceImpl implements UserService { private final TeamMapper teamMapper; + private final UserRoleMapper userRoleMapper; + private final JwtUtil jwtUtil; @Override @@ -66,11 +75,44 @@ public class UserServiceImpl implements UserService { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper() .eq(User::getId, id) .set(StringUtils.hasText(dto.getName()), User::getName, dto.getName()) - .set(StringUtils.hasText(dto.getPhone()), User::getPhone, dto.getPhone()); + .set(StringUtils.hasText(dto.getPhone()), User::getPhone, dto.getPhone()) + .set(StringUtils.hasText(dto.getUsername()),User::getUsername, dto.getUsername()) + .set(Objects.nonNull(dto.getTeamId()), User::getTeamId, dto.getTeamId()); if (StringUtils.hasText(dto.getPassword())) { String encoded = PasswordUtil.encode(dto.getPassword()); wrapper.set(User::getPassword, encoded); } userMapper.update(wrapper); } + + @Override + public Page getUserVOs(Page pageRequest, String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .orderByAsc(User::getName); + if (StringUtils.hasText(name)) { + wrapper.like(User::getName, name); + } + Page users = userMapper.selectPage(pageRequest, wrapper); + Map teamMap = teamMapper.selectList(null).stream() + .collect(Collectors.toMap(Team::getId, Function.identity())); + Map roleMap = userRoleMapper.selectList(null).stream() + .collect(Collectors.toMap(UserRole::getUserId, UserRole::getRoleId, (v1, v2) -> v1)); + Page res = PageUtil.copyPage(users); + res.setRecords(users.getRecords().stream().map(u -> new UserVO(u, teamMap, roleMap)).toList()); + return res; + } + + @Override + public void deleteById(Long userId) { + userMapper.deleteById(userId); + } + + @Override + public void addUser(UserDTO dto) { + String encoded = PasswordUtil.encode(dto.getPassword()); + dto.setPassword(encoded); + User user = new User(dto); + userMapper.insert(user); + userRoleMapper.insert(new UserRole(user.getId(), dto.getRoleId())); + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/RoleVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/RoleVO.java new file mode 100644 index 0000000..0d986c1 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/vo/RoleVO.java @@ -0,0 +1,19 @@ +package github.benjamin.equipreservebackend.vo; + +import github.benjamin.equipreservebackend.entity.Role; +import github.benjamin.equipreservebackend.entity.Team; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class RoleVO { + + private String label; + private String value; + + public RoleVO(Role r) { + this.label = r.getName(); + this.value = r.getId().toString(); + } +} \ No newline at end of file diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/TeamVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/TeamVO.java new file mode 100644 index 0000000..1208846 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/vo/TeamVO.java @@ -0,0 +1,18 @@ +package github.benjamin.equipreservebackend.vo; + +import github.benjamin.equipreservebackend.entity.Team; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class TeamVO { + + private String label; + private String value; + + public TeamVO(Team t) { + this.label = t.getName(); + this.value = t.getId().toString(); + } +} diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/UserVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/UserVO.java index dbaca32..47a5d9a 100644 --- a/src/main/java/github/benjamin/equipreservebackend/vo/UserVO.java +++ b/src/main/java/github/benjamin/equipreservebackend/vo/UserVO.java @@ -1,25 +1,47 @@ package github.benjamin.equipreservebackend.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import github.benjamin.equipreservebackend.entity.Team; import github.benjamin.equipreservebackend.entity.User; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Map; + @Data @AllArgsConstructor @NoArgsConstructor public class UserVO { + @JsonSerialize(using = ToStringSerializer.class) + private Long userId; private String username; private String team; + @JsonSerialize(using = ToStringSerializer.class) + private Long teamId; private String name; private String phone; + @JsonSerialize(using = ToStringSerializer.class) + private Long roleId; public UserVO(User u, Team t) { + this.userId = u.getId(); this.username = u.getUsername(); this.name = u.getName(); this.phone = u.getPhone(); this.team = t.getName(); + this.teamId = u.getId(); + } + + public UserVO(User u, Map teamMap, Map roleMap) { + this.userId = u.getId(); + this.username = u.getUsername(); + this.name = u.getName(); + this.phone = u.getPhone(); + this.team = teamMap.get(u.getTeamId()).getName(); + this.teamId = u.getTeamId(); + this.roleId = roleMap.get(u.getId()); } }