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

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

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

3、项目重构

       上面我们把连接数据库和响应的代码都放到了一个文件中,显然后期随着业务代码越来越多开发起来越来越难以管理,所以我们这里需要对项目进行重构:

3.1、util 层

存放工具,比如我们上面的随机生成用户名方法

package util
 
import (
  "math/rand"
  "time"
)
 
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)
}

3.2、model 层

存放结构体

package model
 
import "github.com/jinzhu/gorm"
 
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"`
}

3.3、common 层

存放一些公共的方法,比如连接数据库工具

package common
 
import (
  "com.lyh/goessential/model"
  "fmt"
  "github.com/jinzhu/gorm"
)
 
var DB *gorm.DB
 
func InitDB() *gorm.DB {
  driverName := "mysql"
  host := "127.0.0.1"
  port := 3306
  database := "go_web"
  username := "root"
  password := "Yan1029."
  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(&model.User{}) // 如果表不存在则自动创建
 
  DB = db
  return db
}
 
func GetDB() *gorm.DB {
  return DB
}

3.4、controller 层

       存放控制器,因为我们使用的 Gin 框架的请求方法都是函数式编程,它的第二个参数是一个处理请求的函数,所以控制器层我们存放的是业务模块对应的方法:

package controller
 
import (
  "com.lyh/goessential/common"
  "com.lyh/goessential/model"
  "com.lyh/goessential/util"
  "fmt"
  "github.com/gin-gonic/gin"
  "github.com/jinzhu/gorm"
  "net/http"
)
 
func Register(ctx *gin.Context) {
  DB := common.GetDB()
  // 获取参数
  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 = util.RandomString(10)
  }
 
  fmt.Println(name, phone, password)
 
  // 判断手机号是否存在
  if isPhoneExist(DB, phone) {
    ctx.JSON(http.StatusUnprocessableEntity, gin.H{
      "msg": "用户已存在,不允许重复注册",
    })
    return
  }
 
  // 创建用户
  newUser := model.User{
    Name:     name,
    Phone:    phone,
    Password: password,
  }
  DB.Create(&newUser)
 
  // 返回结果
  ctx.JSON(200, gin.H{
    "msg": "注册成功",
  })
}
 
func isPhoneExist(db *gorm.DB, phone string) bool {
  user := model.User{}
  db.Where("phone = ?", phone).First(&user) // 这里的参数是地址
  if user.ID != 0 {
    return true
  }
  return false
}

注意:这里判断用户是否存在需要传入一个 user 地址,因为 user 是值类型,如果不传入地址,则进入方法后的操作无效。

3.5、routes.go

       所有的请求都将通过这个文件中的方法再传递给 main 方法,其实就是为了简化 main 方法所在go文件的代码量,方便管理和维护。所以它的包名也是 main,相当于它俩在一个文件内。

package main
 
import (
  "com.lyh/goessential/controller"
  "github.com/gin-gonic/gin"
)
 
func CollectRoute(engine *gin.Engine) *gin.Engine {
  engine.POST("/register", controller.Register)
  return engine
}

3.6、main.go

这是程序的入口,现在我们已经把它彻底解脱出来了:

package main
 
import (
  "com.lyh/goessential/common"
  "github.com/gin-gonic/gin"
  _ "github.com/go-sql-driver/mysql"
)
 
func main() {
 
  db := common.InitDB()
  defer db.Close()
 
  engine := gin.Default()
  engine = CollectRoute(engine)
 
  panic(engine.Run()) // 默认端口 8080
}

测试

因为我们有两个文件都是 main 包,所以我们最好使用命令启动:

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

相关文章
|
2天前
|
安全 编译器 PHP
PHP 8:探索新特性及其对现代Web开发的影响
本文将深入探讨PHP 8版本中引入的新特性,以及这些更新如何影响现代Web开发的实践。我们将通过实际的代码示例和性能分析,展示PHP 8如何提升开发效率、加强安全性和增强应用性能,从而为开发者提供更优的编程体验。 【7月更文挑战第18天】
11 6
|
1天前
|
安全 编译器 API
探索PHP 8的新特性及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言迎来了重大升级。本文将深入探讨PHP 8引入的关键新特性,包括JIT编译器、联合类型、命名参数、匹配表达式等,以及这些特性如何提升性能、增强类型安全和改善开发者体验。同时,我们将分析这些变化对于现代Web开发实践的具体影响,以及它们如何塑造了PHP的未来发展方向。
7 1
|
2天前
|
前端开发 JavaScript 网络协议
深入理解Python Web开发中的前后端分离与WebSocket实时通信技术
【7月更文挑战第18天】前后端分离采用Flask/Django框架,前端JavaScript框架如Vue.js与后端通过AJAX/Fetch通信。WebSocket提供实时双向通信,Python可借助websockets库或Flask-SocketIO实现。最佳实践包括定义清晰的接口规范,确保安全性(HTTPS,认证授权),优化性能,和健壮的错误处理。结合两者,打造高效实时应用。
14 1
|
7天前
|
前端开发 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项目的用户体验和开发效率。
20 7
|
4天前
|
JavaScript 前端开发 UED
WebSocket在Python Web开发中的革新应用:解锁实时通信的新可能
【7月更文挑战第16天】WebSocket是实现Web实时通信的协议,与HTTP不同,它提供持久双向连接,允许服务器主动推送数据。Python有多种库如websockets和Flask-SocketIO支持WebSocket开发。使用Flask-SocketIO的简单示例包括定义路由、监听消息事件,并在HTML中用JavaScript建立连接。WebSocket提高了实时性、减少了服务器压力,广泛应用于聊天、游戏等场景。
12 1
|
7天前
|
API 数据库 开发者
逆袭之路!Django/Flask助你成为Web开发界的璀璨新星!
【7月更文挑战第13天】在Python Web开发中,Django和Flask各具优势。Django适合快速构建大型项目,如在线书店,其ORM和内置功能让复杂应用轻松上手。Flask则以其轻量和灵活性见长,适用于个人博客等小型应用。选择框架应根据项目需求和个人偏好,两者都能助开发者在Web开发领域大放异彩。
17 2
|
1天前
|
SQL 前端开发 数据库
Python Web开发进阶之路:从模板引擎到ORM的全面掌握
【7月更文挑战第19天】在Python Web开发中,提升技能的关键是理解和运用模板引擎(如Jinja2)与ORM技术。模板引擎,如在Flask中使用的Jinja2,使前端HTML与后端逻辑分离,便于维护。例如,通过路由函数`show_posts()`和`render_template()`呈现文章列表模板,用Jinja2的`for`循环展示内容。ORM,如SQLAlchemy,提供Pythonic的数据库操作,将表映射为类,SQL转化为方法调用。在博客系统中,定义Post模型并与数据库交互,展示了ORM简化数据管理的优势。通过实践这些工具,开发者能更好地驾驭复杂的Web项目。
9 0
|
5天前
|
算法 安全 编译器
PHP 8的新特性及其对现代Web开发的影响
在数字时代的浪潮中,PHP作为一门历史悠久的服务器端脚本语言,一直在不断地进化以适应新的编程挑战。本文将深入探讨PHP 8的最新特性,包括JIT编译器、联合类型、命名参数、匹配表达式等,并分析这些新特性如何优化代码、提升性能和增强安全性。通过实际案例,我们还将展示PHP 8如何影响现代Web开发的实践,以及开发者如何利用这些新工具来构建更快、更可靠、更易于维护的应用。
|
6天前
|
XML 前端开发 API
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
【7月更文挑战第14天】Web开发中,AJAX作为异步通信先驱,与新兴的Fetch API一起革新交互体验。Fetch基于Promise,简化了请求处理。Python后端,如Flask,提供稳定支撑。这三者的融合,推动Web应用达到新高度,实现高效、实时交互。通过示例展示,我们看到从发送请求到更新UI的流畅过程,以及Python如何轻松返回JSON数据。这种组合揭示了现代Web开发的潜力和魅力。
12 0
|
6天前
|
开发者 C++ Python
从零到一,Django/Flask带你走进Web开发的梦幻世界!
【7月更文挑战第14天】在Python Web开发中,Django和Flask各具特色。Django是全能框架,提供ORM、模板、认证等全套解决方案,适合快速建站和新手入门;Flask则轻量灵活,适合原型开发和定制化需求。两者都有活跃社区和丰富扩展,Django学习曲线平缓,Flask更需自定义配置。选择适合自己的框架,开启编程新篇章。
12 0