Go Web 开发 Demo【用户登录、注册、验证】(1)

简介: Go Web 开发 Demo【用户登录、注册、验证】

前言

       这篇文章主要是学习怎么用 Go 语言(Gin)开发Web程序,前端太弱了,得好好补补课,完了再来更新。

1、环境准备

新建项目,生成 go.mod 文件:

出现报错:go: modules disabled by GO111MODULE=off; see 'go help modules',说明需要开启:

临时设置环境变量

set GO111MODULE=on # windows
export GO111MODULE=on # linux

永久设置环境变量:

再次生成 go.mod 文件:

执行完毕,发现项目下生成 go.mod 文件:

这里的模块名称是我们自定义的,不是说非得和哪个目录或者项目名对应上!

2、用户注册

2.1、需求

  • 用户向地址 /register 发送POST请求(表单携带着 username、password、phone)
  • 后端处理请求(检查手机号位数、手机号是否已经被注册、用户名是否为空)

2.2、需求实现

2.2.1、判断手机号是否存在

func isPhoneExist(db gorm.DB, phone string) bool {
  user := User{}
  db.Where("phone = ?", phone).First(user)
  if user.ID != 0 {
    return true
  }
  return false
}

2.2.2、生成随机10位的用户名

func RandomString(length int) string {
  var letters = []byte("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM")
  result := make([]byte, length)
 
  rand.Seed(time.Now().Unix())
  for i := range result {
    result[i] = letters[rand.Intn(len(letters))]
  }
  return string(result)
}

2.2.3、设置用户表结构体

       这个结构体的字段会对应用户表中的每个字段,我们会在初始化数据库的时候,使用 gorm.DB 的  AutoMigrate 方法自动帮我进行创建这个结构体对应的表。

type User struct {
  gorm.Model
  Name     string `gorm:"type:varchar(20);not null"`
  Phone    string `gorm:"type:varchar(110);not null,unique"`
  Password string `gorm:"size:255;not null"`
}

其中 gorm.Model 的源码如下:

我们通过嵌套 gorm.Model 来给我们的表增加四个字段。

2.2.4、获得数据库连接(gorm)

func InitDB() *gorm.DB {
  driverName := "mysql"
  host := "127.0.0.1"
  port := 3306
  database := "go_web"
  username := "root"
  password := "xxxxx"
  charset := "utf8mb4"
 
  args := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true", username, password, host, port, database, charset)
 
  db, err := gorm.Open(driverName, args)
  if err != nil {
    panic("failed to connect database, err : " + err.Error())
  }
  db.AutoMigrate(&User{}) // 如果表不存在则自动创建
  return db
}

2.3、完整代码

package main
 
import (
  "fmt"
  "github.com/gin-gonic/gin"
  _ "github.com/go-sql-driver/mysql"
  "github.com/jinzhu/gorm"
  "math/rand"
  "net/http"
  "time"
)
 
type User struct {
  gorm.Model
  Name     string `gorm:"type:varchar(20);not null"`
  Phone    string `gorm:"type:varchar(110);not null,unique"`
  Password string `gorm:"size:255;not null"`
}
 
func main() {
 
  db := InitDB()
  defer db.Close()
 
  engine := gin.Default()
  engine.POST("/register", func(ctx *gin.Context) {
    // 获取参数
    name := ctx.PostForm("username")
    phone := ctx.PostForm("phone")
    password := ctx.PostForm("password")
 
    // 数据验证
    if len(phone) != 11 {
      ctx.JSON(http.StatusUnprocessableEntity, gin.H{
        "code": 422,
        "msg":  "手机号必须为11位!",
      })
      return
    }
    if len(password) < 6 {
      // gin.H 等同于 map[string]any
      ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{
        "code": 422,
        "msg":  "密码不能少于6位!",
      })
      return
    }
    if len(name) == 0 {
      name = RandomString(10)
    }
 
    fmt.Println(name, phone, password)
 
    // 判断手机号是否存在
    if isPhoneExist(*db, phone) {
      ctx.JSON(http.StatusUnprocessableEntity, gin.H{
        "msg": "用户已存在,不允许重复注册",
      })
      return
    }
 
    // 创建用户
    newUser := User{
      Name:     name,
      Phone:    phone,
      Password: password,
    }
    db.Create(&newUser)
 
    // 返回结果
    ctx.JSON(200, gin.H{
      "msg": "注册成功",
    })
  })
 
  panic(engine.Run()) // 默认端口 8080
}
 
func isPhoneExist(db gorm.DB, phone string) bool {
  user := User{}
  db.Where("phone = ?", phone).First(user)
  if user.ID != 0 {
    return true
  }
  return false
}
 
func RandomString(length int) string {
  var letters = []byte("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM")
  result := make([]byte, length)
 
  rand.Seed(time.Now().Unix())
  for i := range result {
    result[i] = letters[rand.Intn(len(letters))]
  }
  return string(result)
}
 
func InitDB() *gorm.DB {
  driverName := "mysql"
  host := "127.0.0.1"
  port := 3306
  database := "go_web"
  username := "root"
  password := "xxxxx"
  charset := "utf8mb4"
 
  args := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true", username, password, host, port, database, charset)
 
  db, err := gorm.Open(driverName, args)
  if err != nil {
    panic("failed to connect database, err : " + err.Error())
  }
  db.AutoMigrate(&User{}) // 如果表不存在则自动创建
  return db
}

2.4、测试

使用规范的用户信息再次注册:


Go Web 开发 Demo【用户登录、注册、验证】(2)https://developer.aliyun.com/article/1534273

相关文章
|
9天前
|
传感器 小程序 搜索推荐
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
通过电子班牌设备和智慧校园数据平台的统一管理,在电子班牌上,班牌展示、学生上课刷卡考勤、考勤状况汇总展示,课表展示,考场管理,请假管理,成绩查询,考试优秀标兵展示、校园通知展示,班级文化各片展示等多种化展示。
34 0
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
|
7天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
|
3天前
|
前端开发 JavaScript PHP
PHP与现代Web开发:探索PHP的持续演变
在动态Web开发的舞台上,PHP一直是一个不可或缺的角色。从早期的简单个人网页到复杂的企业级应用,PHP经历了无数次变革,以适应不断变化的技术需求。本文将带您了解PHP如何保持其在Web开发中的核心地位,以及它如何应对新兴技术的挑战。
|
3天前
|
前端开发 JavaScript 开发工具
Web前端开发学习资料:深度探索与开发实践
Web前端开发学习资料:深度探索与开发实践
9 3
|
2天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
9天前
|
JavaScript 前端开发 UED
在Web开发中,拖放(Drag and Drop)和动画效果是提升用户体验的重要工具
【6月更文挑战第12天】本文介绍了如何使用JavaScript实现拖放功能和基本动画效果。拖放功能通过监听mousedown、mousemove和mouseup事件,计算并更新元素位置实现。动画效果则利用requestAnimationFrame函数创建平滑移动的视觉效果。示例代码包括HTML结构和对应的JavaScript实现。
33 1
|
2天前
|
存储 Go 开发工具
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
|
2天前
|
JSON 算法 Go
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
|
2天前
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
|
8天前
|
Dart 前端开发 JavaScript
Flutter for Web:跨平台移动与Web开发的新篇章
Flutter for Web是Google的开源UI工具包Flutter的延伸,用于构建高性能、高保真的跨平台应用,包括Web。它基于Dart语言和Flutter的核心框架,利用Skia渲染引擎通过WebAssembly在Web上运行。开发流程包括安装SDK、创建项目、编写Dart代码和部署。性能优化涉及减少渲染开销、代码压缩等。与传统Web框架相比,Flutter for Web在开发效率和性能上有优势,但兼容性和生态系统尚待完善。
14 0