修改vlog

This commit is contained in:
cjh 2025-05-30 15:25:48 +08:00
parent 00104f0580
commit 378aa9df54
11 changed files with 300 additions and 754 deletions

View File

@ -37,7 +37,7 @@ public class UsersVO {
private Integer totalLikeMeCounts; private Integer totalLikeMeCounts;
//private Token shopToken; //private Token shopToken;
private boolean IsFollowed; // 关注状态 private boolean isFollowed; // 关注状态
private String FollowStatus; // 关注状态 private String followStatus; // 关注状态
} }

View File

@ -32,4 +32,14 @@ public enum UserInfoModifyType {
GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_ERROR); GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_ERROR);
} }
} }
public static UserInfoModifyType getTypeByValue(Integer type) {
for (UserInfoModifyType modifyType : UserInfoModifyType.values()) {
if (modifyType.type.equals(type)) {
return modifyType;
}
}
GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_ERROR);
return null;
}
} }

View File

@ -1,5 +1,6 @@
package com.wzj.soopin.content.mapper.mapper; package com.wzj.soopin.content.mapper.mapper;
import com.wzj.soopin.content.domain.po.UserMember;
import com.wzj.soopin.content.domain.po.Users; import com.wzj.soopin.content.domain.po.Users;
import com.wzj.soopin.content.domain.vo.UsersVO; import com.wzj.soopin.content.domain.vo.UsersVO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -9,7 +10,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
* 短视频用户与商城会员数据处理层 * 短视频用户与商城会员数据处理层
*/ */
@Mapper @Mapper
public interface UserMemberMapper extends BaseMapperPlus<Users, UsersVO> { public interface UserMemberMapper extends BaseMapperPlus<UserMember, UserMember> {
Users getUserByMemberId(String memberId); Users getUserByMemberId(String memberId);
} }

View File

@ -36,4 +36,6 @@ public interface UsersMapper extends BaseMapper<Users> {
Users selectByPrimaryKey(String userId); Users selectByPrimaryKey(String userId);
void updateByPrimaryKeySelective(Users users); void updateByPrimaryKeySelective(Users users);
int inset(Users user);
} }

View File

@ -1,6 +1,8 @@
package com.wzj.soopin.content.mapper.mapper; package com.wzj.soopin.content.mapper.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wzj.soopin.content.domain.po.Vlog;
import com.wzj.soopin.content.domain.vo.IndexVlogVO; import com.wzj.soopin.content.domain.vo.IndexVlogVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -12,7 +14,7 @@ import java.util.Map;
//public interface VlogMapper extends MyMapper<Vlog> { //public interface VlogMapper extends MyMapper<Vlog> {
//} //}
@Repository @Repository
public interface VlogMapper { public interface VlogMapper extends BaseMapper<Vlog> {
// public List<IndexVlogVO> updateVlogStatus(@Param("paramMap") Map<String, Object> map); // public List<IndexVlogVO> updateVlogStatus(@Param("paramMap") Map<String, Object> map);
/** /**
* 通用动态更新方法 * 通用动态更新方法

View File

@ -13,5 +13,7 @@ public interface MessageRepository {
// 通过实现Repository自定义条件查询 // 通过实现Repository自定义条件查询
List<MessageMO> findAllByToUserIdEqualsOrderByCreateTimeDesc(String toUserId, List<MessageMO> findAllByToUserIdEqualsOrderByCreateTimeDesc(String toUserId,
Pageable pageable); Pageable pageable);
void save(MessageMO messageMO);
// void deleteAllByFromUserIdAndToUserIdAndMsgType(); // void deleteAllByFromUserIdAndToUserIdAndMsgType();
} }

View File

@ -1,7 +1,6 @@
package com.wzj.soopin.content.service; package com.wzj.soopin.content.service;
import com.wzj.soopin.content.domain.vo.FansVO; import com.wzj.soopin.content.utils.PagedGridResult;
import org.dromara.common.mybatis.core.page.TableDataInfo;
public interface FansService { public interface FansService {
@ -23,14 +22,14 @@ public interface FansService {
/** /**
* 查询我关注的博主列表 * 查询我关注的博主列表
*/ */
public TableDataInfo<FansVO> queryMyFollows(String myId, public PagedGridResult queryMyFollows(String myId,
Integer page, Integer page,
Integer pageSize); Integer pageSize);
/** /**
* 查询我的粉丝列表 * 查询我的粉丝列表
*/ */
public TableDataInfo<FansVO> queryMyFans(String myId, public PagedGridResult queryMyFans(String myId,
Integer page, Integer page,
Integer pageSize); Integer pageSize);
} }

View File

@ -1,8 +1,7 @@
package com.wzj.soopin.content.service.impl; package com.wzj.soopin.content.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import com.wzj.soopin.content.domain.base.BaseInfoProperties; import com.wzj.soopin.content.domain.base.BaseInfoProperties;
import com.wzj.soopin.content.domain.bo.CommentBO; import com.wzj.soopin.content.domain.bo.CommentBO;
import com.wzj.soopin.content.domain.po.Comment; import com.wzj.soopin.content.domain.po.Comment;
@ -18,7 +17,6 @@ import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.utils.PagedGridResult; import com.wzj.soopin.content.utils.PagedGridResult;
import com.wzj.soopin.content.utils.Sid; import com.wzj.soopin.content.utils.Sid;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -27,53 +25,39 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class CommentServiceImpl extends BaseInfoProperties implements CommentService { public class CommentServiceImpl extends BaseInfoProperties implements CommentService {
//
@Autowired @Autowired
private CommentMapper commentMapper; private CommentMapper commentMapper;
//
@Autowired @Autowired
private CommentMapperCustom commentMapperCustom; private CommentMapperCustom commentMapperCustom;
//
@Autowired @Autowired
private VlogService vlogService; private VlogService vlogService;
@Autowired @Autowired
private MsgService msgService; private MsgService msgService;
//
@Autowired @Autowired
private Sid sid; private Sid sid;
//
@Override @Override
public CommentVO createComment(CommentBO commentBO) { public CommentVO createComment(CommentBO commentBO) {
String commentId = sid.nextShort(); String commentId = sid.nextShort();
Comment comment = new Comment(); Comment comment = new Comment();
comment.setId(commentId); comment.setId(commentId);
comment.setVlogId(commentBO.getVlogId()); comment.setVlogId(commentBO.getVlogId());
comment.setVlogerId(commentBO.getVlogerId()); comment.setVlogerId(commentBO.getVlogerId());
comment.setCommentUserId(commentBO.getCommentUserId()); comment.setCommentUserId(commentBO.getCommentUserId());
comment.setFatherCommentId(commentBO.getFatherCommentId()); comment.setFatherCommentId(commentBO.getFatherCommentId());
comment.setContent(commentBO.getContent()); comment.setContent(commentBO.getContent());
comment.setLikeCounts(0); comment.setLikeCounts(0);
comment.setCreateTime(new Date()); comment.setCreateTime(new Date());
commentMapper.insert(comment); commentMapper.insert(comment);
// redis操作放在service中评论总数的累加 // redis操作放在service中评论总数的累加
redis.increment(REDIS_VLOG_COMMENT_COUNTS + ":" + commentBO.getVlogId(), 1); redis.increment(REDIS_VLOG_COMMENT_COUNTS + ":" + commentBO.getVlogId(), 1);
// 留言后的最新评论需要返回给前端进行展示 // 留言后的最新评论需要返回给前端进行展示
CommentVO commentVO = new CommentVO(); CommentVO commentVO = new CommentVO();
BeanUtils.copyProperties(comment, commentVO); BeanUtils.copyProperties(comment, commentVO);
// 系统消息评论/回复 // 系统消息评论/回复
Vlog vlog = vlogService.getVlog(commentBO.getVlogId()); Vlog vlog = vlogService.getVlog(commentBO.getVlogId());
Map msgContent = new HashMap(); Map msgContent = new HashMap();
@ -86,33 +70,26 @@ public class CommentServiceImpl extends BaseInfoProperties implements CommentSer
!commentBO.getFatherCommentId().equalsIgnoreCase("0") ) { !commentBO.getFatherCommentId().equalsIgnoreCase("0") ) {
type = MessageEnum.REPLY_YOU.type; type = MessageEnum.REPLY_YOU.type;
} }
msgService.createMsg(commentBO.getCommentUserId(), msgService.createMsg(commentBO.getCommentUserId(),
commentBO.getVlogerId(), commentBO.getVlogerId(),
type, type,
msgContent); msgContent);
//
//
//
return commentVO; return commentVO;
} }
//
@Override
public PagedGridResult queryVlogComments(String vlogId,
String userId,
Integer page,
Integer pageSize) {
@Override
public PagedGridResult queryVlogComments(String vlogId, String userId, Integer page, Integer pageSize) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("vlogId", vlogId); map.put("vlogId", vlogId);
Page<Comment> pageParam = new Page<>(page, pageSize);
PageHelper.startPage(page, pageSize); LambdaQueryWrapper<Comment> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Comment::getVlogId, vlogId);
List<CommentVO> list = commentMapperCustom.getCommentList(map); Page<Comment> commentPage = commentMapper.selectPage(pageParam, queryWrapper);
List<Comment> commentList = commentPage.getRecords();
for (CommentVO cv:list) { List<CommentVO> list = commentList.stream().map(comment -> {
CommentVO cv = new CommentVO();
BeanUtils.copyProperties(comment, cv);
String commentId = cv.getCommentId(); String commentId = cv.getCommentId();
// 当前短视频的某个评论的点赞总数 // 当前短视频的某个评论的点赞总数
String countsStr = redis.getHashValue(REDIS_VLOG_COMMENT_LIKED_COUNTS, commentId); String countsStr = redis.getHashValue(REDIS_VLOG_COMMENT_LIKED_COUNTS, commentId);
Integer counts = 0; Integer counts = 0;
@ -120,34 +97,28 @@ public class CommentServiceImpl extends BaseInfoProperties implements CommentSer
counts = Integer.valueOf(countsStr); counts = Integer.valueOf(countsStr);
} }
cv.setLikeCounts(counts); cv.setLikeCounts(counts);
// 判断当前用户是否点赞过该评论 // 判断当前用户是否点赞过该评论
String doILike = redis.hget(REDIS_USER_LIKE_COMMENT, userId + ":" + commentId); String doILike = redis.hget(REDIS_USER_LIKE_COMMENT, userId + ":" + commentId);
if (StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")) { if (StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")) {
cv.setIsLike(YesOrNo.YES.type); cv.setIsLike(YesOrNo.YES.type);
} }
} return cv;
}).collect(Collectors.toList());
return setterPagedGrid(list, page); return setterPagedGrid(list, page);
} }
@Override @Override
public void deleteComment(String commentUserId, public void deleteComment(String commentUserId, String commentId, String vlogId) {
String commentId, LambdaQueryWrapper<Comment> queryWrapper = new LambdaQueryWrapper<>();
String vlogId) { queryWrapper.eq(Comment::getId, commentId)
.eq(Comment::getCommentUserId, commentUserId);
Comment pendingDelete = new Comment(); commentMapper.delete(queryWrapper);
pendingDelete.setId(commentId);
pendingDelete.setCommentUserId(commentUserId);
commentMapper.delete(pendingDelete);
// 评论总数的累减 // 评论总数的累减
redis.decrement(REDIS_VLOG_COMMENT_COUNTS + ":" + vlogId, 1); redis.decrement(REDIS_VLOG_COMMENT_COUNTS + ":" + vlogId, 1);
} }
@Override @Override
public Comment getComment(String id) { public Comment getComment(String id) {
return commentMapper.selectByPrimaryKey(id); return commentMapper.selectById(id);
} }
} }

View File

@ -1,6 +1,8 @@
package com.wzj.soopin.content.service.impl; package com.wzj.soopin.content.service.impl;
import com.github.pagehelper.PageHelper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.domain.base.BaseInfoProperties; import com.wzj.soopin.content.domain.base.BaseInfoProperties;
import com.wzj.soopin.content.domain.base.RabbitMQConfig; import com.wzj.soopin.content.domain.base.RabbitMQConfig;
import com.wzj.soopin.content.domain.mo.MessageMO; import com.wzj.soopin.content.domain.mo.MessageMO;
@ -28,38 +30,23 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static com.wzj.soopin.content.domain.base.BaseInfoProperties.REDIS_FANS_AND_VLOGGER_RELATIONSHIP;
@Service @Service
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class FansServiceImpl extends BaseInfoProperties implements FansService { public class FansServiceImpl extends BaseInfoProperties implements FansService {
private final FansMapper fansMapper; private final FansMapper fansMapper;
private final FansMapperCustom fansMapperCustom; private final FansMapperCustom fansMapperCustom;
//
private final MsgService msgService; private final MsgService msgService;
private final RabbitTemplate rabbitTemplate; private final RabbitTemplate rabbitTemplate;
//
@Autowired @Autowired
private Sid sid; private Sid sid;
//
@Transactional @Transactional
@Override @Override
public void doFollow(String myId, String vlogerId) { public void doFollow(String myId, String vlogerId) {
String fid = sid.nextShort(); String fid = sid.nextShort();
// Fans fans = new Fans();
// fans.setId(fid);
// fans.setFanId(myId);
// fans.setVlogerId(vlogerId);
// fans.setCreatedTime(new Date());
Fans fans = new Fans(); Fans fans = new Fans();
fans.setId(fid); fans.setId(fid);
fans.setFanId(myId); fans.setFanId(myId);
@ -67,68 +54,46 @@ public class FansServiceImpl extends BaseInfoProperties implements FansService
// 判断对方是否关注我如果关注我那么双方都要互为朋友关系 // 判断对方是否关注我如果关注我那么双方都要互为朋友关系
Fans vloger = queryFansRelationship(vlogerId, myId); Fans vloger = queryFansRelationship(vlogerId, myId);
System.out.println(vloger);
if (vloger != null) { if (vloger != null) {
// fans.setIsFanFriendOfMine(YesOrNo.YES.type);
fans.setIsFanFriendOfMine(YesOrNo.YES.type); fans.setIsFanFriendOfMine(YesOrNo.YES.type);
vloger.setIsFanFriendOfMine(YesOrNo.YES.type); vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
fansMapper.updateById(vloger); fansMapper.updateById(vloger);
} else { } else {
// fans.setIsFanFriendOfMine(YesOrNo.NO.type);
fans.setIsFanFriendOfMine(YesOrNo.NO.type); fans.setIsFanFriendOfMine(YesOrNo.NO.type);
} }
fansMapper.insert(fans); fansMapper.insert(fans);
// 系统消息关注 // 系统消息关注
// msgService.createMsg(myId, vlogerId, MessageEnum.FOLLOW_YOU.type, null);
//优化使用mQEXCHANGE_MSG
MessageMO messageMO = new MessageMO(); MessageMO messageMO = new MessageMO();
messageMO.setFromUserId(myId); messageMO.setFromUserId(myId);
messageMO.setToUserId(vlogerId); messageMO.setToUserId(vlogerId);
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_MSG, "sys.msg." + MessageEnum.FOLLOW_YOU.enValue, JsonUtils.objectToJson(messageMO)); rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_MSG, "sys.msg." + MessageEnum.FOLLOW_YOU.enValue, JsonUtils.objectToJson(messageMO));
} }
public Fans queryFansRelationship(String fanId, String vlogerId) { public Fans queryFansRelationship(String fanId, String vlogerId) {
// Example example = new Example(Fans.class); LambdaQueryWrapper<Fans> queryWrapper = new LambdaQueryWrapper<>();
// Example.Criteria criteria = example.createCriteria(); queryWrapper.eq(Fans::getVlogerId, vlogerId)
// criteria.andEqualTo("vlogerId", vlogerId); .eq(Fans::getFanId, fanId);
// criteria.andEqualTo("fanId", fanId);
return fansMapper.selectOne(queryWrapper);
Map<String, Object> mapexample = new HashMap<>();
mapexample.put("vlogerId", vlogerId);
mapexample.put("fanId", fanId);
List list = fansMapper.selectByExample(mapexample);
Fans fan = null;
if (list != null && list.size() > 0 && !list.isEmpty()) {
fan = (Fans)list.get(0);
}
return fan;
} }
@Transactional @Transactional
@Override @Override
public void doCancel(String myId, String vlogerId) { public void doCancel(String myId, String vlogerId) {
// 判断我们是否朋友关系如果是则需要取消双方的关系 // 判断我们是否朋友关系如果是则需要取消双方的关系
Fans fan = queryFansRelationship(myId, vlogerId); Fans fan = queryFansRelationship(myId, vlogerId);
if (fan != null && fan.getIsFanFriendOfMine() == YesOrNo.YES.type) { if (fan != null && fan.getIsFanFriendOfMine() == YesOrNo.YES.type) {
// 抹除双方的朋友关系自己的关系删除即可 // 抹除双方的朋友关系自己的关系删除即可
Fans pendingFan = queryFansRelationship(vlogerId, myId); Fans pendingFan = queryFansRelationship(vlogerId, myId);
pendingFan.setIsFanFriendOfMine(YesOrNo.NO.type); pendingFan.setIsFanFriendOfMine(YesOrNo.NO.type);
System.out.println(pendingFan.getIsFanFriendOfMine()); fansMapper.updateById(pendingFan);
fansMapper.updateByPrimaryKeySelective(pendingFan);
} }
// 删除自己的关注关联表记录 // 删除自己的关注关联表记录
String fanId = fan.getId(); LambdaQueryWrapper<Fans> deleteWrapper = new LambdaQueryWrapper<>();
fansMapper.delete(fanId); deleteWrapper.eq(Fans::getId, fan.getId());
fansMapper.delete(deleteWrapper);
} }
@Override @Override
@ -138,46 +103,22 @@ public class FansServiceImpl extends BaseInfoProperties implements FansService
} }
@Override @Override
public PagedGridResult queryMyFollows(String myId, public PagedGridResult queryMyFollows(String myId, Integer page, Integer pageSize) {
Integer page,
Integer pageSize) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("myId", myId); map.put("myId", myId);
PageHelper.startPage(page, pageSize); Page<VlogerVO> pageParam = new Page<>(page, pageSize);
List<VlogerVO> list = fansMapperCustom.queryMyFollows(map); List<VlogerVO> list = fansMapperCustom.queryMyFollows(map);
return setterPagedGrid(list, page); return setterPagedGrid(list, page);
} }
@Override @Override
public PagedGridResult queryMyFans(String myId, public PagedGridResult queryMyFans(String myId, Integer page, Integer pageSize) {
Integer page,
Integer pageSize) {
/**
* <判断粉丝是否是我的朋友互粉互关>
* 普通做法
* 多表关联+嵌套关联查询这样会违反多表关联的规范不可取高并发下回出现性能问题
*
* 常规做法
* 1. 避免过多的表关联查询先查询我的粉丝列表获得fansList
* 2. 判断粉丝关注我并且我也关注粉丝 -> 循环fansList获得每一个粉丝再去数据库查询我是否关注他
* 3. 如果我也关注他粉丝说明我俩互为朋友关系互关互粉则标记flag为true否则false
*
* 高端做法
* 1. 关注/取关的时候关联关系保存在redis中不要依赖数据库
* 2. 数据库查询后直接循环查询redis避免第二次循环查询数据库的尴尬局面
*/
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("myId", myId); map.put("myId", myId);
PageHelper.startPage(page, pageSize); Page<FansVO> pageParam = new Page<>(page, pageSize);
List<FansVO> list = fansMapperCustom.queryMyFans(map); List<FansVO> list = fansMapperCustom.queryMyFans(map);
for (FansVO f : list) { for (FansVO f : list) {

View File

@ -1,6 +1,8 @@
package com.wzj.soopin.content.service.impl; package com.wzj.soopin.content.service.impl;
import com.github.pagehelper.PageHelper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.wzj.soopin.content.domain.base.BaseInfoProperties; import com.wzj.soopin.content.domain.base.BaseInfoProperties;
@ -20,10 +22,7 @@ import com.wzj.soopin.content.mapper.mapper.UserMemberMapper;
import com.wzj.soopin.content.mapper.mapper.UsersMapper; import com.wzj.soopin.content.mapper.mapper.UsersMapper;
import com.wzj.soopin.content.service.FansService; import com.wzj.soopin.content.service.FansService;
import com.wzj.soopin.content.service.UserService; import com.wzj.soopin.content.service.UserService;
import com.wzj.soopin.content.utils.DateUtil; import com.wzj.soopin.content.utils.*;
import com.wzj.soopin.content.utils.DesensitizationUtil;
import com.wzj.soopin.content.utils.GsonUtil;
import com.wzj.soopin.content.utils.Sid;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -79,16 +78,13 @@ public class UserServiceImpl extends BaseInfoProperties implements UserService {
@Override @Override
public Users queryMobileIsExist(String mobile) { public Users queryMobileIsExist(String mobile) {
Example userExample = new Example(Users.class); LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
Example.Criteria criteria = userExample.createCriteria(); queryWrapper.eq(Users::getMobile, mobile);
criteria.andEqualTo("mobile", mobile); return usersMapper.selectOne(queryWrapper);
Users user = usersMapper.selectOneByExample(userExample);
return user;
} }
@Override @Override
public Users createUser(String mobile) { public Users createUser(String mobile) {
// 获得全局唯一主键
String userId = sid.nextShort(); String userId = sid.nextShort();
Users user = new Users(); Users user = new Users();
@ -98,7 +94,6 @@ public class UserServiceImpl extends BaseInfoProperties implements UserService {
user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile)); user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile));
user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile)); user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile));
user.setFace(USER_FACE1); user.setFace(USER_FACE1);
user.setBirthday(DateUtil.stringToDate("1999-01-01")); user.setBirthday(DateUtil.stringToDate("1999-01-01"));
user.setSex(Sex.secret.type); user.setSex(Sex.secret.type);
user.setBgImg(USER_FACE1); user.setBgImg(USER_FACE1);
@ -108,99 +103,75 @@ public class UserServiceImpl extends BaseInfoProperties implements UserService {
user.setDistrict(""); user.setDistrict("");
user.setDescription("这家伙很懒,什么都没留下~"); user.setDescription("这家伙很懒,什么都没留下~");
user.setCanImoocNumBeUpdated(YesOrNo.YES.type); user.setCanImoocNumBeUpdated(YesOrNo.YES.type);
// user.setCreatedTime(new Date());
// user.setUpdatedTime(new Date());
usersMapper.insert(user); usersMapper.insert(user);
return user; return user;
} }
@Override @Override
public Users getUser(String userId) { public Users getUser(String userId) {
Users users = usersMapper.selectByPrimaryKey(userId); return usersMapper.selectById(userId);
return users;
} }
@Transactional @Transactional
@Override @Override
public Users updateUserInfo(UpdatedUserBO updatedUserBO) { public Users updateUserInfo(UpdatedUserBO updatedUserBO) {
Users users = new Users(); Users users = new Users();
BeanUtils.copyProperties(updatedUserBO, users); BeanUtils.copyProperties(updatedUserBO, users);
usersMapper.updateByPrimaryKeySelective(users); usersMapper.updateById(users);
return getUser(updatedUserBO.getId()); return getUser(updatedUserBO.getId());
} }
@Transactional @Transactional
@Override @Override
public Users updateUserInfo(UpdatedUserBO updatedUserBO, Integer type) { public Users updateUserInfo(UpdatedUserBO updatedUserBO, Integer type) {
if (type == UserInfoModifyType.NICKNAME.type) { LambdaUpdateWrapper<Users> updateWrapper = new LambdaUpdateWrapper<>();
usersMapper.updateNickname(updatedUserBO); updateWrapper.eq(Users::getId, updatedUserBO.getId());
}
if (type == UserInfoModifyType.SEX.type) { UserInfoModifyType modifyType = UserInfoModifyType.getTypeByValue(type);
usersMapper.updateSex(updatedUserBO); switch (modifyType) {
} case NICKNAME:
if (type == UserInfoModifyType.BIRTHDAY.type) { updateWrapper.set(Users::getNickname, updatedUserBO.getNickname());
usersMapper.updateBirthday(updatedUserBO); break;
} case SEX:
if (type == UserInfoModifyType.LOCATION.type) { updateWrapper.set(Users::getSex, updatedUserBO.getSex());
usersMapper.updateLocation(updatedUserBO); break;
} case BIRTHDAY:
if (type == UserInfoModifyType.DESC.type) { updateWrapper.set(Users::getBirthday, updatedUserBO.getBirthday());
usersMapper.updateDescription(updatedUserBO); break;
} case LOCATION:
if (type == UserInfoModifyType.IMOOCNUM.type) { updateWrapper.set(Users::getCountry, updatedUserBO.getCountry())
.set(Users::getProvince, updatedUserBO.getProvince())
.set(Users::getCity, updatedUserBO.getCity())
.set(Users::getDistrict, updatedUserBO.getDistrict());
break;
case DESC:
updateWrapper.set(Users::getDescription, updatedUserBO.getDescription());
break;
case IMOOCNUM:
if (updatedUserBO.getCanImoocNumBeUpdated() == YesOrNo.NO.type) { if (updatedUserBO.getCanImoocNumBeUpdated() == YesOrNo.NO.type) {
GraceException.display(ResponseStatusEnum.USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR); GraceException.display(ResponseStatusEnum.USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR);
} }
// 校验唯一性 // 校验唯一性
List<UsersVO> haveImooc = usersMapper.selectByImoocNum(updatedUserBO.getImoocNum()); LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
if (haveImooc != null && !haveImooc.isEmpty()) { queryWrapper.eq(Users::getImoocNum, updatedUserBO.getImoocNum());
if (usersMapper.selectCount(queryWrapper) > 0) {
GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_IMOOCNUM_EXIST_ERROR); GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_IMOOCNUM_EXIST_ERROR);
} }
usersMapper.updateVnum(updatedUserBO); updateWrapper.set(Users::getImoocNum, updatedUserBO.getImoocNum());
break;
default:
break;
} }
usersMapper.update(null, updateWrapper);
return getUser(updatedUserBO.getId()); 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) @Transactional(rollbackFor = RuntimeException.class)
@Override @Override
public Map<String, Object> createUserNew(String mobile) { public Map<String, Object> createUserNew(String mobile) {
// 获得全局唯一主键
String userId = sid.nextShort(); String userId = sid.nextShort();
// 创建短视频系统账号
Users user = new Users(); Users user = new Users();
user.setId(userId); user.setId(userId);
user.setPassword(passwordEncoder.encode(mobile)); user.setPassword(passwordEncoder.encode(mobile));
@ -218,15 +189,12 @@ public class UserServiceImpl extends BaseInfoProperties implements UserService {
user.setDescription("这家伙很懒,什么都没留下~"); user.setDescription("这家伙很懒,什么都没留下~");
user.setBgImg(""); user.setBgImg("");
user.setCanImoocNumBeUpdated(YesOrNo.YES.type); user.setCanImoocNumBeUpdated(YesOrNo.YES.type);
// user.setCreatedTime(new Date());
// user.setUpdatedTime(new Date());
int row = usersMapper.inset(user); int row = usersMapper.insert(user);
if (row > 0) { if (row > 0) {
Map<String, Object> result = Maps.newHashMap(); Map<String, Object> result = Maps.newHashMap();
result.put("user", user); result.put("user", user);
// 创建商城系统账号,获取商城系统token
String url = "http://localhost:8888/buyer/passport/member/registerFromTik"; String url = "http://localhost:8888/buyer/passport/member/registerFromTik";
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("userName", mobile); param.add("userName", mobile);
@ -328,104 +296,25 @@ public class UserServiceImpl extends BaseInfoProperties implements UserService {
@Override @Override
public List<UsersVO> searchByNickname(String nickname, Integer page, Integer pageSize, String currentUserId) { public List<UsersVO> searchByNickname(String nickname, Integer page, Integer pageSize, String currentUserId) {
try { Page<Users> pageParam = new Page<>(page, pageSize);
PageHelper.startPage(page, pageSize); LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
List<UsersVO> userList = usersMapper.searchByNickname(nickname); queryWrapper.like(Users::getNickname, nickname);
if(currentUserId.isEmpty()){ Page<Users> usersPage = usersMapper.selectPage(pageParam, queryWrapper);
return userList; List<Users> usersList = usersPage.getRecords();
}
// 提取模糊查询出的用户 ID 列表 List<UsersVO> usersVOList = usersList.stream().map(u -> {
List<String> vlogerIds = userList.stream().map(UsersVO::getId).collect(Collectors.toList()); UsersVO userVO = new UsersVO();
log.info("用户列表" + vlogerIds); BeanUtils.copyProperties(u, userVO);
if (vlogerIds.isEmpty()) {
log.info("没有查询到用户 ID跳过关注关系查询");
return userList;
}
//
userList.forEach(usersVO -> {
// 当前用户是否关注博主
Boolean isFollowed = fansService.queryDoIFollowVloger(currentUserId,usersVO.getId());
// 我的粉丝总数
String myFansCountsStr = redis.get(REDIS_MY_FANS_COUNTS + ":" + usersVO.getId());
// 获赞总数
String likedVlogerCountsStr = redis.get(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + usersVO.getId());
int fansCount = 0; // 查询当前用户是否关注了该用户
int likeCount = 0; boolean doIFollowVloger = fansService.queryDoIFollowVloger(currentUserId, u.getId());
if (myFansCountsStr != null) { userVO.setFollowed(doIFollowVloger);
try {
fansCount = Integer.parseInt(myFansCountsStr); return userVO;
} catch (NumberFormatException e) { }).collect(Collectors.toList());
// 可选记录日志或处理异常
fansCount = 0; return usersVOList;
}
}
if (likedVlogerCountsStr != null) {
try {
likeCount = Integer.parseInt(likedVlogerCountsStr);
} catch (NumberFormatException e) {
// 可选记录日志或处理异常
likeCount = 0;
}
}
usersVO.setMyFansCounts(fansCount);
usersVO.setTotalLikeMeCounts(likeCount);
if (isFollowed) {
String relationship = redis.get(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + usersVO.getId() + ":" + currentUserId);
if (StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")) {
usersVO.setFollowStatus("互相关注");
}else {
usersVO.setFollowStatus("已关注");
}
} else {
usersVO.setFollowStatus("未关注");
}
});
return userList;
//
//
//
//
// // 获取当前用户关注的
// List<java.util.Map<String, Object>> followedRelations = fansMapper.getFollowedVlogerIds(currentUserId, vlogerIds);
// log.info("获取当前用户关注的: {}", followedRelations);
// // 构建 vlogerId is_fan_friend_of_mine 的映射
// java.util.Map<String, Integer> relationMap = followedRelations.stream()
// .filter(Objects::nonNull) // 排除整个 map null 的情况
// .collect(Collectors.toMap(
// map -> (String) map.get("vloger_id"),
// map -> (Integer) map.get("is_fan_friend_of_mine")
// ));
// log.info("构造的 relationMap: {}", relationMap);
// 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);
}
} }
} }

View File

@ -1,10 +1,11 @@
package com.wzj.soopin.content.service.impl; package com.wzj.soopin.content.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import com.wzj.soopin.content.domain.base.BaseInfoProperties; import com.wzj.soopin.content.domain.base.BaseInfoProperties;
import com.wzj.soopin.content.domain.bo.VlogBO; import com.wzj.soopin.content.domain.bo.VlogBO;
import com.wzj.soopin.content.domain.po.MyLikedVlog; import com.wzj.soopin.content.domain.po.MyLikedVlog;
@ -21,246 +22,148 @@ import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.utils.PagedGridResult; import com.wzj.soopin.content.utils.PagedGridResult;
import com.wzj.soopin.content.utils.Sid; import com.wzj.soopin.content.utils.Sid;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Service @Service
public class VlogServiceImpl extends BaseInfoProperties implements VlogService { public class VlogServiceImpl extends BaseInfoProperties implements VlogService {
@Autowired @Autowired
private VlogMapper vlogMapper; private VlogMapper vlogMapper;
@Autowired @Autowired
private VlogMapperCustom vlogMapperCustom; private VlogMapperCustom vlogMapperCustom;
@Autowired @Autowired
private MyLikedVlogMapper myLikedVlogMapper; private MyLikedVlogMapper myLikedVlogMapper;
@Autowired @Autowired
private FansService fansService; private FansService fansService;
@Autowired @Autowired
private MsgService msgService; private MsgService msgService;
@Autowired @Autowired
private Sid sid; private Sid sid;
@Transactional @Transactional
@Override @Override
public void updateVlogStatus(String fileId, Integer status, String reason) { public void updateVlogStatus(String fileId, Integer status, String reason) {
// Example example = new Example(Vlog.class); LambdaUpdateWrapper<Vlog> updateWrapper = new LambdaUpdateWrapper<>();
// Example.Criteria criteria = example.createCriteria(); updateWrapper.eq(Vlog::getFileId, fileId)
// criteria.andEqualTo("fileId", fileId); .set(Vlog::getStatus, status)
// .set(Vlog::getReason, reason);
// Vlog pendingVlog = new Vlog(); vlogMapper.update(null, updateWrapper);
// pendingVlog.setStatus(status);
// pendingVlog.setReason(reason);
// vlogMapper.updateVlogStatus(fileId, example);
// 示例更新 vlog
Map<String, Object> updateFields = new HashMap<>();
updateFields.put("status", status);
updateFields.put("reason", reason);
vlogMapper.dynamicUpdate(
"file_id", // 主键字段名
fileId, // 主键值
updateFields // 更新字段
);
} }
@Transactional @Transactional
@Override @Override
public void updateVlogFirstImg(String fileId, String url, String fileUrl) { public void updateVlogFirstImg(String fileId, String url, String fileUrl) {
// Example example = new Example(Vlog.class); LambdaUpdateWrapper<Vlog> updateWrapper = new LambdaUpdateWrapper<>();
// Example.Criteria criteria = example.createCriteria(); updateWrapper.eq(Vlog::getFileId, fileId)
// criteria.andEqualTo("fileId", fileId); .set(Vlog::getFirstFrameImg, url)
// Vlog pendingVlog = new Vlog(); .set(Vlog::getUrl, fileUrl);
// pendingVlog.setFirstFrameImg(url); vlogMapper.update(null, updateWrapper);
// pendingVlog.setUrl(fileUrl);
//
// vlogMapper.updateByExampleSelective(pendingVlog, example);
// 示例更新 vlog
Map<String, Object> updateFields = new HashMap<>();
updateFields.put("first_frame_img", url);
updateFields.put("url", fileUrl);
vlogMapper.dynamicUpdate(
"file_id", // 主键字段名
fileId, // 主键值
updateFields // 更新字段
);
} }
@Transactional @Transactional
@Override @Override
public void createVlog(VlogBO vlogBO) { public void createVlog(VlogBO vlogBO) {
// String vid = sid.nextShort();
//
// Vlog vlog = new Vlog();
// BeanUtils.copyProperties(vlogBO, vlog);
//
// vlog.setId(vid);
//
// vlog.setLikeCounts(0);
// vlog.setCommentsCounts(0);
// vlog.setStatus(0);
// vlog.setIsPrivate(YesOrNo.NO.type);
//
// vlog.setCreatedTime(new Date());
// vlog.setUpdatedTime(new Date());
//
// vlogMapper.insert(vlog);
String vid = sid.nextShort(); String vid = sid.nextShort();
Map<String, Object> vlog = new HashMap<>(); Vlog vlog = new Vlog();
BeanUtils.copyProperties(vlogBO, vlog);
vlog.put("id", vid); vlog.setId(vid);
vlog.put("vloger_id", vlogBO.getVlogerId()); vlog.setLikeCounts(0);
vlog.put("url", vlogBO.getUrl()); vlog.setCommentsCounts(0);
vlog.put("title", vlogBO.getTitle()); vlog.setStatus(0);
vlog.put("width", vlogBO.getWidth()); vlog.setIsPrivate(YesOrNo.NO.type);
vlog.put("height", vlogBO.getHeight());
vlog.put("is_private", YesOrNo.NO.type);
vlog.put("created_time", new Date());
vlog.put("updated_time", new Date());
vlog.put("city_code", vlogBO.getCityCode());
vlog.put("file_id", vlogBO.getFileId());
vlog.put("first_frame_img", vlogBO.getFirstFrameImg());
vlogMapper.insert(vlog);
vlogMapper.dynamicInsert(vlog);
//多条导入
// List<Map<String, Object>> vlogList = new ArrayList<>();
//
// Map<String, Object> vlog1 = new HashMap<>();
// vlog1.put("id", sid.nextShort());
// vlog1.put("title", "视频1");
// vlogList.add(vlog1);
//
// Map<String, Object> vlog2 = new HashMap<>();
// vlog2.put("id", sid.nextShort());
// vlog2.put("title", "视频2");
// vlogList.add(vlog2);
//
// vlogMapper.dynamicBatchInsert(vlogList);
} }
@Override @Override
public PagedGridResult getIndexVlogList(String userId, public PagedGridResult getIndexVlogList(String userId, String search, String cityCode, String status, Integer page, Integer pageSize) {
String search, Page<Vlog> pageParam = new Page<>(page, pageSize);
String cityCode, LambdaQueryWrapper<Vlog> queryWrapper = new LambdaQueryWrapper<>();
String status,
Integer page,
Integer pageSize) {
PageHelper.startPage(page, pageSize);
Map<String, Object> map = new HashMap<>();
if (StringUtils.isNotBlank(search)) { if (StringUtils.isNotBlank(search)) {
map.put("search", search); queryWrapper.like(Vlog::getTitle, search);
} }
if (StringUtils.isNotBlank(cityCode)) { if (StringUtils.isNotBlank(cityCode)) {
map.put("cityCode", cityCode); queryWrapper.eq(Vlog::getCityCode, cityCode);
} }
if (StringUtils.isNotBlank(status)) { if (StringUtils.isNotBlank(status)) {
map.put("status", status); queryWrapper.eq(Vlog::getStatus, status);
} }
// Handle blocked videos
if (StringUtils.isNotBlank(userId)) { if (StringUtils.isNotBlank(userId)) {
// 从redis中获取举报信息
String redisKey = REDIS_VIDEO_BLOCK + ":" + userId; String redisKey = REDIS_VIDEO_BLOCK + ":" + userId;
Boolean hasKey = redis.keyIsExist(redisKey); if (redis.keyIsExist(redisKey)) {
if(hasKey){
List<String> blockVdList = new ArrayList<>(); List<String> blockVdList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
List<String> reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 List<String> reports = redis.lrange(redisKey, 0, -1);
for (String report : reports) { for (String report : reports) {
try { try {
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {}); Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {});
// 处理举报信息
String vlogId = (String) reportMap.get("vlogId"); String vlogId = (String) reportMap.get("vlogId");
blockVdList.add(vlogId); blockVdList.add(vlogId);
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
map.put("blockVd",blockVdList); if (!blockVdList.isEmpty()) {
queryWrapper.notIn(Vlog::getId, blockVdList);
} }
} }
}
// Handle blocked users
if (StringUtils.isNotBlank(userId)) { if (StringUtils.isNotBlank(userId)) {
// 从redis中获取拉黑信息
String redisKey = REDIS_USER_BLOCK + ":" + userId; String redisKey = REDIS_USER_BLOCK + ":" + userId;
Boolean hasKey = redis.keyIsExist(redisKey); if (redis.keyIsExist(redisKey)) {
if(hasKey){
List<String> blockUserList = new ArrayList<>(); List<String> blockUserList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
List<String> reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 List<String> reports = redis.lrange(redisKey, 0, -1);
for (String report : reports) { for (String report : reports) {
try { try {
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {}); Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {});
// 处理拉黑信息
String vlogerId = (String) reportMap.get("vlogerId"); String vlogerId = (String) reportMap.get("vlogerId");
blockUserList.add(vlogerId); blockUserList.add(vlogerId);
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
map.put("blockUser",blockUserList); if (!blockUserList.isEmpty()) {
queryWrapper.notIn(Vlog::getVlogerId, blockUserList);
}
} }
} }
List<IndexVlogVO> list = vlogMapperCustom.getIndexVlogList(map); Page<Vlog> vlogPage = vlogMapper.selectPage(pageParam, queryWrapper);
List<Vlog> vlogList = vlogPage.getRecords();
for (IndexVlogVO v : list) { List<IndexVlogVO> voList = vlogList.stream().map(v -> {
String vlogerId = v.getVlogerId(); IndexVlogVO vo = new IndexVlogVO();
String vlogId = v.getVlogId(); BeanUtils.copyProperties(v, vo);
if (StringUtils.isNotBlank(userId)) { if (StringUtils.isNotBlank(userId)) {
// 用户是否关注该博主 vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(userId, v.getVlogerId()));
boolean doIFollowVloger = fansService.queryDoIFollowVloger(userId, vlogerId); vo.setDoILikeThisVlog(doILikeVlog(userId, v.getId()));
v.setDoIFollowVloger(doIFollowVloger);
// 判断当前用户是否点赞过视频
v.setDoILikeThisVlog(doILikeVlog(userId, vlogId));
} }
// 获得当前视频被点赞过的总数 vo.setLikeCounts(getVlogBeLikedCounts(v.getId()));
v.setLikeCounts(getVlogBeLikedCounts(vlogId)); vo.setCommentsCounts(getVlogComment(v.getId()));
// 评论数
v.setCommentsCounts(getVlogComment(vlogId)); return vo;
}).collect(Collectors.toList());
return setterPagedGrid(voList, page);
} }
// return list;
return setterPagedGrid(list, page);
}
private IndexVlogVO setterVO(IndexVlogVO v, String userId) {
String vlogerId = v.getVlogerId();
String vlogId = v.getVlogId();
if (StringUtils.isNotBlank(userId)) {
// 用户是否关注该博主
boolean doIFollowVloger = fansService.queryDoIFollowVloger(userId, vlogerId);
v.setDoIFollowVloger(doIFollowVloger);
// 判断当前用户是否点赞过视频
v.setDoILikeThisVlog(doILikeVlog(userId, vlogId));
}
// 获得当前视频被点赞过的总数
v.setLikeCounts(getVlogBeLikedCounts(vlogId));
return v;
}
//
@Override @Override
public Integer getVlogBeLikedCounts(String vlogId) { public Integer getVlogBeLikedCounts(String vlogId) {
String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId); String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId);
@ -278,351 +181,177 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService {
return Integer.valueOf(countsStr); return Integer.valueOf(countsStr);
} }
//
private boolean doILikeVlog(String myId, String vlogId) { private boolean doILikeVlog(String myId, String vlogId) {
String doILike = redis.get(REDIS_USER_LIKE_VLOG + ":" + myId + ":" + vlogId); String doILike = redis.get(REDIS_USER_LIKE_VLOG + ":" + myId + ":" + vlogId);
boolean isLike = false; return StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1");
if (StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")) {
isLike = true;
} }
return isLike;
}
//
@Override @Override
public IndexVlogVO getVlogDetailById(String userId, String vlogId) { public IndexVlogVO getVlogDetailById(String userId, String vlogId) {
Vlog vlog = vlogMapper.selectById(vlogId);
Map<String, Object> map = new HashMap<>(); if (vlog == null) {
map.put("vlogId", vlogId);
List<IndexVlogVO> list = vlogMapperCustom.getVlogDetailById(map);
if (list != null && list.size() > 0 && !list.isEmpty()) {
IndexVlogVO vlogVO = list.get(0);
// return vlogVO;
return setterVO(vlogVO, userId);
}
return null; return null;
} }
@Transactional IndexVlogVO vo = new IndexVlogVO();
@Override BeanUtils.copyProperties(vlog, vo);
public void changeToPrivateOrPublic(String userId,
String vlogId,
Integer yesOrNo) {
// Example example = new Example(Vlog.class);
// Example.Criteria criteria = example.createCriteria();
// criteria.andEqualTo("id", vlogId);
// criteria.andEqualTo("vlogerId", userId);
//
// Vlog pendingVlog = new Vlog();
// pendingVlog.setIsPrivate(yesOrNo);
Map<String, Object> updates = new HashMap<>(); if (StringUtils.isNotBlank(userId)) {
updates.put("is_private", 2); vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(userId, vlog.getVlogerId()));
Map<String, Object> conditions = new HashMap<>(); vo.setDoILikeThisVlog(doILikeVlog(userId, vlogId));
conditions.put("id", vlogId); }
conditions.put("vloger_id", userId);
vlogMapper.updateVlogByConditions(
updates,
conditions
);
vo.setLikeCounts(getVlogBeLikedCounts(vlogId));
vo.setCommentsCounts(getVlogComment(vlogId));
return vo;
} }
@Transactional @Transactional
@Override @Override
public void changeVlogStatus(String userId, public void changeToPrivateOrPublic(String userId, String vlogId, Integer yesOrNo) {
String vlogId, LambdaUpdateWrapper<Vlog> updateWrapper = new LambdaUpdateWrapper<>();
Integer status) { updateWrapper.eq(Vlog::getId, vlogId)
Map<String, Object> updates = new HashMap<>(); .eq(Vlog::getVlogerId, userId)
updates.put("status", status); .set(Vlog::getIsPrivate, yesOrNo);
Map<String, Object> conditions = new HashMap<>(); vlogMapper.update(null, updateWrapper);
conditions.put("id", vlogId); }
conditions.put("vloger_id", userId);
vlogMapper.updateVlogByConditions(
updates,
conditions
);
@Transactional
@Override
public void changeVlogStatus(String userId, String vlogId, Integer status) {
LambdaUpdateWrapper<Vlog> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Vlog::getId, vlogId)
.eq(Vlog::getVlogerId, userId)
.set(Vlog::getStatus, status);
vlogMapper.update(null, updateWrapper);
} }
@Override @Override
public PagedGridResult queryMyVlogList(String userId, public PagedGridResult queryMyVlogList(String userId, String myId, Integer page, Integer pageSize, Integer yesOrNo) {
String myId, Page<Vlog> pageParam = new Page<>(page, pageSize);
Integer page, LambdaQueryWrapper<Vlog> queryWrapper = new LambdaQueryWrapper<>();
Integer pageSize, queryWrapper.eq(Vlog::getVlogerId, userId)
Integer yesOrNo) { .eq(Vlog::getIsPrivate, yesOrNo);
Page<Vlog> vlogPage = vlogMapper.selectPage(pageParam, queryWrapper);
List<Vlog> vlogList = vlogPage.getRecords();
PageHelper.startPage(page, pageSize); List<IndexVlogVO> voList = vlogList.stream().map(v -> {
Map<String, Object> map = new HashMap<>(); IndexVlogVO vo = new IndexVlogVO();
// if (StringUtils.isNotBlank(search)) { BeanUtils.copyProperties(v, vo);
// map.put("search", search);
// }
// if (StringUtils.isNotBlank(cityCode)) {
// map.put("cityCode", cityCode);
// }
// if (StringUtils.isNotBlank(status)) {
// map.put("status", status);
// }
map.put("vlogerId", userId);
if (StringUtils.isNotBlank(myId)) { if (StringUtils.isNotBlank(myId)) {
// 从redis中获取举报信息 vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(myId, v.getVlogerId()));
String redisKeyRp = REDIS_VIDEO_BLOCK + ":" + myId; vo.setDoILikeThisVlog(doILikeVlog(myId, v.getId()));
Boolean hasKeyRp = redis.keyIsExist(redisKeyRp);
if(hasKeyRp){
List<String> blockVdList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper();
List<String> reports = redis.lrange(redisKeyRp, 0, -1); // 查询用户的所有举报记录
for (String report : reports) {
try {
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {});
// 处理举报信息
String vlogId = (String) reportMap.get("vlogId");
blockVdList.add(vlogId);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
map.put("blockVd",blockVdList);
}
} }
vo.setLikeCounts(getVlogBeLikedCounts(v.getId()));
vo.setCommentsCounts(getVlogComment(v.getId()));
List<IndexVlogVO> list = vlogMapper.selectMyPublic(map); return vo;
}).collect(Collectors.toList());
for (IndexVlogVO v : list) { return setterPagedGrid(voList, page);
String vlogId = v.getVlogId();
// 获得当前视频被点赞过的总数
v.setLikeCounts(getVlogBeLikedCounts(vlogId));
// 评论数
v.setCommentsCounts(getVlogComment(vlogId));
}
return setterPagedGrid(list, page);
} }
@Transactional @Transactional
@Override @Override
public void userLikeVlog(String userId, String vlogId) { public void userLikeVlog(String userId, String vlogId) {
String rid = sid.nextShort(); String rid = sid.nextShort();
MyLikedVlog likedVlog = new MyLikedVlog(); MyLikedVlog likedVlog = new MyLikedVlog();
likedVlog.setId(rid); likedVlog.setId(rid);
likedVlog.setVlogId(vlogId); likedVlog.setVlogId(vlogId);
likedVlog.setUserId(userId); likedVlog.setUserId(userId);
likedVlog.setCreatedTime(new Date());
myLikedVlogMapper.insert(likedVlog); myLikedVlogMapper.insert(likedVlog);
// System.out.println(vlogId);
//
// Vlog vlog = new Vlog();
// vlog.setId(vlogId);
// Vlog vlog1 = vlogMapper.selectOne(vlog);
// System.out.println(vlog1.toString());
//// System.out.println(vlog1.getCreatedTime());
// Vlog vlog2 = vlogMapper.selectByPrimaryKey(vlogId); // 我喜欢的视频总数累加
// System.out.println(vlog2.toString()); redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + userId, 1);
// 视频被喜欢的总数累加
// Vlog vlog1 = vlogMapper.selectOne(new Vlog().setId(vlogId)); redis.increment(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1);
// Vlog vlog = vlog1 // 保存用户和视频的喜欢关系
// System.out.println(vlog); redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId, "1");
// 系统消息点赞短视频
Vlog vlog = this.getVlog(vlogId);
Map msgContent = new HashMap();
msgContent.put("vlogId", vlogId);
msgContent.put("vlogCover", vlog.getCover());
msgService.createMsg(userId,
vlog.getVlogerId(),
MessageEnum.LIKE_VLOG.type,
msgContent);
} }
//
@Override @Override
public Vlog getVlog(String id) { public Vlog getVlog(String id) {
// Vlog vlog = vlogMapper.selectByPrimaryKey(id); return vlogMapper.selectById(id);
// return vlog;
Map<String, Object> map = new HashMap<>();
map.put("vlogId", id);
List<IndexVlogVO> list = vlogMapper.getVlogDetailFromId(map);
if (list != null && list.size() > 0 && !list.isEmpty()) {
IndexVlogVO result = list.get(0);
Vlog vlogVO = new Vlog();
BeanUtils.copyProperties(result, vlogVO);
return vlogVO;
}
return null;
} }
@Transactional @Transactional
@Override @Override
public void flushCounts(String vlogId, Integer counts) { public void flushCounts(String vlogId, Integer counts) {
// LambdaUpdateWrapper<Vlog> updateWrapper = new LambdaUpdateWrapper<>();
// Vlog vlog = new Vlog(); updateWrapper.eq(Vlog::getId, vlogId)
// vlog.setId(vlogId); .set(Vlog::getLikeCounts, counts);
// vlog.setLikeCounts(counts); vlogMapper.update(null, updateWrapper);
// int i = vlogMapper.updateByPrimaryKeySelective(vlog);
// 示例更新 vlog
Map<String, Object> updateFields = new HashMap<>();
updateFields.put("like_counts", counts);
vlogMapper.dynamicUpdate(
"id", // 主键字段名
vlogId, // 主键值
updateFields // 更新字段
);
} }
//
@Transactional @Transactional
@Override @Override
public void userUnLikeVlog(String userId, String vlogId) { public void userUnLikeVlog(String userId, String vlogId) {
LambdaQueryWrapper<MyLikedVlog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MyLikedVlog::getUserId, userId)
.eq(MyLikedVlog::getVlogId, vlogId);
myLikedVlogMapper.delete(queryWrapper);
MyLikedVlog likedVlog = new MyLikedVlog(); // 我喜欢的视频总数累减
likedVlog.setVlogId(vlogId); redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + userId, 1);
likedVlog.setUserId(userId); // 视频被喜欢的总数累减
redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1);
myLikedVlogMapper.deleteById(likedVlog); // 删除用户和视频的喜欢关系
redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId);
} }
@Override @Override
public PagedGridResult getMyLikedVlogList(String userId, public PagedGridResult getMyLikedVlogList(String userId, String myId, Integer page, Integer pageSize) {
String myId, Page<MyLikedVlog> pageParam = new Page<>(page, pageSize);
Integer page, LambdaQueryWrapper<MyLikedVlog> queryWrapper = new LambdaQueryWrapper<>();
Integer pageSize) { queryWrapper.eq(MyLikedVlog::getUserId, userId);
PageHelper.startPage(page, pageSize);
Map<String, Object> map = new HashMap<>(); Page<MyLikedVlog> likedPage = myLikedVlogMapper.selectPage(pageParam, queryWrapper);
map.put("userId", userId); List<MyLikedVlog> likedList = likedPage.getRecords();
String useWho;
List<IndexVlogVO> voList = likedList.stream().map(liked -> {
Vlog vlog = vlogMapper.selectById(liked.getVlogId());
if (vlog == null) {
return null;
}
IndexVlogVO vo = new IndexVlogVO();
BeanUtils.copyProperties(vlog, vo);
if (StringUtils.isNotBlank(myId)) { if (StringUtils.isNotBlank(myId)) {
useWho = myId; vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(myId, vlog.getVlogerId()));
}else{ vo.setDoILikeThisVlog(doILikeVlog(myId, vlog.getId()));
useWho = userId;
}
// 从redis中获取拉黑信息
String redisKey = REDIS_USER_BLOCK + ":" + useWho;
Boolean hasKey = redis.keyIsExist(redisKey);
if(hasKey){
List<String> blockUserList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper();
List<String> reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录
for (String report : reports) {
try {
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {});
// 处理拉黑信息
String vlogerId = (String) reportMap.get("vlogerId");
blockUserList.add(vlogerId);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
map.put("blockUser",blockUserList);
System.out.println(blockUserList);
} }
// 从redis中获取举报信息 vo.setLikeCounts(getVlogBeLikedCounts(vlog.getId()));
String redisKeyRp = REDIS_VIDEO_BLOCK + ":" + useWho; vo.setCommentsCounts(getVlogComment(vlog.getId()));
Boolean hasKeyRp = redis.keyIsExist(redisKeyRp);
if(hasKeyRp){
List<String> blockVdList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper();
List<String> reports = redis.lrange(redisKeyRp, 0, -1); // 查询用户的所有举报记录
for (String report : reports) { return vo;
try { }).filter(Objects::nonNull).collect(Collectors.toList());
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {});
// 处理举报信息
String vlogId = (String) reportMap.get("vlogId");
blockVdList.add(vlogId);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
map.put("blockVd",blockVdList);
}
return setterPagedGrid(voList, page);
List<IndexVlogVO> list = vlogMapperCustom.getMyLikedVlogList(map);
return setterPagedGrid(list, page);
} }
@Override @Override
public PagedGridResult getMyFollowVlogList(String myId, public PagedGridResult getMyFollowVlogList(String myId, Integer page, Integer pageSize) {
Integer page, Page<Vlog> pageParam = new Page<>(page, pageSize);
Integer pageSize) {
PageHelper.startPage(page, pageSize);
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("myId", myId); map.put("myId", myId);
List<IndexVlogVO> voList = vlogMapperCustom.getMyFollowVlogList(map);
List<IndexVlogVO> list = vlogMapperCustom.getMyFollowVlogList(map); return setterPagedGrid(voList, page);
for (IndexVlogVO v : list) {
String vlogerId = v.getVlogerId();
String vlogId = v.getVlogId();
if (StringUtils.isNotBlank(myId)) {
// 用户必定关注该博主
v.setDoIFollowVloger(true);
// 判断当前用户是否点赞过视频
v.setDoILikeThisVlog(doILikeVlog(myId, vlogId));
} }
// 获得当前视频被点赞过的总数
v.setLikeCounts(getVlogBeLikedCounts(vlogId));
}
return setterPagedGrid(list, page);
}
//
@Override @Override
public PagedGridResult getMyFriendVlogList(String myId, public PagedGridResult getMyFriendVlogList(String myId, Integer page, Integer pageSize) {
Integer page, Page<Vlog> pageParam = new Page<>(page, pageSize);
Integer pageSize) {
PageHelper.startPage(page, pageSize);
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("myId", myId); map.put("myId", myId);
List<IndexVlogVO> voList = vlogMapperCustom.getMyFriendVlogList(map);
List<IndexVlogVO> list = vlogMapperCustom.getMyFriendVlogList(map); return setterPagedGrid(voList, page);
for (IndexVlogVO v : list) {
String vlogerId = v.getVlogerId();
String vlogId = v.getVlogId();
if (StringUtils.isNotBlank(myId)) {
// 用户必定关注该博主
v.setDoIFollowVloger(true);
// 判断当前用户是否点赞过视频
v.setDoILikeThisVlog(doILikeVlog(myId, vlogId));
} }
// 获得当前视频被点赞过的总数
v.setLikeCounts(getVlogBeLikedCounts(vlogId));
}
return setterPagedGrid(list, page);
}
// @Override
// public Vlog getVlog(String id) {
// return null;
// }
} }