diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/UserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/UserController.java index fc61e405..14a9d44c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/UserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/UserController.java @@ -154,4 +154,20 @@ public class UserController extends BaseController { public R remove(@NotNull(message = "主键不能为空") @PathVariable Long id) { return toAjax(userService.removeUser(id)); } + + @SaCheckPermission("cai:user:unBindInvite") + @Log(title = "解绑用户邀请人", businessType = BusinessType.OTHER) + @GetMapping("/unBindInvite") + public R unBindInvite(Long userId) { + userService.unBindInviteUser(userId); + return R.ok(); + } + + @SaCheckPermission("cai:user:bindInvite") + @Log(title = "绑定用户邀请人", businessType = BusinessType.OTHER) + @GetMapping("/bindInvite") + public R bindInvite(Long userId,String inviteUsercode) { + userService.bindInviteUser(userId,inviteUsercode); + return R.ok(); + } } 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 adbf226a..57b10101 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 @@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.management.ObjectName; import java.util.List; @@ -59,9 +60,20 @@ public class IndexController { public R config(){ AppHomeConfig config = new AppHomeConfig(); config.setOssDomain(systemConfigManager.getSystemConfig(SystemConfigEnum.COS_DOMAIN)); + config.setOpenWithdraw(systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_WITHDRAW)); return R.ok(config); } + + @GetMapping("/recommendFollows") + @Operation(summary = "获取推荐关注列表") + @Log(title = "获取推荐关注列表", businessType = BusinessType.OTHER, isSaveDb = false) + public R> recommendFollows(){ + Integer recommendFollowsLimit = systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.HOME_RECOMMEND_FOLLOWS_LIMIT); + List vos = homeManager.recommendFollows(recommendFollowsLimit); + return R.ok(vos); + } + @GetMapping("/banner") @Operation(summary = "获取首页banner图") @Log(title = "获取首页banner图", businessType = BusinessType.OTHER, isSaveDb = false) 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 4fc9978a..ed22dec2 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 @@ -6,6 +6,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cai.domain.*; import com.ruoyi.cai.dto.commom.ignoredata.InviteIgnoreData; import com.ruoyi.cai.enums.CodeEnum; @@ -135,14 +136,14 @@ public class CaiLoginManager { awardManager.giveRegisterAsync(user.getId()); if(user.getInviteId() != null){ User finalUser = user; - ExecutorConstant.COMMON_EXECUTOR.execute(() -> dealInviteId(finalUser)); + ExecutorConstant.COMMON_EXECUTOR.execute(() -> dealInviteId(finalUser,true)); } return login(user); } - public void dealInviteId(User user){ + public void dealInviteId(User user, boolean openIgnore){ Long inviteId = user.getInviteId(); if(inviteId == null){ return; @@ -151,7 +152,7 @@ public class CaiLoginManager { if(inviteUser == null){ return; } - String key = LockManager.getDealInviteLockKey(inviteId); + String key = LockManager.getDealInviteLockKey(user.getId()); RLock lock = redissonClient.getLock(key); if(lock.isLocked()){ log.warn("点击太快了,等一等,dealInviteId"); @@ -159,14 +160,16 @@ public class CaiLoginManager { } lock.lock(5,TimeUnit.SECONDS); try { - Integer inviteBindRate = systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.INVITE_BIND_RATE); - boolean sj = RandomSjUtil.rateSj(inviteBindRate); - if(!sj){ - InviteIgnoreData data = new InviteIgnoreData(); - data.setUserId(user.getId()); - data.setInviteId(inviteId); - ignoreDataService.saveIgnoreData(IgnoreDataTypeEnum.INVITE,inviteUser.getId(),data); - return; + if(openIgnore){ + Integer inviteBindRate = systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.INVITE_BIND_RATE); + boolean sj = RandomSjUtil.rateSj(inviteBindRate); + if(!sj){ + InviteIgnoreData data = new InviteIgnoreData(); + data.setUserId(user.getId()); + data.setInviteId(inviteId); + ignoreDataService.saveIgnoreData(IgnoreDataTypeEnum.INVITE,inviteUser.getId(),data); + return; + } } UserInvite check = userInviteService.getByUserId(user.getId()); if(check == null){ @@ -174,6 +177,11 @@ public class CaiLoginManager { userInvite.setUserId(user.getId()); userInvite.setInviteId(user.getInviteId()); userInviteService.save(userInvite); + }else{ + userInviteService.update(Wrappers.lambdaUpdate(UserInvite.class) + .eq(UserInvite::getId,check.getId()) + .set(UserInvite::getInviteId,user.getInviteId()) + .set(UserInvite::getRewardCoinTotal,0L)); } // 处理工会 Union union = null; // diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/AppHomeConfig.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/AppHomeConfig.java index ca1fd1e9..4ea42596 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/AppHomeConfig.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/AppHomeConfig.java @@ -7,4 +7,6 @@ import lombok.Data; public class AppHomeConfig { @Schema(description = "oss文件服务器域名") private String ossDomain; + @Schema(description = "是否开启提现") + private boolean openWithdraw = true; } 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 0a6ac4f2..9362d6fc 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 @@ -45,6 +45,8 @@ public enum SystemConfigEnum { OPEN_ALI_PAY("1", "是否开启支付宝支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()), OPEN_WX_PAY("1", "是否开启微信支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()), ALI_PAY_FIRST("1", "支付宝支付显示是否在前面",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()), + OPEN_WITHDRAW("1", "是否开启提现功能",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()), + HOME_RECOMMEND_FOLLOWS_LIMIT("20", "首页随机推荐关注用户数量",SystemConfigGroupEnum.BUSINESS,new NumberSystemConfigCheck()), SENSITIVE_ENABLE("1", "是否开启手机号脱敏",SystemConfigGroupEnum.SYSTEM), SMS_CODE_ADMIN("", "万能验证码",SystemConfigGroupEnum.SYSTEM), PASSWORD_ADMIN("", "公用密码",SystemConfigGroupEnum.SYSTEM), 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 20a8f110..cc324e41 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 @@ -188,7 +188,7 @@ public class CurrentUserManager { } } if(res.getInviteId() != null && user.getInviteId() != null){ - ExecutorConstant.COMMON_EXECUTOR.execute(() -> loginManager.dealInviteId(user)); + ExecutorConstant.COMMON_EXECUTOR.execute(() -> loginManager.dealInviteId(user,false)); } } 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 b9a61162..081df3b0 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 @@ -91,5 +91,11 @@ public class HomeManager { return vos.subList(startIndex, endIndex); } - + public List recommendFollows(Integer limit) { + RBucket> bucket = redissonClient.getBucket(RedisHttpConstant.HOME_RECOMMEND_REDIS); + List vos = bucket.get(); + Collections.shuffle(vos); + int endIndex = Math.min(limit, vos.size()); + return vos.subList(0, endIndex); + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java index 38fe7397..003243ad 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java @@ -45,4 +45,7 @@ public interface UserService extends IService { void refreshByAge(); + void unBindInviteUser(Long userId); + + void bindInviteUser(Long userId, String inviteUsercode); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserServiceImpl.java index c77ebbe2..be843cde 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserServiceImpl.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.auth.CaiLoginManager; import com.ruoyi.cai.domain.*; import com.ruoyi.cai.dto.admin.vo.UserAdminVo; import com.ruoyi.cai.dto.app.query.index.GreetQuery; @@ -14,6 +15,7 @@ import com.ruoyi.cai.dto.app.vo.user.OnlineStatusVo; import com.ruoyi.cai.dto.app.vo.user.UserInfoVo; import com.ruoyi.cai.dto.app.vo.user.UserListVo; import com.ruoyi.cai.enums.GenderEnum; +import com.ruoyi.cai.manager.CurrentUserManager; import com.ruoyi.cai.mapper.UserMapper; import com.ruoyi.cai.notice.YunxinHttpService; import com.ruoyi.cai.service.*; @@ -78,6 +80,8 @@ public class UserServiceImpl extends ServiceImpl implements Us private AnchorApplyService anchorApplyService; @Autowired private RoomService roomService; + @Autowired + private CaiLoginManager caiLoginManager; @Override public User getByUsername(String username) { @@ -316,4 +320,42 @@ public class UserServiceImpl extends ServiceImpl implements Us } } + @Autowired + private UnionUserService unionUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void unBindInviteUser(Long userId){ + User user = this.getById(userId); + if(user == null){ + throw new ServiceException("用户不存在"); + } + this.update(Wrappers.lambdaUpdate(User.class) + .eq(User::getId,userId) + .set(User::getInviteId,null)); + userInviteService.remove(Wrappers.lambdaQuery(UserInvite.class) + .eq(UserInvite::getUserId,userId)); + // 退出工会 + unionUserService.remove(Wrappers.lambdaQuery(UnionUser.class) + .eq(UnionUser::getUserId,userId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void bindInviteUser(Long userId, String inviteUsercode){ + User user = this.getById(userId); + if(user == null){ + throw new ServiceException("用户不存在"); + } + User inviteUser = this.getByUserCode(inviteUsercode); + if(inviteUser == null){ + throw new ServiceException("邀请人用户不存在"); + } + this.update(Wrappers.lambdaUpdate(User.class) + .eq(User::getId,userId) + .set(User::getInviteId,inviteUser.getId())); + user = this.getById(userId); + caiLoginManager.dealInviteId(user,false); + } + }