如何给国外网站做seo,wordpress 标签前缀,网站进行规划与设计,如何做好企业推广目录
项目介绍
简介
技术
项目结构
项目分析
总结 项目介绍
简介 项目地址#xff1a;knoci/list: 基于Gin的待办清单小项目 (github.com) 一个仿照github/Q1mi/bubble 做的一个gin框架练习
技术
gin 框架gorm 操作PostgreSQLini 配置文件
项目结构
list
├── R…目录
项目介绍
简介
技术
项目结构
项目分析
总结 项目介绍
简介 项目地址knoci/list: 基于Gin的待办清单小项目 (github.com) 一个仿照github/Q1mi/bubble 做的一个gin框架练习
技术
gin 框架gorm 操作PostgreSQLini 配置文件
项目结构
list
├── README.md
├── config
│ └── config.ini
├── controller
│ └── controller.go
├── dao
│ └── postgresql.go
├── go.mod
├── go.sum
├── main.go
├── models
│ └── todo.go
├── routers
│ └── routers.go
├── static
│ ├── css
│ │ ├── app.8eeeaf31.css
│ │ └── chunk-vendors.57db8905.css
│ ├── fonts
│ │ ├── element-icons.535877f5.woff
│ │ └── element-icons.732389de.ttf
│ └── js
│ ├── app.007f9690.js
│ └── chunk-vendors.ddcb6f91.js
└── templates├── favicon.ico└── index.html 项目分析 项目中有configcontrollersdaomodelsroutersstatictemplate这7个文件夹。
config保存ini文件配置连接数据库的参数(Port,User,Password...)controllers保存控制函数实现器功能处理web响应dao连接数据库models是各种数据结构模板定义routers负责路由分组和路由处理static存储静态资源template是前端模板 接下来我们从mian.go开始逐步分析整个项目的运行。
package mainimport (list/daolist/modelslist/routers//_ gorm.io/driver/mysql_ gorm.io/driver/postgres
)func main() {//连接数据库dao.Connect()//模型绑定dao.DB.AutoMigrate(models.Todo{})//启动routerrouters.SetupRouter()
}在main.go中我们导入了同文件夹下的daomodelsrouters随后运行第一个函数 dao.Connect()接下来我们进入dao来看看 dao.Connect() 函数实现了什么功能。
package daoimport (fmtgopkg.in/ini.v1//gorm.io/driver/mysqlgorm.io/driver/postgresgorm.io/gorm
)var (DB *gorm.DB
)type MysqlConfig struct {User string ini:userPassword string ini:passwordHost string ini:hostPort string ini:portDBname string ini:db
}func LoadConfig() *MysqlConfig {//development_通过结构体映射参数c : new(MysqlConfig)ini.MapTo(c, config/config.ini)fmt.Println(c)return c
}func Connect() {c : LoadConfig()dsn : fmt.Sprintf(host%s user%s password%s dbname%s port%s, c.Host, c.User, c.Password, c.DBname, c.Port)/* mysqldsn : fmt.Sprintf(%s:%stcp(%s:%s)/%s?charsetutf8mb4parseTimeTruelocLocal,c.User, c.Password, c.Host, c.Port, c.DBname)dsn : root:root1234tcp(127.0.0.1:13306)/bubble?charsetutf8mb4parseTimeTruelocLocal*/var err errorDB, err gorm.Open(postgres.Open(dsn), gorm.Config{}) // connect// mysql DB, err gorm.Open(mysql.Open(dsn), gorm.Config{})if err ! nil {panic(err.Error())}fmt.Print(连接数据库成功\n)
} 在postgresql.go中导入了GORMPG驱动ini包自定义了结构体Mysqlconfig和一个 导包全局可访问的 gorm.DB类型的指针DB封装了一个函数 LoadConfig() 通过ini.MapTo(c, config/config.ini) 来接收配置文件。 在Connect函数中调用LoadConfig()获得配置用Sprintf()把配置复制到dsn,然后通过gorm.Open方法连接到我们的数据库。 dao.Connect()完成后我们继续回到main.go用dao包内变量DB的内置方法 dao.DB.AutoMigrate(models.Todo{}) 实现了模型绑定实际上就是按照models.Todo结构体在数据库中创建了一张表。
package modelstype Todo struct {ID int json:idTitle string json:titleStatus bool json:status
} Todo表中每个待办事项有IDTitleStatus并且有相应JOSN的tag。其中ID是用来标识事项的自增唯一值Title是事务名Status用0和1表示未完成和完成。 回到main.go最后调用了routers.SetupRouter()这是在本地routers包routers.go里的函数。在SetupRouter中使用gin.Default()注册默认路由r然后用r.Static()导入./static目录下静态文件指定为static接着用r.LoadHTMLGlob()导入当前路径template/*的模板。 接着就是路由处理指定了对/的GET请求回应controllers.ShowIndex函数用r.Group()定义了路由组v1Group。 路由组中指定了对todo的POST请求回应controllers.CreateTodo函数对/todo的GET请求回应controllers.RetrieveTodo函数对/todo/:id的PUT请求回应controllers.UpdateTodo函数对/todo/:id的DELETE请求回应controllers.DeleteTodo函数。 最后用r.Run(:9090)在9090端口上监听并运行。
package routersimport (github.com/gin-gonic/ginlist/controllers
)func SetupRouter() {r : gin.Default()r.Static(/static, static)r.LoadHTMLGlob(template/*)r.GET(/, controllers.ShowIndex)v1Group : r.Group(v1){//添加v1Group.POST(todo, controllers.CreateTodo)//查看v1Group.GET(/todo, controllers.RetrieveTodo)//修改v1Group.PUT(/todo/:id, controllers.UpdateTodo)//删除v1Group.DELETE(/todo/:id, controllers.DeleteTodo)}r.Run(:9090)} 接下来看看controller中的各个函数的功能首先是ShowIndex负责返回状态码200展示index.html。
func ShowIndex(c *gin.Context) {c.HTML(http.StatusOK, index.html, nil)
} CreateTodo 用来创建一个待办事项。在接收到传来的数据后定义一个models.Todo类型的todo结构体然后用 c.ShouldBind(todo) 自动的进行响应格式(这里是JSON)的参数绑定到todo然后通过 dao.DB.Create(todo) 把todo存入数据库DB以JSON格式失败返回报错成功返回todo。
func CreateTodo(c *gin.Context) {//get datavar todo models.Todoc.ShouldBind(todo)//add into databaseerr : dao.DB.Create(todo).Error//returnif err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})return} else {c.JSON(http.StatusOK, todo)}} RetrieveTodo 用来获取所有待办事项创建一个结构体数组todos用 dao.DB.Find(todos) 把所有的表数据给到todos以JSON格式失败返回报错成功返回todos。
func RetrieveTodo(c *gin.Context) {var todos []models.Todoif err : dao.DB.Find(todos).Error; err ! nil {c.JSON(http.StatusOK, gin.H{error: err.Error()})return} else {c.JSON(http.StatusOK, todos)}
} UpdateTodo 用来更新指定的事项用 c.Params.GET(id) 获得要修改事项名为id的指定url定义todo结构体然后用 dao.DB.Where(id?, id).First(todo) 来查询数据库中第一个对应id的数据到todo然后 c.BindJSON(todo) 把方法请求体c以JSON绑定到todo最后 dao.DB.Save(todo) 来更新数据库。
func UpdateTodo(c *gin.Context) {id, ok : c.Params.Get(id)if !ok {c.JSON(http.StatusOK, gin.H{error: id invalid})return}var todo models.Todoif err : dao.DB.Where(id?, id).First(todo).Error; err ! nil {c.JSON(http.StatusOK, gin.H{error: err.Error()})return}c.BindJSON(todo) //修改if err : dao.DB.Save(todo).Error; err ! nil {c.JSON(http.StatusOK, gin.H{error: err.Error()})} else {c.JSON(http.StatusOK, todo)}
} DeletTodo 用来删除一个待办事项还是通过 c.Params.GET(id) 获得要修改事项名为id的指定url用 dao.DB.Where(id?, id).Delete(models.Todo{}) 来删除数据库中对应id的数据因为这里不接收请求体没有定义局部变量结构体所以直接传入model.Todo{}指定表格式。 总结 这个项目是Gin和GORM的非常非常简单的小项目适合新手入门。