[{"data":1,"prerenderedAt":247},["ShallowReactive",2],{"content:\u002Fposts\u002F2022\u002Fgin-setup":3,"surround:\u002Fposts\u002F2022\u002Fgin-setup":236},{"id":4,"title":5,"body":6,"canonical":205,"categories":206,"date":208,"description":209,"draft":210,"extension":211,"image":212,"meta":213,"navigation":214,"path":215,"permalink":205,"readingTime":216,"recommend":205,"references":221,"seo":230,"sitemap":231,"stem":232,"tags":233,"type":205,"updated":208,"__hash__":235},"content\u002Fposts\u002F2022\u002Fgin-setup.md","gin初始化项目",{"type":7,"value":8,"toc":195},"minimark",[9,13,20,31,37,43,49,55,61,69,75,81,84,91,99,103,109,118,125,129,136,143,147,153,159,164,171,174,181,188],[10,11,12],"h2",{"id":12},"初始化项目",[14,15,16],"ol",{},[17,18,19],"li",{},"初始化 go 项目",[21,22,28],"pre",{"className":23,"code":25,"language":26,"meta":27},[24],"language-shell","go mod init \u003Cprogram-name>\n","shell","",[29,30,25],"code",{"__ignoreMap":27},[14,32,34],{"start":33},2,[17,35,36],{},"配置国内镜像",[21,38,41],{"className":39,"code":40,"language":26,"meta":27},[24],"go env -w GOPROXY=https:\u002F\u002Fgoproxy.io,direct\n",[29,42,40],{"__ignoreMap":27},[14,44,46],{"start":45},3,[17,47,48],{},"引入 gin 框架",[21,50,53],{"className":51,"code":52,"language":26,"meta":27},[24],"go get -u github.com\u002Fgin-gonic\u002Fgin\n",[29,54,52],{"__ignoreMap":27},[14,56,58],{"start":57},4,[17,59,60],{},"编写一个网络请求",[21,62,67],{"className":63,"code":65,"language":66,"meta":27},[64],"language-go","package main\n\nimport \"github.com\u002Fgin-gonic\u002Fgin\"\n\nfunc main() {\n  r := gin.Default()\n  r.GET(\"\u002Fping\", func(c *gin.Context) {\n    c.JSON(200, gin.H{\n      \"message\": \"ping\",\n    })\n  })\n  r.Run(\":9999\") \u002F\u002F 在9999端口启动服务，不填默认在8080端口启动\n}\n","go",[29,68,65],{"__ignoreMap":27},[14,70,72],{"start":71},5,[17,73,74],{},"启动项目",[21,76,79],{"className":77,"code":78,"language":26,"meta":27},[24],"go run main.go\n",[29,80,78],{"__ignoreMap":27},[10,82,83],{"id":83},"网站目录初始化",[85,86,87],"blockquote",{},[88,89,90],"p",{},"定义一个初始化的项目目录，方便后期开发",[21,92,97],{"className":93,"code":95,"language":96,"meta":27},[94],"language-txt","--| api\u002F          # 放置api接口，相当于controller\n  --| v1\u002F\n--| config\u002F       # 放置网站配置文件\n  --| config.ini\n--| middleware\u002F   # 中间件\n--| model\u002F        # 数据模型\n--| routes\u002F       # 网站路由\n--| upload\u002F       # 上传静态文件托管\n--| utils\u002F        # 公共函数\n--| web\u002F          # 前端静态文件托管\n--| main.go       # 项目入口\n","txt",[29,98,95],{"__ignoreMap":27},[10,100,102],{"id":101},"使用-ini-做网站配置","使用 ini 做网站配置",[21,104,107],{"className":105,"code":106,"language":26,"meta":27},[24],"go get -u gopkg.in\u002Fini.v1\n",[29,108,106],{"__ignoreMap":27},[21,110,116],{"className":111,"code":113,"language":114,"meta":115},[112],"language-ini","# 网站服务配置\n[server]\nAppMode = debug # debug or server\nHttpPort = :9999\nJWTToken = ajlsdflasjdjlasjdlf\n\n# 数据库配置\n[database]\nDB = mysql\nDBHost = localhost\nDBPort = 3306\nDBUser = root\nDBPwd = admin888\nDBName = ginblog\n","ini","config\u002Fconfig.ini",[29,117,113],{"__ignoreMap":27},[21,119,123],{"className":120,"code":121,"language":66,"meta":122},[64],"package utils\n\nimport (\n  \"fmt\"\n\n  \"gopkg.in\u002Fini.v1\"\n)\n\nvar (\n  AppMode  string\n  HttpPort string\n  JWTToken string\n\n  DB     string\n  DBHost string\n  DBPort string\n  DBUser string\n  DBPwd  string\n  DBName string\n)\n\nfunc init() {\n  file, err := ini.Load(\"config\u002Fconfig.ini\")\n\n  if err != nil {\n    fmt.Println(\"配置文件错误，请确认配置文件是否正确\")\n  }\n\n  LoadServer(file)\n  LoadDataBase(file)\n}\n\n\u002F\u002F 加载网站配置\nfunc LoadServer(file *ini.File) {\n  AppMode = file.Section(\"server\").Key(\"AppMode\").MustString(\"debug\")\n  HttpPort = file.Section(\"server\").Key(\"HttpPort\").MustString(\":9999\")\n  JWTToken = file.Section(\"server\").Key(\"JWTToken\").MustString(\"ajlsdflasjdjlasjdlf\")\n}\n\n\u002F\u002F 加载数据库配置\nfunc LoadDataBase(file *ini.File) {\n  DB = file.Section(\"database\").Key(\"DB\").MustString(\"mysql\")\n  DBHost = file.Section(\"database\").Key(\"DBHost\").MustString(\"localhost\")\n  DBPort = file.Section(\"database\").Key(\"DBPort\").MustString(\"3306\")\n  DBUser = file.Section(\"database\").Key(\"DBUser\").MustString(\"root\")\n  DBPwd = file.Section(\"database\").Key(\"DBPwd \").MustString(\"admin888\")\n  DBName = file.Section(\"database\").Key(\"DBName\").MustString(\"ginblog\")\n}\n\n","utils\u002Fsetting.go",[29,124,121],{"__ignoreMap":27},[10,126,128],{"id":127},"router-分组","router 分组",[21,130,134],{"className":131,"code":132,"language":66,"meta":133},[64],"package main\n\nimport (\n  \"github.com\u002Fgin-gonic\u002Fgin\"\n  v1 \"weilog.me\u002Fgin\u002Frouter\u002Fv1\"\n)\n\nfunc main() {\n  r := gin.Default()\n  v1.InitRouter(r)\n  r.Run(\":9999\")\n}\n\n","main.go",[29,135,132],{"__ignoreMap":27},[21,137,141],{"className":138,"code":139,"language":66,"meta":140},[64],"package v1\n\nimport \"github.com\u002Fgin-gonic\u002Fgin\"\n\nfunc InitRouter(g *gin.Engine) {\n  v1 := g.Group(\"v1\")\n\n  v1.GET(\"\u002Fhello\", func(c *gin.Context) {\n    c.JSON(200, gin.H{\n      \"message\": \"hello v1\",\n    })\n  })\n\n  v2 := g.Group(\"v2\")\n  v2.GET(\"\u002Fhello\", func(c *gin.Context) {\n    c.JSON(200, gin.H{\n      \"message\": \"hello v2\",\n    })\n  })\n}\n","router\u002Fv1",[29,142,139],{"__ignoreMap":27},[10,144,146],{"id":145},"使用-gorm-操作-mysql-数据库","使用 gorm 操作 mysql 数据库",[21,148,151],{"className":149,"code":150,"language":26,"meta":27},[24],"go get -u gorm.io\u002Fgorm\n",[29,152,150],{"__ignoreMap":27},[21,154,157],{"className":155,"code":156,"language":26,"meta":27},[24],"go get -u gorm.io\u002Fdriver\u002Fmysql\n",[29,158,156],{"__ignoreMap":27},[160,161,163],"h3",{"id":162},"配置-gorm-连接数据库","配置 gorm 连接数据库",[21,165,169],{"className":166,"code":167,"language":66,"meta":168},[64],"package model\n\nimport (\n  \"fmt\"\n  \"server\u002Futils\"\n  \"time\"\n\n  \"gorm.io\u002Fdriver\u002Fmysql\"\n  \"gorm.io\u002Fgorm\"\n)\n\nvar db *gorm.DB\nvar err error\n\nfunc InitDB() {\n  db, err = gorm.Open(mysql.Open(fmt.Sprintf(\"%s:%s@tcp(%s:%s)\u002F%s?charset=utf8mb4&parseTime=True&loc=Local\",\n    utils.DBUser,\n    utils.DBPwd,\n    utils.DBHost,\n    utils.DBPort,\n    utils.DBName,\n  )))\n\n  if err != nil {\n    fmt.Println(\"数据库连接失败，请检查参数\", err)\n  }\n\n  \u002F\u002F 迁移文件\n  db.AutoMigrate(&User{}, &Article{}, &Category{})\n\n  \u002F\u002F 获取通用数据库对象 sql.DB ，然后使用其提供的功能\n  db, err := db.DB()\n  if err != nil {\n    fmt.Println(\"数据库连接失败，请检查参数\", err)\n  }\n\n  \u002F\u002F SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。\n  db.SetMaxIdleConns(10)\n\n  \u002F\u002F SetMaxOpenConns 设置打开数据库连接的最大数量。\n  db.SetMaxOpenConns(100)\n\n  \u002F\u002F SetConnMaxLifetime 设置了连接可复用的最大时间。\n  db.SetConnMaxLifetime(10 * time.Second) \u002F\u002F 最大连接时间10s，超出10s就超时\n\n  \u002F\u002F 关闭数据库连接\n  db.Close()\n}\n\n","model\u002Fdb.go",[29,170,167],{"__ignoreMap":27},[160,172,173],{"id":173},"创建数据模型",[21,175,179],{"className":176,"code":177,"language":66,"meta":178},[64],"package model\n\nimport \"gorm.io\u002Fgorm\"\n\ntype User struct {\n  gorm.Model\n  Username string `gorm:\"type:varchar(20);not null\" json:\"username\"`\n  Password string `gorm:\"type:varchar(20);not null\" json:\"password\"`\n  Role     int    `gorm:\"type:int\" json:\"role\"`\n}\n","model\u002FUser.go",[29,180,177],{"__ignoreMap":27},[21,182,186],{"className":183,"code":184,"language":66,"meta":185},[64],"package model\n\nimport \"gorm.io\u002Fgorm\"\n\ntype Category struct {\n  gorm.Model\n  Name string `gorm:\"varchar(20);not null\" json:\"name\"`\n}\n","model\u002FCategory.go",[29,187,184],{"__ignoreMap":27},[21,189,193],{"className":190,"code":191,"language":66,"meta":192},[64],"package model\n\nimport \"gorm.io\u002Fgorm\"\n\ntype Article struct {\n  gorm.Model\n  Title    string   `gorm:\"varchar(100);not null\" json:\"title\"`\n  Body     string   `gorm:\"longtext;not null\" json:\"body\"`\n  Desc     string   `gorm:\"varchar(200);\" json:\"desc\"`\n  Cover    string   `gorm:\"varchar(100);\" json:\"cover\"`\n  Category Category `gorm:\"foreignKey:Cid\"`\n  Cid      int      `gorm:\"int;not null\" json:\"cid\"`\n}\n","model\u002FArticle.go",[29,194,191],{"__ignoreMap":27},{"title":27,"searchDepth":57,"depth":57,"links":196},[197,198,199,200,201],{"id":12,"depth":33,"text":12},{"id":83,"depth":33,"text":83},{"id":101,"depth":33,"text":102},{"id":127,"depth":33,"text":128},{"id":145,"depth":33,"text":146,"children":202},[203,204],{"id":162,"depth":45,"text":163},{"id":173,"depth":45,"text":173},null,[207],"代码","2022-12-04 16:02:46","初始化一个 gin 的项目，领略一下 go 语言的风采",false,"md","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fgin-setup.jpg",{},true,"\u002Fposts\u002F2022\u002Fgin-setup",{"text":217,"minutes":218,"time":219,"words":220},"4 min read",3.5,210000,700,[222,225,227],{"title":223,"link":224},"gin","https:\u002F\u002Fgin-gonic.com\u002Fzh-cn\u002Fdocs\u002Fquickstart\u002F",{"title":114,"link":226},"https:\u002F\u002Fini.unknwon.io\u002Fdocs",{"title":228,"link":229},"gorm","https:\u002F\u002Fgorm.io\u002Findex.html",{"title":5,"description":209},{"loc":215},"posts\u002F2022\u002Fgin-setup",[223,66,234],"服务端","YXRVJVzYlSCTntujsbUEO2ZKOj5VAOjX7bEQAR7mIOQ",[237,242],{"title":238,"path":239,"stem":240,"date":241,"type":205,"children":-1},"git统计代码提交数量","\u002Fposts\u002F2022\u002Fgit-log","posts\u002F2022\u002Fgit-log","2022-12-04 16:01:16",{"title":243,"path":244,"stem":245,"date":246,"type":205,"children":-1},"MIME 类型和 Blob","\u002Fposts\u002F2022\u002Fblob-and-mime","posts\u002F2022\u002Fblob-and-mime","2022-12-04 16:12:29",1789642596078]