diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java index 42d609b8..acc9dad0 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java @@ -217,21 +217,6 @@ public class CaiLoginManager { } - public void recordLoginInfo(User user, String ip,String imei) { - String address = AddressUtils.getRealAddressByIP(ip); - UserInfo userInfo = userInfoService.getById(user.getId()); - UserInfo update = new UserInfo(); - update.setUserId(user.getId()); - update.setLoginCount(userInfo.getLoginCount()==null?0:userInfo.getLoginCount()+1); - update.setLastLoginIp(ip); - update.setLastLoginTime(LocalDateTime.now()); - update.setLastLocation(address); - if(StringUtils.isNotBlank(imei)){ - update.setImei(imei); - } - userInfoService.updateById(update); - } - /** * 退出登录 @@ -262,9 +247,6 @@ public class CaiLoginManager { loginUser.setUserType(UserType.APP_USER.getUserType()); LoginHelper.login(loginUser); sysLoginService.recordLogininfor(loginUser.getUsername(), UserType.APP_USER.getUserType(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - String clientIP = ServletUtils.getClientIP(); - String imei = ServletUtils.getImei(); - ExecutorConstant.COMMON_EXECUTOR.execute(() -> recordLoginInfo(user,clientIP,imei)); return StpUtil.getTokenValue(); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberPrice.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberPrice.java index 26c6adae..88b3202e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberPrice.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberPrice.java @@ -61,14 +61,17 @@ public class MemberPrice implements Serializable { /** * 有效期(天) */ + @Schema(description = "有效期(天)") private Integer expires; /** * 状态 0 可用 1不可用 */ + @Schema(hidden = true) private Integer status; /** * 永久状态 0 不是 1是 */ + @Schema(description = "永久状态 0-不是 1-是") private Integer longs; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberSkill.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberSkill.java index b545bad9..0ba9c987 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberSkill.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/MemberSkill.java @@ -29,6 +29,7 @@ public class MemberSkill implements Serializable { /** * 类型 0 普通 1 超级 */ + @Schema(description = "会员类型 0 普通 1 超级") private Integer memberType; /** * 名称 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/commom/IdDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/commom/IdDTO.java new file mode 100644 index 00000000..5a6db7a3 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/commom/IdDTO.java @@ -0,0 +1,8 @@ +package com.ruoyi.cai.dto.commom; + +import lombok.Data; + +@Data +public class IdDTO { + private Long id; +} 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 f07d9d60..f2d59a7b 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 @@ -12,6 +12,7 @@ import com.ruoyi.cai.mq.handle.dto.LoginNotifyDTO; import com.ruoyi.cai.service.AnchorService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.common.utils.ServletUtils; import org.redisson.api.RBucket; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; @@ -117,6 +118,8 @@ public class HomeManager { if(userId != null){ LoginNotifyDTO loginUserDTO = new LoginNotifyDTO(); loginUserDTO.setUserId(userId); + loginUserDTO.setImei(ServletUtils.getImei()); + loginUserDTO.setClientIP(ServletUtils.getClientIP()); amqpProducer.sendCommonMq(loginUserDTO); } return config; 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 ab4ba044..dccabf9b 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 @@ -11,6 +11,7 @@ public class LockManager { public static final String LOCK_SEND_GUARD_REDIS = RedisHttpConstant.REDIS_P + "lock:sendGuard:%s"; public static final String LOCK_SEND_GIFT_REDIS = RedisHttpConstant.REDIS_P + "lock:sendGift:%s"; public static final String LOCK_VIDEO_SETTLE_REDIS = RedisHttpConstant.REDIS_P + "lock:videoSettle:%s"; + public static final String LOCK_ONLINE_LOGIN_NOTICE_REDIS = RedisHttpConstant.REDIS_P + "lockHand:loginFansNotice:%s"; public static String getRegisterLockKey(String mobile){ return String.format(LOCK_REGISTER_REDIS,mobile); @@ -39,4 +40,8 @@ public class LockManager { public static String getSendGiftLock(Long userId){ return String.format(LOCK_SEND_GIFT_REDIS,userId); } + + public static String getLoginNoticeFansLock(Long userId){ + return String.format(LOCK_ONLINE_LOGIN_NOTICE_REDIS,userId); + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserFollowMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserFollowMapper.java index 03647545..cb03434b 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserFollowMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserFollowMapper.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.cai.domain.UserFollow; import com.ruoyi.cai.dto.app.query.StarQuery; import com.ruoyi.cai.dto.app.vo.user.UserStarOrVisitorList; +import com.ruoyi.cai.dto.commom.IdDTO; import org.apache.ibatis.annotations.Param; /** @@ -25,4 +26,6 @@ public interface UserFollowMapper extends BaseMapper { * 查询我的粉丝 (关注我的人) */ Page pageMyFansApp(@Param("build") Page build, @Param("query") StarQuery query); + + Page pageFanUserIdByGender(@Param("page") Page page, @Param("userId") Long userId, @Param("gender") Integer gender); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java index 90feecf1..3ac80283 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java @@ -1,32 +1,107 @@ package com.ruoyi.cai.mq.handle; import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.User; +import com.ruoyi.cai.domain.UserInfo; +import com.ruoyi.cai.dto.commom.IdDTO; +import com.ruoyi.cai.enums.GenderEnum; +import com.ruoyi.cai.manager.LockManager; +import com.ruoyi.cai.mapper.UserFollowMapper; import com.ruoyi.cai.mq.dto.CommonConsumerEnum; import com.ruoyi.cai.mq.handle.dto.LoginNotifyDTO; -import com.ruoyi.cai.mq.handle.dto.RankNotifyDTO; -import com.ruoyi.cai.rank.RankManager; +import com.ruoyi.cai.notice.YunxinHttpService; +import com.ruoyi.cai.service.UserInfoService; +import com.ruoyi.cai.service.UserService; +import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.framework.OnlineUserTodayCache; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RBucket; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + @Component @Slf4j public class LoginNotifyHandle implements IHandle { @Autowired private OnlineUserTodayCache onlineUserTodayCache; + @Autowired + private UserInfoService userInfoService; + @Autowired + private UserService userService; + @Autowired + private RedissonClient redissonClient; @Override public void run(String message) { LoginNotifyDTO loginNotify = JSON.parseObject(message, LoginNotifyDTO.class); - boolean todayFirstLogin = onlineUserTodayCache.addOnlineUserId(loginNotify.getUserId()); + boolean todayFirstLogin = onlineUserTodayCache.addOnlineUserId(loginNotify.getUserId(),loginNotify.getHappenTime()); + if(todayFirstLogin){ + this.updateUserInfoSB(loginNotify.getUserId(),loginNotify.getClientIP(),loginNotify.getImei()); + } // 上线通知 - - - + String loginNoticeFansLock = LockManager.getLoginNoticeFansLock(loginNotify.getUserId()); + RBucket bucket = redissonClient.getBucket(loginNoticeFansLock); + boolean boo = bucket.setIfAbsent("cai", Duration.ofMinutes(60)); + if(boo){ + sendOnlineNotice(loginNotify.getUserId()); + } } + @Resource + private UserFollowMapper userFollowMapper; + @Autowired + private YunxinHttpService yunxinHttpService; + + private void sendOnlineNotice(Long userId){ + log.info("发送在线通知调试打印"); + User user = userService.getById(userId); + // 男的上线,并且没有开启隐身模式 则通知女主播舔狗上线了 + if(GenderEnum.MAN.getCode().equals(user.getGender()) && !user.getNoGreet().equals(1)){ + // 获取他的女粉丝 + Page page = new Page<>(1,500); + int current = 0; + while (true){ + current++; + page.setCurrent(current); + Page userIdPage = userFollowMapper.pageFanUserIdByGender(page, userId,GenderEnum.WOMEN.getCode()); + if(userIdPage.getRecords().isEmpty()){ + break; + } + List userIds = userIdPage.getRecords().stream().map(IdDTO::getId).collect(Collectors.toList()); + yunxinHttpService.sendOnlineAttentionNotice(userIds, user); + if(userIdPage.getRecords().size() < 500){ + break; + } + } + } + } + + private void updateUserInfoSB(Long userId, String ip,String imei) { + String address = AddressUtils.getRealAddressByIP(ip); + UserInfo userInfo = userInfoService.getById(userId); + UserInfo update = new UserInfo(); + update.setUserId(userId); + update.setLoginCount(userInfo.getLoginCount()==null?0:userInfo.getLoginCount()+1); + update.setLastLoginIp(ip); + update.setLastLoginTime(LocalDateTime.now()); + update.setLastLocation(address); + if(StringUtils.isNotBlank(imei)){ + update.setImei(imei); + } + userInfoService.updateById(update); + } + + @Override public CommonConsumerEnum getType() { return CommonConsumerEnum.LOGIN; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/WindowGiftNotifyHandle.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/WindowGiftNotifyHandle.java index 7e065801..bdfd5cd7 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/WindowGiftNotifyHandle.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/WindowGiftNotifyHandle.java @@ -35,7 +35,7 @@ public class WindowGiftNotifyHandle implements IHandle{ Gift gift = windowGift.getGift(); Set userIds = onlineUserTodayCache.getAllOnlineToday(); List userIdList = new ArrayList<>(userIds); - List> lists = Lists.partition(userIdList, 300); + List> lists = Lists.partition(userIdList, 500); for (List list : lists) { SendGiftWindowsAmountNoticeData data = new SendGiftWindowsAmountNoticeData(); data.setId(fromUser.getId()); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/dto/LoginNotifyDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/dto/LoginNotifyDTO.java index 97f3d770..755b60a6 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/dto/LoginNotifyDTO.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/dto/LoginNotifyDTO.java @@ -9,6 +9,8 @@ import java.time.LocalDateTime; @Data public class LoginNotifyDTO extends CommonDTO { private Long userId; + private String clientIP; + private String imei; private LocalDateTime happenTime; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java index 2934ee3e..086a842c 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java @@ -97,6 +97,7 @@ public class UserFollowServiceImpl extends ServiceImpl + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/OnlineUserTodayCache.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/OnlineUserTodayCache.java index 09aa5fde..a1d70318 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/OnlineUserTodayCache.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/OnlineUserTodayCache.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import java.time.Duration; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Set; @@ -17,20 +18,20 @@ public class OnlineUserTodayCache { @Autowired private RedissonClient redissonClient; - private String getKey(){ - String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + private String getKey(LocalDateTime dateTime){ + String today = dateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd")); return String.format(CacheConstants.ONLINE_TODAY_TOKEN_KEY,today); } - public boolean addOnlineUserId(Long userId){ - RSet set = redissonClient.getSet(getKey()); + public boolean addOnlineUserId(Long userId, LocalDateTime dateTime){ + RSet set = redissonClient.getSet(getKey(dateTime)); boolean res = set.add(userId); set.expire(Duration.ofDays(1)); return res; } public Set getAllOnlineToday(){ - RSet set = redissonClient.getSet(getKey()); + RSet set = redissonClient.getSet(getKey(LocalDateTime.now())); return set.readAll(); } }