当前位置: 首页 > news >正文

衡水网站制作费用网站兼容所有浏览器

衡水网站制作费用,网站兼容所有浏览器,自己做社交网站吗,公司网站备案后在百度上多长时间可以搜索到目录 1. 介绍 2. 环境 3. gin 3.1 gin提供的常见路由 3.2 gin的分组 main.go router.go 代码结构 3.3 gin 提供的Json方法 main.go route.go common.go user.go order.go 3.4 gin框架下如何获取传递来的参数 第一种是GET请求后面直接 /拼上传递的参数 第二种是…目录 1. 介绍 2. 环境 3. gin 3.1 gin提供的常见路由 3.2 gin的分组 main.go router.go 代码结构 3.3 gin 提供的Json方法 main.go route.go common.go user.go order.go 3.4 gin框架下如何获取传递来的参数 第一种是GET请求后面直接 /拼上传递的参数 第二种是这样传递 第三种是以Json方式来传递 3.5 golang如何进行异常捕获和处理 4. 关于日志 5. gin如何操作数据库需要用到gorm main.go config db.go controller common.go order.go user.go dao dao.go models user.go router router.go 1. 介绍 2. 环境 查看是否设置成功 PS:go env -w GOSUMDBsum.golang.org(GOSUM问题) 3. gin gin 的路由是通过前缀树来实现的每个请求方法一个前缀树没有使用反射来实现比反射的效率好得多一般路由分为GET,POST,DELETE等等我们都来看看 3.1 gin提供的常见路由 package mainimport (net/httpgithub.com/gin-gonic/gin)func main() {//先生成一个实例r: gin.Default()//再定义一个路由//第一个是访问的url 第二个是处理函数r.GET(/hello, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, Hello, World!)})r.POST(/user/list, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user list)})r.PUT(/user/add, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user add)})r.DELETE(/user/delete, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user delete)})//可以使用ANY方法来处理所有的请求r.Any(/any, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, Hello, World!)})//最后启动web服务//可以指定端口号r.Run(:9999) }3.2 gin的分组 并且 gin 的路由是可以分组的/user/list /user/add这种 package mainimport (net/httpgithub.com/gin-gonic/gin)func main() {//先生成一个实例r: gin.Default()//再定义一个路由//第一个是访问的url 第二个是处理函数// r.GET(/hello, func(ctx *gin.Context) {// ctx.String(http.StatusOK/*200*/, Hello, World!)// })// r.POST(/user/list, func(ctx *gin.Context) {// ctx.String(http.StatusOK/*200*/, user list)// })// r.PUT(/user/add, func(ctx *gin.Context) {// ctx.String(http.StatusOK/*200*/, user add)// })// r.DELETE(/user/delete, func(ctx *gin.Context) {// ctx.String(http.StatusOK/*200*/, user delete)// })user:r.Group(user){//因为上面已经有/user了 所以这里不用再写/useruser.POST(/list, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user list)})user.PUT(/add, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user add)})user.DELETE(/delete, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user delete)})}//最后启动web服务//可以指定端口号r.Run(:9999) }然后此时是写在main包里面的而main包作为入口文件把这么多的路由写在这里显然很不合理所以我们创建一个router包去专门导入路由 main.go package mainimport (//引入包这个整了很久一直有各种问题//使用注意要在 GOROOT/src 同级目录下创建项目然后进入项目文件夹//然后 go mod init 该文件夹然后去使用 gin-ranking/router )func main() {r:router.Router()r.Run(:9999) }router.go package router//和文件夹名保持一致import (github.com/gin-gonic/ginnet/http )func Router() *gin.Engine {r : gin.Default()user:r.Group(user){//因为上面已经有/user了 所以这里不用再写/useruser.POST(/list, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user list)})user.PUT(/add, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user add)})user.DELETE(/delete, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user delete)})}return r } 代码结构 3.3 gin 提供的Json方法 gin返回Json数据很简单因为他提供了Json方法 路由以及统一的返回 main.go package mainimport (gin-ranking/router )func main() {r:router.Router()r.Run(:9999) }route.go package router//和文件夹名保持一致import (github.com/gin-gonic/ginnet/httpgin-ranking/controller )func Router() *gin.Engine {r : gin.Default()user:r.Group(user){//因为上面已经有/user了 所以这里不用再写/user 注意使用Talend的时候前面是 ip:port/user/各种信息user.GET(/info,controller.UserController{}.GetUserInfo)user.POST(/list, controller.UserController{}.GetList)user.PUT(/add, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user add)})user.DELETE(/delete, func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, user delete)})}order:r.Group(/order){order.POST(/list, controller.OrderController{}.GetList)}return r } common.go package controllerimport (github.com/gin-gonic/gin )type JsonStruct struct {Code int json:code //返回的是 200 400 404 500...Msg interface{} json:msg //返回的信息Data interface{} json:data //返回的数据Count int64 json:count //返回的数据总数 }type JsonErrorStruct struct {Code int json:code //返回的是 200 400 404 500...Msg interface{} json:msg //返回的信息 }func ReturnSucces(c *gin.Context, code int,msg interface{}, data interface{}, count int64) {json : JsonStruct{Code: code,Msg: msg,Data: data,Count: count,}c.JSON(200, json) }func ReturnError(c *gin.Context, code int, msg interface{}) {json : JsonErrorStruct{Code: code,Msg: msg,}c.JSON(200, json) } user.go package controllerimport (github.com/gin-gonic/gin )//因为我们目前这么写的话这些文件都在一个包也就其实是 //一个作用域所以函数名容易重复此时我们可以给他们加上一个前缀 //比如这里的UserController type UserController struct {}func (u UserController)GetUserInfo(c *gin.Context) {ReturnSucces(c,0,succes,user info,1) }func (u UserController)GetList(c *gin.Context) {ReturnError(c,4004,没有相关信息list) } order.go package controllerimport (github.com/gin-gonic/gin )type OrderController struct {}func (o OrderController)GetList(c *gin.Context){ReturnError(c,4004,没有相关信息order) } 3.4 gin框架下如何获取传递来的参数 传递参数一般分为三种 第一种是GET请求后面直接 /拼上传递的参数 第二种是这样传递 第三种是以Json方式来传递 然后我们分别来看如何获取 一 url方式 这种我们一般会在路由中直接拼上 第二种是通过POST怎么接收值呢 这种方式路由是不用改的直接改order.go 第三种是Json格式的数据传入 接收Json数据我们需要通过map或者结构体 对于Json还有一种解决方式就是用结构体 3.5 golang如何进行异常捕获和处理 其他语言底层抛出异常上层逻辑通过try catch捕获异常但是go语言的设计者认为将异常与控制结构混在一起会很容易使得代码变得混乱为了不影响代码的原有逻辑采用的延迟执行捕获异常的模式来实现 defer压栈延迟执行 recover是个内建函数可以让系统崩溃的流程恢复过来仅在延迟函数defer内有效在正常程序执行中调用会返回nil并且没有任何效果。假如有问题调用recover可以捕获到panic的输入值并且恢复正常的执行。 panic让程序直接崩溃 我们改一下user.go 然后加上 web访问结果就是200并且没有内容了 并且打印里面捕获到了异常 自定义log中间件并实现日志的收集 4. 关于日志 /// 关于日志比较重要的有三种 第一种是项目的请求日志和ngix类似每次请求都保留日志 第二种是错误日志当程序出现错误的时候日志应该保留下来 第三种是在开发业务逻辑的时候程序员自己保存的日志。比如请求第三方接口的时候把接口返回的信息直接保留下来。 /// 5. gin如何操作数据库需要用到gorm gorm中文文档GORM - The fantastic ORM library for Golang, aims to be developer friendly. 项目结构 main.go package mainimport (gin-ranking/router )func main() {r:router.Router()r.Run(:9999) }config db.go package configconst (//Mysqldb root:123456tcp(10.18.11.64:3306)/lml_dtbase?charsetutf8 )controller common.go package controllerimport (github.com/gin-gonic/gin )type JsonStruct struct {Code int json:code //返回的是 200 400 404 500...Msg interface{} json:msg //返回的信息Data interface{} json:data //返回的数据Count int64 json:count //返回的数据总数 }type JsonErrorStruct struct {Code int json:code //返回的是 200 400 404 500...Msg interface{} json:msg //返回的信息 }func ReturnSucces(c *gin.Context, code int,msg interface{}, data interface{}, count int64) {json : JsonStruct{Code: code,Msg: msg,Data: data,Count: count,}c.JSON(200, json) }func ReturnError(c *gin.Context, code int, msg interface{}) {json : JsonErrorStruct{Code: code,Msg: msg,}c.JSON(200, json) } order.go package controllerimport (github.com/gin-gonic/gin )type OrderController struct{}type Search struct {//需要注意的是定义结构体和返回的时候//都要指定Json的字段否则首字母大写肯定是匹配不上的//注意前端传来的数据一定是小写的所以我们统一转成小写Name string json:nameCid int json:cid }func (o OrderController) GetList(c *gin.Context) {//cid:c.PostForm(cid)//name:c.DefaultPostForm(name,wangwu(Default))// param : make(map[string]interface{})// err : c.BindJSON(param)search : Search{}err : c.BindJSON(search)if err nil {ReturnSucces(c, 0, search.Name, search.Cid, 1)return}ReturnError(c, 4001, gin.H{err: err}) }user.go package controllerimport (fmtgin-ranking/modelsstrconv//gin-ranking/pkg/loggergithub.com/gin-gonic/gin )// 因为我们目前这么写的话这些文件都在一个包也就其实是 // 一个作用域所以函数名容易重复此时我们可以给他们加上一个前缀 // 比如这里的UserController type UserController struct{}func (u UserController) GetUserInfo(c *gin.Context) {idStr : c.Param(id)name : c.Param(name)id, _ : strconv.Atoi(idStr) //----------testuser, _ : models.GetUserTest(id) //-----testReturnSucces(c, 0, name, user, 1) }func (u UserController) AddUser(c *gin.Context) {username : c.DefaultPostForm(username, )id, err : models.AddUser(username)if err ! nil {ReturnError(c, 4002, 保存错误)return}ReturnSucces(c, 0, 保存成功, id, 1) }func (u UserController) UpdateUser(c *gin.Context) {username : c.DefaultPostForm(username, ) //获取usernameidStr : c.DefaultPostForm(id, )id, _ : strconv.Atoi(idStr)models.UpdateUser(id, username)ReturnSucces(c, 0, 更新成功, true, 1) }func (u UserController) DeleteUser(c *gin.Context) {idStr : c.DefaultPostForm(id, )id, _ : strconv.Atoi(idStr)err : models.DeleteUser(id)if err ! nil {ReturnError(c, 4002, 删除错误)return}ReturnSucces(c, 0, 删除成功, true, 1) }func (u UserController) GetList(c *gin.Context) {//user loggerdefer func() {if err : recover(); err ! nil {fmt.Println(异常捕获, err)}}()num1 : 1num2 : 0num3 : num1 / num2ReturnError(c, 4004, num3)//ReturnError(c, 4004, 没有相关信息list) }func (u UserController) GetUserListTest(c *gin.Context) {users, err : models.GetUserListTest()if err ! nil {ReturnError(c, 4004, 没有相关信息list)return}ReturnSucces(c, 0, 获取成功, users, 1) }dao dao.go package daoimport (fmtgin-ranking/configtimegithub.com/jinzhu/gorm_ github.com/jinzhu/gorm/dialects/mysql )// 因为要和数据库建立连接所以我们要把链接保存到var中 var (Db *gorm.DBerr error )func init() {Db, err gorm.Open(mysql, config.Mysqldb)if err ! nil {fmt.Println(-----mysql connect error:, err)}if Db.Error ! nil {fmt.Println(-----database err:, err)}Db.DB().SetMaxIdleConns(10)Db.DB().SetMaxOpenConns(100)Db.DB().SetConnMaxLifetime(time.Hour) }models user.go package daoimport (fmtgin-ranking/configtimegithub.com/jinzhu/gorm_ github.com/jinzhu/gorm/dialects/mysql )// 因为要和数据库建立连接所以我们要把链接保存到var中 var (Db *gorm.DBerr error )func init() {Db, err gorm.Open(mysql, config.Mysqldb)if err ! nil {fmt.Println(-----mysql connect error:, err)}if Db.Error ! nil {fmt.Println(-----database err:, err)}Db.DB().SetMaxIdleConns(10)Db.DB().SetMaxOpenConns(100)Db.DB().SetConnMaxLifetime(time.Hour) }router router.go package daoimport (fmtgin-ranking/configtimegithub.com/jinzhu/gorm_ github.com/jinzhu/gorm/dialects/mysql )// 因为要和数据库建立连接所以我们要把链接保存到var中 var (Db *gorm.DBerr error )func init() {Db, err gorm.Open(mysql, config.Mysqldb)if err ! nil {fmt.Println(-----mysql connect error:, err)}if Db.Error ! nil {fmt.Println(-----database err:, err)}Db.DB().SetMaxIdleConns(10)Db.DB().SetMaxOpenConns(100)Db.DB().SetConnMaxLifetime(time.Hour) }本文根据小破站作者 慕课网官方账号 GO流行的Gin框架快速搭建开发 所著 在此感谢该博主讲的很棒  最后的最后创作不易希望读者三连支持  赠人玫瑰手有余香
http://www.hkea.cn/news/14532040/

相关文章:

  • 手机网站设计公司只找亿企邦大良营销网站建设机构
  • 济南网站优化推广公司vs2017移动网站开发
  • 网站服务器 内存图书馆网站建设的意义
  • 分析某个网站建设长春市网站制作
  • 网站建立网络优化泉州最专业手机网站建设哪家好
  • 海外注册域名的网站好网站分析工具有哪些
  • 淘客网站如何做个人养老金
  • 魔方 网站苏州网站制作开发公司
  • 网站建设珠江摩尔王占山事迹
  • 吉林平台网站建设多少钱用jsp做网站的难点
  • 电子商务网站建设管理答案网站开通告知书
  • 网站开发有哪几种语言国外ps网站
  • 正规网站建设咨询电话wordpress个人展示
  • 新手做网站教程青岛建设集团建兴工程有限公司
  • 网站建设是怎么赚钱营销网站的成功案例
  • 网站的视频做gifwordpress 做值班表
  • 黑龙江建设网站网页网页设计班
  • 丹阳网站设计建设银行河北招聘网站
  • 如何做公司网站wordpress ftp设置
  • 个人备案网站做淘宝客可以用吗企业网站建设申请怎么写
  • 请问下网站开发怎么弄没有icp备案的ip地址访问的网站会被各搜索引擎收录吗
  • 兼职网站高中生在家可做传奇怎么做网站
  • 网站开发手册网站模块功能
  • php wordpress 配置成都排名seo公司
  • 内网建站教程wordpress会员等级
  • 东莞网站公司建设网站中国防疫政策马上要变化了
  • 上海市虹口市容建设公司网站迁安网站建设
  • 网页设计与网站建设pdf环保主题的网站模板
  • 嘉定网站网站建设做网站运营公司收费
  • 个人网站模板下载自己做的公司网站百度搜不到