以注册为例展示对service层的调用
一、编写注册接口进行测试
一切看起来都是那么的完么,编写一下注册接口,测试一下
在main.go中定义注册路由和注册方法
注册方法
package main
import (
"encoding/json"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
"hello/model"
"hello/service"
"html/template"
"log"
"math/rand"
"net/http"
)
// 登录方法
func userLogin(writer http.ResponseWriter, request *http.Request) {
//数据库操作
//逻辑处理
//restapi json/xml 返回
//1.获取前端传递的参数
//mobile,passwd
//如何获取参数
//解析参数
request.ParseForm()
mobile := request.PostForm.Get("mobile")
passwd := request.PostForm.Get("passwd")
loginOk := false
if mobile == "15313311315" && passwd == "123456" {
loginOk = true
}
if loginOk {
//{"id":1,"token":"xx"}
data := make(map[string]interface{})
data["id"] = 1
data["token"] = "test"
Resp(writer, 0, data, "登录成功")
} else {
Resp(writer, -1, nil, "密码不正确")
}
}
var userService service.UserService
// 注册方法
func userRegister(writer http.ResponseWriter, request *http.Request) {
//数据库操作
//逻辑处理
//restapi json/xml 返回
//1.获取前端传递的参数
//mobile,passwd
//如何获取参数
//解析参数
request.ParseForm()
mobile := request.PostForm.Get("mobile")
plainpwd := request.PostForm.Get("passwd")
nickname := fmt.Sprintf("user%06d", rand.Int31())
avatar := ""
sex := model.SEX_UNKNON
user, err := userService.Register(mobile, plainpwd, nickname, avatar, sex)
//登录失败
if err != nil {
Resp(writer, -1, nil, err.Error())
} else {
Resp(writer, 0, user, "")
}
}
func RegisterView() {
//把模版解析并且显示出来
//tpl得到模版的指针
//ParseGlob 满足这种格式的都可以解析出来 ** 表示目录 * 表示文件
tpl, err := template.ParseGlob("view/**/*") //filename是模版的相对路径
//如果报错就不用继续走啦
if err != nil {
//直接退出和fmt.Printf不一样
log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
}
for _, v := range tpl.Templates() {
//参数2 模版的名称是view视图上方define定义的名字
//参数3 需要往视图传递的数据,不需要nil
tplname := v.Name()
//循环注册
http.HandleFunc(tplname, func(writer http.ResponseWriter, request *http.Request) {
tpl.ExecuteTemplate(writer, tplname, nil)
})
}
}
// 定义一个全局变量 对应的是一个指针
var DbEngin *xorm.Engine
// init 在main函数运行的时候自动运行的
func init() {
//DbEngin进行初始化
driverName := "mysql"
DsName := "root:@(127.0.0.1:3306)/chat?charset=utf8"
DbEngin, err := xorm.NewEngine(driverName, DsName)
if err != nil {
//直接退出和fmt.Printf不一样
log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
}
//进行一些设置,在调试模式的设置
//是否显示sql语句
DbEngin.ShowSQL(true)
//数据库最大链接数,线上环境自己设置,这个直接影响数据库的性能
DbEngin.SetMaxOpenConns(2)
//自动建表User
//DbEngin.Sync2(new(User))
//打印一下是否初始化成功
fmt.Println("init data base ok")
}
type H struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"` //omitempty如果为空则不显示
}
func Resp(w http.ResponseWriter, code int, data interface{}, msg string) {
//设置header 为JSON 默认的text/html,所以特别指出返回的为application/json
w.Header().Set("Content-Type", "application/json")
//设置200状态
w.WriteHeader(http.StatusOK)
//定义一个结构体
h := H{
Code: code,
Msg: msg,
Data: data,
}
//将结构体转化成JSON字符串
ret, err := json.Marshal(h)
if err != nil {
log.Println(err.Error())
}
//输出
w.Write([]byte(ret))
}
func main() {
//把前端请求的格式和封装处理函数进行绑定的标签
//绑定请求和处理函数
http.HandleFunc("/user/login", userLogin)
//注册路由
http.HandleFunc("/user/register", userRegister)
//1.提供静态资源目录支持
//http.Handle("/", http.FileServer(http.Dir("."))) //当前目录
//2.提供指定目录的静态文件支持
http.Handle("/asset/", http.FileServer(http.Dir("."))) //第一个是格式
/*
//定义可以允许访问的模版 user/login.shtml
http.HandleFunc("/user/login.shtml", func(writer http.ResponseWriter, request *http.Request) {
//把模版解析并且显示出来
//tpl得到模版的指针
tpl, err := template.ParseFiles("view/user/login.html") //filename是模版的相对路径
if err != nil {
//直接退出和fmt.Printf不一样
log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
}
//参数2 模版的名称是view视图上方define定义的名字
//参数3 需要往视图传递的数据,不需要nil
tpl.ExecuteTemplate(writer, "/user/login.shtml", nil)
})
//定义可以允许访问的模版 user/register.shtml
http.HandleFunc("/user/register.shtml", func(writer http.ResponseWriter, request *http.Request) {
//把模版解析并且显示出来
//tpl得到模版的指针
tpl, err := template.ParseFiles("view/user/register.html") //filename是模版的相对路径
if err != nil {
//直接退出和fmt.Printf不一样
log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
}
//参数2 模版的名称是view视图上方define定义的名字
//参数3 需要往视图传递的数据,不需要nil
tpl.ExecuteTemplate(writer, "/user/register.shtml", nil)
})
*/
RegisterView()
//启动web服务器
http.ListenAndServe(":8080", nil)
}
启动服务,如果服务启动失败,则按照一下步骤进行排错
如果启动服务报以下错误,说明没有表结构
需要使用以下解决方案,以下方法可以方法可以自动创建表结构
之后在请求就可以得到一些相关信息
service/init.go代码
package service
import (
"errors"
"fmt"
"github.com/go-xorm/xorm"
"hello/model"
"log"
)
// 定义一个全局变量 对应的是一个指针
var DbEngin *xorm.Engine
// init 在main函数运行的时候自动运行的
func init() {
//DbEngin进行初始化
driverName := "mysql"
DsName := "root:@(127.0.0.1:3306)/chat?charset=utf8"
//这个操作有可能是变量再次赋值了,所以有可能是个nil
//DbEngin, err := xorm.NewEngine(driverName, DsName)
//if err != nil {
// //直接退出和fmt.Printf不一样
// log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
//}
err := errors.New("")
DbEngin, err = xorm.NewEngine(driverName, DsName)
if nil != err && "" != err.Error() {
//直接退出和fmt.Printf不一样
log.Fatal(err.Error()) //Fatal函数作用,如果模版渲染出错了,这个应用不用往下跑了,直接退出
}
//进行一些设置,在调试模式的设置
//是否显示sql语句
DbEngin.ShowSQL(true)
//数据库最大链接数,线上环境自己设置,这个直接影响数据库的性能
DbEngin.SetMaxOpenConns(2)
//自动建表User
DbEngin.Sync2(new(model.User))
//打印一下是否初始化成功
fmt.Println("init data base ok")
}
发现返回的结果集没有token,进行处理下token
再次运行发现token已经存在了
到此我们的注册逻辑就已经全部完毕了