我是程序员无思。这是创作gin + vue 零基础入门的教程(part2),这个教程的前后端源码我将同步更新至我的gitee账号:https://gitee.com/coderwusi 、github账号:https://github.com/coderwusi。
新建项目根目录文件夹gin-base-cli ,在根目录文件夹下新建 main.go,内容如下:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
使用go的包管理工具go modules ,在cmd下输入以下内容初始化:
go mod init gin-base-cli
输入 以下内容更新依赖
go mod tidy
gopath的设置通过设置变量名为GOPATH,变量值为文件夹目录
使用 go mod tidy 命令进行依赖整理时,新增加的包会出现在gopath的路径下
在项目根目录下执行
go run main.go
程序编译完后访问
http://localhost:8080/ping
显示如下,则表示gin引入成功
在根目录新建config.yaml文件
mysql: host: "127.0.0.1" port: 3306 suffix: "charset=utf8mb4&parseTime=True&loc=Local" #后缀 dbname: "wusidb" username: "root" password: "123456" max_open_conns: 200 max_idle_conns: 50
新建名为setting的文件夹,在setting文件夹下新建init.go:
package setting import ( "fmt" "github.com/spf13/viper" //第三方配置管理神器 ) var Conf = new(TotalConfig) type TotalConfig struct { *MySQLConfig `mapstructure:"mysql"` } type MySQLConfig struct { Host string `mapstructure:"host"` Username string `mapstructure:"username"` Password string `mapstructure:"password"` Dbname string `mapstructure:"dbname"` Suffix string `mapstructure:"suffix"` Port int `mapstructure:"port"` MaxOpenConns int `mapstructure:"max_open_conns"` MaxIdleConns int `mapstructure:"max_idle_conns"` } func init() () { viper.SetConfigFile("config.yaml") //viper.AddConfigPath("./") if err := viper.ReadInConfig(); err != nil { fmt.Printf("viper.ReadInConfig failed, err:%v\n", err) return } if err := viper.Unmarshal(Conf); err != nil { fmt.Printf("viper.Unmarshal failed, err:%v\n", err) } fmt.Println(Conf.MySQLConfig) }
在main.go 中导入setting :
package main import ( _ "gin-base-cli/setting" //导入setting.init 完成初始化 "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
执行命令整理依赖
go mod tidy
执行 go run main.go启动程序
如上图所示,若打印出config.yaml中的文件,则表示第三方配置库viper引入成功。
当前目录结构如下:
在这里插入图片描述
Gorm 是非常好的orm框架,可以大大加快我们编写sql语句的效率
根目录下新建model文件夹,在model文件夹下新建init.go:
package model import ( "fmt" "gin-base-cli/setting" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/schema" ) // DB 数据库链接单例 var DB *gorm.DB func MysqlInit(config *setting.MySQLConfig) () { var err error dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", config.Username, config.Password, config.Host, config.Port, config.Dbname, config.Suffix) DB, err = gorm.Open(mysql.New(mysql.Config{ DSN: dsn, // DSN data source name DefaultStringSize: 256, // string 类型字段的默认长度 DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置 }), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}}) if err != nil { fmt.Println("数据库连接错误:", err) return } if err := DB.AutoMigrate(); err != nil { fmt.Println("数据库迁移错误:", err) return } fmt.Println("success") }
修改main.go:
package main import ( "gin-base-cli/model" "gin-base-cli/setting" "github.com/gin-gonic/gin" ) func main() { setting.Init() model.MysqlInit(setting.Conf.MySQLConfig) r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
go run main.go 命令启动程序,若打印出如下信息则表示gorm引入成功:
至此,环境变量的读取,mysql数据库的连接告一段落了。目前目录结构如下:
我是程序员无思,喜欢这个系列的文章就点赞支持一下吧!