数据
This commit is contained in:
@@ -10,6 +10,7 @@ public class RedisHttpConstant {
|
||||
public static final String WITHDRAW_TOTAL_CACHE_REDIS = REDIS_P + "withdrawTotal:%s";
|
||||
public static final String CODE_REDIS = REDIS_P + "code:%s:%s";
|
||||
public static final String USER_GREET_TOTAL_REDIS = REDIS_P + "userGreetTotal:%s:%s";
|
||||
public static final String ANCHOR_TOP_TIME_REDIS = REDIS_P + "anchorTopTime:%s";
|
||||
public static final String USER_GREET_SEND_TIME_REDIS = REDIS_P + "userGreetSendTime:%s";
|
||||
public static final String FORBID_CACHE_REDIS = REDIS_P + "forbid:%s";
|
||||
public static final String LOVE_RANK_REDIS = REDIS_P + "loveRank:%s:%s";
|
||||
|
||||
@@ -85,6 +85,11 @@ public class Anchor implements Serializable{
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 置顶时间
|
||||
*/
|
||||
private LocalDateTime topShowRank;
|
||||
|
||||
/**
|
||||
* 是否允许 发布群发
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.ruoyi.cai.dto.app.vo.top;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AnchorTopResp {
|
||||
@Schema(description = "置顶是否成功")
|
||||
private boolean topSuccess;
|
||||
@Schema(description = "下一次置顶间隔(秒)")
|
||||
private Long nextTopDate = 0L;
|
||||
}
|
||||
@@ -52,6 +52,7 @@ public enum SystemConfigEnum {
|
||||
DEFAULT_UNION_ONE_INCOME_RATE("0.07", "默认工会一级提成",SystemConfigGroupEnum.BUSINESS, new RateSystemConfigCheck()),
|
||||
TODAY_GREET_MAX("100", "每日主播群打招呼次数",SystemConfigGroupEnum.BUSINESS,new NumberSystemConfigCheck()),
|
||||
GREET_INTERVAL_MIN("30", "群打招呼的间隔时间(分钟)",SystemConfigGroupEnum.BUSINESS, new NumberSystemConfigCheck()),
|
||||
ANCHOR_TOP_MIN("30", "小火箭置顶间隔时间(分钟)",SystemConfigGroupEnum.BUSINESS, new NumberSystemConfigCheck()),
|
||||
OPEN_ALI_PAY("1", "是否开启支付宝支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
|
||||
OPEN_WX_PAY("1", "是否开启微信支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
|
||||
ALI_PAY_FIRST("1", "支付宝支付显示是否在前面",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.ruoyi.cai.manager;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.ruoyi.cai.auth.CaiLoginManager;
|
||||
import com.ruoyi.cai.constant.RedisHttpConstant;
|
||||
import com.ruoyi.cai.domain.*;
|
||||
import com.ruoyi.cai.dto.app.query.AccountAliBankCardRes;
|
||||
import com.ruoyi.cai.dto.app.query.AnchorUpdateReq;
|
||||
@@ -11,6 +14,7 @@ import com.ruoyi.cai.dto.app.query.user.UserUpdateAvatarReq;
|
||||
import com.ruoyi.cai.dto.app.query.user.UserUpdateReq;
|
||||
import com.ruoyi.cai.dto.app.vo.AnchorVo;
|
||||
import com.ruoyi.cai.dto.app.vo.CurrentUserInfoVo;
|
||||
import com.ruoyi.cai.dto.app.vo.top.AnchorTopResp;
|
||||
import com.ruoyi.cai.dto.app.vo.user.*;
|
||||
import com.ruoyi.cai.enums.AuditStatusEnum;
|
||||
import com.ruoyi.cai.enums.GenderEnum;
|
||||
@@ -26,15 +30,21 @@ import com.ruoyi.common.utils.BeanConvertUtil;
|
||||
import com.ruoyi.yunxin.client.ImUserRefClient;
|
||||
import com.ruoyi.yunxin.req.UpdateUinfoReq;
|
||||
import com.ruoyi.yunxin.resp.YxCommonR;
|
||||
import com.ruoyi.yunxin.resp.YxDataR;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
@@ -280,5 +290,42 @@ public class CurrentUserManager {
|
||||
|
||||
@Autowired
|
||||
private AnchorApplyService anchorApplyService;
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
@Autowired
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
public AnchorTopResp top() {
|
||||
Long userId = LoginHelper.getUserId();
|
||||
String lockKey = LockManager.getAnchorTopLock(userId);
|
||||
RLock lock = redissonClient.getLock(lockKey);
|
||||
if(lock.isLocked()){
|
||||
throw new ServiceException("操作太频繁");
|
||||
}
|
||||
try {
|
||||
lock.lock(3, TimeUnit.SECONDS);
|
||||
String userGreetSendTime = String.format(RedisHttpConstant.ANCHOR_TOP_TIME_REDIS,userId); // 最近一次的发送时间
|
||||
String lastTime = stringRedisTemplate.opsForValue().get(userGreetSendTime);
|
||||
if(StringUtils.isNotBlank(lastTime)){
|
||||
int inter = systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.ANCHOR_TOP_MIN) * 60;
|
||||
long jiange = DateUtil.currentSeconds() - Long.parseLong(lastTime); // 距离上次发送的间隔
|
||||
long diff = inter - jiange;
|
||||
if(diff > 0){
|
||||
AnchorTopResp resp = new AnchorTopResp();
|
||||
resp.setTopSuccess(false);
|
||||
resp.setNextTopDate(diff);
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
anchorService.update(Wrappers.lambdaUpdate(Anchor.class)
|
||||
.set(Anchor::getTopShowRank, LocalDateTime.now())
|
||||
.eq(Anchor::getUserId, userId));
|
||||
stringRedisTemplate.opsForValue().set(userGreetSendTime,DateUtil.currentSeconds()+"",1,TimeUnit.DAYS);
|
||||
}finally {
|
||||
lock.unlock();
|
||||
}
|
||||
AnchorTopResp resp = new AnchorTopResp();
|
||||
resp.setTopSuccess(true);
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,6 +116,17 @@ public class HomeManager {
|
||||
return list.subList(0,endIndex);
|
||||
}
|
||||
|
||||
public List<AnchorListVo> getHomeV2(PageQuery pageQuery, AnchorListQuery query){
|
||||
if(pageQuery.checkPageNum(20)){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
pageQuery.resetPageSize();
|
||||
query.setOnlineStatus(1);
|
||||
query.setOpenVideoStatus(1);
|
||||
Page<AnchorListVo> page = anchorService.pageAppV2(pageQuery, query);
|
||||
return page.getRecords();
|
||||
}
|
||||
|
||||
public List<AnchorListVo> getHomeCache(PageQuery pageQuery,AnchorListQuery query){
|
||||
AnchorListQueryTypeEnum anchorListQueryTypeEnum = AnchorListQueryTypeEnum.getByCode(query.getType());
|
||||
List<AnchorListVo> vos;
|
||||
|
||||
@@ -8,6 +8,7 @@ public class LockManager {
|
||||
public static final String LOCK_DEAL_INVITE_REDIS = RedisHttpConstant.REDIS_P + "lock:dealInvite:%s";
|
||||
public static final String LOCK_ADD_USER_GREET_REDIS = RedisHttpConstant.REDIS_P + "lock:addUserGreet:%s";
|
||||
public static final String LOCK_SEND_GREET_REDIS = RedisHttpConstant.REDIS_P + "lock:sendGreet:%s";
|
||||
public static final String LOCK_ANCHOR_TOP_REDIS = RedisHttpConstant.REDIS_P + "lock:anchorTop:%s";
|
||||
public static final String LOCK_SEND_GUARD_REDIS = RedisHttpConstant.REDIS_P + "lock:sendGuard:%s";
|
||||
public static final String LOCK_JOIN_ANCHOR_REDIS = RedisHttpConstant.REDIS_P + "lock:joinAnchor:%s";
|
||||
public static final String LOCK_SEND_GIFT_REDIS = RedisHttpConstant.REDIS_P + "lock:sendGift:%s";
|
||||
@@ -35,6 +36,10 @@ public class LockManager {
|
||||
return String.format(LOCK_SEND_GREET_REDIS,userId);
|
||||
}
|
||||
|
||||
public static String getAnchorTopLock(Long userId){
|
||||
return String.format(LOCK_ANCHOR_TOP_REDIS,userId);
|
||||
}
|
||||
|
||||
public static String getSendGuardLock(Long userId){
|
||||
return String.format(LOCK_SEND_GUARD_REDIS,userId);
|
||||
}
|
||||
|
||||
@@ -20,5 +20,7 @@ public interface AnchorMapper extends BaseMapper<Anchor> {
|
||||
|
||||
Page<AnchorListVo> pageApp(@Param("build") Page<Object> build, @Param("query") AnchorListQuery query);
|
||||
|
||||
Page<AnchorListVo> pageAppV2(@Param("build") Page<Object> build, @Param("query") AnchorListQuery query);
|
||||
|
||||
boolean incsServiceTimeAndCount(@Param("toUid") Long toUid, @Param("callTime") Long callTime, @Param("count") int count);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ public interface AnchorService extends IService<Anchor> {
|
||||
|
||||
Page<AnchorListVo> pageApp(PageQuery pageQuery, AnchorListQuery query);
|
||||
|
||||
Page<AnchorListVo> pageAppV2(PageQuery pageQuery, AnchorListQuery query);
|
||||
|
||||
Anchor getByUserId(Long userId);
|
||||
|
||||
void updateVideoStatus(Long userId, int videoStatus);
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.ruoyi.cai.dto.app.query.index.AnchorListQuery;
|
||||
import com.ruoyi.cai.dto.app.vo.AnchorListVo;
|
||||
import com.ruoyi.cai.enums.GenderEnum;
|
||||
import com.ruoyi.cai.enums.SystemConfigEnum;
|
||||
import com.ruoyi.cai.enums.home.AnchorListQueryTypeEnum;
|
||||
import com.ruoyi.cai.manager.SystemConfigManager;
|
||||
import com.ruoyi.cai.mapper.AnchorMapper;
|
||||
import com.ruoyi.cai.notice.YunxinHttpService;
|
||||
@@ -120,6 +121,17 @@ public class AnchorServiceImpl extends ServiceImpl<AnchorMapper, Anchor> impleme
|
||||
return baseMapper.pageApp(pageQuery.build(),query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<AnchorListVo> pageAppV2(PageQuery pageQuery, AnchorListQuery query) {
|
||||
if(query.getType() != null && query.getType() != 3){
|
||||
query.setCityId(null);
|
||||
}
|
||||
if(query.getType() == null){
|
||||
query.setType(AnchorListQueryTypeEnum.DEFAULT.getCode());
|
||||
}
|
||||
return baseMapper.pageAppV2(pageQuery.build(),query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Anchor getByUserId(Long userId){
|
||||
return this.getOne(Wrappers.lambdaQuery(Anchor.class).eq(Anchor::getUserId,userId));
|
||||
|
||||
Reference in New Issue
Block a user