Merge remote-tracking branch 'origin/wzj-main' into wzj-main

This commit is contained in:
huk 2025-09-05 12:51:37 +08:00
commit 17648ceb5c
16 changed files with 367 additions and 59 deletions

View File

@ -1,41 +1,23 @@
package org.dromara.app;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wzj.soopin.content.domain.bo.*;
import com.wzj.soopin.content.domain.po.MyLikedVlog;
import com.wzj.soopin.content.domain.po.Vlog;
import com.wzj.soopin.content.domain.vo.IndexVlogVO;
import com.wzj.soopin.content.service.IVlogPullService;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.service.VlogUploadService;
import com.wzj.soopin.content.utils.PagedGridResult;
import com.wzj.soopin.content.utils.QcCloud;
import com.wzj.soopin.content.utils.RedisOperator;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MQMessageType;
import org.dromara.common.mq.enums.MessageActionEnum;
import org.dromara.common.mq.utils.MqUtil;
import org.dromara.common.redis.redis.RedisCache;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.wzj.soopin.content.domain.base.BaseInfoProperties.*;
@Slf4j
@Api(tags = "VlogController 短视频相关业务功能的接口")
@ -54,7 +36,7 @@ public class AppVlogController {
@PostMapping("/indexList")
public R<Page<IndexVlogVO>> indexList(@RequestBody IndexListBO bo, @RequestBody Page page) {
Page<IndexVlogVO> pages = pullService.page(page);
Page<IndexVlogVO> pages = pullService.pullFromMq(page);
return R.ok(pages);
}

View File

@ -8,7 +8,9 @@ import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.content.domain.vo.IndexVlogVO;
import com.wzj.soopin.content.enums.YesOrNo;
import com.wzj.soopin.content.service.IVlogPullService;
import com.wzj.soopin.content.service.IVlogPushService;
import lombok.AllArgsConstructor;
import org.dromara.common.core.domain.R;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.service.VlogUploadService;
@ -36,18 +38,12 @@ import java.util.ArrayList;
@Api(tags = "VlogController 短视频相关业务功能的接口")
@RequestMapping("/cms/vlog")
@RestController
@AllArgsConstructor
public class VlogController extends BaseInfoProperties {
@Autowired
private VlogService vlogService;
@Autowired
private QcCloud qcCloud;
@Autowired
private VlogUploadService vlogUploadService;
@Autowired
public RedisOperator redis;
@Autowired
private IVlogPushService vlogPushService;
private final VlogService vlogService;
public final RedisOperator redis;
private final IVlogPushService vlogPushService;
private final IVlogPullService vlogPullService;
@Tag(name = "查询列表")
@PostMapping("/page")
public R<IPage<IndexVlogVO>> page(@RequestBody VlogBO bo, @RequestBody Page page) {
@ -203,4 +199,11 @@ public class VlogController extends BaseInfoProperties {
return R.ok(vlogPushService.pushVlogToMq(count,tag));
}
@GetMapping("/sync")
public R syncVlog() {
// vlogPullService.pullFromTencentCloud();
return R.ok();
}
}

View File

@ -1,16 +1,18 @@
package com.wzj.soopin.content.convert;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.wzj.soopin.content.domain.po.Vlog;
import com.wzj.soopin.content.domain.vo.IndexVlogVO;
import com.wzj.soopin.content.domain.bo.VlogBO;
import com.wzj.soopin.content.domain.vo.VlogerVO;
import org.dromara.common.web.core.BaseConverter;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = "spring")
public interface VlogConvert {
VlogConvert INSTANCE = Mappers.getMapper(VlogConvert.class);
public interface VlogConvert extends BaseConverter<VlogerVO,VlogBO,Vlog> {
IndexVlogVO toVO(Vlog vlog);
// IndexVlogVO toVO(Vlog vlog);
Vlog toEntity(VlogBO vlogBO);
}
// Vlog toEntity(VlogBO vlogBO);
}

View File

@ -11,10 +11,10 @@ public interface IVlogPullService {
/**
* 从视频库中拉取视频
*/
Page<IndexVlogVO> page(Page<IndexVlogVO> page);
Page<IndexVlogVO> pullFromMq(Page<IndexVlogVO> page);
void pullVlog(VlogBO vlogBO);
void pullFromTencentCloud(VlogBO vlogBO);

View File

@ -9,4 +9,6 @@ public interface IVlogPushService {
boolean cacheTopLikedVlogs(int limit) ;
boolean pushVlogToMq(int count,String tag);
void syncVlog();
}

View File

@ -44,7 +44,7 @@ public class VlogPullServiceImpl implements IVlogPullService {
private final TencentCloudUtil tencentCloudUtil;
@Override
public Page<IndexVlogVO> page(Page<IndexVlogVO> page) {
public Page<IndexVlogVO> pullFromMq(Page<IndexVlogVO> page) {
List<MessageExt> messageExts = new ArrayList<>();
@ -88,7 +88,7 @@ public class VlogPullServiceImpl implements IVlogPullService {
@Override
public void pullVlog(VlogBO vlogBO) {
public void pullFromTencentCloud(VlogBO vlogBO) {
try {
// 验证分页参数
if (vlogBO.getCurrent() < 1) {

View File

@ -109,4 +109,9 @@ public class VlogPushServiceImpl implements IVlogPushService {
return true;
}
@Override
public void syncVlog() {
}
}

View File

@ -83,7 +83,7 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
private final MemberMapper memberMapper;
private final RedisCache cache;
private final RedisCache redisCache;
private final VlogConvert vlogConvert;
@Autowired
private IMemberService memberService;
@Autowired
@ -138,13 +138,15 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
@Override
public void createVlog(VlogBO vlogBO) {
String vid = sid.nextShort();
Vlog vlog = MapstructUtils.convert(vlogBO, Vlog.class);
Vlog vlog = vlogConvert.toPo(vlogBO);
vlog.setId(vid);
vlog.setLikeCounts(0);
vlog.setCommentsCounts(0);
vlog.setStatus(0);
vlog.setIsPrivate(YesOrNo.NO.type);
LoginUser loginUser = LoginHelper.getLoginUser();
vlog.setMemberId(loginUser.getUserId()+"");
vlogMapper.insert(vlog);
}
@ -153,12 +155,12 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
public Integer getVlogBeLikedCounts(String vlogId) {
Double count = cache.zSetScore(REDIS_VLOG_BE_LIKED_COUNTS, vlogId);
return count==null?0:count.intValue();
return count == null ? 0 : count.intValue();
}
private Integer getVlogComment(String vlogId) {
Double count = cache.zSetScore(REDIS_VLOG_COMMENT_COUNTS, vlogId);
return count==null?0:count.intValue();
return count == null ? 0 : count.intValue();
}
private boolean doILikeVlog(String myId, String vlogId) {
@ -625,13 +627,13 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
@Override
public List<IndexVlogVO> getIndexVlogList(VlogBO bo) {
List<IndexVlogVO> indexVlogVOPage = vlogMapperCustom.getIndexVlogList(bo);
fillRedisColumn(indexVlogVOPage );
fillRedisColumn(indexVlogVOPage);
return indexVlogVOPage;
}
@Override
public Page<IndexVlogVO> getIndexVlogList(VlogBO bo, Page page) {
Page<IndexVlogVO> indexVlogVOPage = vlogMapperCustom.getIndexVlogList(bo,page);
Page<IndexVlogVO> indexVlogVOPage = vlogMapperCustom.getIndexVlogList(bo, page);
fillRedisColumn(indexVlogVOPage.getRecords());
return indexVlogVOPage;
}
@ -674,7 +676,8 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
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>>() {});
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {
});
String vlogId = (String) reportMap.get("vlogId");
blockVdList.add(vlogId);
} catch (JsonProcessingException e) {
@ -695,7 +698,8 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
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>>() {});
Map<String, Object> reportMap = objectMapper.readValue(report, new TypeReference<Map<String, Object>>() {
});
String memberId = (String) reportMap.get("MemberId");
blockUserList.add(memberId);
} catch (JsonProcessingException e) {
@ -718,7 +722,7 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
}
vo.setLikeCounts(getVlogBeLikedCounts(v.getId()));
vo.setCommentsCounts(getVlogComment(v.getId()));
MemberVO m =memberService.getMemberInfo(vo.getMemberId());
MemberVO m = memberService.getMemberInfo(vo.getMemberId());
if (m != null) {
vo.setAvatar(m.getAvatar());
vo.setNickname(m.getNickname());

View File

@ -236,4 +236,12 @@ public class MemberController extends BaseController {
return R.ok(service.getLoginMemberInfo());
}
@Tag(name ="同步会员的信息")
@GetMapping(value = "/sync")
public R<MemberVO> syncInfo() {
service.syncInfo();
return R.ok();
}
}

View File

@ -0,0 +1,162 @@
package com.wzj.soopin.member.domain.po;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 会员
*
* @author Bulbasaur
* @since 2020-02-25 14:10:16
*/
@Data
@TableName("li_member")
@ApiModel(value = "会员")
@NoArgsConstructor
public class OrgMember extends BaseEntity {
private static final long serialVersionUID = 1L;
private String id;
@ApiModelProperty(value = "会员用户名")
private String username;
@ApiModelProperty(value = "会员密码")
private String password;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "会员性别,1为男0为女")
private Integer sex;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "会员生日")
private Date birthday;
@ApiModelProperty(value = "会员地址ID")
private String regionId;
@ApiModelProperty(value = "会员地址")
private String region;
@ApiModelProperty(value = "手机号码", required = true)
private String mobile;
@ApiModelProperty(value = "积分数量")
private Long point;
@ApiModelProperty(value = "积分总数量")
private Long totalPoint;
@ApiModelProperty(value = "会员头像")
private String face;
@ApiModelProperty(value = "会员状态")
private Boolean disabled;
@ApiModelProperty(value = "是否开通店铺")
private Boolean haveStore;
@ApiModelProperty(value = "店铺ID")
private String storeId;
@ApiModelProperty(value = "客户端")
private String clientEnum;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "最后一次登录时间")
private Date lastLoginDate;
@ApiModelProperty(value = "会员等级ID")
private String gradeId;
@ApiModelProperty(value = "是否为达人")
private Integer expert;
@ApiModelProperty(value = "是否为代理")
private Integer agent;
@ApiModelProperty(value = "经验值数量")
private Long experience;
private String userSig; // 添加 UserSig 属性
/**
* 封禁结束时间
*/
@TableField(value = "ban_end_time")
private Date banEndTime;
// /**
// * 是否为达人
// */
// @TableField("is_expert")
// private Integer isExpert;
public OrgMember(String username, String password, String mobile) {
this.username = username;
this.password = password;
this.mobile = mobile;
this.nickName = mobile;
this.disabled = true;
this.haveStore = false;
this.sex = 0;
this.expert=getExpert();
this.point = 0L;
this.totalPoint = 0L;
this.lastLoginDate = new Date();
this.banEndTime=getBanEndTime();
}
public OrgMember(String username, String password, String mobile, String nickName, String face) {
this.username = username;
this.password = password;
this.mobile = mobile;
this.nickName = nickName;
this.disabled = true;
this.haveStore = false;
this.face = face;
this.sex = 0;
this.point = 0L;
this.totalPoint = 0L;
this.lastLoginDate = new Date();
this.expert=getExpert();
this.banEndTime=getBanEndTime();
}
public OrgMember(String username, String password, String face, String nickName, Integer sex) {
this.username = username;
this.password = password;
this.mobile = "";
this.nickName = nickName;
this.disabled = true;
this.haveStore = false;
this.face = face;
this.sex = sex;
this.point = 0L;
this.totalPoint = 0L;
this.lastLoginDate = new Date();
this.expert=getExpert();
this.banEndTime=getBanEndTime();
}
public Date getBanEndTime() {
return banEndTime;
}
public void setBanEndTime(Date banEndTime) {
this.banEndTime = banEndTime;
}
}

View File

@ -0,0 +1,11 @@
package com.wzj.soopin.member.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wzj.soopin.member.domain.po.OrgMember;
import org.apache.ibatis.annotations.Mapper;
@InterceptorIgnore(tenantLine = "true")
@Mapper
public interface OrgMemberMapper extends BaseMapper<OrgMember> {
}

View File

@ -27,11 +27,10 @@ public interface IMemberService extends IService<Member> {
/**
* 是否可以通过手机获取用户
*
* @param uuid UUID
* @param mobile 手机号
* @return 操作状态
*/
boolean findByMobile(String uuid, String mobile);
Member findByMobile( String mobile);
/**
* 通过用户名获取用户
@ -86,4 +85,5 @@ public interface IMemberService extends IService<Member> {
IPage<MemberVO> getMemberPageList(MemberBO bo, Page<Member> page);
void syncInfo();
}

View File

@ -0,0 +1,17 @@
package com.wzj.soopin.member.service;
import java.lang.reflect.InvocationTargetException;
/**
* 会员同步服务
*
* @author 王智杰
*/
public interface IMemberSyncService {
/**
* 同步会员
*
* @param memberId 会员ID
*/
void syncMember(Long memberId) throws InvocationTargetException, IllegalAccessException;
}

View File

@ -30,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@ -96,7 +97,11 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
queryWrapper.eq(Fans::getVloggerId, vlogerId)
.eq(Fans::getFanId, fanId);
return baseMapper.selectOne(queryWrapper);
List<Fans> fansList = baseMapper.selectList(queryWrapper);
if (fansList.isEmpty()) {
return null;
}
return fansList.get(0);
}
@Transactional(rollbackFor = Exception.class)

View File

@ -92,16 +92,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper,Member> implemen
return this.baseMapper.selectOne(queryWrapper);
}
@Override
public boolean findByMobile(String uuid, String mobile) {
@Cacheable(value = GlobalConstants.MEMBER_KEY, key = "#mobile")
public Member findByMobile( String mobile) {
QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile", mobile);
Member member = this.baseMapper.selectOne(queryWrapper);
if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_PHONE);
}
redisCache.setCacheObject(CachePrefix.FIND_MOBILE + uuid, mobile, 300, TimeUnit.SECONDS);
return true;
return this.baseMapper.selectOne(queryWrapper);
}
@CacheEvict(value = GlobalConstants.MEMBER_KEY, key = "#id")
@ -317,5 +312,12 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper,Member> implemen
return memeberPage;
}
@Override
public void syncInfo() {
//分页拉取用户信息
return;
}
}

View File

@ -0,0 +1,105 @@
package com.wzj.soopin.member.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.domain.po.OrgMember;
import com.wzj.soopin.member.mapper.MemberMapper;
import com.wzj.soopin.member.mapper.OrgMemberMapper;
import com.wzj.soopin.member.service.IMemberService;
import com.wzj.soopin.member.service.IMemberSyncService;
import jodd.typeconverter.impl.LocalDateConverter;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.dromara.common.core.utils.LocalDataUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
/**
* 会员同步服务实现类
*
* @author 王智杰
*/
@Slf4j
@Service
@AllArgsConstructor
public class MemberSyncServiceImpl implements IMemberSyncService {
private final OrgMemberMapper orgMemberMapper;
private final MemberMapper memberMapper;
private final IMemberService memberService;
@Override
public void syncMember(Long memberId) throws InvocationTargetException, IllegalAccessException {
//访问生产数据库
//生产数据库为mysql
//使用orgMember表为用户表
//获取总条数
//分包计算
//每次获取1000条
//循环处理转成Member表
//检查是否存在不存在则新增存在则更新
//更新时只更新会员用户名会员密码昵称手机号邮箱头像性别年龄生日会员等级积分余额状态备注创建时间更新时间删除标志
//访问生产数据库
//生产数据库为mysql
//使用orgMember表为用户表
//获取总条数 n
int totalCount = orgMemberMapper.selectCount(null).intValue();
log.info("开始同步会员数据,总条数:{}", totalCount);
//分包计算
int pageSize = 1000;
int totalPages = (totalCount + pageSize - 1) / pageSize;
LocalDateConverter localDateConverter = new LocalDateConverter();
//每次获取1000条
for (int pageNum = 1; pageNum <= totalPages; pageNum++) {
int offset = (pageNum - 1) * pageSize;
Page<OrgMember> page = new Page<>(pageNum, pageSize);
Page<OrgMember> orgMembers = orgMemberMapper.selectPage(page, null);
//循环处理转成Member表
for (OrgMember orgMember : orgMembers.getRecords()) {
Member member = new Member();
BeanUtils.copyProperties(orgMember, member);
//检查是否存在不存在则新增存在则更新
Member curMember = memberService.findByMobile(orgMember.getMobile());
if (curMember == null) {
curMember=new Member();
BeanUtils.copyProperties(orgMember, curMember);
curMember.setGender(orgMember.getSex());
curMember.setNickname(orgMember.getNickName());
curMember.setBirthday(localDateConverter.convert(orgMember.getBirthday()));
curMember.setPhoneHidden(orgMember.getMobile());
curMember.setPhoneEncrypted(orgMember.getMobile());
curMember.setUserSig(orgMember.getUserSig());
//新增会员
memberService.saveOrUpdate(member);
log.info("新增会员:{}", orgMember.getUsername());
} else {
//更新时只更新会员用户名会员密码昵称手机号邮箱头像性别年龄生日会员等级积分余额状态备注创建时间更新时间删除标志
BeanUtils.copyProperties(orgMember, curMember);
curMember.setGender(orgMember.getSex());
curMember.setNickname(orgMember.getNickName());
curMember.setBirthday(localDateConverter.convert(orgMember.getBirthday()));
curMember.setPhoneHidden(orgMember.getMobile());
curMember.setPhoneEncrypted(orgMember.getMobile());
curMember.setUserSig(orgMember.getUserSig());
memberMapper.updateById(curMember);
log.info("更新会员:{}", orgMember.getUsername());
}
}
log.info("完成第{}页会员同步,共{}条数据", pageNum, orgMembers.getRecords().size());
}
log.info("会员同步完成,总处理条数:{}", totalCount);
}
}