💜 想真正擅长编程? 从一门课程开始,100% 免费

《笔记》第三十六篇 用户注册

第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)
密码 本讲明文,下讲加密

六、课后练习

  1. 写 Register handler,接收用户名/密码/确认密码
  2. 校验非空与两次密码一致,不一致返回错误 JSON
  3. 用 GORM 查用户名是否重复,重复则返回"已被注册"
  4. 用 DB.Create 插入新用户
  5. 注册成功后返回跳转到登录页的 JSON
  6. 思考:为什么不能把密码明文存库?为下一讲 MD5 加密做准备