Gin框架(三)

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函数中直接调用跨域请求中间件,至此跨域请求处理完成;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值