feat:用户接口开发v1

This commit is contained in:
xiang
2025-08-25 22:54:41 +08:00
parent a486ed073c
commit 32783ecb0b
11 changed files with 381 additions and 48 deletions

View File

@@ -70,6 +70,12 @@
<artifactId>xservice-cache-starter</artifactId> <artifactId>xservice-cache-starter</artifactId>
<version>2.0</version> <version>2.0</version>
</dependency> </dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -1,4 +1,49 @@
package com.xiang.xservice.auth.api.dto.req.user; 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;
} }

View File

@@ -1,4 +1,36 @@
package com.xiang.xservice.auth.api.dto.req.user; 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;
} }

View File

@@ -1,4 +1,12 @@
package com.xiang.xservice.auth.api.dto.req.user; 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;
} }

View File

@@ -1,19 +1,17 @@
package com.xiang.xservice.auth.server.controller; 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.UserAddRequest;
import com.xiang.xservice.auth.api.dto.req.user.UserDeptUpdateRequest; 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.UserQueryRequest;
import com.xiang.xservice.auth.api.dto.req.user.UserRoleUpdateRequest; 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.req.user.UserUpdateRequest;
import com.xiang.xservice.auth.api.dto.resp.UserResp; import com.xiang.xservice.auth.api.dto.resp.UserResp;
import com.xiang.xservice.auth.service.entity.XUser; import com.xiang.xservice.auth.service.service.XUserService;
import com.xiang.xservice.auth.service.enums.UserStatusEnum;
import com.xiang.xservice.auth.service.repository.mapper.XUserMapper;
import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.common.resp.Result;
import com.xiang.xservice.basic.exception.BusinessException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -25,80 +23,118 @@ import javax.validation.Valid;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
@Slf4j @Slf4j
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
public class UserController { public class UserController {
private final XUserMapper userMapper; private final XUserService userService;
private final PasswordEncoder passwordEncoder;
@PostMapping("/private/user/list") @PostMapping("/private/user/list")
public Result<UserResp> getUserList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserQueryRequest request) { public Result<UserResp> getUserList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserQueryRequest request) {
return Result.success(new UserResp()); return Result.success(userService.getUserList(request));
} }
@GetMapping("/private/user/info/{id}") @GetMapping("/private/user/info/{id}")
public Result<UserResp> getUserById(@PathVariable("id") Long id) { public Result<UserResp> getUserById(@PathVariable("id") Long id) {
return Result.success(new UserResp()); return Result.success(userService.getUserInfo(id));
} }
@PostMapping("/private/user/add") @PostMapping("/private/user/add")
public Result<Boolean> addUser(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserAddRequest request) { public Result<Boolean> 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") @PostMapping("/private/user/update")
public Result<Boolean> updateUser(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserUpdateRequest request) { public Result<Boolean> 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") @PostMapping("/private/user/del")
public Result<Boolean> delUser(@RequestParam @Valid @NotEmpty(message = "请求参数不能为空") List<Long> ids) { public Result<Boolean> delUser(@RequestParam @Valid @NotEmpty(message = "请求参数不能为空") List<Long> 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") @PostMapping("/private/user/setDept")
public Result<Boolean> setUserDept(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserDeptUpdateRequest request) { public Result<Boolean> 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") @PostMapping("/private/user/setRole")
public Result<Boolean> setUserRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserRoleUpdateRequest request) { public Result<Boolean> setUserRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserRoleUpdateRequest request) {
return Result.success(true); 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);
}
return Result.error();
} }
@PostMapping("/public/user/useraddBatch") // @PostMapping("/public/user/useraddBatch")
public Result<Void> add() { // public Result<Void> add() {
List<CompletableFuture> futures = Lists.newArrayList(); // List<CompletableFuture> futures = Lists.newArrayList();
List<XUser> list = Lists.newCopyOnWriteArrayList(); // List<XUser> list = Lists.newCopyOnWriteArrayList();
for (int i = 0; i < 100; i++) { // for (int i = 0; i < 100; i++) {
int finalI = i; // int finalI = i;
log.info("第{}批数据生成!", finalI); // log.info("第{}批数据生成!", finalI);
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { // CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
for (int j = 0; j < 1000; j++) { // for (int j = 0; j < 1000; j++) {
log.info("第{}批的第{}条数据生成!", finalI, j); // log.info("第{}批的第{}条数据生成!", finalI, j);
XUser user = new XUser(); // XUser user = new XUser();
user.setName("nameTest2" + finalI + j); // user.setName("nameTest2" + finalI + j);
user.setUsername("usernameTest2" + finalI + j); // user.setUsername("usernameTest2" + finalI + j);
user.setPassword(passwordEncoder.encode("123456")); // user.setPassword(passwordEncoder.encode("123456"));
user.setEmail("emailTest2" + finalI + j + "@test.com"); // user.setEmail("emailTest2" + finalI + j + "@test.com");
user.setPhone("13800000000"); // user.setPhone("13800000000");
user.setStatus(UserStatusEnum.USING.getCode()); // user.setStatus(UserStatusEnum.USING.getCode());
list.add(user); // list.add(user);
} // }
}); // });
futures.add(future); // futures.add(future);
} // }
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); // CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
List<List<XUser>> partition = Lists.partition(list, 3000); // List<List<XUser>> partition = Lists.partition(list, 3000);
CompletableFuture.runAsync(() -> { // CompletableFuture.runAsync(() -> {
partition.stream().parallel().forEach(userMapper::insertBatch); // partition.stream().parallel().forEach(userMapper::insertBatch);
}); // });
return Result.success(); // return Result.success();
} // }
} }

View File

@@ -54,6 +54,7 @@ public class AuthorizationServerConfig {
.authorizeRequests(authorizeRequests -> authorizeRequests .authorizeRequests(authorizeRequests -> authorizeRequests
.antMatchers("/public/**").permitAll() .antMatchers("/public/**").permitAll()
.antMatchers("/open/**").permitAll() .antMatchers("/open/**").permitAll()
.antMatchers("/private/**").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
) )
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

View File

@@ -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<UserResp> toRespList(List<XUser> list);
UserResp toResp(XUser user);
}

View File

@@ -2,14 +2,21 @@ package com.xiang.xservice.auth.service.repository.mapper;
import com.xiang.xservice.auth.service.entity.XUser; import com.xiang.xservice.auth.service.entity.XUser;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@Repository @Repository
@Mapper @Mapper
public interface XUserMapper { public interface XUserMapper {
/**
* 根据用户名查询用户
* @param username
* @return
*/
XUser selectByUsername(String username); XUser selectByUsername(String username);
/** /**
@@ -19,5 +26,40 @@ public interface XUserMapper {
*/ */
int insert(XUser user); int insert(XUser user);
/**
* 批量插入
* @param list
* @return
*/
int insertBatch(List<XUser> list); int insertBatch(List<XUser> list);
/**
* 查询用户列表
* @param user
* @return
*/
List<XUser> 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<Long> ids, @Param("time") LocalDateTime time, @Param("operator") String operator);
} }

View File

@@ -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.LoginRequest;
import com.xiang.xservice.auth.api.dto.req.RegisterRequest; 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.LoginResp;
import com.xiang.xservice.auth.api.dto.resp.RegisterResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp;
import com.xiang.xservice.auth.api.dto.resp.UserResp; import com.xiang.xservice.auth.api.dto.resp.UserResp;
import java.util.List;
public interface XUserService { public interface XUserService {
LoginResp login(LoginRequest request); LoginResp login(LoginRequest request);
@@ -13,4 +20,18 @@ public interface XUserService {
UserResp getUserByUsername(String username); UserResp getUserByUsername(String username);
RegisterResp userRegister(RegisterRequest request); RegisterResp userRegister(RegisterRequest request);
List<UserResp> getUserList(UserQueryRequest request);
UserResp getUserInfo(Long id);
Boolean addUser(UserAddRequest request);
Boolean updateUser(UserUpdateRequest request);
Boolean delUser(List<Long> ids);
Boolean setUserDept(UserDeptUpdateRequest request);
Boolean setUserRole(UserRoleUpdateRequest request);
} }

View File

@@ -1,11 +1,18 @@
package com.xiang.xservice.auth.service.service.impl; 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.code.UserErrorCode;
import com.xiang.xservice.auth.api.dto.req.LoginRequest; 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.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.LoginResp;
import com.xiang.xservice.auth.api.dto.resp.RegisterResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp;
import com.xiang.xservice.auth.api.dto.resp.UserResp; 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.entity.XUser;
import com.xiang.xservice.auth.service.enums.UserStatusEnum; import com.xiang.xservice.auth.service.enums.UserStatusEnum;
import com.xiang.xservice.auth.service.repository.mapper.XUserMapper; 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 com.xiang.xservice.basic.exception.BusinessException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication; 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.JwtEncoder;
import org.springframework.security.oauth2.jwt.JwtEncoderParameters; import org.springframework.security.oauth2.jwt.JwtEncoderParameters;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Objects; import java.util.Objects;
@Slf4j @Slf4j
@@ -38,6 +48,7 @@ public class XUserServiceImpl implements XUserService {
private final XUserMapper userMapper; private final XUserMapper userMapper;
private final AuthenticationManager authenticationManager; private final AuthenticationManager authenticationManager;
private final PasswordEncoder passwordEncoder; private final PasswordEncoder passwordEncoder;
private final XUserConvert userConvert;
@Override @Override
public LoginResp login(LoginRequest request) { public LoginResp login(LoginRequest request) {
@@ -122,4 +133,55 @@ public class XUserServiceImpl implements XUserService {
} }
return null; return null;
} }
@Override
public List<UserResp> getUserList(UserQueryRequest request) {
List<XUser> 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<Long> 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;
}
} }

View File

@@ -160,6 +160,12 @@
</set> </set>
WHERE id = #{id} WHERE id = #{id}
</update> </update>
<update id="deleteBatch">
update x_user set del_flag = 0, update_time = #{time}, update_by = #{operator} where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
<select id="selectByUsername" resultMap="BaseResultMap"> <select id="selectByUsername" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> select <include refid="Base_Column_List"/>
@@ -167,4 +173,54 @@
where username = #{username} and del_flag = 0 and status = 1 where username = #{username} and del_flag = 0 and status = 1
</select> </select>
<select id="getUserList" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from x_user
<trim prefix="AND">
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="username != null and username != ''">
AND username = #{username}
</if>
<if test="email != null and email != ''">
AND email = #{email}
</if>
<if test="phone != null and phone != ''">
AND phone = #{phone}
</if>
<if test="status != null">
AND status = #{status}
</if>
<if test="delFlag != null">
AND del_flag = #{delFlag}
</if>
<if test="loginIp != null and loginIp != ''">
AND login_ip = #{loginIp}
</if>
<if test="loginDate != null">
AND login_date = #{loginDate}
</if>
<if test="createBy != null and createBy != ''">
AND create_by = #{createBy}
</if>
<if test="updateBy != null and updateBy != ''">
AND update_by = #{updateBy}
</if>
<if test="createTime != null">
AND create_time &gt;= #{createTime}
</if>
<if test="updateTime != null">
AND update_time &lt;= #{updateTime}
</if>
</where>
</trim>
</select>
<select id="getUserById" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from x_user
where id = #{id}
</select>
</mapper> </mapper>