feat:查看微信,vip详细配置

This commit is contained in:
dzc committed 2025-12-08 10:39:59 +08:00
1 parent d4c83d9c18
commit 204c4a7129
12 files changed
+161 -13

No files matched your search

@@ -42,6 +42,10 @@ public enum MemberRecentOperateEnum {
* 用户-评价
*/
MEMBER_RATING("7", "评价"),
/**
* 用户-查看微信
*/
MEMBER_LOOK_WECHAT("100", "用户-查看微信"),
;
private final String type;
private final String description;
@@ -37,6 +37,18 @@ public class MemberConfigBaseVO {
@Schema(description = "普通用户每天可以和人发几次消息")
private Integer defaultChatUserMsgCout;
@NotNull(message = "vip用户每天可以和几个人聊天不能为空")
@Schema(description = "vip用户每天可以和几个人聊天")
private Integer vipChatUserCout;
@NotNull(message = "vip用户每天可以和人发几次消息不能为空")
@Schema(description = "vip用户每天可以和人发几次消息")
private Integer vipChatUserMsgCout;
@NotNull(message = "vip查看微信次数不能为空")
@Schema(description = "vip查看微信次数")
private Integer vipLookWechtCout;
@Schema(description = "举报类型")
private List<String> reportTypeList;
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.member.controller.app.recent.vo.*;
import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum;
import cn.iocoder.yudao.module.member.service.recent.RecentService;
import cn.iocoder.yudao.module.member.service.recent.ViewRecordService;
import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.ibatis.annotations.Delete;
@@ -69,6 +70,12 @@ public class AppRecentController {
return success(recentService.operate(dto));
}
@GetMapping("/look-wechat")
@Operation(summary = "查看微信")
public CommonResult<MemberWechatBO> lookWechat(@RequestParam("memberId") Long memberId) {
return success(recentService.lookWechat(getLoginUserId(), memberId));
}
@PostMapping("/create/view-record")
@Operation(summary = "添加用户预览记录")
public CommonResult<Long> createViewRecord(@Valid @RequestBody AppRecentViewRecordReqVo dto) {
@@ -63,6 +63,21 @@ public class MemberConfigDO extends BaseDO {
*/
private Integer defaultChatUserMsgCout;
/**
* vip用户每天可以和几个人聊天
*/
private Integer vipChatUserCout;
/**
* vip用户每天可以和人发几次消息
*/
private Integer vipChatUserMsgCout;
/**
* vip查看微信次数
*/
private Integer vipLookWechtCout;
/**
* 举报类型
*/
@@ -187,16 +187,16 @@ public class OpenTypeServiceImpl implements OpenTypeService {
*/
@Override
public boolean isUserCanSendMessage(Long sendId, Long receiveId) {
// 判断是否是会员
if (isUserOpenType(sendId)) return true;
// 获取配置
MemberConfigDO config = memberConfigService.getConfig();
// 普通用户每天可以和几个人聊天
Integer defaultChatUserCout = config.getDefaultChatUserCout();
if (ObjectUtil.isEmpty(defaultChatUserCout)) defaultChatUserCout = 3;
// 普通用户每天可以和人发几次消息
Integer defaultChatUserMsgCout = config.getDefaultChatUserMsgCout();
if (ObjectUtil.isEmpty(defaultChatUserMsgCout)) defaultChatUserMsgCout = 3;
// 判断是否是会员
boolean isVip = isUserOpenType(sendId);
// 用户每天可以和几个人聊天
Integer chatUserCout = isVip ? config.getVipChatUserCout() : config.getDefaultChatUserCout();
if (ObjectUtil.isEmpty(chatUserCout)) chatUserCout = 3;
// 用户每天可以和人发几次消息
Integer chatUserMsgCout = isVip ? config.getVipChatUserMsgCout() : config.getDefaultChatUserMsgCout();
if (ObjectUtil.isEmpty(chatUserMsgCout)) chatUserMsgCout = 3;
LocalDateTime now = LocalDateTime.now();
LocalDateTime startDate = now.withHour(0).withMinute(0).withSecond(0);
@@ -212,13 +212,13 @@ public class OpenTypeServiceImpl implements OpenTypeService {
List<ChatPrivateTotalMessageTotalResVO> msgList = chatApi.privateTotal(dto);
if (ObjectUtil.isEmpty(msgList)) return true;
// 普通用户聊天人数是否超过上限
if (msgList.size() > defaultChatUserCout) {
if (msgList.size() > chatUserCout && ObjectUtil.notEqual(chatUserCout, -1)) {
throw exception(MemberErrorCode.CHAT_USER_COUNT_EXCEED);
}
// 聊天人数已经超过限制
ChatPrivateTotalMessageTotalResVO targetCount = msgList.stream().filter(item -> ObjectUtil.equals(item.getSendId(), sendId) && ObjectUtil.equals(item.getReceiveId(), receiveId)).findFirst().orElse(null);
if (ObjectUtil.isEmpty(targetCount)) return true;
if (targetCount.getMessageTotal() > defaultChatUserMsgCout) {
if (targetCount.getMessageTotal() > chatUserMsgCout && ObjectUtil.notEqual(chatUserMsgCout, -1)) {
throw exception(MemberErrorCode.CHAT_MSG_COUNT_EXCEED);
}
return true;
@@ -59,4 +59,9 @@ public interface OperationService {
* 获取黑名单列表
*/
List<Long> getBlackUserIdList(Long memberId);
/**
* 获取微信今日查看次数
*/
Integer lookWechatTodayCount(Long operateMemberId, Long memberId);
}
@@ -20,6 +20,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -132,4 +134,18 @@ public class OperationServiceImpl implements OperationService {
return list.stream().map(OperationDO::getMemberId).collect(Collectors.toList());
}
/**
* 获取微信今日查看次数
*/
@Override
public Integer lookWechatTodayCount(Long operateMemberId, Long memberId) {
LocalDateTime now = LocalDateTime.now();
Long count = operationMapper.selectCount(new LambdaQueryWrapperX<OperationDO>()
.eq(OperationDO::getOperatorMemberId, operateMemberId)
.eqIfPresent(OperationDO::getMemberId, memberId)
.eq(OperationDO::getBizType, MemberRecentOperateEnum.MEMBER_LOOK_WECHAT.getType())
.between(OperationDO::getCancelTime, now.with(LocalTime.MIN), now.with(LocalTime.MAX))
);
return Math.toIntExact(count);
}
}
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.member.controller.admin.recent.vo.*;
import cn.iocoder.yudao.module.member.controller.app.recent.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.recent.RecentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO;
/**
* 朋友圈 Service 接口
@@ -37,6 +38,11 @@ public interface RecentService {
*/
Long operate(@Valid AppRecentOperateReqVo dto);
/**
* 查看微信
*/
MemberWechatBO lookWechat(Long operateMemberId, Long memberId);
/**
* 获得朋友圈
*/
@@ -101,4 +107,5 @@ public interface RecentService {
* 朋友圈我喜欢的、喜欢我的等总数统计
*/
OperationTotalGroupRecentRespVO total(Long userId);
}
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.member.service.recent;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.api.thirdauth.ThirdAuthVo;
@@ -11,6 +10,7 @@ import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppEvaluateDetail
import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentLikeReqVo;
import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentOperateReqVo;
import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentQuickPageVO;
import cn.iocoder.yudao.module.member.dal.dataobject.config.MemberConfigDO;
import cn.iocoder.yudao.module.member.dal.dataobject.location.LocationDO;
import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO;
import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO;
@@ -18,16 +18,18 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberRecentTagMapper;
import cn.iocoder.yudao.module.member.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.member.enums.MemberErrorCode;
import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum;
import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum;
import cn.iocoder.yudao.module.member.enums.tag.MemberRecentTagEnum;
import cn.iocoder.yudao.module.member.service.config.MemberConfigService;
import cn.iocoder.yudao.module.member.service.location.LocationService;
import cn.iocoder.yudao.module.member.client.service.ThirdAuthService;
import cn.iocoder.yudao.module.member.service.opentype.OpenTypeService;
import cn.iocoder.yudao.module.member.service.photo.PhotoService;
import cn.iocoder.yudao.module.member.service.user.BO.MemberExtBO;
import cn.iocoder.yudao.module.member.service.user.BO.MemberTagExtBO;
import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO;
import cn.iocoder.yudao.module.member.service.user.MemberRecentCfgService;
import cn.iocoder.yudao.module.member.service.user.MemberRecentTagService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
@@ -37,7 +39,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -79,6 +80,8 @@ public class RecentServiceImpl implements RecentService {
@Resource
private MemberUserService memberUserService;
@Resource
private MemberConfigService memberConfigService;
@Resource
private LocationService locationService;
@Resource
private ThirdAuthService thirdAuthService;
@@ -90,6 +93,8 @@ public class RecentServiceImpl implements RecentService {
private MemberRecentTagService memberRecentTagService;
@Resource
private MemberRecentCfgService memberRecentCfgService;
@Resource
private OpenTypeService openTypeService;
/**
* 创建朋友圈
@@ -262,6 +267,42 @@ public class RecentServiceImpl implements RecentService {
return operationDO.getId();
}
/**
* 查看微信
*/
@Override
public MemberWechatBO lookWechat(Long operateMemberId, Long memberId) {
if (ObjectUtil.equals(operateMemberId, memberId)) {
throw exception(MemberErrorCode.EMPTY, "不能查看自己微信");
}
// 查询用户是不是vip
if (!openTypeService.isUserOpenType(operateMemberId)) {
throw exception(MemberErrorCode.EMPTY, "请先开通会员");
}
MemberWechatBO memberWechat = memberUserService.getMemberWechat(memberId);
if (ObjectUtil.isEmpty(memberWechat)) {
throw exception(MemberErrorCode.EMPTY, "用户没有绑定微信");
}
MemberConfigDO config = memberConfigService.getConfig();
Integer vipLookWechtCout = config.getVipLookWechtCout();
// 判断今天有没有查看过
if (operationService.lookWechatTodayCount(operateMemberId, memberId) > 0) {
return memberWechat;
}
// 查询用户今天有没有查看次数
Integer userLookWechtCout = operationService.lookWechatTodayCount(operateMemberId, null);
if (userLookWechtCout > vipLookWechtCout) {
throw exception(MemberErrorCode.EMPTY, "今日查看微信次数已用完");
}
OperationDO operationObj = new OperationDO();
operationObj.setOperatorMemberId(operateMemberId);
operationObj.setMemberId(memberId);
operationObj.setBizType(MemberRecentOperateEnum.MEMBER_LOOK_WECHAT.getType());
operationObj.setTapTime(LocalDateTime.now());
operationMapper.insert(operationObj);
return memberWechat;
}
@Override
public RecentDO getRecent(Long id) {
return recentMapper.selectById(id);
@@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.member.service.user.BO;
import lombok.Data;
@Data
public class MemberWechatBO {
/**
* 微信号
*/
private String wechatNum;
/**
* 微信二维码
*/
private String wechatQrCode;
}
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateR
import cn.iocoder.yudao.module.member.controller.app.user.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.service.user.BO.MemberExtBO;
import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO;
import javax.validation.Valid;
import java.util.Collection;
@@ -198,4 +199,9 @@ public interface MemberUserService {
* 同步聊天的用户体系
*/
boolean syncChatUser(Long id);
/**
* 获取用户的微信信息
*/
MemberWechatBO getMemberWechat(Long memberId);
}
@@ -26,6 +26,7 @@ import cn.iocoder.yudao.module.member.enums.photo.PhotoBizTypeEnum;
import cn.iocoder.yudao.module.member.enums.tag.MemberRecentTagEnum;
import cn.iocoder.yudao.module.member.mq.producer.user.MemberUserProducer;
import cn.iocoder.yudao.module.member.service.user.BO.MemberExtBO;
import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO;
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
import cn.iocoder.yudao.module.system.api.social.SocialClientApi;
@@ -428,4 +429,20 @@ public class MemberUserServiceImpl implements MemberUserService {
chatUser.setAvatar(memberUser.getAvatar());
return chatApi.createOrUpdate(chatUser);
}
/**
* 获取用户的微信信息
*/
@Override
public MemberWechatBO getMemberWechat(Long memberId) {
MemberUserDO detail = memberUserMapper.selectById(memberId);
if (ObjectUtil.isEmpty(detail)) return null;
if (ObjectUtil.isEmpty(detail.getWechatNum()) || ObjectUtil.isEmpty(detail.getWechatQrCode())) {
return null;
}
MemberWechatBO result = new MemberWechatBO();
result.setWechatNum(detail.getWechatNum());
result.setWechatQrCode(detail.getWechatQrCode());
return result;
}
}