概述
一般的 web项目,主要两点:路由 和 数据库。围绕这两点之外就是业务逻辑。下面以几个例子简单谈谈 web项目的封装逻辑。
封装方式一、路由写在 main函数中,数据库初始连接放在 init() 函数中。地址
func init() { db.Connect() } func main() { // Configure router := gin.Default() // Set html render options htmlRender := GinHTMLRender.New() htmlRender.Debug = gin.IsDebugging() htmlRender.Layout = "layouts/default" // htmlRender.TemplatesDir = "templates/" // default // htmlRender.Ext = ".html" // default // Tell gin to use our html render router.HTMLRender = htmlRender.Create() router.RedirectTrailingSlash = true router.RedirectFixedPath = true // Middlewares router.Use(middlewares.Connect) router.Use(middlewares.ErrorHandler) // Statics router.Static("/public","./public") // Routes router.GET("/",func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently,"/articles") }) // Articles router.GET("/new",articles.New) router.GET("/articles/:_id",articles.Edit) router.GET("/articles",articles.List) router.POST("/articles",articles.Create) router.POST("/articles/:_id",articles.Update) router.POST("/delete/articles/:_id",articles.Delete) // Start listening port := Port if len(os.Getenv("PORT")) > 0 { port = os.Getenv("PORT") } router.Run(":" + port) }
封装方式二、路由和 db单独封装到一个函数中,以传参的形式将路由传给另一个函数。地址
func SetUpServer() { r := gin.Default() // secret 相当于签名 store,_ := sessions.NewRedisStore(10,"tcp",CONFIG.Redis.Host,CONFIG.Redis.Password,[]byte(CONFIG.Server.Secret)) r.Use(sessions.Sessions("session",store)) r.Use(gin.Recovery()) r.Use(Uniquify()) r.LoadHTMLGlob("templates/*") r.Static("/static","public/") SetUpRoutes(r) r.GET("/incr",func(c *gin.Context) { c.JSON(200,gin.H{"count": c.MustGet("key").(string)}) }) // var port string r.Run(":" + CONFIG.Server.Port) }
封装三、将路由等封装到 Server struct 中。对此 Server 创建一个 new函数,路由等相关内容只包含在方法中。(面向对象)地址
type Server struct { Ws *melody.Melody Routes *gin.Engine Games []*Game } func New() *Server { ws := melody.New() routes := gin.Default() games := make([]*Game,0) return &Server{ Ws: ws,Routes: routes,Games: games,} } ... ... func (srv *Server) RoutesInit() { srv.Routes.GET("/jq.js",func(c *gin.Context) { http.ServeFile(c.Writer,c.Request,"html/jq.js") }) srv.Routes.GET("/goyaniv.js","html/goyaniv.js") }) srv.Routes.GET("/game/:name",func(c *gin.Context) { cookiekey,_ := c.Request.Cookie("goyanivkey") cookieid,_ := c.Request.Cookie("goyanivid") if cookieid == nil || cookiekey == nil { cookieid := CreateCookie("goyanivkey",GenerateUnique()) cookiekey := CreateCookie("goyanivid",GenerateUnique()) http.SetCookie(c.Writer,cookieid) http.SetCookie(c.Writer,cookiekey) } http.ServeFile(c.Writer,"html/game.html") }) srv.Routes.GET("/gamedev/:name","html/gamedev.html") }) srv.Routes.GET("/game/:name/ws",func(c *gin.Context) { srv.Ws.HandleRequest(c.Writer,c.Request) }) srv.Routes.GET("/gamedev/:name/ws",c.Request) }) srv.Ws.HandleMessage(func(s *melody.Session,msg []byte) { FireMessage(srv,s,msg) }) srv.Ws.HandleDisconnect(func(s *melody.Session) { FireDisconnect(srv,s) }) srv.Ws.HandleConnect(func(s *melody.Session) { FireConnect(srv,s) }) } func (s *Server) Run() { s.RoutesInit() s.Routes.Run(":5000") }