帮室友写一个个人博客
- 其实是自己想写,但是菜,后端勉强能像个人,前端没系统学过,离开教程自己写前端就像一坨答辩
- 室友给的要求是能写数学公式就算成功
- 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如下
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"`
}