第37讲 用户注册
本讲基于视频实际讲解内容整理
一、本讲概述
前面实现了登录,本讲做用户注册:用户提交用户名和密码,后端校验合法性、检查用户名是否重复,然后把用户写入数据库(密码加密留到第38讲)。本讲把表单接收(第30讲)、数据库操作(第36讲)串成完整的注册流程。
二、注册表单
HTML
<form method="post" action="/register">
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
确认密码:<input type="password" name="confirm"><br>
<button type="submit">注册</button>
</form>
三、后端注册处理
3.1 接收并校验参数
Go
func Register(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
confirm := c.PostForm("confirm")
if username == "" || password == "" {
c.JSON(200, gin.H{"code": 400, "msg": "用户名和密码不能为空"})
return
}
if password != confirm {
c.JSON(200, gin.H{"code": 400, "msg": "两次密码不一致"})
return
}
3.2 检查用户名是否已存在
Go
var exist User
result := DB.Where("username = ?", username).First(&exist)
if result.RowsAffected > 0 {
c.JSON(200, gin.H{"code": 400, "msg": "用户名已被注册"})
return
}
老师强调:注册前必须查重,否则两个用户同名会出问题(username 设了唯一索引,重复插入也会报错,但提前校验能给出友好提示)。
3.3 写入数据库
Go
user := User{
Username: username,
Password: password, // 本讲先明文,第38讲改为 MD5 加密
}
if err := DB.Create(&user).Error; err != nil {
c.JSON(200, gin.H{"code": 500, "msg": "注册失败"})
return
}
c.JSON(200, gin.H{"code": 200, "msg": "注册成功", "data": gin.H{"redirect": "/login"}})
}
四、完整流程梳理
TEXT
用户填表 → POST /register
→ 校验非空、两次密码一致
→ 查用户名是否重复
→ 创建用户写入 DB
→ 返回 JSON(成功/失败 + 提示)
老师说明:注册成功后通常跳转到登录页让用户登录。这里返回
redirect地址,前端按第33讲的方式跳转。
五、本讲小结
| 知识点 | 要点 |
|---|---|
| 接收参数 | c.PostForm |
| 校验 | 非空、两次密码一致 |
| 查重 | DB.Where(...).First 看 RowsAffected |
| 写入 | DB.Create(&user) |
| 返回 | 统一 JSON(code/msg/redirect) |
| 密码 | 本讲明文,下讲加密 |
六、课后练习
- 写
Registerhandler,接收用户名/密码/确认密码 - 校验非空与两次密码一致,不一致返回错误 JSON
- 用 GORM 查用户名是否重复,重复则返回"已被注册"
- 用
DB.Create插入新用户 - 注册成功后返回跳转到登录页的 JSON
- 思考:为什么不能把密码明文存库?为下一讲 MD5 加密做准备