1. goini设置常量&数据库初始化

110 阅读2分钟

帮室友写一个个人博客

  • 其实是自己想写,但是菜,后端勉强能像个人,前端没系统学过,离开教程自己写前端就像一坨答辩
  • 室友给的要求是能写数学公式就算成功
  • why go
    • Spring写这玩意太快了,封装的太好使以至于不是很想用,以后学习源码再看看了
    • 学习go后端写法,学一点gin+gorm/xorm为实习做点准备

goini

虽然不知道这是干什么用的

go get gopkg.in/ini.v1

然后配置config

[server]
# [debug] -> 开发模式 [release] -> 发布模式
AppMode = debug
HttpPort = :9090

[database]
Db = mysql
DbHost = localhost
DbPort = 3306
DbUser = root
DbPassword = 123456
DbName = cornfield

utils包里面将ini文件初始化

package utils

import (
   "fmt"
   "gopkg.in/ini.v1"
)

var (
   AppMode  string
   HttpPort string

   Db         string
   DbHost     string
   DbPort     string
   DbUser     string
   DbPassword string
   DbName     string
)

func init() {
   file, err := ini.Load("config/config.ini")
   if err != nil {
      fmt.Println("配置文件读写错误!")
      return
   }
   LoadServer(file)
   LoadDataBase(file)
}

func LoadServer(file *ini.File) {
   AppMode = file.Section("server").Key("AppMode").MustString("debug")
   HttpPort = file.Section("server").Key("HttpPort").MustString(":9090")
}

func LoadDataBase(file *ini.File) {
   Db = file.Section("database").Key("Db").MustString("mysql")
   DbHost = file.Section("database").Key("DbHost").MustString("localhost")
   DbPort = file.Section("database").Key("DbPort").MustString("3306")
   DbUser = file.Section("database").Key("DbUser").MustString("root")
   DbPassword = file.Section("database").Key("DbPassword").MustString("123456")
   DbName = file.Section("database").Key("DbName").MustString("cornfield")
}

test router

项目初始化之后看看能不能显示JSON

router/router.go如下

image.png

func InitRouter() {
   gin.SetMode(utils.AppMode)
   r := gin.Default()

   router := r.Group("/api/v1")
   {
      router.GET("hello", func(c *gin.Context) {
         c.JSON(http.StatusOK, gin.H{
            "msg": "hello, world!",
         })
      })
   }
   if err := r.Run(utils.HttpPort); err != nil {
      fmt.Println("Init Router failed, err = " + err.Error())
      return
   }
}

目前的项目分层如下:

│  README.md
│  .gitignore
│  LICENSE
│  .gitattributes
│  go.mod
│  go.sum
│  main.go
│
├─.idea
│      Cornfield.iml
│      modules.xml
│      workspace.xml
│      vcs.xml
│      .gitignore
│
├─config
│      config.ini
│
├─model
├─api
│  └─v1
├─middleware
├─router
│      router.go
│
├─utils
│      setting.go
│
├─upload
└─web

连接数据库

使用gorm连接数据库:

var DB *gorm.DB
var err error

func InitDB() {
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
      utils.DbUser,
      utils.DbPassword,
      utils.DbHost,
      utils.DbPort,
      utils.DbName,
   )
   DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
      Logger:         logger.Default.LogMode(logger.Info),
      NamingStrategy: schema.NamingStrategy{SingularTable: true}, // 将表名默认设置为单数形式
   })
   if err != nil {
      log.Fatal("Init db failed, err = " + err.Error())
      return
   }

   if err = DB.AutoMigrate(&User{}, &Article{}, &Category{}); err != nil {
      log.Fatal("auto migrate failed, err = " + err.Error())
      return
   }

   sqlDB, err := DB.DB()
   if err != nil {
      log.Fatal("get common sql db failed, err = " + err.Error())
      return
   }

   // 设置连接池中空闲连接的最大数量
   sqlDB.SetConnMaxIdleTime(10)
   // 设置打开数据库连接的最大数量
   sqlDB.SetMaxOpenConns(100)
   // 连接可复用的最大时间
   sqlDB.SetConnMaxLifetime(time.Second * 10)
}

在数据库初始化中,可以使用NamingStrategy:schema.NamingStrategy{SingularTable: true}将自动迁移生成的表名设置为单数形式

几个模型:

type User struct {
   gorm.Model
   Username string `gorm:"column:username;type:varchar(20);not null;" json:"username"`
   Password string `gorm:"column:password;type:varchar(20);not null;" json:"password"`
   Role     int    `gorm:"column:role;type:int" json:"role"`
}
type Article struct {
   gorm.Model
   Title   string `gorm:"column:title;type:varchar(100);not null;" json:"title"`
   Cid     int    `gorm:"type:int;not null;" json:"cid"`
   Desc    string `gorm:"type:varchar(200);" json:"desc"`
   Content string `gorm:"type:longtext;"json:"content"`
   Img     string `gorm:"type:varchar(100);" json:"img"`
}
type Category struct {
   gorm.Model
   Name string `gorm:"column:name;type:varchar(50);not null;" json:"name"`
}