基于MVC思想的通用应用程序架构
一、代码结构的重新组织阶段,封装controller层
把main.go中的注册和登录方法放到控制器层
进行封装Resp返回数据方法,放到util目录下
因为返回结果集有成功,还会失败的,进行二次封装
package util
import (
"encoding/json"
"log"
"net/http"
)
type H struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"` //omitempty如果为空则不显示
}
// 失败返回方法,注重返回消息
func RespFail(w http.ResponseWriter, msg string) {
Resp(w, -1, nil, msg)
}
// 成功返回方法,注重返回数据
func RespOk(w http.ResponseWriter, data interface{}, msg string) {
Resp(w, 0, data, msg)
}
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))
}
接下来就可以在控制器引用这个包
因为要在main.go调用这个方法,所以方法名要改成首字母大写
package controller
import (
"fmt"
"hello/model"
"hello/service"
"hello/util"
"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"
util.RespOk(writer, data, "登录成功")
} else {
util.RespFail(writer, "密码不正确")
}
}
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 {
util.RespFail(writer, err.Error())
} else {
util.RespOk(writer, user, "")
}
}
在main.go函数怎么进行调用控制器方法呢
经测试,发现进行优化过的代码是没有任何问题的
至此,一套通用的mvc结构就已经封装好了