美文网首页
使用Iris打造一款个人博客(控制器)

使用Iris打造一款个人博客(控制器)

作者: 鬼子口音 | 来源:发表于2020-01-09 20:27 被阅读0次

    Golang:使用Iris打造一款个人博客(三)

    使用Iris打造一款个人博客之配置篇
    使用Iris打造一款个人博客之路由篇

    所谓的 MVC 架构,就是视图,模型和控制器
    视图和模型已经说过了,现在来看看控制器的实现
    哎 我有点坚持不下去了

    image

    先来看看 main主入口中的调用

    package main
    
    import (
        "Iris_web/controller"
        "Iris_web/server/routeFunc"
        "github.com/kataras/iris"
        "github.com/kataras/iris/mvc"
    )
    
    func main() {
        app := iris.New()
        app.Logger().SetLevel("info")
    
        //全局前置
        //app.Use(before)
    
    
        //tmp := iris.HTML("./templates", ".html")
        tmp := iris.Django("./templates",".html") //这里使用Django模板 没办法 flask落下的病根
    
        //自动重载模板文件
        tmp.Reload(true)
    
    
        //加载静态文件
        app.HandleDir("/static", "./static")  //把app.StaticWeb("/static", "./static")干掉  会报错 iris版本原因
    
        //错误处理
        app.OnErrorCode(iris.StatusNotFound, routeFunc.NotFound)
        app.OnErrorCode(iris.StatusInternalServerError, routeFunc.InternalServerError)
    
        //注册进去
        app.RegisterView(tmp)
    
        archives := app.Party("/article")
        archives.Get("/{uuid:int}", routeFunc.ArchivesDetail)
    
        app.Get("/ajaxPage", routeFunc.AjaxPage)
    
        app.Get("/search", routeFunc.Search)
    
        //路由组的mvc处理
        mvc.Configure(app, controller.Basic)
    
    
        app.Run(
            iris.Addr("localhost:8000"),
            iris.WithoutServerError(iris.ErrServerClosed),//无服务错误提示
            iris.WithOptimizations,
            )
    }
    
    
    

    可以看到我引入了 Iris 的 MVC 模型(事实上不引入也完全不影响代码的实现)
    其中 mvc.Configure(app, controller.Basic) 就是路由组的 mvc 处理
    controller.Basic 就是控制器的根处理,跟我来

    实现控制器

    basic.go

    package controller
    
    import (
        "github.com/kataras/iris"
        "github.com/kataras/iris/mvc"
    )
    
    // 在路由组下面创建 context.Handle(new(Branch))
    func Basic(context *mvc.Application) {
        iris.New().Logger().Info(" root 控制器")
        Root(context)
    
        iris.New().Logger().Info(" 定义 Sub 子路径")
        Sub(context)
    
        iris.New().Logger().Info(" 定义 Sub2 子路径")
        Sub2(context)
    }
    
    

    root.go

    package controller
    
    import (
        //"Iris_web/datasource"
        "Iris_web/server/dbServer"
        "github.com/kataras/iris"
        "github.com/kataras/iris/mvc"
        "github.com/kataras/iris/sessions"
        "time"
    )
    
    type RootController struct {
        //上下文对象
        Ctx iris.Context
    
        //session对象
        Session *sessions.Session
    
    }
    
    func Root(context *mvc.Application) {
        context.Handle(new(RootController)) // 相当于mvc.New(app).Handle(new(UserController))
    }
    
    
    func (uc *RootController) Get() {
        iris.New().Logger().Info(" Get请求-->首页 ")
    
        c := dbServer.Article{}
        comments := c.GetPages(4,1)  //是一个数组
    
    
        // 绑定: {{ contents }} 为 "Hello world!"
        uc.Ctx.ViewData("datas", comments)
    
        now := time.Now().Format(uc.Ctx.Application().ConfigurationReadOnly().GetTimeFormat())
        uc.Ctx.ViewData("now", now)
    
        if err := uc.Ctx.View("index.html"); err != nil {
            uc.Ctx.Application().Logger().Infof(err.Error())
        }
    }
    
    
    func (uc *RootController) GetArchives() {
        iris.New().Logger().Info(" Archives 请求 ")
        c := dbServer.Article{}
    
        datas := c.GetArticleList()
        counts := c.GetCounts()
        uc.Ctx.ViewData("datas", datas)
        uc.Ctx.ViewData("counts", counts)
        if err := uc.Ctx.View("archives.html"); err != nil {
            uc.Ctx.Application().Logger().Infof(err.Error())
        }
    }
    
    
    func (uc *RootController) GetTags() {
        iris.New().Logger().Info(" get请求-->tags")
        if err := uc.Ctx.View("tags.html"); err != nil {
            uc.Ctx.Application().Logger().Infof(err.Error())
        }
    }
    
    
    func (uc *RootController) GetAbout() {
        iris.New().Logger().Info(" get请求-->about")
    
        g := dbServer.G_count{}
        G,_ := g.GetGc()
    
        uc.Ctx.ViewData("count", G.Count)
        if err := uc.Ctx.View("about.html"); err != nil {
            uc.Ctx.Application().Logger().Infof(err.Error())
        }
    }
    
    
    //中间件
    func (uc *RootController) BeforeActivation(a mvc.BeforeActivation) {
        a.Handle("GET", "/UserInfo", "UserInfo", MiddlewareHere)
    }
    
    
    func (uc *RootController) UserInfo() {
        iris.New().Logger().Info(" get请求-->query")
    }
    
    
    func MiddlewareHere(ctx iris.Context) {
        ctx.Application().Logger().Warnf("调用中间件")
        ctx.Next()
    }
    
    

    sub.go

    package controller
    
    import (
        "github.com/kataras/iris"
        "github.com/kataras/iris/mvc"
    )
    
    type SubController struct {
        //上下文对象
        Ctx iris.Context
    }
    
    
    // 在路由组下面创建 context.Handle(new(Branch))
    func Sub(context *mvc.Application) {
        context.Party("/Sub").Handle(new(SubController))
    
    }
    
    
    func (uc *SubController) Get(ctx iris.Context) {
        iris.New().Logger().Info(" Get Sub 请求")
    
        //ctx.SetCookieKV("Sub", "Sub") // <-- 设置一个Cookie
    
        if err := ctx.View("sub.html"); err != nil {
            ctx.Application().Logger().Infof(err.Error())
        }
    
    }
    
    
    func (uc *SubController) GetTags(ctx iris.Context) {
        iris.New().Logger().Info(" get请求-->Sub-->tags")
        ctx.HTML("<h1>Sub-->tags</h1>")
    }
    
    

    sub2.go

    
    package controller
    
    import (
    "github.com/kataras/iris"
    "github.com/kataras/iris/mvc"
    )
    
    type Sub2Controller struct {
        //上下文对象
        Ctx iris.Context
    }
    
    
    // 在路由组下面创建 context.Handle(new(Branch))
    func Sub2(context *mvc.Application) {
        context.Party("/Sub").Handle(new(Sub2Controller))
    }
    
    
    func (uc *Sub2Controller) Get(ctx iris.Context) {
        iris.New().Logger().Info(" Get Sub 请求")
    
        //ctx.SetCookieKV("Sub", "Sub") // <-- 设置一个Cookie
    
        if err := ctx.View("sub.html"); err != nil {
            ctx.Application().Logger().Infof(err.Error())
        }
    
    }
    
    
    func (uc *Sub2Controller) GetTags(ctx iris.Context) {
        iris.New().Logger().Info(" get请求-->Sub-->tags")
        ctx.HTML("<h1>Sub-->tags</h1>")
    }
    
    

    看看,多么美妙的路由组处理,如果不使用 MVC 架构也可以像之前定义路由函数那样写
    事实上整个web框架搭建完成之后,本身就是mvc架构,并不需要引入 Iris的 mvc模块,有点多余而且,还有点缺陷

    这样就把控制器注册到app服务中去了,实际上控制器和路由方法很大程度上是一个东西

    很好,我写博客的思路就是只要贴出代码那就完成了一半
    啥玩意,光有代码看不懂,听我说,先把文档看一遍,你就发现你真正上车了,而且开的贼快

    加密

    golang也可以实现很多很多的加密,一般用于cookie加密啊,参数加密啊,session之类的
    来实现一个简单的 MD5 + BASE64 加密

    MD.go

    package encryption
    
    import (
        "crypto/md5"
        "encoding/base64"
        "encoding/hex"
        "fmt"
    )
    
    func M_base64(s string) string{
    
        md := md5.New()
        md.Write([]byte(s))
        mdSum := md.Sum(nil)
    
        hexString := hex.EncodeToString(mdSum)
        base64String := base64.StdEncoding.EncodeToString(mdSum)
    
        fmt.Println("  hexString:", hexString)
    
        fmt.Println("base64String:", base64String)
    
        return base64String
    }
    

    控制器完,没啥

    下一篇我就直接完结掉这个Iris博客系列

    ps:这个系列的文章还是有一些门槛的,我跳过了一些基础的东西
    一些demo可以直接参考Iris 中文文档 https://learnku.com/docs/iris-go

    欢迎转载,但要声明出处,不然我顺着网线过去就是一拳。
    个人技术博客:http://www.gzky.live

    相关文章

      网友评论

          本文标题:使用Iris打造一款个人博客(控制器)

          本文链接:https://www.haomeiwen.com/subject/viruactx.html