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 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().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() .eq(UserRole::getUserId, userRoleVO.getUserInfoId())); List 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 listOnlineUsers(ConditionVO conditionVO) { Map userMaps = redisService.hGetAll("login_user"); Collection values = userMaps.values(); ArrayList userDetailsDTOs = new ArrayList<>(); for (Object value : values) { userDetailsDTOs.add((UserDetailsDTO) value); } List userOnlineDTOs = BeanCopyUtil.copyList(userDetailsDTOs, UserOnlineDTO.class); List 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 userOnlineList = onlineUsers.subList(fromIndex, toIndex); return new PageResultDTO<>(userOnlineList, onlineUsers.size()); } @Override public void removeOnlineUser(Integer userInfoId) { Integer userId = userAuthMapper.selectOne(new LambdaQueryWrapper().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); } }