feat(invite): 新增用户邀请码创建与查询接口

This commit is contained in:
2025-12-24 21:36:27 +08:00
parent e90078791c
commit b9197c4275
5 changed files with 111 additions and 2 deletions

View File

@@ -8,9 +8,13 @@ import com.yolo.keyborad.model.dto.AppleLoginReq;
import com.yolo.keyborad.model.dto.user.*; import com.yolo.keyborad.model.dto.user.*;
import com.yolo.keyborad.model.entity.KeyboardFeedback; import com.yolo.keyborad.model.entity.KeyboardFeedback;
import com.yolo.keyborad.model.entity.KeyboardUser; import com.yolo.keyborad.model.entity.KeyboardUser;
import com.yolo.keyborad.model.entity.KeyboardUserInviteCodes;
import com.yolo.keyborad.model.vo.user.InviteCodeRespVO;
import com.yolo.keyborad.model.vo.user.KeyboardUserInfoRespVO; import com.yolo.keyborad.model.vo.user.KeyboardUserInfoRespVO;
import com.yolo.keyborad.model.vo.user.KeyboardUserRespVO; import com.yolo.keyborad.model.vo.user.KeyboardUserRespVO;
import com.yolo.keyborad.service.IAppleService; import com.yolo.keyborad.service.IAppleService;
import com.yolo.keyborad.service.KeyboardFeedbackService;
import com.yolo.keyborad.service.KeyboardUserInviteCodesService;
import com.yolo.keyborad.service.UserService; import com.yolo.keyborad.service.UserService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@@ -41,8 +45,10 @@ public class UserController {
private UserService userService; private UserService userService;
@Resource @Resource
private com.yolo.keyborad.service.KeyboardFeedbackService feedbackService; private KeyboardFeedbackService feedbackService;
@Resource
private KeyboardUserInviteCodesService inviteCodesService;
/** /**
* 苹果登录 * 苹果登录
* *
@@ -133,4 +139,15 @@ public class UserController {
return ResultUtils.success(userService.bindInviteCode(bindInviteCodeDTO)); return ResultUtils.success(userService.bindInviteCode(bindInviteCodeDTO));
} }
@GetMapping("/inviteCode")
@Operation(summary = "查询邀请码", description = "查询用户自己的邀请码")
public BaseResponse<InviteCodeRespVO> getInviteCode() {
long userId = StpUtil.getLoginIdAsLong();
KeyboardUserInviteCodes inviteCode = inviteCodesService.getUserInviteCode(userId);
if (inviteCode == null) {
inviteCode = inviteCodesService.createInviteCode(userId);
}
InviteCodeRespVO respVO = BeanUtil.copyProperties(inviteCode, InviteCodeRespVO.class);
return ResultUtils.success(respVO);
}
} }

View File

@@ -0,0 +1,29 @@
package com.yolo.keyborad.model.vo.user;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
/**
* 邀请码响应VO
*/
@Data
@Schema(description = "邀请码信息")
public class InviteCodeRespVO {
@Schema(description = "邀请码")
private String code;
@Schema(description = "邀请码状态1=启用0=停用")
private Short status;
@Schema(description = "已使用次数")
private Integer usedCount;
@Schema(description = "最大可使用次数")
private Integer maxUses;
@Schema(description = "过期时间")
private Date expiresAt;
}

View File

@@ -15,4 +15,18 @@ public interface KeyboardUserInviteCodesService extends IService<KeyboardUserInv
*/ */
KeyboardUserInviteCodes validateInviteCode(String code); KeyboardUserInviteCodes validateInviteCode(String code);
/**
* 获取用户的邀请码
* @param userId 用户ID
* @return 邀请码实体
*/
KeyboardUserInviteCodes getUserInviteCode(Long userId);
/**
* 为用户创建邀请码
* @param userId 用户ID
* @return 创建的邀请码实体
*/
KeyboardUserInviteCodes createInviteCode(Long userId);
} }

View File

@@ -20,6 +20,53 @@ import com.yolo.keyborad.service.KeyboardUserInviteCodesService;
@Service @Service
public class KeyboardUserInviteCodesServiceImpl extends ServiceImpl<KeyboardUserInviteCodesMapper, KeyboardUserInviteCodes> implements KeyboardUserInviteCodesService{ public class KeyboardUserInviteCodesServiceImpl extends ServiceImpl<KeyboardUserInviteCodesMapper, KeyboardUserInviteCodes> implements KeyboardUserInviteCodesService{
@Override
public KeyboardUserInviteCodes getUserInviteCode(Long userId) {
QueryWrapper<KeyboardUserInviteCodes> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("owner_user_id", userId);
return this.getOne(queryWrapper);
}
@Override
public KeyboardUserInviteCodes createInviteCode(Long userId) {
// 生成唯一的邀请码
String code;
int maxRetries = 10;
int retryCount = 0;
do {
// 生成8位字母数字组合的邀请码
code = RandomUtil.randomString(8).toUpperCase();
// 检查邀请码是否已存在
QueryWrapper<KeyboardUserInviteCodes> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("code", code);
KeyboardUserInviteCodes existingCode = this.getOne(queryWrapper);
if (existingCode == null) {
break;
}
retryCount++;
} while (retryCount < maxRetries);
// 创建邀请码实体
KeyboardUserInviteCodes inviteCode = new KeyboardUserInviteCodes();
inviteCode.setCode(code);
inviteCode.setOwnerUserId(userId);
inviteCode.setStatus((short) 1); // 启用状态
inviteCode.setCreatedAt(new Date());
inviteCode.setExpiresAt(null); // 永久有效
inviteCode.setMaxUses(null); // 不限次数
inviteCode.setUsedCount(0); // 初始使用次数为0
// 保存到数据库
this.save(inviteCode);
return inviteCode;
}
@Override @Override
public KeyboardUserInviteCodes validateInviteCode(String code) { public KeyboardUserInviteCodes validateInviteCode(String code) {
// 查询邀请码 // 查询邀请码

View File

@@ -103,7 +103,6 @@ public class UserServiceImpl extends ServiceImpl<KeyboardUserMapper, KeyboardUse
wallet.setCreatedAt(new Date()); wallet.setCreatedAt(new Date());
wallet.setUpdatedAt(new Date()); wallet.setUpdatedAt(new Date());
walletService.save(wallet); walletService.save(wallet);
// 初始化用户免费使用次数配额 // 初始化用户免费使用次数配额
KeyboardUserQuotaTotal quotaTotal = new KeyboardUserQuotaTotal(); KeyboardUserQuotaTotal quotaTotal = new KeyboardUserQuotaTotal();
quotaTotal.setUserId(keyboardUser.getId()); quotaTotal.setUserId(keyboardUser.getId());
@@ -114,6 +113,8 @@ public class UserServiceImpl extends ServiceImpl<KeyboardUserMapper, KeyboardUse
quotaTotal.setUpdatedAt(new Date()); quotaTotal.setUpdatedAt(new Date());
quotaTotalService.save(quotaTotal); quotaTotalService.save(quotaTotal);
inviteCodesService.createInviteCode(keyboardUser.getId());
log.info("User registered with Apple Sign-In, userId={}, freeQuota={}", log.info("User registered with Apple Sign-In, userId={}, freeQuota={}",
keyboardUser.getId(), appConfig.getUserRegisterProperties().getFreeTrialQuota()); keyboardUser.getId(), appConfig.getUserRegisterProperties().getFreeTrialQuota());
@@ -252,6 +253,7 @@ public class UserServiceImpl extends ServiceImpl<KeyboardUserMapper, KeyboardUse
quotaTotal.setCreatedAt(new Date()); quotaTotal.setCreatedAt(new Date());
quotaTotal.setUpdatedAt(new Date()); quotaTotal.setUpdatedAt(new Date());
quotaTotalService.save(quotaTotal); quotaTotalService.save(quotaTotal);
inviteCodesService.createInviteCode(keyboardUser.getId());
// 处理邀请码绑定 // 处理邀请码绑定
if (userRegisterDTO.getInviteCode() != null && !userRegisterDTO.getInviteCode().trim().isEmpty()) { if (userRegisterDTO.getInviteCode() != null && !userRegisterDTO.getInviteCode().trim().isEmpty()) {