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

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

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

添加路由并测试

添加到我们的管理所有路由的文件(routes.go)中:

测试:

6、统一请求返回格式

       我们在学习 SpringBoot 项目的时候也进行了请求的统一返回格式:(code,data,other),这里也是一样,为的是简化开发,比如我们前面返回前端需要这样写:

    ctx.JSON(200, gin.H{
    "code": 200,
    "msg":  "注册成功",
  })

统一格式后我们只需要写个 200 和 "注册成功" 就可以了。

       此外,我们给前端返回的数据还有一些问题:比如把用户的全部信息都返回出去了(包括密码登隐私信息)

6.1、数据传输对象(dto)

创建一个包 dto 并创建 user_dto.go 用来将返回给前端的 user 转换为 userDto:

package dto
 
import (
  "com.lyh/goessential/model"
)
 
type UserDto struct {
  Name  string `json:"name"`
  Phone string `json:"phone"`
}
 
// 将 user 转换为 userDto
func ToUserDto(user model.User) UserDto {
  return UserDto{
    Name:  user.Name,
    Phone: user.Phone,
  }
}

修改 controller 中的 Info 方法:

func Info(ctx *gin.Context) {
  // 从上下文中获得用户的信息
  user, _ := ctx.Get("user")
  ctx.JSON(http.StatusOK, gin.H{"code": 200, "data": gin.H{"user": dto.ToUserDto(user.(model.User))}})
}

再次进行用户验证:

可以看到,这次返回的数据没有其它敏感信息。

6.2、封装 HTTP 返回

创建目录 response,并创建 response.go :        

package response
 
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
 
// 这里的 code 是我们自定义的业务code
func Response(ctx *gin.Context, httpStatus int, code int, data gin.H, msg string) {
  ctx.JSON(httpStatus, gin.H{"code": code, "date": data, "msg": msg})
}
 
func Success(ctx *gin.Context, data gin.H, msg string) {
  Response(ctx, http.StatusOK, 200, data, msg)
}
 
func Fail(ctx *gin.Context, data gin.H, msg string) {
  Response(ctx, http.StatusOK, 400, data, msg)
}

       定义了统一的前端返回类型之后,我们就可以开始修改之前的返回代码了,之前我们的 HTTP 返回都是通过 ctx.JSON(httpStatus,gin.H) 来返回的,现在我们需要都替换为我们自定义的返回格式,比如下面的:

    ctx.JSON(http.StatusUnprocessableEntity, gin.H{
      "code": 422,
      "msg":  "手机号必须为11位!",
  })

统一之后就清爽多了,而且不会存在前端拿一些 JSON 的属性却拿不到的情况。

response.Response(ctx, http.StatusUnprocessableEntity, 422, nil, "手机号必须为11位")

7、从文件中读取配置(viper)

       上面我们的很多配置信息都是直接定义在代码中的(比如连接数据库需要的参数),这样很不好管理和维护,所以这里我们统一下配置源。

7.1、安装 viper

go get github.com/spf13/viper

如果需要使用旧版本就去 go.mod 取修改版本号重新下载。

7.2、编写配置文件(yml)

在 config 目录下创建 application.yml:

server:
  port: 1016
datasource:
  driverName: mysql
  host: 127.0.0.1
  port: 3306
  database: go_web
  username: root
  password: Yan1029.
  charset: utf8mb4

7.3、使用 viper 读取配置文件

在 main 方法中添加读取配置文件的函数:

package main
 
import (
  "com.lyh/goessential/common"
  "github.com/gin-gonic/gin"
  _ "github.com/go-sql-driver/mysql"
  "github.com/spf13/viper"
  "os"
)
 
func main() {
 
  InitConfig()
  db := common.InitDB()
  defer db.Close()
 
  engine := gin.Default()
  engine = CollectRoute(engine)
  port := viper.GetString("server.port")
  if port != "" {
    panic(engine.Run(":" + port))
  }
  panic(engine.Run()) // 默认端口 8080
}
 
func InitConfig() {
  workDir, _ := os.Getwd()
  viper.SetConfigName("application")
  viper.SetConfigType("yml")
  viper.AddConfigPath(workDir + "/config")
  err := viper.ReadInConfig()
  if err != nil {
    panic(err)
  }
}

修改 databse.go 中的 InitDB 方法:

    driverName := viper.GetString("datasource.driverName")
  host := viper.GetString("datasource.host")
  port := viper.GetInt("datasource.port")
  database := viper.GetString("datasource.database")
  username := viper.GetString("datasource.username")
  password := viper.GetString("datasource.password")
  charset := viper.GetString("datasource.charset")

测试

数据库可以查询成功,配置成功。

注意事项

1、gorm 版本问题

最新版 gorm:

使用旧版本的 gorm:

require (
    github.com/jinzhu/gorm v1.9.12
)

总结

       至此,我大概明白了 Go 语言怎么开发一个 Web 程序,也消除了我的很多疑虑,比如Java一个类就是一个文件,那Go语言怎么对项目进行分层架构等一些简单但又特别重要的内容。

       接下来,学学前端,至少了解怎么和后端交互,写一个功能完整的Web程序。

相关文章
|
2月前
|
数据采集 网络协议 测试技术
使用Go Validator在Go应用中有效验证数据
使用Go Validator在Go应用中有效验证数据
|
4月前
|
Go
go创建web服务
go创建web服务
|
22天前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`<select>` 和 `<option>`)、文本域(`<textarea>`)、标签解释(`<label>`)、各类按钮(`<button>`)及表单重置功能、无语义布局标签(`<div>` 和 `<span>`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
2月前
|
人工智能 Go
go validator 值为 0 required 验证
go validator 值为 0 required 验证
39 6
|
2月前
|
数据采集 网络协议 测试技术
使用Go Validator在Go应用中有效验证数据
使用Go Validator在Go应用中有效验证数据
|
2月前
|
缓存 监控 中间件
构建高效的Go语言Web服务器:基于Fiber框架的性能优化实践
在追求极致性能的Web开发领域,Go语言(Golang)凭借其高效的并发处理能力、垃圾回收机制及简洁的语法赢得了广泛的青睐。本文不同于传统的性能优化教程,将深入剖析如何在Go语言环境下,利用Fiber这一高性能Web框架,通过精细化配置、并发策略调整及代码层面的微优化,构建出既快速又稳定的Web服务器。通过实际案例与性能测试数据对比,揭示一系列非直觉但极为有效的优化技巧,助力开发者在快节奏的互联网环境中抢占先机。
|
3月前
|
JSON 中间件 Go
Go语言Web框架Gin介绍
【7月更文挑战第19天】Gin是一个功能强大、高性能且易于使用的Go语言Web框架。它提供了路由、中间件、参数绑定等丰富的功能,帮助开发者快速构建高质量的Web应用。通过本文的介绍,你应该对Gin框架有了初步的了解,并能够使用它来开发简单的Web服务。随着你对Gin的深入学习和实践,你将能够利用它构建更复杂、更强大的Web应用。
|
2月前
|
缓存 NoSQL 关系型数据库
Go - 开箱即用,WEB 界面一键安装,没有项目经验,可以拿这个练手
Go - 开箱即用,WEB 界面一键安装,没有项目经验,可以拿这个练手
58 0
|
3月前
|
关系型数据库 MySQL Go
go项目实现mysql接入以及web api
go项目实现mysql接入以及web api
30 0
|
3月前
|
Linux Go API
go创建web项目分别在windows和linux部署
go创建web项目分别在windows和linux部署
36 0
下一篇
无影云桌面