3.6 用户管理+一些坑的修复,如分页插件、long格式转换
This commit is contained in:
parent
b0cf0b54ab
commit
b809fb9a6b
12
pom.xml
12
pom.xml
@ -46,6 +46,11 @@
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-crypto</artifactId>
|
||||
</dependency>
|
||||
<!-- MyBatis Plus 分页插件 -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
@ -64,6 +69,13 @@
|
||||
</dependencies>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-bom</artifactId>
|
||||
<version>3.5.9</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-dependencies</artifactId>
|
||||
|
@ -0,0 +1,58 @@
|
||||
package edu.whut.smilepicturebackend.aop;
|
||||
|
||||
import edu.whut.smilepicturebackend.annotation.AuthCheck;
|
||||
import edu.whut.smilepicturebackend.exception.BusinessException;
|
||||
import edu.whut.smilepicturebackend.exception.ErrorCode;
|
||||
import edu.whut.smilepicturebackend.model.entity.User;
|
||||
import edu.whut.smilepicturebackend.model.enums.UserRoleEnum;
|
||||
import edu.whut.smilepicturebackend.service.UserService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.request.RequestAttributes;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class AuthInterceptor {
|
||||
|
||||
private final UserService userService;
|
||||
|
||||
/**
|
||||
* 执行拦截
|
||||
*
|
||||
* @param joinPoint 切入点
|
||||
* @param authCheck 权限校验注解
|
||||
*/
|
||||
@Around("@annotation(authCheck)")
|
||||
public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
|
||||
String mustRole = authCheck.mustRole();
|
||||
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
|
||||
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
|
||||
// 获取当前登录用户
|
||||
User loginUser = userService.getLoginUser(request);
|
||||
UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
|
||||
// 如果不需要权限,放行
|
||||
if (mustRoleEnum == null) {
|
||||
return joinPoint.proceed();
|
||||
}
|
||||
// 以下的代码:必须有权限,才会通过
|
||||
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole());
|
||||
if (userRoleEnum == null) {
|
||||
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
|
||||
}
|
||||
// 要求必须有管理员权限,但用户没有管理员权限,拒绝
|
||||
if (UserRoleEnum.ADMIN.equals(mustRoleEnum) && !UserRoleEnum.ADMIN.equals(userRoleEnum)) {
|
||||
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
|
||||
}
|
||||
// 通过权限校验,放行
|
||||
return joinPoint.proceed();
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
package edu.whut.smilepicturebackend.config;
|
||||
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.*;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.*;
|
||||
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
@Configuration
|
||||
public class JacksonConfig {
|
||||
|
||||
private static final String DATE_FORMAT = "yyyy-MM-dd";
|
||||
private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||
private static final String TIME_FORMAT = "HH:mm:ss";
|
||||
|
||||
@Bean
|
||||
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
|
||||
return builder -> {
|
||||
// 1) 忽略未知属性
|
||||
builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
|
||||
// 2) 全局日期格式(对于 Date 类型)
|
||||
builder.simpleDateFormat(DATETIME_FORMAT);
|
||||
|
||||
// 3) Java 8 Time 类型的序列化/反序列化
|
||||
JavaTimeModule javaTime = new JavaTimeModule();
|
||||
javaTime.addSerializer(
|
||||
LocalDateTime.class,
|
||||
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))
|
||||
);
|
||||
javaTime.addSerializer(
|
||||
LocalDate.class,
|
||||
new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))
|
||||
);
|
||||
javaTime.addSerializer(
|
||||
LocalTime.class,
|
||||
new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT))
|
||||
);
|
||||
javaTime.addDeserializer(
|
||||
LocalDateTime.class,
|
||||
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))
|
||||
);
|
||||
javaTime.addDeserializer(
|
||||
LocalDate.class,
|
||||
new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT))
|
||||
);
|
||||
javaTime.addDeserializer(
|
||||
LocalTime.class,
|
||||
new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT))
|
||||
);
|
||||
builder.modules(javaTime);
|
||||
|
||||
// 4) 将所有 long / Long 类型序列化成 String
|
||||
SimpleModule longToString = new SimpleModule();
|
||||
longToString.addSerializer(Long.class, ToStringSerializer.instance);
|
||||
longToString.addSerializer(Long.TYPE, ToStringSerializer.instance);
|
||||
builder.modules(longToString);
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package edu.whut.smilepicturebackend.config;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.DbType;
|
||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
@MapperScan("edu.whut.smilepicturebackend.mapper")
|
||||
public class MybatisPlusConfig {
|
||||
|
||||
/**
|
||||
* 拦截器配置
|
||||
*
|
||||
* @return {@link MybatisPlusInterceptor}
|
||||
*/
|
||||
@Bean
|
||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||
// 分页插件
|
||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
|
||||
return interceptor;
|
||||
}
|
||||
}
|
@ -9,7 +9,10 @@ public interface UserConstant {
|
||||
* 用户登录态键
|
||||
*/
|
||||
String USER_LOGIN_STATE = "user_login";
|
||||
|
||||
/**
|
||||
* 创建用户默认密码
|
||||
*/
|
||||
String USER_DEFAULT= "12345678";
|
||||
// region 权限
|
||||
|
||||
/**
|
||||
|
@ -1,18 +1,26 @@
|
||||
package edu.whut.smilepicturebackend.controller;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import edu.whut.smilepicturebackend.annotation.AuthCheck;
|
||||
import edu.whut.smilepicturebackend.common.BaseResponse;
|
||||
import edu.whut.smilepicturebackend.common.DeleteRequest;
|
||||
import edu.whut.smilepicturebackend.common.ResultUtils;
|
||||
import edu.whut.smilepicturebackend.constant.UserConstant;
|
||||
import edu.whut.smilepicturebackend.exception.BusinessException;
|
||||
import edu.whut.smilepicturebackend.exception.ErrorCode;
|
||||
import edu.whut.smilepicturebackend.exception.ThrowUtils;
|
||||
import edu.whut.smilepicturebackend.model.dto.UserLoginRequest;
|
||||
import edu.whut.smilepicturebackend.model.dto.UserRegisterRequest;
|
||||
import edu.whut.smilepicturebackend.model.dto.user.*;
|
||||
import edu.whut.smilepicturebackend.model.entity.User;
|
||||
import edu.whut.smilepicturebackend.model.vo.LoginUserVO;
|
||||
import edu.whut.smilepicturebackend.model.vo.UserVO;
|
||||
import edu.whut.smilepicturebackend.service.UserService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@RestController
|
||||
@ -65,4 +73,87 @@ public class UserController {
|
||||
boolean result = userService.userLogout(request);
|
||||
return ResultUtils.success(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
||||
public BaseResponse<Long> createUser(@RequestBody UserAddRequest userAddRequest) {
|
||||
// 参数非空校验
|
||||
ThrowUtils.throwIf(userAddRequest == null, ErrorCode.PARAMS_ERROR);
|
||||
// 调用 Service 完成业务逻辑
|
||||
long userId = userService.createUser(userAddRequest);
|
||||
return ResultUtils.success(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据 id 获取用户(仅管理员)
|
||||
*/
|
||||
@GetMapping("/get")
|
||||
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
||||
public BaseResponse<User> getUserById(long id) {
|
||||
ThrowUtils.throwIf(id <= 0, ErrorCode.PARAMS_ERROR);
|
||||
User user = userService.getById(id);
|
||||
ThrowUtils.throwIf(user == null, ErrorCode.NOT_FOUND_ERROR);
|
||||
return ResultUtils.success(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据 id 获取包装类(脱敏)
|
||||
*/
|
||||
@GetMapping("/get/vo")
|
||||
public BaseResponse<UserVO> getUserVOById(long id) {
|
||||
BaseResponse<User> response = getUserById(id);
|
||||
User user = response.getData();
|
||||
return ResultUtils.success(userService.getUserVO(user));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*/
|
||||
@PostMapping("/delete")
|
||||
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
||||
public BaseResponse<Boolean> deleteUser(@RequestBody DeleteRequest deleteRequest) {
|
||||
if (deleteRequest == null || deleteRequest.getId() <= 0) {
|
||||
throw new BusinessException(ErrorCode.PARAMS_ERROR);
|
||||
}
|
||||
boolean b = userService.removeById(deleteRequest.getId());
|
||||
return ResultUtils.success(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户
|
||||
*/
|
||||
@PostMapping("/update")
|
||||
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
||||
public BaseResponse<Boolean> updateUser(@RequestBody UserUpdateRequest userUpdateRequest) {
|
||||
if (userUpdateRequest == null || userUpdateRequest.getId() == null) {
|
||||
throw new BusinessException(ErrorCode.PARAMS_ERROR);
|
||||
}
|
||||
User user = new User();
|
||||
BeanUtils.copyProperties(userUpdateRequest, user);
|
||||
boolean result = userService.updateById(user);
|
||||
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
|
||||
return ResultUtils.success(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页获取用户封装列表(仅管理员)
|
||||
*
|
||||
* @param userQueryRequest 查询请求参数
|
||||
*/
|
||||
@PostMapping("/list/page/vo")
|
||||
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
||||
public BaseResponse<Page<UserVO>> listUserVOByPage(@RequestBody UserQueryRequest userQueryRequest) {
|
||||
ThrowUtils.throwIf(userQueryRequest == null, ErrorCode.PARAMS_ERROR);
|
||||
long current = userQueryRequest.getCurrent(); //页号
|
||||
long pageSize = userQueryRequest.getPageSize();
|
||||
Page<User> userPage = userService.page(new Page<>(current, pageSize),
|
||||
userService.getQueryWrapper(userQueryRequest));
|
||||
Page<UserVO> userVOPage = new Page<>(current, pageSize, userPage.getTotal());
|
||||
List<UserVO> userVOList = userService.getUserVOList(userPage.getRecords());
|
||||
userVOPage.setRecords(userVOList);
|
||||
return ResultUtils.success(userVOPage);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,39 @@
|
||||
package edu.whut.smilepicturebackend.model.dto.user;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 用户创建请求
|
||||
*/
|
||||
@Data
|
||||
public class UserAddRequest implements Serializable {
|
||||
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
private String userAccount;
|
||||
|
||||
/**
|
||||
* 用户头像
|
||||
*/
|
||||
private String userAvatar;
|
||||
|
||||
/**
|
||||
* 用户简介
|
||||
*/
|
||||
private String userProfile;
|
||||
|
||||
/**
|
||||
* 用户角色: user, admin
|
||||
*/
|
||||
private String userRole;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package edu.whut.smilepicturebackend.model.dto;
|
||||
package edu.whut.smilepicturebackend.model.dto.user;
|
||||
|
||||
import lombok.Data;
|
||||
|
@ -0,0 +1,44 @@
|
||||
package edu.whut.smilepicturebackend.model.dto.user;
|
||||
|
||||
|
||||
import edu.whut.smilepicturebackend.common.PageRequest;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 用户查询请求
|
||||
*/
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class UserQueryRequest extends PageRequest implements Serializable {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
private String userAccount;
|
||||
|
||||
/**
|
||||
* 简介
|
||||
*/
|
||||
private String userProfile;
|
||||
|
||||
/**
|
||||
* 用户角色:user/admin/ban
|
||||
*/
|
||||
private String userRole;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package edu.whut.smilepicturebackend.model.dto;
|
||||
package edu.whut.smilepicturebackend.model.dto.user;
|
||||
|
||||
import lombok.Data;
|
||||
|
@ -0,0 +1,39 @@
|
||||
package edu.whut.smilepicturebackend.model.dto.user;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 更新用户请求
|
||||
*/
|
||||
@Data
|
||||
public class UserUpdateRequest implements Serializable {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 用户头像
|
||||
*/
|
||||
private String userAvatar;
|
||||
|
||||
/**
|
||||
* 简介
|
||||
*/
|
||||
private String userProfile;
|
||||
|
||||
/**
|
||||
* 用户角色:user/admin
|
||||
*/
|
||||
private String userRole;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package edu.whut.smilepicturebackend.model.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 用户视图(脱敏)
|
||||
*/
|
||||
@Data
|
||||
public class UserVO implements Serializable {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
private String userAccount;
|
||||
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 用户头像
|
||||
*/
|
||||
private String userAvatar;
|
||||
|
||||
/**
|
||||
* 用户简介
|
||||
*/
|
||||
private String userProfile;
|
||||
|
||||
/**
|
||||
* 用户角色:user/admin
|
||||
*/
|
||||
private String userRole;
|
||||
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
@ -1,10 +1,15 @@
|
||||
package edu.whut.smilepicturebackend.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import edu.whut.smilepicturebackend.model.dto.user.UserAddRequest;
|
||||
import edu.whut.smilepicturebackend.model.dto.user.UserQueryRequest;
|
||||
import edu.whut.smilepicturebackend.model.entity.User;
|
||||
import edu.whut.smilepicturebackend.model.vo.LoginUserVO;
|
||||
import edu.whut.smilepicturebackend.model.vo.UserVO;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 张三
|
||||
@ -68,4 +73,12 @@ public interface UserService extends IService<User> {
|
||||
* @return
|
||||
*/
|
||||
boolean userLogout(HttpServletRequest request);
|
||||
|
||||
UserVO getUserVO(User user);
|
||||
|
||||
List<UserVO> getUserVOList(List<User> userList);
|
||||
|
||||
QueryWrapper<User> getQueryWrapper(UserQueryRequest userQueryRequest);
|
||||
|
||||
long createUser(UserAddRequest userAddRequest);
|
||||
}
|
||||
|
@ -1,23 +1,37 @@
|
||||
package edu.whut.smilepicturebackend.service.impl;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import edu.whut.smilepicturebackend.annotation.AuthCheck;
|
||||
import edu.whut.smilepicturebackend.common.BaseResponse;
|
||||
import edu.whut.smilepicturebackend.common.ResultUtils;
|
||||
import edu.whut.smilepicturebackend.constant.UserConstant;
|
||||
import edu.whut.smilepicturebackend.exception.BusinessException;
|
||||
import edu.whut.smilepicturebackend.exception.ErrorCode;
|
||||
import edu.whut.smilepicturebackend.exception.ThrowUtils;
|
||||
import edu.whut.smilepicturebackend.model.dto.user.UserAddRequest;
|
||||
import edu.whut.smilepicturebackend.model.dto.user.UserQueryRequest;
|
||||
import edu.whut.smilepicturebackend.model.entity.User;
|
||||
import edu.whut.smilepicturebackend.model.enums.UserRoleEnum;
|
||||
import edu.whut.smilepicturebackend.model.vo.LoginUserVO;
|
||||
import edu.whut.smilepicturebackend.model.vo.UserVO;
|
||||
import edu.whut.smilepicturebackend.service.UserService;
|
||||
import edu.whut.smilepicturebackend.mapper.UserMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
/**
|
||||
@ -101,26 +115,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
||||
if (userPassword.length() < 8) {
|
||||
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码错误");
|
||||
}
|
||||
// 2. 对用户传递的密码进行加密
|
||||
String encryptPassword = getEncryptPassword(userPassword);
|
||||
// 3. 查询数据库中的用户是否存在
|
||||
LambdaQueryWrapper<User> lambda = new LambdaQueryWrapper<>();
|
||||
lambda
|
||||
.eq(User::getUserAccount, userAccount)
|
||||
.eq(User::getUserPassword, encryptPassword);
|
||||
// 2. 根据账号查询用户(不带密码)
|
||||
LambdaQueryWrapper<User> lambda = Wrappers.lambdaQuery();
|
||||
lambda.eq(User::getUserAccount, userAccount);
|
||||
User user = this.baseMapper.selectOne(lambda);
|
||||
// 不存在,抛异常
|
||||
if (user == null) {
|
||||
log.info("user login failed, userAccount cannot match userPassword");
|
||||
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在或者密码错误");
|
||||
}
|
||||
// 3. 用 BCryptPasswordEncoder 去校验明文密码 vs 数据库里存的加密密码
|
||||
if (!passwordEncoder.matches(userPassword, user.getUserPassword())) {
|
||||
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在或者密码错误");
|
||||
}
|
||||
// 4. 保存用户的登录态
|
||||
request.getSession().setAttribute(UserConstant.USER_LOGIN_STATE, user);
|
||||
return this.getLoginUserVO(user);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取脱敏类的用户信息
|
||||
* 获取脱敏后的用户信息(无密码)
|
||||
*
|
||||
* @param user 用户
|
||||
* @return 脱敏后的用户信息
|
||||
@ -135,6 +147,38 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
||||
return loginUserVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得脱敏后的用户信息(无密码、更新、编辑时间)
|
||||
*
|
||||
* @param user
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public UserVO getUserVO(User user) {
|
||||
if (user == null) {
|
||||
return null;
|
||||
}
|
||||
UserVO userVO = new UserVO();
|
||||
BeanUtil.copyProperties(user, userVO);
|
||||
return userVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取脱敏后的用户列表
|
||||
*
|
||||
* @param userList
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<UserVO> getUserVOList(List<User> userList) {
|
||||
if (CollUtil.isEmpty(userList)) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return userList.stream()
|
||||
.map(this::getUserVO)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getLoginUser(HttpServletRequest request) {
|
||||
// 判断是否已经登录
|
||||
@ -169,6 +213,53 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
||||
request.getSession().removeAttribute(UserConstant.USER_LOGIN_STATE);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询条件
|
||||
* @param userQueryRequest
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public QueryWrapper<User> getQueryWrapper(UserQueryRequest userQueryRequest) {
|
||||
if (userQueryRequest == null) {
|
||||
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
|
||||
}
|
||||
Long id = userQueryRequest.getId();
|
||||
String userName = userQueryRequest.getUserName();
|
||||
String userAccount = userQueryRequest.getUserAccount();
|
||||
String userProfile = userQueryRequest.getUserProfile();
|
||||
String userRole = userQueryRequest.getUserRole();
|
||||
String sortField = userQueryRequest.getSortField();
|
||||
String sortOrder = userQueryRequest.getSortOrder();
|
||||
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq(ObjUtil.isNotNull(id), "id", id);
|
||||
queryWrapper.eq(StrUtil.isNotBlank(userRole), "userRole", userRole);
|
||||
queryWrapper.like(StrUtil.isNotBlank(userAccount), "userAccount", userAccount);
|
||||
queryWrapper.like(StrUtil.isNotBlank(userName), "userName", userName);
|
||||
queryWrapper.like(StrUtil.isNotBlank(userProfile), "userProfile", userProfile);
|
||||
queryWrapper.orderBy(StrUtil.isNotEmpty(sortField), sortOrder.equals("ascend"), sortField);
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
@Override
|
||||
public long createUser(UserAddRequest req) {
|
||||
// 1. DTO -> entity
|
||||
User user = new User();
|
||||
BeanUtil.copyProperties(req, user);
|
||||
|
||||
// 2. 设定默认密码并加密
|
||||
String encoded = passwordEncoder.encode(UserConstant.USER_DEFAULT);
|
||||
user.setUserPassword(encoded);
|
||||
|
||||
// 3.插入数据库
|
||||
boolean result = this.save(user);
|
||||
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
|
||||
return user.getId();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user