懒人必备20行代码实现全部模板页面自动渲染并接入

一、注册页面的渲染

11、懒人必备20行代码实现全部模板页面自动渲染并接入 - 图1 11、懒人必备20行代码实现全部模板页面自动渲染并接入 - 图2

运行发现没有任何问题,能够渲染成功 11、懒人必备20行代码实现全部模板页面自动渲染并接入 - 图3 思考一下, 现在只是两个页面都这么多代码,那想一想有没有一劳永逸的办法呢? 而且每次运行代码的内容基本上都差不多。 可不可以把这些共同代码抽象提炼出共同的方法里呢? 答案是肯定的,接下来给大家展示一个 万能的模板渲染函数。

11、懒人必备20行代码实现全部模板页面自动渲染并接入 - 图4

  1. package main
  2. import (
  3. "encoding/json"
  4. "html/template"
  5. "log"
  6. "net/http"
  7. )
  8. func userLogin(writer http.ResponseWriter, request *http.Request) {
  9. //数据库操作
  10. //逻辑处理
  11. //restapi json/xml 返回
  12. //1.获取前端传递的参数
  13. //mobile,passwd
  14. //如何获取参数
  15. //解析参数
  16. request.ParseForm()
  17. mobile := request.PostForm.Get("mobile")
  18. passwd := request.PostForm.Get("passwd")
  19. loginOk := false
  20. if mobile == "15313311315" && passwd == "123456" {
  21. loginOk = true
  22. }
  23. if loginOk {
  24. //{"id":1,"token":"xx"}
  25. data := make(map[string]interface{})
  26. data["id"] = 1
  27. data["token"] = "test"
  28. Resp(writer, 0, data, "登录成功")
  29. } else {
  30. Resp(writer, -1, nil, "密码不正确")
  31. }
  32. }
  33. func RegisterView() {
  34. //把模版解析并且显示出来
  35. //tpl得到模版的指针
  36. //ParseGlob 满足这种格式的都可以解析出来 ** 表示目录 * 表示文件
  37. tpl, err := template.ParseGlob("view/**/*") //filename是模版的相对路径
  38. //如果报错就不用继续走啦
  39. if err != nil {
  40. //直接退出和fmt.Printf不一样
  41. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  42. }
  43. for _, v := range tpl.Templates() {
  44. //参数2 模版的名称是view视图上方define定义的名字
  45. //参数3 需要往视图传递的数据,不需要nil
  46. tplname := v.Name()
  47. //循环注册
  48. http.HandleFunc(tplname, func(writer http.ResponseWriter, request *http.Request) {
  49. tpl.ExecuteTemplate(writer, tplname, nil)
  50. })
  51. }
  52. }
  53. type H struct {
  54. Code int `json:"code"`
  55. Msg string `json:"msg"`
  56. Data interface{} `json:"data,omitempty"` //omitempty如果为空则不显示
  57. }
  58. func Resp(w http.ResponseWriter, code int, data interface{}, msg string) {
  59. //设置header 为JSON 默认的text/html,所以特别指出返回的为application/json
  60. w.Header().Set("Content-Type", "application/json")
  61. //设置200状态
  62. w.WriteHeader(http.StatusOK)
  63. //定义一个结构体
  64. h := H{
  65. Code: code,
  66. Msg: msg,
  67. Data: data,
  68. }
  69. //将结构体转化成JSON字符串
  70. ret, err := json.Marshal(h)
  71. if err != nil {
  72. log.Println(err.Error())
  73. }
  74. //输出
  75. w.Write([]byte(ret))
  76. }
  77. func main() {
  78. //把前端请求的格式和封装处理函数进行绑定的标签
  79. //绑定请求和处理函数
  80. http.HandleFunc("/user/login", userLogin)
  81. //1.提供静态资源目录支持
  82. //http.Handle("/", http.FileServer(http.Dir("."))) //当前目录
  83. //2.提供指定目录的静态文件支持
  84. http.Handle("/asset/", http.FileServer(http.Dir("."))) //第一个是格式
  85. /*
  86. //定义可以允许访问的模版 user/login.shtml
  87. http.HandleFunc("/user/login.shtml", func(writer http.ResponseWriter, request *http.Request) {
  88. //把模版解析并且显示出来
  89. //tpl得到模版的指针
  90. tpl, err := template.ParseFiles("view/user/login.html") //filename是模版的相对路径
  91. if err != nil {
  92. //直接退出和fmt.Printf不一样
  93. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  94. }
  95. //参数2 模版的名称是view视图上方define定义的名字
  96. //参数3 需要往视图传递的数据,不需要nil
  97. tpl.ExecuteTemplate(writer, "/user/login.shtml", nil)
  98. })
  99. //定义可以允许访问的模版 user/register.shtml
  100. http.HandleFunc("/user/register.shtml", func(writer http.ResponseWriter, request *http.Request) {
  101. //把模版解析并且显示出来
  102. //tpl得到模版的指针
  103. tpl, err := template.ParseFiles("view/user/register.html") //filename是模版的相对路径
  104. if err != nil {
  105. //直接退出和fmt.Printf不一样
  106. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  107. }
  108. //参数2 模版的名称是view视图上方define定义的名字
  109. //参数3 需要往视图传递的数据,不需要nil
  110. tpl.ExecuteTemplate(writer, "/user/register.shtml", nil)
  111. })
  112. */
  113. RegisterView()
  114. //启动web服务器
  115. http.ListenAndServe(":8080", nil)
  116. }

新建一个test文件测试一下是否好使,记得重启,后续没有修改main.go的代码,看一下是否可以生效 11、懒人必备20行代码实现全部模板页面自动渲染并接入 - 图5

11、懒人必备20行代码实现全部模板页面自动渲染并接入 - 图6

看到如上效果,说明没有问题,这个就是万能的模板页面自动渲染