diff --git a/src/main/java/com/yolo/keyborad/common/ErrorCode.java b/src/main/java/com/yolo/keyborad/common/ErrorCode.java index 4cfd434..e17d40a 100644 --- a/src/main/java/com/yolo/keyborad/common/ErrorCode.java +++ b/src/main/java/com/yolo/keyborad/common/ErrorCode.java @@ -62,6 +62,8 @@ public enum ErrorCode { INVITE_CODE_INVALID(50024, "邀请码无效"), INVITE_CODE_EXPIRED(50025, "邀请码已过期"), INVITE_CODE_USED_UP(50026, "邀请码使用次数已达上限"), + INVITE_CODE_ALREADY_BOUND(50028, "您已绑定过邀请码,无法重复绑定"), + INVITE_CODE_CANNOT_BIND_SELF(50029, "不能绑定自己的邀请码"), RECEIPT_ALREADY_PROCESSED(50027, "收据已处理"); /** diff --git a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java index a2645c1..dddec31 100644 --- a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java +++ b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java @@ -103,8 +103,8 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/apple/notification", "/apple/receipt", "/apple/validate-receipt", - "/user/inviteCode" - + "/user/inviteCode", + "/user/bindInviteCode" }; } @Bean diff --git a/src/main/java/com/yolo/keyborad/controller/UserController.java b/src/main/java/com/yolo/keyborad/controller/UserController.java index ed03069..c00adfe 100644 --- a/src/main/java/com/yolo/keyborad/controller/UserController.java +++ b/src/main/java/com/yolo/keyborad/controller/UserController.java @@ -142,4 +142,10 @@ public class UserController { return ResultUtils.success(respVO); } + @PostMapping("/bindInviteCode") + @Operation(summary = "绑定邀请码", description = "用户填写邀请码进行绑定") + public BaseResponse bindInviteCode(@RequestBody BindInviteCodeDTO bindInviteCodeDTO) { + return ResultUtils.success(userService.bindInviteCode(bindInviteCodeDTO)); + } + } \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/dto/user/BindInviteCodeDTO.java b/src/main/java/com/yolo/keyborad/model/dto/user/BindInviteCodeDTO.java new file mode 100644 index 0000000..035fdb5 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/dto/user/BindInviteCodeDTO.java @@ -0,0 +1,20 @@ +package com.yolo.keyborad.model.dto.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 绑定邀请码请求 + * @author: ziin + * @date: 2025/12/19 + */ +@Data +@Schema(description = "绑定邀请码请求") +public class BindInviteCodeDTO { + + /** + * 邀请码 + */ + @Schema(description = "邀请码", required = true) + private String inviteCode; +} diff --git a/src/main/java/com/yolo/keyborad/service/UserService.java b/src/main/java/com/yolo/keyborad/service/UserService.java index 31fc8a9..960c355 100644 --- a/src/main/java/com/yolo/keyborad/service/UserService.java +++ b/src/main/java/com/yolo/keyborad/service/UserService.java @@ -28,4 +28,6 @@ public interface UserService extends IService { Boolean resetPassWord(ResetPassWordDTO resetPassWordDTO); + Boolean bindInviteCode(BindInviteCodeDTO bindInviteCodeDTO); + } 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 048fd99..44b87ba 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java @@ -350,4 +350,49 @@ public class UserServiceImpl extends ServiceImpl() + .eq(KeyboardUserInvites::getInviteeUserId, userId) + ); + if (existingBindCount > 0) { + throw new BusinessException(ErrorCode.INVITE_CODE_ALREADY_BOUND); + } + + // 验证邀请码 + String inviteCodeStr = bindInviteCodeDTO.getInviteCode().trim(); + KeyboardUserInviteCodes inviteCode = inviteCodesService.validateInviteCode(inviteCodeStr); + + // 检查是否是绑定自己的邀请码 + if (inviteCode.getOwnerUserId().equals(userId)) { + throw new BusinessException(ErrorCode.INVITE_CODE_CANNOT_BIND_SELF); + } + + // 创建邀请关系绑定记录 + KeyboardUserInvites userInvite = new KeyboardUserInvites(); + userInvite.setInviterUserId(inviteCode.getOwnerUserId()); + userInvite.setInviteeUserId(userId); + userInvite.setInviteCodeId(inviteCode.getId()); + userInvite.setBindType((short) 1); // 1=手动填写邀请码 + userInvite.setBoundAt(new Date()); + userInvite.setBindIp(request.getRemoteAddr()); + userInvite.setBindUserAgent(request.getHeader("User-Agent")); + userInvitesService.save(userInvite); + + // 更新邀请码使用次数 + inviteCode.setUsedCount(inviteCode.getUsedCount() + 1); + inviteCodesService.updateById(inviteCode); + + log.info("User bound invite code, userId={}, inviteCodeId={}, inviterUserId={}", + userId, inviteCode.getId(), inviteCode.getOwnerUserId()); + + return true; + } + }