This commit is contained in:
2025-09-09 11:13:36 +08:00
parent cf50a9f1fa
commit fcd35c78e5
60 changed files with 2753 additions and 2196 deletions
@@ -1,19 +1,27 @@
package com.emotion.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.emotion.common.BasePageRequest;
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;
/**
* 用户服务实现类
@@ -26,12 +34,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
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 IPage<User> getPage(BasePageRequest request) {
public PageResult<UserResponse> getPageWithResponse(UserPageRequest request) {
Page<User> page = new Page<>(request.getCurrent(), request.getSize());
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
@@ -42,6 +52,36 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
.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);
// 排序
@@ -55,160 +95,172 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
wrapper.orderByDesc(User::getCreateTime);
}
return this.page(page, wrapper);
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 User getByAccount(String account) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAccount, account)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
public UserResponse getUserResponseById(String id) {
User user = this.getById(id);
if (user == null || user.getIsDeleted() == 1) {
return null;
}
return convertToResponse(user);
}
@Override
public User getByUsername(String username) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername, username)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public User getByEmail(String email) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getEmail, email)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public User getByPhone(String phone) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getPhone, phone)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public User getByThirdParty(String thirdPartyId, String thirdPartyType) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getThirdPartyId, thirdPartyId)
.eq(User::getThirdPartyType, thirdPartyType)
.eq(User::getIsDeleted, 0);
return this.getOne(wrapper);
}
@Override
public List<User> getByStatus(Integer status) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, status)
.eq(User::getIsDeleted, 0)
.orderByDesc(User::getCreateTime);
return this.list(wrapper);
}
@Override
public List<User> getByMemberLevel(String memberLevel) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getMemberLevel, memberLevel)
.eq(User::getIsDeleted, 0)
.orderByDesc(User::getCreateTime);
return this.list(wrapper);
}
@Override
public List<User> getActiveUsers(Integer days) {
LocalDateTime startTime = LocalDateTime.now().minusDays(days);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getLastActiveTime, startTime)
.eq(User::getIsDeleted, 0)
.orderByDesc(User::getLastActiveTime);
return this.list(wrapper);
}
@Override
public List<User> getNewUsers(Integer days) {
LocalDateTime startTime = LocalDateTime.now().minusDays(days);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getCreateTime, startTime)
.eq(User::getIsDeleted, 0)
.orderByDesc(User::getCreateTime);
return this.list(wrapper);
}
@Override
public boolean updateLastActiveTime(String userId, LocalDateTime lastActiveTime) {
public UserResponse createUserWithResponse(UserCreateRequest request) {
User user = new User();
user.setId(userId);
user.setLastActiveTime(lastActiveTime);
return this.updateById(user);
}
@Override
public boolean updateStatus(String userId, Integer status) {
User user = new User();
user.setId(userId);
user.setStatus(status);
return this.updateById(user);
}
@Override
public boolean updateTotalDays(String userId, Integer totalDays) {
User user = new User();
user.setId(userId);
user.setTotalDays(totalDays);
return this.updateById(user);
}
@Override
public Long countByStatus(Integer status) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, status)
.eq(User::getIsDeleted, 0);
return this.count(wrapper);
}
@Override
public Long countByMemberLevel(String memberLevel) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getMemberLevel, memberLevel)
.eq(User::getIsDeleted, 0);
return this.count(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.setPassword(passwordEncoder.encode(password));
user.setEmail(email);
user.setPhone(phone);
user.setNickname(username);
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 user;
return convertToResponse(user);
}
@Override
public boolean validatePassword(String userId, String password) {
User user = this.getById(userId);
if (user == null) {
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;
}
return passwordEncoder.matches(password, user.getPassword());
}
@Override
public boolean updatePassword(String userId, String newPassword) {
User user = new User();
user.setId(userId);
user.setPassword(passwordEncoder.encode(newPassword));
user.setIsDeleted(1);
return 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;
}
}