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

@@ -1,16 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yolo.keyborad.mapper.KeyboardUserCharacterMapper">
<resultMap id="BaseResultMap" type="com.yolo.keyborad.model.entity.KeyboardUserCharacter">
<!--@Table keyboard_user_character-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="character_id" jdbcType="BIGINT" property="characterId" />
<result column="deleted" jdbcType="BOOLEAN" property="deleted" />
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
<result column="user_id" jdbcType="BIGINT" property="userId" />
</resultMap>
<sql id="Base_Column_List">
id, character_id, deleted, created_at, updated_at, user_id
</sql>
<resultMap id="KeyboardUserCharacterVOMap"
type="com.yolo.keyborad.model.vo.character.KeyboardUserCharacterVO">
<id column="id" property="id"/>
<!-- keyboard_character 表的列名,根据你的实际字段调整 -->
<result column="character_name" property="characterName"/>
<!-- 关键ARRAY 字段明确指定 jdbcType + typeHandler -->
<result column="sort"
jdbcType="ARRAY"
typeHandler="org.apache.ibatis.type.ArrayTypeHandler"/>
<result column="emoji" property="emoji"/>
</resultMap>
<update id="updateSortByIdAndUserId">
UPDATE keyboard_user_character
SET sort = #{sort,jdbcType=ARRAY}
where user_id = #{userId}
AND deleted = FALSE
</update>
<select id="selectByUserId"
resultMap="KeyboardUserCharacterVOMap">
SELECT
kuc.id,
kc.character_name,
kuc.sort,
kuc.emoji
FROM keyboard_user_character AS kuc
LEFT JOIN keyboard_character AS kc ON kuc.character_id = kc.id
WHERE kuc.user_id = #{loginId}
AND kuc.deleted = FALSE
</select>
</mapper>