从零开始的IM聊天系统(二)——参数初始化

211 阅读5分钟

引入gin框架

上篇文章已经成功将测试数据写入数据库,那么今天我们就要将数据库中的文件取出来放到接口中去,为前后端联调奠定基础。要实现这一点,我们需要引入 golang的企业级框架gin。 Gin(Gin)是一个基于Go语言的Web框架,由Alexey Gordeev于2014年创建。Gin的设计目标是简单、快速且易于学习和使用。它具有高性能和灵活性,适用于各种规模的项目。

gin框架简介

以下是Gin的一些特点:

  1. 高性能:Gin采用了基于事件驱动的异步I/O模型,这使得它在处理大量并发请求时表现出色。同时,它还支持HTTP/2协议,以提高网络性能。
  2. 中间件支持:Gin内置了许多常用的中间件,如路由、日志记录、验证等。此外,您还可以轻松地添加自定义中间件来满足特定需求。
  3. 渲染:Gin支持多种模板引擎,如HTML、XML、JSON等。您可以根据需要选择合适的模板引擎进行渲染。
  4. RESTful API:Gin的设计灵感来自于RESTful架构风格,因此它非常适合构建RESTful API。您可以使用Gin轻松地创建和管理API端点。
  5. 错误处理:Gin提供了丰富的错误处理机制,可以帮助您更好地捕获和处理异常情况。
  6. 文档生成:Gin内置了文档生成功能,可以自动生成API文档,方便开发人员和客户端了解API的结构和使用方法。

引入gin框架到项目中

官方文档中可以得知引入框架的流程。

下载gin框架

go get -u github.com/gin-gonic/gin

在项目中引入gin

在main.go中加入以下代码:

package main

import "github.com/gin-gonic/gin"

func main() {
        //初始化gin
	r := gin.Default() 
        //路由配置
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 localhost:8080 上启动服务
}

运行go.main文件,运行成功后在浏览器中打开localhost:8080/ping,如果在浏览器中显示

{"message":"pong"}

则表示gin框架成功引入并运行。

将main.go中的代码模块化

接下来,我们需要将gin框架的代码分离到模块中,方便我们使用和维护。 在router文件夹中新建app.go文件,用于存放路由配置信息:

package router

import (
   "ginchat/service"
   "github.com/gin-gonic/gin"
)

func Router() *gin.Engine {
   r := gin.Default()
   r.GET("/index", service.GetIndex)
   return r
}

在main.go中调用router中的方法:

package main

import (
   "ginchat/router"
)

func main() {
   r := router.Router()
   r.Run()
}

在service文件夹中新建index.go文件,配置路由传递的参数信息:

package service

import "github.com/gin-gonic/gin"

func GetIndex(c *gin.Context) {
   c.JSON(200, gin.H{
      "message": "Welcome !!",
   })
}

重新启动main.go文件,在浏览器中启动localhost:8080/index,如果显示以下信息,则表示运行成功:

{"message":"Welcome !!"}

至此,初级的gin框架的应用我们已经学会了,接下来我们需要将数据库中的数据导出到路由参数中去:

初始化数据库配置参数

初始化数据库

在config文件夹中,新建app.yml,用来配置一些基本的启动配置:

mysql:
  dns:用户名:密码@tcp(数据库公网地址:3306)/ginchatcharset=utf8mb4&parseTime=True&loc=Local

这里配置的是数据库的初始连接配置。 配置好后,我们需要utils中配置调用函数,在utils中新建系统初始化文件system_init.go:

package utils

import (
   "fmt"
   "github.com/spf13/viper"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
)

var DB *gorm.DB

func InitConfig() {
   viper.SetConfigName("app")
   viper.AddConfigPath("config")
   err := viper.ReadInConfig()
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println("config app: ", viper.Get("app"))
   fmt.Println("config mysql: ", viper.Get("mysql"))
}

func InitMySql() {
   DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{})
}

这里配置系统启动参数用到了viper库

Viper是一个Go语言的配置库,它提供了一种简单、灵活且功能强大的方式来读取和写入配置文件。Viper的目标是使配置文件的处理变得非常容易,同时保持代码的可读性和可维护性。

以下是Viper的一些特点:

  1. 简单易用:Viper的API非常简单直观,易于学习和使用。您只需要导入一个包并按照文档中的示例进行配置即可。
  2. 多种格式支持:Viper支持多种常见的配置文件格式,如JSON、YAML、INI等。您可以根据需要选择合适的格式进行配置。
  3. 嵌套结构支持:Viper允许您在配置文件中嵌套定义不同的配置项,从而更好地组织和管理配置信息。
  4. 验证器支持:Viper内置了丰富的验证器,可以帮助您确保配置文件的正确性和一致性。例如,您可以验证一个字符串是否为空、是否只包含特定的字符等等。
  5. 环境变量支持:Viper允许您从环境变量中读取配置信息,这使得配置文件更加灵活和可移植。
  6. 高级特性:Viper还提供了许多高级特性,如文件锁定、默认值设置、自定义命令等等。这些特性可以帮助您更好地控制配置文件的行为和处理过程。

这里我们定义了一个全局的DB变量,并通过viper库和gorm库将数据库初始化并导出给DB变量。这样我们就可以通过DB关键字进行数据库操作了。

数据库查表

接下来我们就可以在models文件夹中的user_basic.go中通过结构体获取到数据库中的表数据:

func GetUserList() []*UserBasic {
   data := make([]*UserBasic, 10)
   utils.DB.Find(&data)
   for _, v := range data {
      fmt.Println(v)
   }
   return data
}

返回的data则是我们所需要的表数据了。

将数据导入路由参数中

在service中新建文件user_service.go文件,用于将数据导入路由参数中。

package service

import (
   "ginchat/models"
   "github.com/gin-gonic/gin"
)

func GetUserList(c *gin.Context) {
   data := make([]*models.UserBasic, 10)
   data = models.GetUserList()

   c.JSON(200, gin.H{
      "message": data,
   })
}

至此,配置已经全部完成。接下来就可以验证了。

验证数据

运行main.go文件,在浏览器中打开localhost:8080/user/getUserList,如果浏览器显示如下格式的数据,即为成功:

image.png