# 用户注册功能说明 ## ✅ 已实现的功能 ### 1. 前端页面 #### 登录页面 (`books/pages/login/login.vue`) - ✅ 添加了"还没有账号?立即注册"链接 - ✅ 点击链接跳转到注册页面 - ✅ 支持从注册页面返回时自动填充用户名 #### 注册页面 (`books/pages/register/register.vue`) - ✅ 注册表单包含以下字段: - 用户名(必填) - 昵称(可选,默认使用用户名) - 密码(必填,6-20位) - 确认密码(必填,需与密码一致) - 手机号(可选) - 邮箱(可选) - ✅ 表单验证: - 用户名不能为空 - 密码长度6-20位 - 确认密码必须与密码一致 - 手机号格式验证(如果填写) - 邮箱格式验证(如果填写) - ✅ 密码显示/隐藏切换 - ✅ 注册成功后跳转到登录页面,并自动填充用户名 - ✅ 错误提示和成功提示 ### 2. 后端接口 #### 注册接口 (`POST /api/user/register`) - ✅ 接收注册数据(用户名、密码、昵称、手机号、邮箱) - ✅ 参数验证: - 用户名不能为空 - 密码不能为空 - 密码长度6-20位 - ✅ 业务验证: - 检查用户名是否已存在 - 检查手机号是否已被注册(如果填写) - 检查邮箱是否已被注册(如果填写) - ✅ 密码MD5加密存储 - ✅ 空字符串自动转换为null - ✅ 返回注册成功的用户信息 ### 3. 数据库存储 - ✅ 用户数据存储到 `users` 表 - ✅ 密码使用MD5加密存储 - ✅ 默认状态为启用(status = 1) - ✅ 默认非VIP用户(is_vip = 0) - ✅ 自动生成创建时间和更新时间 ## 📋 数据库表结构 ```sql CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` VARCHAR(50) NOT NULL COMMENT '用户名', `nickname` VARCHAR(50) DEFAULT NULL COMMENT '昵称', `avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像URL', `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号', `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱', `password` VARCHAR(255) NOT NULL COMMENT '密码(MD5加密)', `is_vip` TINYINT(1) DEFAULT 0 COMMENT '是否VIP:0-否,1-是', `vip_expire_time` DATETIME DEFAULT NULL COMMENT 'VIP过期时间', `status` TINYINT(1) DEFAULT 1 COMMENT '状态:0-禁用,1-启用', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), KEY `idx_phone` (`phone`), KEY `idx_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; ``` ## 🚀 使用流程 ### 1. 用户注册流程 1. **打开登录页面** - 用户看到登录页面 - 点击"还没有账号?立即注册"链接 2. **填写注册信息** - 输入用户名(必填) - 输入密码(必填,6-20位) - 输入确认密码(必填,需与密码一致) - 可选:输入昵称、手机号、邮箱 3. **提交注册** - 点击"注册"按钮 - 前端进行表单验证 - 验证通过后调用后端注册接口 4. **注册成功** - 后端验证用户名、手机号、邮箱是否已存在 - 密码MD5加密后存储到数据库 - 返回注册成功的用户信息 - 前端跳转到登录页面,自动填充用户名 - 用户输入密码即可登录 ### 2. 错误处理 - **用户名已存在**:显示"用户名已存在" - **手机号已被注册**:显示"手机号已被注册" - **邮箱已被注册**:显示"邮箱已被注册" - **密码长度不符合要求**:显示"密码长度必须在6-20位之间" - **两次密码不一致**:显示"两次输入的密码不一致" - **手机号格式错误**:显示"请输入正确的手机号" - **邮箱格式错误**:显示"请输入正确的邮箱地址" - **网络错误**:显示"注册失败,请检查网络连接" ## 📝 API接口说明 ### 注册接口 **请求地址**:`POST /api/user/register` **请求头**: ``` Content-Type: application/json ``` **请求参数**: ```json { "username": "testuser", // 必填,用户名 "password": "123456", // 必填,密码(6-20位) "nickname": "测试用户", // 可选,昵称 "phone": "13800138000", // 可选,手机号 "email": "test@example.com" // 可选,邮箱 } ``` **响应示例**: ```json { "code": 200, "message": "注册成功", "data": { "id": 1, "username": "testuser", "nickname": "测试用户", "avatar": null, "phone": "13800138000", "email": "test@example.com", "isVip": false, "status": 1 } } ``` **错误响应**: ```json { "code": 500, "message": "用户名已存在", "data": null } ``` ## 🔍 测试步骤 ### 1. 启动后端服务 ```bash cd book mvn spring-boot:run ``` ### 2. 启动前端项目 在微信开发者工具中打开 `books` 项目 ### 3. 测试注册功能 1. **打开登录页面** - 在微信开发者工具中打开登录页面 2. **点击注册链接** - 点击"还没有账号?立即注册" - 应该跳转到注册页面 3. **填写注册信息** - 用户名:`testuser` - 密码:`123456` - 确认密码:`123456` - 昵称:`测试用户`(可选) - 手机号:`13800138000`(可选) - 邮箱:`test@example.com`(可选) 4. **提交注册** - 点击"注册"按钮 - 应该显示"注册成功"提示 - 自动跳转到登录页面 - 用户名应该自动填充 5. **登录测试** - 在登录页面输入密码 - 点击"登录"按钮 - 应该能够成功登录 ### 4. 测试错误情况 1. **用户名已存在** - 使用已存在的用户名注册 - 应该显示"用户名已存在"错误 2. **密码长度不符合要求** - 输入少于6位的密码 - 应该显示"密码长度不能少于6位"错误 3. **两次密码不一致** - 输入不同的密码和确认密码 - 应该显示"两次输入的密码不一致"错误 4. **手机号格式错误** - 输入格式错误的手机号 - 应该显示"请输入正确的手机号"错误 5. **邮箱格式错误** - 输入格式错误的邮箱 - 应该显示"请输入正确的邮箱地址"错误 ## 📌 注意事项 1. **密码加密**:密码使用MD5加密存储,前端传输的是明文密码 2. **唯一性检查**: - 用户名必须唯一 - 手机号如果填写,必须唯一 - 邮箱如果填写,必须唯一 3. **空值处理**: - 如果手机号或邮箱为空字符串,会自动转换为null - 如果昵称为空,默认使用用户名 4. **数据验证**: - 前端进行基本格式验证 - 后端进行业务逻辑验证 - 数据库层面有唯一性约束 5. **安全性**: - 密码使用MD5加密(生产环境建议使用BCrypt等更安全的加密方式) - 前端验证不能替代后端验证 - 建议添加验证码防止恶意注册 ## 🔄 后续优化建议 1. **密码强度验证**:添加密码强度检查(包含字母、数字等) 2. **验证码**:添加图形验证码或短信验证码 3. **邮箱验证**:注册后发送验证邮件 4. **手机号验证**:注册时发送短信验证码 5. **密码加密升级**:使用BCrypt等更安全的加密方式 6. **注册协议**:添加用户协议和隐私政策 7. **第三方注册**:支持微信、QQ等第三方注册 --- **创建时间**:2024年 **最后更新**:2024年