GO语言工程实践课后作业:实现思路、代码以及路径记录 | 青训营

73 阅读3分钟

1. 建立项目框架

image.png

  • 先建立main.go文件作为程序入口,然后开启go mod包管理(在终端输入命令go mod init 项目名称和go mod tidy)
  • 新建config配置文件夹,models模型文件夹,router路由文件夹,service服务文件,test测试文件,untils工具文件夹

2. 引入gin框架

2.1 安装gin

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

gin官方项目实例

package main

import (
  "net/http"
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  r.GET("/ping", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "pong",
    })
  })
  r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

2.2 拆分gin框架

  1. 在main.go中
r := router.Router()
//监听端口,默认在8080,Run("里面不指定端口号默认为8080") 
r.Run() 
  1. 在service中进行服务编写,供路由时调用
package service

import (
	"fmt"
	"go-example/models"
	"go-example/untils"
	"math/rand"
	"net/http"
	"strings"

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

func GetUserList(c *gin.Context) {
	data := make([]*models.User, 10)
	data = models.GetUserList()
	c.JSON(http.StatusOK, gin.H{
		"code":    0, //0成功,-1失败
		"message": "显示所用用户",
		"data":    data,
	})
}

  1. 在router文件夹创建app.go,进行路由
package router

import (
	"go-example/docs"
	"go-example/service"

	"github.com/gin-gonic/gin"
	swaggerfiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

func Router() *gin.Engine {
        // 创建路由
	r := gin.Default()
	docs.SwaggerInfo.BasePath = ""
        // 绑定路由规则,执行的函数
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
	return r
}

3. 引入swagger

3.1 安装swagger

go get -u github.com/swaggo/swag/cmd/swag
在终端执行 swag init生成docs文件夹
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

3.2 使用swagger

swagger可以用注解生成代码,每次修改注解都要在终端执行一次swag init生成新的代码

// GetUserList
// Summary 用户列表
// @Tags 用户模块
// @Accept json
// @Produce json
// @Success 200 {string} json{"code","message"}
// @Router /user/getuserList [get]
func GetUserList(c *gin.Context) {
	data := make([]*models.User, 10)
	data = models.GetUserList()
	c.JSON(http.StatusOK, gin.H{
		"code":    0, //0成功,-1失败
		"message": "显示所用用户",
		"data":    data,
	})
}

4. 建立米模型,连接数据库,并在数据库中隐射为表

使用mysql数据,引入gorm库进行连接

下载MySQL驱动
go get github.com/go-sql-driver/mysql 
安装gorm
go get -u gorm.io/gorm

4.1 建立模型

在models中建立user.go和posting.go,分别在其中定义结构体(模型),并编写函数和方法

type Posting struct {
	gorm.Model
	Title    string
	Mainbody string
}

type User struct {
	gorm.Model
	Name     string
	Password string
	Salt     string
}

4.2 连接数据库,并在数据库中映射为表

func InitMySQL() {
	//自定义日志
	mylogger := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
		SlowThreshold: time.Second, //慢SQL阈值
		LogLevel:      logger.Info, //级别
		Colorful:      true,        //彩色
	})
	db, err := gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{
		Logger: mylogger,
	})
	DB = db
	if err != nil {
		panic("failed to connect database")
	}
	fmt.Println("init mysql successfully:", viper.Get("mysql"))

}

5. 项目效果

image.png

项目代码 :gitee.com/fdzx/go-eaa…

6. 项目总结

整体分为三层,model数据层, service逻辑层, controler视图层。

model数据层只关联底层数据模型,数据层面向逻辑层,对service层透明,屏蔽下游数据差异。 Servcie逻辑层处理核心业务逻辑,计算打包业务实体entiy,对应我们的需求,就是话题页面,包括话题和回帖列表,并上送给视图层。 Cortroller视图层负责处理和外部的交互逻辑,以view视图的形式返回给客户端,对于我们需求,我们封装json格式化的请求结果,api形式访问就好

首先在main函数中使用gin框架完成路由搭建,并使用viper读取配置文件信息,初始化数据库。通过automigrate直接根据model初始化两个数据库表。

以上就是对社区话题页面需求的整个实现流程,对于我有个没有什么开发经验的小白刚开始拿到整个项目需求是比较懵的,但是后面通过大拆小的思路,将大需求拆解为小需求的思路来分析解决,思路清晰了代码也慢慢构建起来了。