Files
happy-life-star/backend-single/src/main/java/com/emotion/service/impl/UserServiceImpl.java
T
2025-10-27 23:57:31 +08:00

329 lines
11 KiB
Java

package com.emotion.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.emotion.common.PageResult;
import com.emotion.dto.request.UserCreateRequest;
import com.emotion.dto.request.UserPageRequest;
import com.emotion.dto.request.UserUpdateRequest;
import com.emotion.dto.request.UserProfileUpdateRequest;
import com.emotion.dto.response.UserResponse;
import com.emotion.entity.User;
import com.emotion.mapper.UserMapper;
import com.emotion.service.UserService;
import com.emotion.util.UserContextHolder;
import org.springframework.beans.BeanUtils;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户服务实现类
*
* @author huazhongmin
* @date 2025-07-24
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
private final PasswordEncoder passwordEncoder;
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public UserServiceImpl(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Override
public PageResult<UserResponse> getPageWithResponse(UserPageRequest request) {
Page<User> page = new Page<>(request.getCurrent(), request.getSize());
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
// 关键词搜索
if (StringUtils.hasText(request.getKeyword())) {
wrapper.and(w -> w.like(User::getUsername, request.getKeyword())
.or().like(User::getNickname, request.getKeyword())
.or().like(User::getEmail, request.getKeyword()));
}
// 账号查询
if (StringUtils.hasText(request.getAccount())) {
wrapper.eq(User::getAccount, request.getAccount());
}
// 用户名查询
if (StringUtils.hasText(request.getUsername())) {
wrapper.like(User::getUsername, request.getUsername());
}
// 邮箱查询
if (StringUtils.hasText(request.getEmail())) {
wrapper.eq(User::getEmail, request.getEmail());
}
// 手机号查询
if (StringUtils.hasText(request.getPhone())) {
wrapper.eq(User::getPhone, request.getPhone());
}
// 状态查询
if (request.getStatus() != null) {
wrapper.eq(User::getStatus, request.getStatus());
}
// 会员等级查询
if (StringUtils.hasText(request.getMemberLevel())) {
wrapper.eq(User::getMemberLevel, request.getMemberLevel());
}
wrapper.eq(User::getIsDeleted, 0);
// 排序
if (StringUtils.hasText(request.getOrderBy())) {
if ("asc".equalsIgnoreCase(request.getOrderDirection())) {
wrapper.orderByAsc(User::getCreateTime);
} else {
wrapper.orderByDesc(User::getCreateTime);
}
} else {
wrapper.orderByDesc(User::getCreateTime);
}
Page<User> resultPage = this.page(page, wrapper);
List<UserResponse> userResponses = resultPage.getRecords().stream()
.map(this::convertToResponse)
.collect(Collectors.toList());
PageResult<UserResponse> pageResult = new PageResult<>();
pageResult.setCurrent(resultPage.getCurrent());
pageResult.setSize(resultPage.getSize());
pageResult.setTotal(resultPage.getTotal());
pageResult.setPages(resultPage.getPages());
pageResult.setRecords(userResponses);
return pageResult;
}
@Override
public UserResponse getUserResponseById(String id) {
User user = this.getById(id);
if (user == null || user.getIsDeleted() == 1) {
return null;
}
return convertToResponse(user);
}
@Override
public UserResponse createUserWithResponse(UserCreateRequest request) {
User user = new User();
user.setAccount(request.getAccount());
user.setUsername(request.getUsername());
user.setPassword(passwordEncoder.encode(request.getPassword()));
user.setEmail(request.getEmail());
user.setPhone(request.getPhone());
user.setNickname(request.getUsername());
user.setMemberLevel("free");
user.setStatus(1);
user.setIsVerified(0);
user.setLastActiveTime(LocalDateTime.now());
this.save(user);
return convertToResponse(user);
}
@Override
public UserResponse updateUserWithResponse(UserUpdateRequest request) {
User user = this.getById(request.getId());
if (user == null || user.getIsDeleted() == 1) {
return null;
}
// 只更新非空字段
if (StringUtils.hasText(request.getUsername())) {
user.setUsername(request.getUsername());
}
if (StringUtils.hasText(request.getNickname())) {
user.setNickname(request.getNickname());
}
if (StringUtils.hasText(request.getEmail())) {
user.setEmail(request.getEmail());
}
if (StringUtils.hasText(request.getPhone())) {
user.setPhone(request.getPhone());
}
if (StringUtils.hasText(request.getAvatar())) {
user.setAvatar(request.getAvatar());
}
if (request.getBirthDate() != null) {
user.setBirthDate(request.getBirthDate());
}
if (StringUtils.hasText(request.getLocation())) {
user.setLocation(request.getLocation());
}
if (StringUtils.hasText(request.getBio())) {
user.setBio(request.getBio());
}
if (request.getStatus() != null) {
user.setStatus(request.getStatus());
}
if (StringUtils.hasText(request.getMemberLevel())) {
user.setMemberLevel(request.getMemberLevel());
}
this.updateById(user);
return convertToResponse(user);
}
@Override
public UserResponse updateCurrentUserProfileWithResponse(UserProfileUpdateRequest request) {
// 从UserContextHolder获取当前用户ID
String currentUserId = UserContextHolder.getCurrentUserId();
if (currentUserId == null) {
return null;
}
User user = this.getById(currentUserId);
if (user == null || user.getIsDeleted() == 1) {
return null;
}
// 只更新非空字段
if (StringUtils.hasText(request.getNickname())) {
user.setNickname(request.getNickname());
}
if (StringUtils.hasText(request.getEmail())) {
user.setEmail(request.getEmail());
}
if (StringUtils.hasText(request.getPhone())) {
user.setPhone(request.getPhone());
}
if (StringUtils.hasText(request.getAvatar())) {
user.setAvatar(request.getAvatar());
}
if (request.getBirthDate() != null) {
user.setBirthDate(request.getBirthDate());
}
if (StringUtils.hasText(request.getLocation())) {
user.setLocation(request.getLocation());
}
if (StringUtils.hasText(request.getBio())) {
user.setBio(request.getBio());
}
this.updateById(user);
return convertToResponse(user);
}
@Override
public UserResponse getCurrentUserProfileWithResponse() {
// 从UserContextHolder获取当前用户ID
String currentUserId = UserContextHolder.getCurrentUserId();
if (currentUserId == null) {
return null;
}
User user = this.getById(currentUserId);
if (user == null || user.getIsDeleted() == 1) {
return null;
}
return convertToResponse(user);
}
@Override
public boolean deleteUser(String id) {
User user = this.getById(id);
if (user == null || user.getIsDeleted() == 1) {
return false;
}
user.setIsDeleted(1);
return this.updateById(user);
}
@Override
public User getByAccount(String account) {
if (!StringUtils.hasText(account)) {
return null;
}
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAccount, account)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public User getByEmail(String email) {
if (!StringUtils.hasText(email)) {
return null;
}
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getEmail, email)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public User getByPhone(String phone) {
if (!StringUtils.hasText(phone)) {
return null;
}
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getPhone, phone)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public User createUser(String account, String username, String password, String email, String phone) {
User user = new User();
user.setAccount(account);
user.setUsername(username);
user.setNickname(username); // 默认昵称与用户名相同
user.setPassword(passwordEncoder.encode(password)); // 加密密码
user.setEmail(email);
user.setPhone(phone);
user.setMemberLevel("free"); // 默认免费会员
user.setStatus(1); // 默认启用
user.setIsVerified(0); // 默认未验证
user.setLastActiveTime(LocalDateTime.now());
this.save(user);
return user;
}
@Override
public void updateLastActiveTime(String userId, LocalDateTime lastActiveTime) {
if (!StringUtils.hasText(userId) || lastActiveTime == null) {
return;
}
User user = this.getById(userId);
if (user != null && user.getIsDeleted() == 0) {
user.setLastActiveTime(lastActiveTime);
this.updateById(user);
}
}
/**
* 转换为响应对象
*/
private UserResponse convertToResponse(User user) {
UserResponse response = new UserResponse();
BeanUtils.copyProperties(user, response);
response.setId(user.getId());
if (user.getCreateTime() != null) {
response.setCreateTime(user.getCreateTime().format(DATE_TIME_FORMATTER));
}
if (user.getUpdateTime() != null) {
response.setUpdateTime(user.getUpdateTime().format(DATE_TIME_FORMATTER));
}
if (user.getLastActiveTime() != null) {
response.setLastActiveTime(user.getLastActiveTime().format(DATE_TIME_FORMATTER));
}
return response;
}
}