From b9197c427589df330dafe253b8d05f8679329cdd Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 24 Dec 2025 21:36:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(invite):=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=82=80=E8=AF=B7=E7=A0=81=E5=88=9B=E5=BB=BA=E4=B8=8E?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyborad/controller/UserController.java | 19 +++++++- .../model/vo/user/InviteCodeRespVO.java | 29 ++++++++++++ .../KeyboardUserInviteCodesService.java | 14 ++++++ .../KeyboardUserInviteCodesServiceImpl.java | 47 +++++++++++++++++++ .../service/impl/UserServiceImpl.java | 4 +- 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/yolo/keyborad/model/vo/user/InviteCodeRespVO.java diff --git a/src/main/java/com/yolo/keyborad/controller/UserController.java b/src/main/java/com/yolo/keyborad/controller/UserController.java index 8a83c21..ef2d7c1 100644 --- a/src/main/java/com/yolo/keyborad/controller/UserController.java +++ b/src/main/java/com/yolo/keyborad/controller/UserController.java @@ -8,9 +8,13 @@ import com.yolo.keyborad.model.dto.AppleLoginReq; import com.yolo.keyborad.model.dto.user.*; import com.yolo.keyborad.model.entity.KeyboardFeedback; 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.KeyboardUserRespVO; 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 io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -41,8 +45,10 @@ public class UserController { private UserService userService; @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)); } + @GetMapping("/inviteCode") + @Operation(summary = "查询邀请码", description = "查询用户自己的邀请码") + public BaseResponse 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); + } } \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/vo/user/InviteCodeRespVO.java b/src/main/java/com/yolo/keyborad/model/vo/user/InviteCodeRespVO.java new file mode 100644 index 0000000..f9c155f --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/vo/user/InviteCodeRespVO.java @@ -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; +} diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardUserInviteCodesService.java b/src/main/java/com/yolo/keyborad/service/KeyboardUserInviteCodesService.java index c7b63b9..7741b42 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardUserInviteCodesService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardUserInviteCodesService.java @@ -15,4 +15,18 @@ public interface KeyboardUserInviteCodesService extends IService implements KeyboardUserInviteCodesService{ + @Override + public KeyboardUserInviteCodes getUserInviteCode(Long userId) { + QueryWrapper 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 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 public KeyboardUserInviteCodes validateInviteCode(String code) { // 查询邀请码 diff --git a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java index 9a8051c..cf40d0d 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java @@ -103,7 +103,6 @@ public class UserServiceImpl extends ServiceImpl