基于MVC思想的通用应用程序架构

一、代码结构的重新组织阶段,封装controller层

把main.go中的注册和登录方法放到控制器层

16、基于MVC思想的通用应用程序架构 - 图1

进行封装Resp返回数据方法,放到util目录下

16、基于MVC思想的通用应用程序架构 - 图2

16、基于MVC思想的通用应用程序架构 - 图3

因为返回结果集有成功,还会失败的,进行二次封装

  1. package util
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net/http"
  6. )
  7. type H struct {
  8. Code int `json:"code"`
  9. Msg string `json:"msg"`
  10. Data interface{} `json:"data,omitempty"` //omitempty如果为空则不显示
  11. }
  12. // 失败返回方法,注重返回消息
  13. func RespFail(w http.ResponseWriter, msg string) {
  14. Resp(w, -1, nil, msg)
  15. }
  16. // 成功返回方法,注重返回数据
  17. func RespOk(w http.ResponseWriter, data interface{}, msg string) {
  18. Resp(w, 0, data, msg)
  19. }
  20. func Resp(w http.ResponseWriter, code int, data interface{}, msg string) {
  21. //设置header 为JSON 默认的text/html,所以特别指出返回的为application/json
  22. w.Header().Set("Content-Type", "application/json")
  23. //设置200状态
  24. w.WriteHeader(http.StatusOK)
  25. //定义一个结构体
  26. h := H{
  27. Code: code,
  28. Msg: msg,
  29. Data: data,
  30. }
  31. //将结构体转化成JSON字符串
  32. ret, err := json.Marshal(h)
  33. if err != nil {
  34. log.Println(err.Error())
  35. }
  36. //输出
  37. w.Write([]byte(ret))
  38. }

接下来就可以在控制器引用这个包

16、基于MVC思想的通用应用程序架构 - 图4

因为要在main.go调用这个方法,所以方法名要改成首字母大写

  1. package controller
  2. import (
  3. "fmt"
  4. "hello/model"
  5. "hello/service"
  6. "hello/util"
  7. "math/rand"
  8. "net/http"
  9. )
  10. // 登录方法
  11. func UserLogin(writer http.ResponseWriter, request *http.Request) {
  12. //数据库操作
  13. //逻辑处理
  14. //restapi json/xml 返回
  15. //1.获取前端传递的参数
  16. //mobile,passwd
  17. //如何获取参数
  18. //解析参数
  19. request.ParseForm()
  20. mobile := request.PostForm.Get("mobile")
  21. passwd := request.PostForm.Get("passwd")
  22. loginOk := false
  23. if mobile == "15313311315" && passwd == "123456" {
  24. loginOk = true
  25. }
  26. if loginOk {
  27. //{"id":1,"token":"xx"}
  28. data := make(map[string]interface{})
  29. data["id"] = 1
  30. data["token"] = "test"
  31. util.RespOk(writer, data, "登录成功")
  32. } else {
  33. util.RespFail(writer, "密码不正确")
  34. }
  35. }
  36. var userService service.UserService
  37. // 注册方法
  38. func UserRegister(writer http.ResponseWriter, request *http.Request) {
  39. //数据库操作
  40. //逻辑处理
  41. //restapi json/xml 返回
  42. //1.获取前端传递的参数
  43. //mobile,passwd
  44. //如何获取参数
  45. //解析参数
  46. request.ParseForm()
  47. mobile := request.PostForm.Get("mobile")
  48. plainpwd := request.PostForm.Get("passwd")
  49. nickname := fmt.Sprintf("user%06d", rand.Int31())
  50. avatar := ""
  51. sex := model.SEX_UNKNON
  52. user, err := userService.Register(mobile, plainpwd, nickname, avatar, sex)
  53. //登录失败
  54. if err != nil {
  55. util.RespFail(writer, err.Error())
  56. } else {
  57. util.RespOk(writer, user, "")
  58. }
  59. }

在main.go函数怎么进行调用控制器方法呢

16、基于MVC思想的通用应用程序架构 - 图5

经测试,发现进行优化过的代码是没有任何问题的

16、基于MVC思想的通用应用程序架构 - 图6

至此,一套通用的mvc结构就已经封装好了 16、基于MVC思想的通用应用程序架构 - 图7