xorm数据库框架
安装:
go get github.com/go-xorm/xorm
//安装mysql驱动
go get github.com/go-sql-driver/mysql
想要使用某一数据库,现在mysql里创建一个自己需要的数据库
例如:
create database shiyan6;//分号是必须的
数据库连接:
host := "localhost"
port := "3306"
username := "root"
password := "Qq3318055."
database := "shiyan6"
dataSourceName := fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8", username, password, host, port, database)
engine, err := xorm.NewEngine("mysql", dataSourceName)
if err != nil {
fmt.Println(err)
}
xorm.NewEngine返回一个*engine类型和err类型,使用engine和err来接受它们,之后对engine进行数据库操作就可以,例如创建表:
engine.Sync2(new(data5))
type data5 struct {
Id int64 `xorm:"pk autoincr" json:"id"` //pk表示主键,autoincr表示自增,如果这个ID不自己创建的话,数据库会自动创建,不过在后期有获取的麻烦
Name string
Phone string
}
数据插入(保存从前端获取到的信息存进数据库):
r:=gin.Default()
r.GET("/register", func(context *gin.Context) {
var use user
context.ShouldBindQuery(&use)
fmt.Println(use)
var mode =data5{Name: use.Name,Phone: use.Phone}
engine.Insert(&mode)
})
type user struct { //数据绑定
Name string `form:"name"`
Phone string `form:"phone"`
}
需要注意的是:插入数据库的结构体要与你的建表所用的结构体一致(包括名称),否则会返回错误:xxx表不存在
在插入了许多数据后,可以查找某一数据是否存在,可以用来验证登录实现登录接口等
数据查找功能:
r.POST("/login", func(context *gin.Context) {
var use user
var use1 data5
context.ShouldBindQuery((&use))
fmt.Println(use)
var mode1=data5{Name: use.Name,Phone: use.Phone}
_,err:=engine.Where("name=? and phone=?",mode1.Name,mode1.Phone).Get(&use1)
if err!=nil{
fmt.Println(err)
}
fmt.Println(use1.Id)
})
如果数据存在的话我们本地端会打印所查找数据的序号,若不存在打印0
数据的删除():
r.POST("/login", func(context *gin.Context) {
var use user
context.ShouldBindQuery((&use))
fmt.Println(use)
var mode1=data5{Name: use.Name,Phone: use.Phone}
zz,err:=engine.Where("name=? and phone=?",mode1.Name,mode1.Phone).Delete(&data5{})
if err!=nil{
fmt.Println(err)
}
fmt.Println(zz)
})
运用delete函数,返回一个int类型和err类型;
删除成功会返回一个1,失败返回0;
本地端口:
跨域请求处理:
当在一个页面中发起一个新的请求时,如果通信协议、主机和端口,这三部分内容中的任意一个与原页面的不相同,就被称之为跨域访问。
在请求时发生了跨域访问,因此浏览器为了安全起见,会首先发起一个请求测试一下此次访问是否安全,这种测试的请求类型为OPTIONS,又称之为options嗅探,同时在header中会带上origin,用来判断是否有跨域请求权限。
我们可以对这个嗅探进行处理让它返回一个安全的信息从而使得正常的请求能够被处理到
编写处理中间件:
func Cors() gin.HandlerFunc {
return func(context *gin.Context) {
method := context.Request.Method
origin := context.Request.Header.Get("Origin")
var headerKeys []string
for k, _ := range context.Request.Header {
headerKeys = append(headerKeys, k)
}
headerStr := strings.Join(headerKeys, ",")
if headerStr != "" {
headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
} else {
headerStr = "access-control-allow-origin, access-control-allow-headers"
}
if origin != "" {
context.Writer.Header().Set("Access-Control-Allow-Origin", "*")
context.Header("Access-Control-Allow-Origin", "*") // 设置允许访问所有域
context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
context.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar")
context.Header("Access-Control-Max-Age", "172800")
context.Header("Access-Control-Allow-Credentials", "false")
context.Set("content-type", "application/json") 设置返回格式是json
}
if method == "OPTIONS" {
context.JSON(http.StatusOK, "Options Request!")
}
//处理请求,处理主函数中的其它任务
context.Next()
}
}
在main函数中直接调用跨域请求中间件,至此跨域请求处理完成;