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

做服务器的网站都有哪些功能百度网盘网页版官网

做服务器的网站都有哪些功能,百度网盘网页版官网,国内正品购物app排行,怎么做展示网站对控制器的分组与继承 1 )设计项目目录结构 yourGinProject/ 根目录├── go.mod go mod 文件├── go.sum go sum 文件├── main.go main 文件└── tpls html模板目录│ └── web│ │ └── index.html├── routers 路由目录│ …

对控制器的分组与继承


1 )设计项目目录结构

yourGinProject/ ·······························  根目录├── go.mod ··································  go mod 文件├── go.sum ··································  go sum 文件├── main.go ·································  main 文件└── tpls ····································· html模板目录│     └── web│     │    └── index.html├── routers ·································· 路由目录│     ├── webRouters.go│     ├── apiRouters.go│     └── adminRouters.go├── controllers ······························ 控制器目录│     ├── web│     │     └── webCtrl.go│     ├── api│     │     └── apiCtrl.go│     └── admin│     │     ├── base.go│     │     ├── indexCtrl.go│     │     └── userCtrl.go

2 )主程序 main.go

package mainimport ("gin-demo/routers" //gin-demo 是 go mod init 初始化的工程,下同"github.com/gin-gonic/gin"
)func main() {// 创建一个默认的路由引擎r := gin.Default()//加载模板 放在配置路由前面r.LoadHTMLGlob("tpls/**/*")routers.WebRoutersInit(r)routers.ApiRoutersInit(r)routers.AdminRoutersInit(r)r.Run()
}

3 ) HTML模板目录配置

tpls/web/index.html

{{ define "web/index.html" }}<h1>web index 页面</h1>{{.msg}}{{ end }}

4 ) routers 配置

4.1 webRouters.go

package routersimport ("gin-demo/controllers/web""github.com/gin-gonic/gin"
)func WebRoutersInit(r *gin.Engine) {webRouters := r.Group("/"){webRouters.GET("/", web.WebCtrl{}.Index)}
}

4.2 apiRouters.go

package routersimport ("gin-demo/controllers/api""github.com/gin-gonic/gin"
)func ApiRoutersInit(r *gin.Engine) {apiRouters := r.Group("/api"){apiRouters.GET("/", api.ApiCtrl{}.Index)apiRouters.GET("/user", api.ApiCtrl{}.User)}
}

4.2 adminRouters.go

package routersimport ("gin-demo/controllers/admin""github.com/gin-gonic/gin"
)func AdminRoutersInit(r *gin.Engine) {adminRouters := r.Group("/admin"){adminRouters.GET("/", admin.IndexCtrl{}.Index)adminRouters.GET("/user", admin.UserCtrl{}.Index)adminRouters.GET("/user/success", admin.UserCtrl{}.Success)adminRouters.GET("/user/error", admin.UserCtrl{}.Error)}
}

5 ) controller 配置

5.1 web/webCtrl.go

package webimport ("net/http""github.com/gin-gonic/gin"
)type WebCtrl struct{}func (con WebCtrl) Index(c *gin.Context) {c.HTML(http.StatusOK, "web/index.html", gin.H{"msg": "我是一个msg",})
}

5.2 api/apiCtrl.go

package apiimport ("github.com/gin-gonic/gin""net/http"
)type ApiCtrl struct{}func (con ApiCtrl) Index(c *gin.Context) {c.String(http.StatusOK, "api接口总承")
}
func (con ApiCtrl) User(c *gin.Context) {c.String(http.StatusOK, "这是一个 user 接口")
}

5.3 admin/indexCtrl.go

package adminimport ("github.com/gin-gonic/gin""net/http"
)type IndexCtrl struct {}func (con IndexCtrl) Index(c *gin.Context) {c.String(http.StatusOK, "admin 页面")
}

5.4 admin/baseCtrl.go

package adminimport ("github.com/gin-gonic/gin""net/http"
)type BaseCtrl struct{}func (con BaseCtrl) success(c *gin.Context) {c.String(http.StatusOK, "成功")
}func (con BaseCtrl) error(c *gin.Context) {c.String(http.StatusOK, "失败")
}

5.4 admin/userCtrl.go

package adminimport ("github.com/gin-gonic/gin""net/http"
)type UserCtrl struct {BaseCtrl
}func (con UserCtrl) Index(c *gin.Context) {c.String(http.StatusOK, "user 页面")
}
func (con UserCtrl) Success(c *gin.Context) {con.success(c)
}
func (con UserCtrl) Error(c *gin.Context) {con.error(c)
}

以上就是对控制器的一般文件拆分和继承关系的调用示例,验证如下

/ 访问首页
/api
/api/user
/admin
/admin/user
/admin/user/success
/admin/user/error

以上均可正常访问,这样就可以最快完成一个项目的拆分

中间件的处理


1 ) 基础用法, 单一中间件

package mainimport ("fmt""time""github.com/gin-gonic/gin""net/http"
)func initMiddleware(c *gin.Context) {// 记录开始时间start := time.Now().UnixNano()// 调用该请求的剩余处理程序c.Next()// 记录结束时间end := time.Now().UnixNano()// 输出当前渲染时间差fmt.Println("时间:", end - start)
}func main() {// 创建一个默认的路由引擎r := gin.Default()r.GET("/", initMiddleware, func(c *gin.Context) {c.String(http.StatusOK, "首页")})r.GET("/news", initMiddleware, func(c *gin.Context) {c.String(http.StatusOK, "新闻页面")})r.Run()
}
  • 中间件就是匹配路由前和匹配路由完成后执行的一系列操作
  • 中间件必须是一个 gin.HandlerFunc 类型

2 )多个路由中间件

package mainimport ("fmt""time""github.com/gin-gonic/gin""net/http"
)func initMiddleware(c *gin.Context) {fmt.Println("第1个中间件开始")// 记录开始时间start := time.Now().UnixNano()// 调用该请求的剩余处理程序c.Next()// 记录结束时间end := time.Now().UnixNano()// 输出当前渲染时间差fmt.Println("第1个中间件结束,并统计其处理时间:", end - start)
}func initMiddleware2(c *gin.Context) {fmt.Println("第2个中间件开始")c.Next()// 终止调用该请求的剩余处理程序// c.Abort() // 注意,Next 和 Abort 只能二选一,可以控制在某些情况下,终止中间件fmt.Println("第2个中间件结束")
}func main() {// 创建一个默认的路由引擎r := gin.Default()r.GET("/", initMiddleware, initMiddleware2, func(c *gin.Context) {c.String(http.StatusOK, "首页")})r.GET("/news", initMiddleware, initMiddleware2, func(c *gin.Context) {c.String(http.StatusOK, "新闻页面")})r.Run()
}
  • 上述示例中,有两个中间件,就是 initMiddleware, initMiddleware2
  • 访问路由时的输出顺序
    第1个中间件开始
    第2个中间件开始
    第2个中间件结束
    第1个中间件结束,并统计其处理时间: 21000
    
  • 这种就是洋葱模型,基本上所有中间件都符合这一模型
  • 配置路由的时候可以传递多个 func 回调函数
  • 最后一个 func 回调函数前面触发的方法都可以称为中间件
  • 中间件里面加上 ctx.Next()可以让我们在路由匹配完成后执行一些操作
  • 如果想要终止中间件操作可以通过判断,添加 ctx.Abort() 来终止接下来的操作

3 )全局中间件

package mainimport ("fmt""time""github.com/gin-gonic/gin""net/http"
)func initMiddleware(c *gin.Context) {fmt.Println("第1个中间件开始")// 记录开始时间start := time.Now().UnixNano()// 调用该请求的剩余处理程序c.Next()// 记录结束时间end := time.Now().UnixNano()// 输出当前渲染时间差fmt.Println("第1个中间件结束,并统计其处理时间:", end - start)
}func initMiddleware2(c *gin.Context) {fmt.Println("第2个中间件开始")c.Next()fmt.Println("第2个中间件结束")
}func main() {// 创建一个默认的路由引擎r := gin.Default()// 全局中间件r.Use(initMiddleware, initMiddleware2)r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "首页")})r.GET("/news", func(c *gin.Context) {c.String(http.StatusOK, "新闻页面")})r.Run()
}
  • 这种属于全局配置的中间件,不用在每个路由中书写,进行全局use
  • 这种写法和第2种效果一致

4 )中间件的拆分

yourGinProject/ ·······························  根目录├── go.mod ··································  go mod 文件├── go.sum ··································  go sum 文件├── main.go ·································  main 文件└── tpls ····································· html模板目录│     └── web│     │    └── index.html├── routers ·································· 路由目录│     ├── webRouters.go│     ├── apiRouters.go│     └── adminRouters.go├── controllers ······························ 控制器目录│     ├── web│     │     └── webCtrl.go│     ├── api│     │     └── apiCtrl.go│     └── admin│     │     ├── base.go│     │     ├── indexCtrl.go│     │     └── userCtrl.go├── middlewares ······························ 中间件目录│     └── init.go

这里使用最顶层控制器拆分时用的结构

这里 middlewares/init.go

package middlewaresimport ("fmt""time""github.com/gin-gonic/gin"
)func InitMiddleware(c *gin.Context) {//判断用户是否登录fmt.Println("当前时间:", time.Now())fmt.Println("当前URL:", c.Request.URL)c.Set("username", "Wang") // 在请求上下文中设置值,后续的处理函数能够取到该值// 定义一个 goroutine 统计日志// 当在中间件或 handler 中启动新的 goroutine 时// 不能使用原始的上下文(c *gin.Context), 必须使用其只读副本(c.Copy())cCp := c.Copy()go func() {time.Sleep(2 * time.Second)fmt.Println("Done! in path " + cCp.Request.URL.Path)}()
}

改造 routers/adminRouters.go 文件

package routersimport ("gin-demo/controllers/admin""github.com/gin-gonic/gin""gin-demo/middlewares" // 引入
)func AdminRoutersInit(r *gin.Engine) {adminRouters := r.Group("/admin", middlewares.InitMiddleware) // 注意这里{adminRouters.GET("/", admin.IndexCtrl{}.Index)adminRouters.GET("/user", admin.UserCtrl{}.Index)adminRouters.GET("/user/success", admin.UserCtrl{}.Success)adminRouters.GET("/user/error", admin.UserCtrl{}.Error)}
}

/admin 及子路由被访问时都会经过这个中间件
这里用了一个 goroutine 做数据统计,下面在 admin.userCtrl 中获取中间件中配置的值

改造 controllers/admin/userCtrl.go 文件

package adminimport ("net/http""github.com/gin-gonic/gin"
)type UserCtrl struct {BaseCtrl
}func (con UserCtrl) Index(c *gin.Context) {username, _ := c.Get("username") // 这里从中间件中读取数据c.String(http.StatusOK, "user 页面: %v", username) // 响应出去
}
func (con UserCtrl) Success(c *gin.Context) {con.success(c)
}
func (con UserCtrl) Error(c *gin.Context) {con.error(c)
}

这样就可以获取到中间件中读取的数据了

注意事项

  • gin 默认中间件
    • gin.Default()默认使用了 Logger 和 Recovery 中间件,其中:
    • Logger 中间件将日志写入 gin.DefaultWriter,即使配置了 GIN_MODE=release
    • Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500 响应码
    • 如果不想使用上面两个默认的中间件,可以使用 gin.New() 新建一个没有任何默认中间件的路由
  • gin 中间件中使用 goroutine
    • 当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context)
    • 必须使用其只读副本(c.Copy())
http://www.wooajung.com/news/29363.html

相关文章:

  • 德阳做网站的互联网公司社区营销推广活动方案
  • c程序设计教学网站怎么做百度首页 百度一下
  • 网站创建服务公司竞价推广思路
  • 做网站公司做网站排名服务热线
  • 网站页面优化网站访问量查询工具
  • 游戏网站代码网站宣传和推广的方法有哪些
  • 什么是网站风格湖北网站seo设计
  • 2019年建设银行安徽招聘网站兴安盟新百度县seo快速排名
  • 做网站时怎样图片上传怎么才能让图片不变形有什么插件吗网站申请
  • 网站排名做不上去如何分步骤开展seo工作
  • 外贸管理网站模板seo网站推广经理招聘
  • 广东微信网站开发哪家好代写软文公司
  • 怎么用dw英文版做网站临沂seo全网营销
  • 素材网站 模板广告软文范例
  • 长沙专业外贸建站公司seo公司系统
  • 深圳云购网站制作在线制作网站免费
  • 网站建设装什么系统苏州seo排名公司
  • 如何查看网站的建设方式网络搜索词排名
  • 北京网站设计济南兴田德润团队怎么样网络营销的流程和方法
  • 网站建设有哪些渠道广告营销公司
  • 做网站 提交源码 论坛网址导航
  • 哈尔滨网站开发工作室教育机构网站
  • 合肥建网站公司苏州关键词优化排名推广
  • 洛阳网站建设哪家权威12345浏览器网址大全
  • 做网站的用什么软件呢seo站长工具查询系统
  • 学习怎么做网站百度官网app
  • 网站建设在哪块做广州百度关键词排名
  • 广州番禺营销型网站建设产品软文怎么写
  • 翔安区建设网站今天晚上19点新闻联播直播回放
  • 有什么网站可以做跳转连接的搜索引擎优化指南