feat(user): 新增邮箱注册与验证码发送功能

- 新增 UserRegisterDTO 及 /user/register 接口
- 集成 MailerSend,异步发送 6 位验证码邮件
- 添加 RedisUtil 缓存验证码 10 分钟
- 补充 SEND_MAIL_FAILED、CONFIRM_PASSWORD_NOT_MATCH 错误码
- 关闭 Spring Security CSRF 与表单登录,放行 /user/register
- AppleService 移除 @AllArgsConstructor,改用 @Resource 注入
This commit is contained in:
2025-12-04 15:22:16 +08:00
parent a7273e4620
commit 4e6a5a6e18
12 changed files with 173 additions and 34 deletions

View File

@@ -4,6 +4,8 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.yolo.keyborad.common.BaseResponse;
import com.yolo.keyborad.common.ResultUtils;
import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterDTO;
import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterSortUpdateDTO;
import com.yolo.keyborad.model.entity.KeyboardCharacter;
import com.yolo.keyborad.model.entity.KeyboardTag;
import com.yolo.keyborad.model.entity.KeyboardUserCharacter;
@@ -15,10 +17,9 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -34,6 +35,8 @@ public class CharacterController {
@Resource
private KeyboardCharacterService characterService;
@Autowired
private ChatModel chatModel;
@GetMapping("/list")
@Operation(summary = "人设列表", description = "人设列表接口按 rank 排名")
@@ -59,7 +62,15 @@ public class CharacterController {
@GetMapping("/listByUser")
@Operation(summary = "用户人设列表", description = "用户人设列表接口")
public BaseResponse<List<KeyboardUserCharacterVO>> userList() {
List<KeyboardCharacter> keyboardCharacters = characterService.selectListByUserId();
return ResultUtils.success(BeanUtil.copyToList(keyboardCharacters, KeyboardUserCharacterVO.class));
return ResultUtils.success(characterService.selectListByUserId());
}
@PostMapping("/updateUserCharacterSort")
@Operation(summary = "更新用户人设排序",description = "更新用户人设排序接口")
public BaseResponse<Boolean> updateUserCharacterSort(@RequestBody KeyboardUserCharacterSortUpdateDTO sortUpdateDTO) {
characterService.updateSort(sortUpdateDTO);
return ResultUtils.success(true);
}
}