371 lines
12 KiB
Java
371 lines
12 KiB
Java
package com.imooc.service.impl;
|
|
|
|
import com.github.pagehelper.PageHelper;
|
|
import com.google.common.collect.Maps;
|
|
import com.imooc.bo.UpdatedUserBO;
|
|
import com.imooc.enums.Sex;
|
|
import com.imooc.enums.UserInfoModifyType;
|
|
import com.imooc.enums.YesOrNo;
|
|
import com.imooc.exceptions.GraceException;
|
|
import com.imooc.grace.result.ResponseStatusEnum;
|
|
import com.imooc.mapper.FansMapper;
|
|
import com.imooc.mapper.UserMemberMapper;
|
|
import com.imooc.mapper.UsersMapper;
|
|
import com.imooc.mo.Token;
|
|
import com.imooc.pojo.Fans;
|
|
import com.imooc.pojo.UserMember;
|
|
import com.imooc.pojo.Users;
|
|
import com.imooc.service.UserService;
|
|
import com.imooc.utils.*;
|
|
import com.imooc.vo.FansVO;
|
|
import com.imooc.vo.UsersVO;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.n3r.idworker.Sid;
|
|
import org.redisson.api.RedissonClient;
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
import org.springframework.http.HttpStatus;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.util.LinkedMultiValueMap;
|
|
import org.springframework.util.MultiValueMap;
|
|
import tk.mybatis.mapper.entity.Example;
|
|
import javax.annotation.Resource;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
import static com.imooc.base.BaseInfoProperties.REDIS_USER_TOKEN;
|
|
import static com.imooc.base.BaseInfoProperties.MOBILE_SMSCODE;
|
|
|
|
/**
|
|
* @author vercen
|
|
* @version 1.0
|
|
* @date 2023/5/25 21:02
|
|
*/
|
|
@Slf4j
|
|
@Service
|
|
public class UserServiceImpl implements UserService {
|
|
@Autowired
|
|
private UsersMapper usersMapper;
|
|
|
|
@Resource
|
|
private PasswordEncoder passwordEncoder;
|
|
|
|
@Autowired
|
|
private UserMemberMapper userMemberMapper;
|
|
|
|
@Autowired
|
|
private FansMapper fansMapper;
|
|
|
|
//@Autowired
|
|
//public RedisOperator redis;
|
|
|
|
@Resource(name = "redisTemplate")
|
|
private RedisTemplate<String, Object> redisTemplate;
|
|
|
|
@Autowired
|
|
private Sid sid;
|
|
private static final String USER_FACE1 = "http://43.143.227.203:29000/bucket/logo.png";
|
|
|
|
@Override
|
|
public Users queryMobileIsExist(String mobile) {
|
|
Example userExample = new Example(Users.class);
|
|
Example.Criteria criteria = userExample.createCriteria();
|
|
criteria.andEqualTo("mobile", mobile);
|
|
Users user = usersMapper.selectOneByExample(userExample);
|
|
return user;
|
|
}
|
|
|
|
@Override
|
|
public Users createUser(String mobile) {
|
|
// 获得全局唯一主键
|
|
String userId = sid.nextShort();
|
|
|
|
Users user = new Users();
|
|
user.setId(userId);
|
|
user.setPassword(mobile);
|
|
user.setMobile(mobile);
|
|
user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile));
|
|
user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile));
|
|
user.setFace(USER_FACE1);
|
|
|
|
user.setBirthday(DateUtil.stringToDate("1999-01-01"));
|
|
user.setSex(Sex.secret.type);
|
|
user.setBgImg(USER_FACE1);
|
|
user.setCountry("中国");
|
|
user.setProvince("");
|
|
user.setCity("");
|
|
user.setDistrict("");
|
|
user.setDescription("这家伙很懒,什么都没留下~");
|
|
user.setCanImoocNumBeUpdated(YesOrNo.YES.type);
|
|
user.setCreatedTime(new Date());
|
|
user.setUpdatedTime(new Date());
|
|
|
|
usersMapper.insert(user);
|
|
|
|
return user;
|
|
}
|
|
|
|
@Override
|
|
public Users getUser(String userId) {
|
|
Users users = usersMapper.selectByPrimaryKey(userId);
|
|
return users;
|
|
}
|
|
|
|
|
|
@Transactional
|
|
@Override
|
|
public Users updateUserInfo(UpdatedUserBO updatedUserBO) {
|
|
|
|
Users users = new Users();
|
|
BeanUtils.copyProperties(updatedUserBO, users);
|
|
usersMapper.updateByPrimaryKeySelective(users);
|
|
return getUser(updatedUserBO.getId());
|
|
}
|
|
|
|
@Transactional
|
|
@Override
|
|
public Users updateUserInfo(UpdatedUserBO updatedUserBO, Integer type) {
|
|
if (type == UserInfoModifyType.NICKNAME.type) {
|
|
usersMapper.updateNickname(updatedUserBO);
|
|
}
|
|
if (type == UserInfoModifyType.SEX.type) {
|
|
usersMapper.updateSex(updatedUserBO);
|
|
}
|
|
if (type == UserInfoModifyType.BIRTHDAY.type) {
|
|
usersMapper.updateBirthday(updatedUserBO);
|
|
}
|
|
if (type == UserInfoModifyType.LOCATION.type) {
|
|
usersMapper.updateLocation(updatedUserBO);
|
|
}
|
|
if (type == UserInfoModifyType.DESC.type) {
|
|
usersMapper.updateDescription(updatedUserBO);
|
|
}
|
|
if (type == UserInfoModifyType.IMOOCNUM.type) {
|
|
if (updatedUserBO.getCanImoocNumBeUpdated() == YesOrNo.NO.type) {
|
|
GraceException.display(ResponseStatusEnum.USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR);
|
|
}
|
|
// 校验唯一性
|
|
List<UsersVO> haveImooc = usersMapper.selectByImoocNum(updatedUserBO.getImoocNum());
|
|
if (haveImooc != null && !haveImooc.isEmpty()) {
|
|
GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_IMOOCNUM_EXIST_ERROR);
|
|
}
|
|
usersMapper.updateVnum(updatedUserBO);
|
|
}
|
|
|
|
|
|
return getUser(updatedUserBO.getId());
|
|
|
|
// Example example = new Example(Users.class);
|
|
// Example.Criteria criteria = example.createCriteria();
|
|
// if (type == UserInfoModifyType.NICKNAME.type) {
|
|
// criteria.andEqualTo("nickname", updatedUserBO.getNickname());
|
|
// Users user = usersMapper.selectOneByExample(example);
|
|
// if (user != null) {
|
|
// GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_NICKNAME_EXIST_ERROR);
|
|
// }
|
|
// }
|
|
//
|
|
// if (type == UserInfoModifyType.IMOOCNUM.type) {
|
|
// criteria.andEqualTo("imoocNum", updatedUserBO.getImoocNum());
|
|
// Users user = usersMapper.selectOneByExample(example);
|
|
// if (user != null) {
|
|
// GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_NICKNAME_EXIST_ERROR);
|
|
// }
|
|
//
|
|
// Users tempUser = getUser(updatedUserBO.getId());
|
|
// if (tempUser.getCanImoocNumBeUpdated() == YesOrNo.NO.type) {
|
|
// GraceException.display(ResponseStatusEnum.USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR);
|
|
// }
|
|
//
|
|
// updatedUserBO.setCanImoocNumBeUpdated(YesOrNo.NO.type);
|
|
// }
|
|
//
|
|
// return updateUserInfo(updatedUserBO);
|
|
|
|
}
|
|
|
|
@Transactional(rollbackFor = RuntimeException.class)
|
|
@Override
|
|
public Map<String, Object> createUserNew(String mobile) {
|
|
// 获得全局唯一主键
|
|
String userId = sid.nextShort();
|
|
// 创建短视频系统账号
|
|
Users user = new Users();
|
|
user.setId(userId);
|
|
user.setPassword(passwordEncoder.encode(mobile));
|
|
user.setMobile(mobile);
|
|
user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile));
|
|
user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile));
|
|
user.setFace(USER_FACE1);
|
|
user.setBirthday(DateUtil.stringToDate("1999-01-01"));
|
|
user.setSex(Sex.secret.type);
|
|
user.setBgImg(USER_FACE1);
|
|
user.setCountry("中国");
|
|
user.setProvince("");
|
|
user.setCity("");
|
|
user.setDistrict("");
|
|
user.setDescription("这家伙很懒,什么都没留下~");
|
|
user.setBgImg("");
|
|
user.setCanImoocNumBeUpdated(YesOrNo.YES.type);
|
|
user.setCreatedTime(new Date());
|
|
user.setUpdatedTime(new Date());
|
|
|
|
int row = usersMapper.insert(user);
|
|
|
|
if (row > 0) {
|
|
Map<String, Object> result = Maps.newHashMap();
|
|
result.put("user", user);
|
|
// 创建商城系统账号,获取商城系统token
|
|
String url = "http://localhost:8888/buyer/passport/member/registerFromTik";
|
|
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
|
|
param.add("userName", mobile);
|
|
param.add("password", mobile);
|
|
param.add("mobilePhone", mobile);
|
|
param.add("userId", user.getId());
|
|
|
|
RestTemplateUtil.post(null, null, null, url, param, String.class, t -> {
|
|
if (t.getStatusCode() == HttpStatus.OK) {
|
|
String content = t.getBody();
|
|
if (StringUtils.isNotBlank(content)) {
|
|
Token token = GsonUtil.jsonToBean(content, Token.class);
|
|
result.put("token", token);
|
|
} else {
|
|
throw new RuntimeException("账号注册异常");
|
|
}
|
|
} else {
|
|
throw new RuntimeException("账号注册异常");
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Token getShopToken(String userId) {
|
|
Token[] tokens = { null };
|
|
String url = "http://localhost:8888/buyer/passport/member/getTokenFromTik";
|
|
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
|
|
param.add("userId", userId);
|
|
RestTemplateUtil.post(null, null, null, url, param, String.class, t -> {
|
|
if (t.getStatusCode() == HttpStatus.OK) {
|
|
String content = t.getBody();
|
|
if (StringUtils.isNotBlank(content)) {
|
|
tokens[0] = GsonUtil.jsonToBean(content, Token.class);
|
|
} else {
|
|
throw new RuntimeException("账号注册异常");
|
|
}
|
|
} else {
|
|
throw new RuntimeException("账号注册异常");
|
|
}
|
|
});
|
|
return tokens[0];
|
|
}
|
|
|
|
@Transactional(rollbackFor = RuntimeException.class)
|
|
@Override
|
|
public Users createUserFromShop(String mobile, String memberId) {
|
|
String tempMobile = StringUtils.isBlank(mobile) ? "unionID" : mobile;
|
|
// 获得全局唯一主键
|
|
String userId = sid.nextShort();
|
|
Users user = new Users();
|
|
user.setId(userId);
|
|
user.setPassword(tempMobile);
|
|
user.setMobile(tempMobile);
|
|
user.setNickname("用户:" + DesensitizationUtil.commonDisplay(tempMobile));
|
|
user.setImoocNum("WZJ" + (System.currentTimeMillis() / 1000) + (int)(Math.random() * 1000));
|
|
user.setFace(USER_FACE1);
|
|
user.setBirthday(DateUtil.stringToDate("1999-01-01"));
|
|
user.setSex(Sex.secret.type);
|
|
user.setBgImg("https://wuzhongjie.com.cn/download/logo.png"); // 测试用地址
|
|
user.setCountry("中国");
|
|
user.setProvince("");
|
|
user.setCity("");
|
|
user.setDistrict("");
|
|
user.setDescription("这家伙很懒,什么都没留下~");
|
|
user.setCanImoocNumBeUpdated(YesOrNo.YES.type);
|
|
user.setCreatedTime(new Date());
|
|
user.setUpdatedTime(new Date());
|
|
|
|
// 短视频用户与商城账号关系
|
|
UserMember userMember = new UserMember();
|
|
userMember.setUserId(user.getId());
|
|
userMember.setMemberId(memberId);
|
|
|
|
if (usersMapper.insert(user) > 0 && userMemberMapper.insert(userMember) > 0) {
|
|
return user;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public String getUserInfoFromShop(String memberId) {
|
|
return Optional.ofNullable(userMemberMapper.getUserByMemberId(memberId))//
|
|
.map(user -> {
|
|
String uToken = UUID.randomUUID().toString();
|
|
//redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken);
|
|
redisTemplate.opsForValue().set(REDIS_USER_TOKEN + ":" + user.getId(), uToken);
|
|
// 返回给前端
|
|
UsersVO usersVO = new UsersVO();
|
|
BeanUtils.copyProperties(user, usersVO);
|
|
usersVO.setUserToken(uToken);
|
|
|
|
return GsonUtil.beanToJson(usersVO);
|
|
})//
|
|
.orElseGet(() -> StringUtils.EMPTY);
|
|
}
|
|
|
|
@Override
|
|
public List<UsersVO> searchByNickname(String nickname, Integer page, Integer pageSize, String currentUserId) {
|
|
try {
|
|
PageHelper.startPage(page, pageSize);
|
|
List<UsersVO> userList = usersMapper.searchByNickname(nickname);
|
|
if(currentUserId.isEmpty()){
|
|
return userList;
|
|
}
|
|
|
|
// 提取模糊查询出的用户 ID 列表
|
|
List<String> vlogerIds = userList.stream().map(UsersVO::getId).collect(Collectors.toList());
|
|
log.info("用户列表" + vlogerIds);
|
|
|
|
// 获取当前用户关注的
|
|
List<java.util.Map<String, Object>> followedRelations = fansMapper.getFollowedVlogerIds(currentUserId, vlogerIds);
|
|
// 构建 vlogerId 到 is_fan_friend_of_mine 的映射
|
|
java.util.Map<String, Integer> relationMap = followedRelations.stream()
|
|
.collect(Collectors.toMap(
|
|
map -> (String) map.get("vloger_id"),
|
|
map -> (Integer) map.get("is_fan_friend_of_mine")
|
|
));
|
|
Set<String> followedVlogerIds = relationMap.keySet();
|
|
|
|
// 遍历设置每个用户的关注状态及展示状态
|
|
userList.forEach(usersVO -> {
|
|
boolean isFollowed = followedVlogerIds.contains(usersVO.getId());
|
|
usersVO.setIsFollowed(isFollowed);
|
|
if (isFollowed) {
|
|
Integer isFanFriendOfMine = relationMap.get(usersVO.getId());
|
|
if (isFanFriendOfMine != null && isFanFriendOfMine == 1) {
|
|
usersVO.setFollowStatus("互相关注"); // 假设 UsersVO 有此方法设置展示状态
|
|
} else {
|
|
usersVO.setFollowStatus("已关注");
|
|
}
|
|
} else {
|
|
usersVO.setFollowStatus("未关注");
|
|
}
|
|
});
|
|
|
|
log.info("用户列表" + userList);
|
|
return userList;
|
|
} catch (Exception e) {
|
|
log.error("搜索用户时发生异常", e);
|
|
throw new RuntimeException("搜索用户时发生异常", e);
|
|
}
|
|
}
|
|
}
|
|
|