以注册为例展示对service层的调用

一、编写注册接口进行测试

一切看起来都是那么的完么,编写一下注册接口,测试一下

在main.go中定义注册路由和注册方法 15、以注册为例展示对service层的调用 - 图1

注册方法

15、以注册为例展示对service层的调用 - 图2

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. "github.com/go-xorm/xorm"
  7. "hello/model"
  8. "hello/service"
  9. "html/template"
  10. "log"
  11. "math/rand"
  12. "net/http"
  13. )
  14. // 登录方法
  15. func userLogin(writer http.ResponseWriter, request *http.Request) {
  16. //数据库操作
  17. //逻辑处理
  18. //restapi json/xml 返回
  19. //1.获取前端传递的参数
  20. //mobile,passwd
  21. //如何获取参数
  22. //解析参数
  23. request.ParseForm()
  24. mobile := request.PostForm.Get("mobile")
  25. passwd := request.PostForm.Get("passwd")
  26. loginOk := false
  27. if mobile == "15313311315" && passwd == "123456" {
  28. loginOk = true
  29. }
  30. if loginOk {
  31. //{"id":1,"token":"xx"}
  32. data := make(map[string]interface{})
  33. data["id"] = 1
  34. data["token"] = "test"
  35. Resp(writer, 0, data, "登录成功")
  36. } else {
  37. Resp(writer, -1, nil, "密码不正确")
  38. }
  39. }
  40. var userService service.UserService
  41. // 注册方法
  42. func userRegister(writer http.ResponseWriter, request *http.Request) {
  43. //数据库操作
  44. //逻辑处理
  45. //restapi json/xml 返回
  46. //1.获取前端传递的参数
  47. //mobile,passwd
  48. //如何获取参数
  49. //解析参数
  50. request.ParseForm()
  51. mobile := request.PostForm.Get("mobile")
  52. plainpwd := request.PostForm.Get("passwd")
  53. nickname := fmt.Sprintf("user%06d", rand.Int31())
  54. avatar := ""
  55. sex := model.SEX_UNKNON
  56. user, err := userService.Register(mobile, plainpwd, nickname, avatar, sex)
  57. //登录失败
  58. if err != nil {
  59. Resp(writer, -1, nil, err.Error())
  60. } else {
  61. Resp(writer, 0, user, "")
  62. }
  63. }
  64. func RegisterView() {
  65. //把模版解析并且显示出来
  66. //tpl得到模版的指针
  67. //ParseGlob 满足这种格式的都可以解析出来 ** 表示目录 * 表示文件
  68. tpl, err := template.ParseGlob("view/**/*") //filename是模版的相对路径
  69. //如果报错就不用继续走啦
  70. if err != nil {
  71. //直接退出和fmt.Printf不一样
  72. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  73. }
  74. for _, v := range tpl.Templates() {
  75. //参数2 模版的名称是view视图上方define定义的名字
  76. //参数3 需要往视图传递的数据,不需要nil
  77. tplname := v.Name()
  78. //循环注册
  79. http.HandleFunc(tplname, func(writer http.ResponseWriter, request *http.Request) {
  80. tpl.ExecuteTemplate(writer, tplname, nil)
  81. })
  82. }
  83. }
  84. // 定义一个全局变量 对应的是一个指针
  85. var DbEngin *xorm.Engine
  86. // init 在main函数运行的时候自动运行的
  87. func init() {
  88. //DbEngin进行初始化
  89. driverName := "mysql"
  90. DsName := "root:@(127.0.0.1:3306)/chat?charset=utf8"
  91. DbEngin, err := xorm.NewEngine(driverName, DsName)
  92. if err != nil {
  93. //直接退出和fmt.Printf不一样
  94. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  95. }
  96. //进行一些设置,在调试模式的设置
  97. //是否显示sql语句
  98. DbEngin.ShowSQL(true)
  99. //数据库最大链接数,线上环境自己设置,这个直接影响数据库的性能
  100. DbEngin.SetMaxOpenConns(2)
  101. //自动建表User
  102. //DbEngin.Sync2(new(User))
  103. //打印一下是否初始化成功
  104. fmt.Println("init data base ok")
  105. }
  106. type H struct {
  107. Code int `json:"code"`
  108. Msg string `json:"msg"`
  109. Data interface{} `json:"data,omitempty"` //omitempty如果为空则不显示
  110. }
  111. func Resp(w http.ResponseWriter, code int, data interface{}, msg string) {
  112. //设置header 为JSON 默认的text/html,所以特别指出返回的为application/json
  113. w.Header().Set("Content-Type", "application/json")
  114. //设置200状态
  115. w.WriteHeader(http.StatusOK)
  116. //定义一个结构体
  117. h := H{
  118. Code: code,
  119. Msg: msg,
  120. Data: data,
  121. }
  122. //将结构体转化成JSON字符串
  123. ret, err := json.Marshal(h)
  124. if err != nil {
  125. log.Println(err.Error())
  126. }
  127. //输出
  128. w.Write([]byte(ret))
  129. }
  130. func main() {
  131. //把前端请求的格式和封装处理函数进行绑定的标签
  132. //绑定请求和处理函数
  133. http.HandleFunc("/user/login", userLogin)
  134. //注册路由
  135. http.HandleFunc("/user/register", userRegister)
  136. //1.提供静态资源目录支持
  137. //http.Handle("/", http.FileServer(http.Dir("."))) //当前目录
  138. //2.提供指定目录的静态文件支持
  139. http.Handle("/asset/", http.FileServer(http.Dir("."))) //第一个是格式
  140. /*
  141. //定义可以允许访问的模版 user/login.shtml
  142. http.HandleFunc("/user/login.shtml", func(writer http.ResponseWriter, request *http.Request) {
  143. //把模版解析并且显示出来
  144. //tpl得到模版的指针
  145. tpl, err := template.ParseFiles("view/user/login.html") //filename是模版的相对路径
  146. if err != nil {
  147. //直接退出和fmt.Printf不一样
  148. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  149. }
  150. //参数2 模版的名称是view视图上方define定义的名字
  151. //参数3 需要往视图传递的数据,不需要nil
  152. tpl.ExecuteTemplate(writer, "/user/login.shtml", nil)
  153. })
  154. //定义可以允许访问的模版 user/register.shtml
  155. http.HandleFunc("/user/register.shtml", func(writer http.ResponseWriter, request *http.Request) {
  156. //把模版解析并且显示出来
  157. //tpl得到模版的指针
  158. tpl, err := template.ParseFiles("view/user/register.html") //filename是模版的相对路径
  159. if err != nil {
  160. //直接退出和fmt.Printf不一样
  161. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  162. }
  163. //参数2 模版的名称是view视图上方define定义的名字
  164. //参数3 需要往视图传递的数据,不需要nil
  165. tpl.ExecuteTemplate(writer, "/user/register.shtml", nil)
  166. })
  167. */
  168. RegisterView()
  169. //启动web服务器
  170. http.ListenAndServe(":8080", nil)
  171. }

启动服务,如果服务启动失败,则按照一下步骤进行排错 15、以注册为例展示对service层的调用 - 图3

如果启动服务报以下错误,说明没有表结构

15、以注册为例展示对service层的调用 - 图4

需要使用以下解决方案,以下方法可以方法可以自动创建表结构 15、以注册为例展示对service层的调用 - 图5

之后在请求就可以得到一些相关信息 15、以注册为例展示对service层的调用 - 图6

service/init.go代码

  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/go-xorm/xorm"
  6. "hello/model"
  7. "log"
  8. )
  9. // 定义一个全局变量 对应的是一个指针
  10. var DbEngin *xorm.Engine
  11. // init 在main函数运行的时候自动运行的
  12. func init() {
  13. //DbEngin进行初始化
  14. driverName := "mysql"
  15. DsName := "root:@(127.0.0.1:3306)/chat?charset=utf8"
  16. //这个操作有可能是变量再次赋值了,所以有可能是个nil
  17. //DbEngin, err := xorm.NewEngine(driverName, DsName)
  18. //if err != nil {
  19. // //直接退出和fmt.Printf不一样
  20. // log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  21. //}
  22. err := errors.New("")
  23. DbEngin, err = xorm.NewEngine(driverName, DsName)
  24. if nil != err && "" != err.Error() {
  25. //直接退出和fmt.Printf不一样
  26. log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
  27. }
  28. //进行一些设置,在调试模式的设置
  29. //是否显示sql语句
  30. DbEngin.ShowSQL(true)
  31. //数据库最大链接数,线上环境自己设置,这个直接影响数据库的性能
  32. DbEngin.SetMaxOpenConns(2)
  33. //自动建表User
  34. DbEngin.Sync2(new(model.User))
  35. //打印一下是否初始化成功
  36. fmt.Println("init data base ok")
  37. }

发现返回的结果集没有token,进行处理下token 15、以注册为例展示对service层的调用 - 图7

再次运行发现token已经存在了 15、以注册为例展示对service层的调用 - 图8

到此我们的注册逻辑就已经全部完毕了