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

相关文章
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
【7月更文挑战第13天】在Web开发中,AJAX和Fetch API是实现页面无刷新数据交换的关键。在Flask博客系统中,通过创建获取评论的GET路由,我们可以展示使用AJAX和Fetch API的前端实现。AJAX通过XMLHttpRequest发送请求,处理响应并在成功时更新DOM。Fetch API则使用Promise简化异步操作,代码更现代。这两个工具都能实现不刷新页面查看评论,Fetch API的语法更简洁,错误处理更直观。掌握这些技巧能提升Python Web项目的用户体验和开发效率。
15 7
|
2天前
|
API 数据库 开发者
逆袭之路!Django/Flask助你成为Web开发界的璀璨新星!
【7月更文挑战第13天】在Python Web开发中,Django和Flask各具优势。Django适合快速构建大型项目,如在线书店,其ORM和内置功能让复杂应用轻松上手。Flask则以其轻量和灵活性见长,适用于个人博客等小型应用。选择框架应根据项目需求和个人偏好,两者都能助开发者在Web开发领域大放异彩。
11 2
|
3天前
|
安全 大数据 编译器
PHP 8: 探索新特性及其对现代Web开发的影响
在这篇文章中,我们将深入探讨PHP 8的最新特性,包括JIT编译器、联合类型、匹配表达式等,并分析这些更新如何影响现代Web开发。通过具体示例和代码片段,本文旨在为开发者提供一个清晰的指南,以便更好地利用PHP 8的新功能优化和加速他们的应用程序。
10 2
|
3天前
|
编译器 测试技术 PHP
深入理解PHP 7的新特性及其对现代Web开发的影响
【7月更文挑战第12天】本文将探讨PHP 7版本中引入的关键改进和新增功能,以及这些变化如何优化了性能、提升了代码的可维护性,并促进了现代Web开发的最佳实践。通过具体示例,我们将深入了解这些新特性在日常开发中的应用,以及它们为开发者带来的实际益处。
10 2
|
3天前
|
数据库 开发者 Python
从菜鸟到大神,Django/Flask 让你秒变 Web 开发界的‘头号玩家’!
【7月更文挑战第12天】在Python Web开发中,Django和Flask框架各具特色。Flask轻量灵活,适合快速搭建简单应用,如博客,基本代码仅需几行。Django则功能全面,适用于复杂项目,如电商网站,内置ORM和管理后台。两者都助力开发者从新手进阶。选择取决于项目需求和个人偏好。学习和实践这两个框架,能助你成为Web开发专家。
|
3天前
|
PHP 开发者
PHP 8 新特性及其对现代Web开发的影响
PHP 8作为最新版本,引入了一系列强大的新特性和改进,这些变化不仅仅是语言本身的提升,更深刻地影响了现代Web开发的方式和效率。本文将深入探讨PHP 8的关键特性,分析其在开发实践中的应用和优势,帮助开发者更好地理解和利用这些新特性。 【7月更文挑战第12天】
9 1
|
1天前
|
XML 前端开发 API
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
【7月更文挑战第14天】Web开发中,AJAX作为异步通信先驱,与新兴的Fetch API一起革新交互体验。Fetch基于Promise,简化了请求处理。Python后端,如Flask,提供稳定支撑。这三者的融合,推动Web应用达到新高度,实现高效、实时交互。通过示例展示,我们看到从发送请求到更新UI的流畅过程,以及Python如何轻松返回JSON数据。这种组合揭示了现代Web开发的潜力和魅力。
7 0
|
1天前
|
开发者 C++ Python
从零到一,Django/Flask带你走进Web开发的梦幻世界!
【7月更文挑战第14天】在Python Web开发中,Django和Flask各具特色。Django是全能框架,提供ORM、模板、认证等全套解决方案,适合快速建站和新手入门;Flask则轻量灵活,适合原型开发和定制化需求。两者都有活跃社区和丰富扩展,Django学习曲线平缓,Flask更需自定义配置。选择适合自己的框架,开启编程新篇章。
7 0
|
5天前
|
安全 编译器 数据处理
PHP 8新特性及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言引入了多项新特性和性能改进。本文将深入探讨PHP 8的关键更新,包括JIT编译器、联合类型、命名参数、匹配表达式等,并分析这些变化如何影响现代Web开发实践,以及开发者如何利用这些新工具来构建更快、更安全、更易维护的应用程序。
8 0
|
5天前
|
编译器 API PHP
PHP 8新特性及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言迎来了其发展历程中的一个重要里程碑。本文将深入探讨PHP 8引入的关键新特性,如JIT编译器、联合类型、匹配表达式等,并分析这些变化如何影响现代Web开发的实践和原则。通过具体案例和性能数据,我们将展示PHP 8如何优化代码编写、增强程序性能以及提升项目维护性,从而为开发者提供更高效、更可靠的开发体验。
7 0