From 3706411b80f8e8faf2e1c08f1ab37ba3bd41290d Mon Sep 17 00:00:00 2001 From: 77 <77@77.com> Date: Sat, 3 Aug 2024 19:56:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/1.2.0.sql | 6 +++ .../cai/app/AnchorAppController.java | 10 ++++ .../controller/cai/app/IndexController.java | 3 +- .../ruoyi/cai/constant/RedisHttpConstant.java | 1 + .../java/com/ruoyi/cai/domain/Anchor.java | 5 ++ .../cai/dto/app/vo/top/AnchorTopResp.java | 12 +++++ .../com/ruoyi/cai/enums/SystemConfigEnum.java | 1 + .../ruoyi/cai/manager/CurrentUserManager.java | 47 +++++++++++++++++++ .../com/ruoyi/cai/manager/HomeManager.java | 11 +++++ .../com/ruoyi/cai/manager/LockManager.java | 5 ++ .../com/ruoyi/cai/mapper/AnchorMapper.java | 2 + .../com/ruoyi/cai/service/AnchorService.java | 2 + .../cai/service/impl/AnchorServiceImpl.java | 12 +++++ .../resources/mapper/cai/AnchorMapper.xml | 34 ++++++++++++++ 14 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/top/AnchorTopResp.java diff --git a/doc/1.2.0.sql b/doc/1.2.0.sql index 0c93f50c..9fcb5849 100644 --- a/doc/1.2.0.sql +++ b/doc/1.2.0.sql @@ -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, '账户黑名单菜单'); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/AnchorAppController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/AnchorAppController.java index b9fdac04..0ea1c580 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/AnchorAppController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/AnchorAppController.java @@ -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 anchorTop(){ + AnchorTopResp top = currentUserManager.top(); + return R.ok(top); + } + + @PostMapping("/update") @Operation(summary = "修改当前用户的主播信息") @Log(title = "修改当前用户的主播信息", businessType = BusinessType.OTHER, isSaveDb = true) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/IndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/IndexController.java index 5e708833..cd59e718 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/IndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/IndexController.java @@ -93,7 +93,8 @@ public class IndexController { @Operation(summary = "首页查询主播接口-分页") @Log(title = "首页查询主播接口", businessType = BusinessType.OTHER,isPrintResponseData = false, isSaveDb = false) public R> anchorPage(PageQuery page, AnchorListQuery query){ - List home = homeManager.getHomeCache(page, query); +// List home = homeManager.getHomeCache(page, query); + List home = homeManager.getHomeV2(page, query); return R.ok(home); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java index 66ef557f..d7548e03 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java @@ -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"; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Anchor.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Anchor.java index ce7dc67b..24f41832 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Anchor.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Anchor.java @@ -85,6 +85,11 @@ public class Anchor implements Serializable{ */ private Integer status; + /** + * 置顶时间 + */ + private LocalDateTime topShowRank; + /** * 是否允许 发布群发 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/top/AnchorTopResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/top/AnchorTopResp.java new file mode 100644 index 00000000..0e4b0d55 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/top/AnchorTopResp.java @@ -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; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java index 82932ef9..ee7cedc3 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java @@ -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()), diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java index 273b0b2c..9847eab5 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java @@ -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; + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/HomeManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/HomeManager.java index 06bea750..dcf6c14b 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/HomeManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/HomeManager.java @@ -116,6 +116,17 @@ public class HomeManager { return list.subList(0,endIndex); } + public List getHomeV2(PageQuery pageQuery, AnchorListQuery query){ + if(pageQuery.checkPageNum(20)){ + return Collections.emptyList(); + } + pageQuery.resetPageSize(); + query.setOnlineStatus(1); + query.setOpenVideoStatus(1); + Page page = anchorService.pageAppV2(pageQuery, query); + return page.getRecords(); + } + public List getHomeCache(PageQuery pageQuery,AnchorListQuery query){ AnchorListQueryTypeEnum anchorListQueryTypeEnum = AnchorListQueryTypeEnum.getByCode(query.getType()); List vos; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java index daf3b3b5..91e832a0 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java @@ -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); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorMapper.java index 523d73af..0240b274 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorMapper.java @@ -20,5 +20,7 @@ public interface AnchorMapper extends BaseMapper { Page pageApp(@Param("build") Page build, @Param("query") AnchorListQuery query); + Page pageAppV2(@Param("build") Page build, @Param("query") AnchorListQuery query); + boolean incsServiceTimeAndCount(@Param("toUid") Long toUid, @Param("callTime") Long callTime, @Param("count") int count); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorService.java index 478e761c..7390ae23 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorService.java @@ -24,6 +24,8 @@ public interface AnchorService extends IService { Page pageApp(PageQuery pageQuery, AnchorListQuery query); + Page pageAppV2(PageQuery pageQuery, AnchorListQuery query); + Anchor getByUserId(Long userId); void updateVideoStatus(Long userId, int videoStatus); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorServiceImpl.java index 251fe0bb..d7b91e75 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorServiceImpl.java @@ -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 impleme return baseMapper.pageApp(pageQuery.build(),query); } + @Override + public Page 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)); diff --git a/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml index 81303eaf..dc915438 100644 --- a/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml +++ b/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml @@ -87,6 +87,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +