From 32783ecb0b667cf7f8f41763a2405c438f07143f Mon Sep 17 00:00:00 2001 From: xiang Date: Mon, 25 Aug 2025 22:54:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=94=A8=E6=88=B7=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=BC=80=E5=8F=91v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../auth/api/dto/req/user/UserAddRequest.java | 47 ++++++- .../api/dto/req/user/UserQueryRequest.java | 34 ++++- .../api/dto/req/user/UserUpdateRequest.java | 10 +- .../server/controller/UserController.java | 126 +++++++++++------- .../config/AuthorizationServerConfig.java | 1 + .../auth/service/convert/XUserConvert.java | 24 ++++ .../repository/mapper/XUserMapper.java | 42 ++++++ .../auth/service/service/XUserService.java | 21 +++ .../service/impl/XUserServiceImpl.java | 62 +++++++++ .../resources/mapper/user/XUserMapper.xml | 56 ++++++++ 11 files changed, 381 insertions(+), 48 deletions(-) create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XUserConvert.java diff --git a/pom.xml b/pom.xml index 075f83c..4f678a2 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,12 @@ xservice-cache-starter 2.0 + + + org.mapstruct + mapstruct + 1.5.5.Final + \ No newline at end of file diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserAddRequest.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserAddRequest.java index e19d0be..5af33d2 100644 --- a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserAddRequest.java +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserAddRequest.java @@ -1,4 +1,49 @@ package com.xiang.xservice.auth.api.dto.req.user; -public class UserAddRequest { +import com.xiang.xservice.basic.common.req.BaseRequest; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserAddRequest extends BaseRequest { + + /** + * 用户名(昵称) + */ + private String name; + + /** + * 账号 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号 + */ + private String phone; + + /** + * 头像 + */ + private String avatar; + + /** + * 状态(0:禁用, 1:启用) + */ + private Integer status; } diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserQueryRequest.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserQueryRequest.java index 54a8bcc..9b22297 100644 --- a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserQueryRequest.java +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserQueryRequest.java @@ -1,4 +1,36 @@ package com.xiang.xservice.auth.api.dto.req.user; -public class UserQueryRequest { +import com.xiang.xservice.basic.common.req.BaseRequest; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserQueryRequest extends BaseRequest { + /** + * 用户名(昵称) + */ + private String name; + + /** + * 账号 + */ + private String username; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号 + */ + private String phone; + + /** + * 状态(0:禁用, 1:启用) + */ + private Integer status; } diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserUpdateRequest.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserUpdateRequest.java index a2e9f2c..dcebbad 100644 --- a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserUpdateRequest.java +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/user/UserUpdateRequest.java @@ -1,4 +1,12 @@ package com.xiang.xservice.auth.api.dto.req.user; -public class UserUpdateRequest { +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserUpdateRequest extends UserAddRequest { + private Long id; } diff --git a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java index 973e2d4..32e0ea3 100644 --- a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java +++ b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java @@ -1,19 +1,17 @@ package com.xiang.xservice.auth.server.controller; -import com.google.common.collect.Lists; +import com.alibaba.fastjson.JSON; import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest; import com.xiang.xservice.auth.api.dto.req.user.UserDeptUpdateRequest; import com.xiang.xservice.auth.api.dto.req.user.UserQueryRequest; import com.xiang.xservice.auth.api.dto.req.user.UserRoleUpdateRequest; import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest; import com.xiang.xservice.auth.api.dto.resp.UserResp; -import com.xiang.xservice.auth.service.entity.XUser; -import com.xiang.xservice.auth.service.enums.UserStatusEnum; -import com.xiang.xservice.auth.service.repository.mapper.XUserMapper; +import com.xiang.xservice.auth.service.service.XUserService; import com.xiang.xservice.basic.common.resp.Result; +import com.xiang.xservice.basic.exception.BusinessException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -25,80 +23,118 @@ import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; -import java.util.concurrent.CompletableFuture; @Slf4j @RestController @RequiredArgsConstructor public class UserController { - private final XUserMapper userMapper; - private final PasswordEncoder passwordEncoder; + private final XUserService userService; @PostMapping("/private/user/list") public Result getUserList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserQueryRequest request) { - return Result.success(new UserResp()); + return Result.success(userService.getUserList(request)); } @GetMapping("/private/user/info/{id}") public Result getUserById(@PathVariable("id") Long id) { - return Result.success(new UserResp()); + return Result.success(userService.getUserInfo(id)); } @PostMapping("/private/user/add") public Result addUser(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserAddRequest request) { - return Result.success(true); + try { + return Result.success(userService.addUser(request)); + } catch (BusinessException e) { + log.error("用户新增异常,请求:{}", JSON.toJSONString(request), e); + return Result.error(e.getMessage()); + } catch (Exception e) { + log.error("用户新增异常,请求:{}", JSON.toJSONString(request), e); + } + return Result.error(); } @PostMapping("/private/user/update") public Result updateUser(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserUpdateRequest request) { - return Result.success(true); + try { + return Result.success(userService.updateUser(request)); + } catch (BusinessException e) { + log.error("用户编辑异常,请求:{}", JSON.toJSONString(request), e); + return Result.error(e.getMessage()); + } catch (Exception e) { + log.error("用户编辑异常,请求:{}", JSON.toJSONString(request), e); + } + return Result.error(); } @PostMapping("/private/user/del") public Result delUser(@RequestParam @Valid @NotEmpty(message = "请求参数不能为空") List ids) { - return Result.success(true); + try { + return Result.success(userService.delUser(ids)); + } catch (BusinessException e) { + log.error("用户删除异常,请求:{}", JSON.toJSONString(ids), e); + return Result.error(e.getMessage()); + } catch (Exception e) { + log.error("用户删除异常,请求:{}", JSON.toJSONString(ids), e); + } + return Result.error(); } @PostMapping("/private/user/setDept") public Result setUserDept(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserDeptUpdateRequest request) { - return Result.success(true); + try { + return Result.success(userService.setUserDept(request)); + } catch (BusinessException e) { + log.error("用户设置部门异常,请求:{}", JSON.toJSONString(request), e); + return Result.error(e.getMessage()); + } catch (Exception e) { + log.error("用户设置部门异常,请求:{}", JSON.toJSONString(request), e); + } + return Result.error(); } @PostMapping("/private/user/setRole") public Result setUserRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserRoleUpdateRequest request) { - return Result.success(true); - } - - - @PostMapping("/public/user/useraddBatch") - public Result add() { - List futures = Lists.newArrayList(); - List list = Lists.newCopyOnWriteArrayList(); - for (int i = 0; i < 100; i++) { - int finalI = i; - log.info("第{}批数据生成!", finalI); - CompletableFuture future = CompletableFuture.runAsync(() -> { - for (int j = 0; j < 1000; j++) { - log.info("第{}批的第{}条数据生成!", finalI, j); - XUser user = new XUser(); - user.setName("nameTest2" + finalI + j); - user.setUsername("usernameTest2" + finalI + j); - user.setPassword(passwordEncoder.encode("123456")); - user.setEmail("emailTest2" + finalI + j + "@test.com"); - user.setPhone("13800000000"); - user.setStatus(UserStatusEnum.USING.getCode()); - list.add(user); - } - }); - futures.add(future); + try { + return Result.success(userService.setUserRole(request)); + } catch (BusinessException e) { + log.error("用户设置角色异常,请求:{}", JSON.toJSONString(request), e); + return Result.error(e.getMessage()); + } catch (Exception e) { + log.error("用户设置角色异常,请求:{}", JSON.toJSONString(request), e); } - CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); - List> partition = Lists.partition(list, 3000); - CompletableFuture.runAsync(() -> { - partition.stream().parallel().forEach(userMapper::insertBatch); - }); - return Result.success(); + return Result.error(); } + + +// @PostMapping("/public/user/useraddBatch") +// public Result add() { +// List futures = Lists.newArrayList(); +// List list = Lists.newCopyOnWriteArrayList(); +// for (int i = 0; i < 100; i++) { +// int finalI = i; +// log.info("第{}批数据生成!", finalI); +// CompletableFuture future = CompletableFuture.runAsync(() -> { +// for (int j = 0; j < 1000; j++) { +// log.info("第{}批的第{}条数据生成!", finalI, j); +// XUser user = new XUser(); +// user.setName("nameTest2" + finalI + j); +// user.setUsername("usernameTest2" + finalI + j); +// user.setPassword(passwordEncoder.encode("123456")); +// user.setEmail("emailTest2" + finalI + j + "@test.com"); +// user.setPhone("13800000000"); +// user.setStatus(UserStatusEnum.USING.getCode()); +// list.add(user); +// } +// }); +// futures.add(future); +// } +// CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); +// List> partition = Lists.partition(list, 3000); +// CompletableFuture.runAsync(() -> { +// partition.stream().parallel().forEach(userMapper::insertBatch); +// }); +// return Result.success(); +// } } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/config/AuthorizationServerConfig.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/config/AuthorizationServerConfig.java index ead15c8..629b4c3 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/config/AuthorizationServerConfig.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/config/AuthorizationServerConfig.java @@ -54,6 +54,7 @@ public class AuthorizationServerConfig { .authorizeRequests(authorizeRequests -> authorizeRequests .antMatchers("/public/**").permitAll() .antMatchers("/open/**").permitAll() + .antMatchers("/private/**").permitAll() .anyRequest().authenticated() ) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XUserConvert.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XUserConvert.java new file mode 100644 index 0000000..6f82e36 --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XUserConvert.java @@ -0,0 +1,24 @@ +package com.xiang.xservice.auth.service.convert; + +import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserQueryRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest; +import com.xiang.xservice.auth.api.dto.resp.UserResp; +import com.xiang.xservice.auth.service.entity.XUser; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface XUserConvert { + XUserConvert INSTANCE = Mappers.getMapper(XUserConvert.class); + + XUser toDO (UserQueryRequest request); + XUser toDO (UserAddRequest request); + XUser toDO (UserUpdateRequest request); + + List toRespList(List list); + + UserResp toResp(XUser user); +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserMapper.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserMapper.java index 2e09231..2a7bdbd 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserMapper.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserMapper.java @@ -2,14 +2,21 @@ package com.xiang.xservice.auth.service.repository.mapper; import com.xiang.xservice.auth.service.entity.XUser; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; @Repository @Mapper public interface XUserMapper { + /** + * 根据用户名查询用户 + * @param username + * @return + */ XUser selectByUsername(String username); /** @@ -19,5 +26,40 @@ public interface XUserMapper { */ int insert(XUser user); + /** + * 批量插入 + * @param list + * @return + */ int insertBatch(List list); + + /** + * 查询用户列表 + * @param user + * @return + */ + List getUserList(XUser user); + + /** + * 查询用户详情 + * @param id + * @return + */ + XUser getUserById(Long id); + + /** + * 编辑用户 + * @param user + * @return + */ + int update(XUser user); + + /** + * 批量删除 + * @param ids + * @param time + * @param operator + * @return + */ + int deleteBatch(@Param("ids") List ids, @Param("time") LocalDateTime time, @Param("operator") String operator); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java index 36caf6f..ae04c54 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java @@ -2,10 +2,17 @@ package com.xiang.xservice.auth.service.service; import com.xiang.xservice.auth.api.dto.req.LoginRequest; import com.xiang.xservice.auth.api.dto.req.RegisterRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserDeptUpdateRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserQueryRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserRoleUpdateRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest; import com.xiang.xservice.auth.api.dto.resp.LoginResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp; import com.xiang.xservice.auth.api.dto.resp.UserResp; +import java.util.List; + public interface XUserService { LoginResp login(LoginRequest request); @@ -13,4 +20,18 @@ public interface XUserService { UserResp getUserByUsername(String username); RegisterResp userRegister(RegisterRequest request); + + List getUserList(UserQueryRequest request); + + UserResp getUserInfo(Long id); + + Boolean addUser(UserAddRequest request); + + Boolean updateUser(UserUpdateRequest request); + + Boolean delUser(List ids); + + Boolean setUserDept(UserDeptUpdateRequest request); + + Boolean setUserRole(UserRoleUpdateRequest request); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java index 67de061..8b414f3 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java @@ -1,11 +1,18 @@ package com.xiang.xservice.auth.service.service.impl; +import com.google.common.collect.Lists; import com.xiang.xservice.auth.api.code.UserErrorCode; import com.xiang.xservice.auth.api.dto.req.LoginRequest; import com.xiang.xservice.auth.api.dto.req.RegisterRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserDeptUpdateRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserQueryRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserRoleUpdateRequest; +import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest; import com.xiang.xservice.auth.api.dto.resp.LoginResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp; import com.xiang.xservice.auth.api.dto.resp.UserResp; +import com.xiang.xservice.auth.service.convert.XUserConvert; import com.xiang.xservice.auth.service.entity.XUser; import com.xiang.xservice.auth.service.enums.UserStatusEnum; import com.xiang.xservice.auth.service.repository.mapper.XUserMapper; @@ -14,6 +21,7 @@ import com.xiang.xservice.basic.enums.DelStatusEnum; import com.xiang.xservice.basic.exception.BusinessException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -23,10 +31,12 @@ import org.springframework.security.oauth2.jwt.JwtClaimsSet; import org.springframework.security.oauth2.jwt.JwtEncoder; import org.springframework.security.oauth2.jwt.JwtEncoderParameters; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; +import java.util.List; import java.util.Objects; @Slf4j @@ -38,6 +48,7 @@ public class XUserServiceImpl implements XUserService { private final XUserMapper userMapper; private final AuthenticationManager authenticationManager; private final PasswordEncoder passwordEncoder; + private final XUserConvert userConvert; @Override public LoginResp login(LoginRequest request) { @@ -122,4 +133,55 @@ public class XUserServiceImpl implements XUserService { } return null; } + + @Override + public List getUserList(UserQueryRequest request) { + List userList = userMapper.getUserList(userConvert.toDO(request)); + if (CollectionUtils.isEmpty(userList)) { + return Lists.newArrayList(); + } + return userConvert.toRespList(userList); + } + + @Override + public UserResp getUserInfo(Long id) { + XUser user = userMapper.getUserById(id); + return userConvert.toResp(user); + } + + @Override + public Boolean addUser(UserAddRequest request) { + XUser user = userConvert.toDO(request); + user.setCreateBy(request.getOperator()); + user.setCreateTime(request.getDateTime()); + user.setUpdateBy(request.getOperator()); + user.setUpdateTime(request.getDateTime()); + return userMapper.insert(user) > 0; + } + + @Override + public Boolean updateUser(UserUpdateRequest request) { + XUser user = userConvert.toDO(request); + user.setCreateBy(request.getOperator()); + user.setCreateTime(request.getDateTime()); + user.setUpdateBy(request.getOperator()); + user.setUpdateTime(request.getDateTime()); + return userMapper.update(user) > 0; + } + + @Override + public Boolean delUser(List ids) { + return userMapper.deleteBatch(ids, LocalDateTime.now(), "System") > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean setUserDept(UserDeptUpdateRequest request) { + return null; + } + + @Override + public Boolean setUserRole(UserRoleUpdateRequest request) { + return null; + } } diff --git a/xs-service/src/main/resources/mapper/user/XUserMapper.xml b/xs-service/src/main/resources/mapper/user/XUserMapper.xml index a38b47a..2cb5254 100644 --- a/xs-service/src/main/resources/mapper/user/XUserMapper.xml +++ b/xs-service/src/main/resources/mapper/user/XUserMapper.xml @@ -160,6 +160,12 @@ WHERE id = #{id} + + update x_user set del_flag = 0, update_time = #{time}, update_by = #{operator} where id in + + #{id} + + + + + \ No newline at end of file