This commit is contained in:
77
2024-08-03 19:56:22 +08:00
parent 4fc5fdc77f
commit 3706411b80
14 changed files with 150 additions and 1 deletions

View File

@@ -15,6 +15,12 @@ CREATE TABLE `cai_account_black`
ALTER TABLE `cai_anchor`
ADD COLUMN `enable_greet` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否允许群发' AFTER `recommend_status`;
ALTER TABLE `cai_anchor`
ADD COLUMN `top_show_rank` datetime NOT NULL DEFAULT now() COMMENT '置顶时间' AFTER `show_me_rate`;
ALTER TABLE `cai_anchor`
ADD INDEX `idx_top_date`(`top_show_rank`) USING BTREE;
-- 菜单 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(1819683762522001409, '账户黑名单', '1737668638361206786', '1', 'accountBlack', 'cai/accountBlack/index', 1, 0, 'C', '0', '0', 'cai:accountBlack:list', '#', 'admin', sysdate(), '', null, '账户黑名单菜单');

View File

@@ -7,6 +7,7 @@ import com.ruoyi.cai.dto.app.query.anchor.UpdateOrderSwitchReq;
import com.ruoyi.cai.dto.app.vo.AnchorJoinHomeVo;
import com.ruoyi.cai.dto.app.vo.AnchorVo;
import com.ruoyi.cai.dto.app.vo.CameraAuditVo;
import com.ruoyi.cai.dto.app.vo.top.AnchorTopResp;
import com.ruoyi.cai.manager.CurrentUserManager;
import com.ruoyi.cai.service.AnchorApplyService;
import com.ruoyi.cai.service.AnchorService;
@@ -46,6 +47,15 @@ public class AnchorAppController {
}
@GetMapping("/top")
@Operation(summary = "主播置顶")
@Log(title = "主播置顶", businessType = BusinessType.OTHER, isSaveDb = false)
public R<AnchorTopResp> anchorTop(){
AnchorTopResp top = currentUserManager.top();
return R.ok(top);
}
@PostMapping("/update")
@Operation(summary = "修改当前用户的主播信息")
@Log(title = "修改当前用户的主播信息", businessType = BusinessType.OTHER, isSaveDb = true)

View File

@@ -93,7 +93,8 @@ public class IndexController {
@Operation(summary = "首页查询主播接口-分页")
@Log(title = "首页查询主播接口", businessType = BusinessType.OTHER,isPrintResponseData = false, isSaveDb = false)
public R<List<AnchorListVo>> anchorPage(PageQuery page, AnchorListQuery query){
List<AnchorListVo> home = homeManager.getHomeCache(page, query);
// List<AnchorListVo> home = homeManager.getHomeCache(page, query);
List<AnchorListVo> home = homeManager.getHomeV2(page, query);
return R.ok(home);
}

View File

@@ -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";

View File

@@ -85,6 +85,11 @@ public class Anchor implements Serializable{
*/
private Integer status;
/**
* 置顶时间
*/
private LocalDateTime topShowRank;
/**
* 是否允许 发布群发
*/

View File

@@ -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;
}

View File

@@ -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()),

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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));

View File

@@ -87,6 +87,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if>
</if>
</select>
<select id="pageAppV2" resultType="com.ruoyi.cai.dto.app.vo.AnchorListVo">
select t1.id as user_id,t1.avatar,t1.gender,t1.city,t1.nickname,t1.usercode,t1.city_id,t1.city,t2.give_score,
t2.price,t3.status as online
from cai_user t1
join cai_anchor t2 on t1.id = t2.user_id
join cai_user_online t3 on t1.id = t3.user_id
where t1.status = 0 and t1.is_anchor = 1 and t2.index_display = 1 and t1.usercode > 100
<if test="query.cityId != null and query.cityId != ''">
and t1.city_id = #{query.cityId}
</if>
<if test="query.cityId != null and query.cityId != ''">
and t1.city_id = #{query.cityId}
</if>
<if test="query.onlineStatus != null">
and t3.status = #{query.onlineStatus}
</if>
<if test="query.openVideoStatus != null">
and t2.open_video_status = #{query.openVideoStatus}
</if>
<if test="query.type != null">
<if test="query.type == 0">
order by t2.top_show_rank desc
</if>
<if test="query.type == 1">
order by t3.top_show_rank desc
</if>
<if test="query.type == 2">
order by t2.top_show_rank desc
</if>
<if test="query.type == 3">
order by t2.top_show_rank desc
</if>
</if>
</select>
</mapper>