feat:查看微信,vip详细配置
This commit is contained in:
1 parent
d4c83d9c18
commit
204c4a7129
12 files changed
+161
-13
No files matched your search
+4
@@ -42,6 +42,10 @@ public enum MemberRecentOperateEnum {
|
||||
* 用户-评价
|
||||
*/
|
||||
MEMBER_RATING("7", "评价"),
|
||||
/**
|
||||
* 用户-查看微信
|
||||
*/
|
||||
MEMBER_LOOK_WECHAT("100", "用户-查看微信"),
|
||||
;
|
||||
private final String type;
|
||||
private final String description;
|
||||
|
||||
+12
@@ -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;
|
||||
|
||||
|
||||
+7
@@ -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) {
|
||||
|
||||
+15
@@ -63,6 +63,21 @@ public class MemberConfigDO extends BaseDO {
|
||||
*/
|
||||
private Integer defaultChatUserMsgCout;
|
||||
|
||||
/**
|
||||
* vip用户每天可以和几个人聊天
|
||||
*/
|
||||
private Integer vipChatUserCout;
|
||||
|
||||
/**
|
||||
* vip用户每天可以和人发几次消息
|
||||
*/
|
||||
private Integer vipChatUserMsgCout;
|
||||
|
||||
/**
|
||||
* vip查看微信次数
|
||||
*/
|
||||
private Integer vipLookWechtCout;
|
||||
|
||||
/**
|
||||
* 举报类型
|
||||
*/
|
||||
|
||||
+10
-10
@@ -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;
|
||||
|
||||
+5
@@ -59,4 +59,9 @@ public interface OperationService {
|
||||
* 获取黑名单列表
|
||||
*/
|
||||
List<Long> getBlackUserIdList(Long memberId);
|
||||
|
||||
/**
|
||||
* 获取微信今日查看次数
|
||||
*/
|
||||
Integer lookWechatTodayCount(Long operateMemberId, Long memberId);
|
||||
}
|
||||
+16
@@ -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);
|
||||
}
|
||||
}
|
||||
+7
@@ -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);
|
||||
|
||||
}
|
||||
+44
-3
@@ -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);
|
||||
|
||||
+18
@@ -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;
|
||||
|
||||
}
|
||||
+6
@@ -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);
|
||||
}
|
||||
+17
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user