You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dsl3/service/impl/UserInfoServiceImpl.java

176 lines
6.8 KiB

package com.aurora.service.impl;
import com.aurora.model.dto.PageResultDTO;
import com.aurora.model.dto.UserDetailsDTO;
import com.aurora.model.dto.UserInfoDTO;
import com.aurora.model.dto.UserOnlineDTO;
import com.aurora.entity.UserAuth;
import com.aurora.entity.UserInfo;
import com.aurora.entity.UserRole;
import com.aurora.enums.FilePathEnum;
import com.aurora.exception.BizException;
import com.aurora.mapper.UserAuthMapper;
import com.aurora.mapper.UserInfoMapper;
import com.aurora.service.RedisService;
import com.aurora.service.TokenService;
import com.aurora.service.UserInfoService;
import com.aurora.service.UserRoleService;
import com.aurora.strategy.context.UploadStrategyContext;
import com.aurora.util.BeanCopyUtil;
import com.aurora.util.UserUtil;
import com.aurora.model.vo.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
import java.util.stream.Collectors;
import static com.aurora.constant.RedisConstant.USER_CODE_KEY;
import static com.aurora.util.PageUtil.getLimitCurrent;
import static com.aurora.util.PageUtil.getSize;
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private UserAuthMapper userAuthMapper;
@Autowired
private TokenService tokenService;
@Autowired
private RedisService redisService;
@Autowired
private UserRoleService userRoleService;
@Autowired
private UploadStrategyContext uploadStrategyContext;
@Transactional(rollbackFor = Exception.class)
@Override
public void updateUserInfo(UserInfoVO userInfoVO) {
UserInfo userInfo = UserInfo.builder()
.id(UserUtil.getUserDetailsDTO().getUserInfoId())
.nickname(userInfoVO.getNickname())
.intro(userInfoVO.getIntro())
.website(userInfoVO.getWebsite())
.build();
userInfoMapper.updateById(userInfo);
}
@Override
public String updateUserAvatar(MultipartFile file) {
String avatar = uploadStrategyContext.executeUploadStrategy(file, FilePathEnum.AVATAR.getPath());
UserInfo userInfo = UserInfo.builder()
.id(UserUtil.getUserDetailsDTO().getUserInfoId())
.avatar(avatar)
.build();
userInfoMapper.updateById(userInfo);
return avatar;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void saveUserEmail(EmailVO emailVO) {
if (Objects.isNull(redisService.get(USER_CODE_KEY + emailVO.getEmail()))) {
throw new BizException("验证码错误");
}
if (!emailVO.getCode().equals(redisService.get(USER_CODE_KEY + emailVO.getEmail()).toString())) {
throw new BizException("验证码错误!");
}
UserInfo userInfo = UserInfo.builder()
.id(UserUtil.getUserDetailsDTO().getUserInfoId())
.email(emailVO.getEmail())
.build();
userInfoMapper.updateById(userInfo);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateUserSubscribe(SubscribeVO subscribeVO) {
UserInfo temp = userInfoMapper.selectOne(new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getId, subscribeVO.getUserId()));
if (StringUtils.isEmpty(temp.getEmail())) {
throw new BizException("邮箱未绑定!");
}
UserInfo userInfo = UserInfo.builder()
.id(subscribeVO.getUserId())
.isSubscribe(subscribeVO.getIsSubscribe())
.build();
userInfoMapper.updateById(userInfo);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateUserRole(UserRoleVO userRoleVO) {
UserInfo userInfo = UserInfo.builder()
.id(userRoleVO.getUserInfoId())
.nickname(userRoleVO.getNickname())
.build();
userInfoMapper.updateById(userInfo);
userRoleService.remove(new LambdaQueryWrapper<UserRole>()
.eq(UserRole::getUserId, userRoleVO.getUserInfoId()));
List<UserRole> userRoleList = userRoleVO.getRoleIds().stream()
.map(roleId -> UserRole.builder()
.roleId(roleId)
.userId(userRoleVO.getUserInfoId())
.build())
.collect(Collectors.toList());
userRoleService.saveBatch(userRoleList);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateUserDisable(UserDisableVO userDisableVO) {
removeOnlineUser(userDisableVO.getId());
UserInfo userInfo = UserInfo.builder()
.id(userDisableVO.getId())
.isDisable(userDisableVO.getIsDisable())
.build();
userInfoMapper.updateById(userInfo);
}
@Override
public PageResultDTO<UserOnlineDTO> listOnlineUsers(ConditionVO conditionVO) {
Map<String, Object> userMaps = redisService.hGetAll("login_user");
Collection<Object> values = userMaps.values();
ArrayList<UserDetailsDTO> userDetailsDTOs = new ArrayList<>();
for (Object value : values) {
userDetailsDTOs.add((UserDetailsDTO) value);
}
List<UserOnlineDTO> userOnlineDTOs = BeanCopyUtil.copyList(userDetailsDTOs, UserOnlineDTO.class);
List<UserOnlineDTO> onlineUsers = userOnlineDTOs.stream()
.filter(item -> StringUtils.isBlank(conditionVO.getKeywords()) || item.getNickname().contains(conditionVO.getKeywords()))
.sorted(Comparator.comparing(UserOnlineDTO::getLastLoginTime).reversed())
.collect(Collectors.toList());
int fromIndex = getLimitCurrent().intValue();
int size = getSize().intValue();
int toIndex = onlineUsers.size() - fromIndex > size ? fromIndex + size : onlineUsers.size();
List<UserOnlineDTO> userOnlineList = onlineUsers.subList(fromIndex, toIndex);
return new PageResultDTO<>(userOnlineList, onlineUsers.size());
}
@Override
public void removeOnlineUser(Integer userInfoId) {
Integer userId = userAuthMapper.selectOne(new LambdaQueryWrapper<UserAuth>().eq(UserAuth::getUserInfoId, userInfoId)).getId();
tokenService.delLoginUser(userId);
}
@Override
public UserInfoDTO getUserInfoById(Integer id) {
UserInfo userInfo = userInfoMapper.selectById(id);
return BeanCopyUtil.copyObject(userInfo, UserInfoDTO.class);
}
}