M 即 Model 模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
V 即 View 视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。
C 即 Controller 控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
Iris 是使用 Go 语言开发的一个 Web 开发框架,特点有 飞快 (fast)、简单 (simple)、效率 (efficient)、小巧 (micro),该框架用起来比较顺手,虽然也存在诸多的问题,但瑕不掩瑜。
Iris 对 MVC (Model View Controller) 模式有着非常好的支持,这是其它 go 语言框架所不具备。
Iris Web 框架支持以最快的方式执行,请求数据、模型、持久性数据和绑定。
想深入了解和学习的可以参考:Iris 框架中文文档
首先分享一个项目目录,先了解每个文件夹干什么
接下来创建一个 go 项目,示例:go-iris 并按上图目录创建所需文件夹。注意:项目目录也可以按照自己习惯创建并不是唯一
最终项目结构如下图所示
注意:conf 和 app/model 目录此项目可忽略,暂时没用上
在 VS Code 终端输入以下命令并执行
# 1、下载并安装 Iris,目前此项目只需要安装这一个
go get -u github.com/kataras/iris/v12@master
工欲善其事,必先利其器,我们从工具包开始
在 utils/common 目录新建文件 response.go,编写如下代码
package commonimport "strconv"/*** 通用响应结构体定义
* Created by woniu*/
type CommonResponse struct {Code int `json:"code"` // 响应状态:0成功 其他失败Message string `json:"message"` // 响应消息Data interface{} `json:"data"` // 响应数据
}/*
* 响应成功
* @param data 响应数据
**/
func ResponseSuccess(data interface{}) CommonResponse {return CommonResponse{Code: 0,Message: "操作成功",Data: data,}
}/*
* 响应失败
* @param code 响应异常状态
* @param message 响应异常消息
**/
func ResponseError(code int, message string) CommonResponse {return CommonResponse{Code: code,Message: message,Data: nil,}
}/*
* 响应失败
* @param code 响应异常状态
**/
func ResponseErrorCode(code int) CommonResponse {return CommonResponse{Code: code,Message: "操作失败",Data: nil,}
}/*
* 响应失败
* @param message 响应异常消息
* 可以传入 0000_XXXXXXX 字符串,自动转换
**/
func ResponseErrorMessage(message string) CommonResponse {// 异常消息长度大于4if len(message) > 4 {// 截取异常消息前四位var codeStr = message[0:4]// 前四位字符串类型转 int 类型code, err := strconv.Atoi(codeStr)// 如果没有异常,自动分割,示例:0000_XXXXXXXif err == nil {return CommonResponse{Code: code,Message: message[5:],Data: nil,}}}return CommonResponse{Code: -1,Message: message,Data: nil,}
}
在 utils/constant 目录新建文件 errors.go,编写如下代码
package constantimport "errors"/*** 业务异常自定义
* Created by woniu*/var (ResErrSysUserPasswordErr = errors.New("1003_密码错误")ResErrSysUserIsNil = errors.New("1004_用户不存在")
)
简单实现用户登录请求并正确响应,用户账号:admin,用户密码:123456
在 app/dto 目录新建文件 login_dto.go,编写如下代码
package dto// 用户登录
type LoginDto struct {Account string // 用户账号Password string // 用户密码
}
在 app/vo 目录新建文件 sys_user_vo.go,编写如下代码
package vo// 系统用户信息
type SysUser struct {Account string `json:"account"` // 用户账号Name string `json:"name"` // 用户姓名Age int `json:"age"` // 用户年龄
}
在 app/service 目录新建文件 sys_user_service.go,编写如下代码
package serviceimport ("go-iris/app/dto""go-iris/app/vo""go-iris/utils/constant"
)/*** 系统用户业务处理
* Created by woniu*/
var SysUser = new(sysUserService)type sysUserService struct{}/*** 用户名密码登录
*/
func (s *sysUserService) PasswordLogin(requestModel dto.LoginDto) (*vo.SysUser, error) {// 用户账号必须是 adminif requestModel.Account != "admin" {return nil, constant.ResErrSysUserIsNil}// 用户密码必须是 123456if requestModel.Password != "123456" {return nil, constant.ResErrSysUserPasswordErr}// 用户名 + 密码 校验正确,返回用户信息var sysUser = vo.SysUser{Account: "admin",Name: "小明",Age: 18,}return &sysUser, nil
}
在 app/controller 目录新建文件 sys_user_controller.go,编写如下代码
package controllerimport ("go-iris/app/dto""go-iris/app/service""go-iris/utils/common""github.com/kataras/iris/v12"
)/*** 系统用户控制器
* Created by woniu*/
var SysUser = new(SysUserController)type SysUserController struct{}/*** 用户名密码登录
*/
func (sc *SysUserController) PasswordLogin(ctx iris.Context) {// 登录参数var requestModel dto.LoginDto// 参数绑定if err := ctx.ReadForm(&requestModel); err != nil {ctx.JSON(common.ResponseError(-1, "传参异常"))return}// 用户登录sysUser, err := service.SysUser.PasswordLogin(requestModel)if err != nil {// 响应失败ctx.JSON(common.ResponseErrorMessage(err.Error()))return}// 响应成功ctx.JSON(common.ResponseSuccess(sysUser))
}
在 app/controller 目录新建文件 error_controller.go,编写如下代码
package controllerimport ("go-iris/utils/common""github.com/kataras/iris/v12"
)/*** 通用响应测试控制器
* Created by woniu*/
var Error = new(ErrorController)type ErrorController struct{}/*** 响应失败
*/
func (sc *ErrorController) ResponseError(ctx iris.Context) {// 响应失败ctx.JSON(common.ResponseError(9001, "自定义响应状态和异常消息"))
}/*** 响应失败
*/
func (sc *ErrorController) ResponseErrorCode(ctx iris.Context) {// 响应失败ctx.JSON(common.ResponseErrorCode(9002))
}/*** 响应失败
*/
func (sc *ErrorController) ResponseErrorMessage(ctx iris.Context) {// 响应失败ctx.JSON(common.ResponseErrorMessage("自定义响应异常消息"))
}
在 router 目录新建文件 router.go,编写如下代码
package routerimport (// 自己业务 controller 路径"go-iris/app/controller""github.com/kataras/iris/v12"
)/*** 注册路由
*/
func RegisterRouter(app *iris.Application) {// 系统用户login := app.Party("/sysUser"){// 用户名 + 密码登录login.Post("/passwordLogin", controller.SysUser.PasswordLogin)}// 通用异常err := app.Party("/error"){err.Get("/responseError", controller.Error.ResponseError)err.Get("/responseErrorCode", controller.Error.ResponseErrorCode)err.Get("/responseErrorMessage", controller.Error.ResponseErrorMessage)}
}
在 app/views/html 目录新建文件 404.html,编写如下代码
GO - IRIS
404
在项目根目录新建文件 main.go,编写如下代码
package mainimport ("go-iris/router""github.com/kataras/iris/v12""github.com/kataras/iris/v12/middleware/logger""github.com/kataras/iris/v12/middleware/recover"
)/*** 应用程序启动
* Created by woniu*/
func main() {// 创建 Irisapp := iris.New()// 设置调试模式app.Logger().SetLevel("debug")// 可选项添加两个内置的句柄(handlers)// 捕获相对于http产生的异常行为app.Use(recover.New())// 记录请求日志app.Use(logger.New())// 路由注册router.RegisterRouter(app)// 加载视图模板地址app.RegisterView(iris.HTML("app/views", ".html"))// 请求异常app.OnErrorCode(iris.StatusNotFound, notFound)// 监听并启动 8080 端口app.Run(iris.Addr(":8080"))
}/*** 请求地址不存在,跳转到 404 页面
*/
func notFound(ctx iris.Context) {// 出现 404 的时候,就跳转到 $views_dir/html/404.html 模板ctx.View("html/404.html")
}
相关代码已完成编写,最终项目结构及文件如下图
在 VS Code 终端输入以下命令并执行
# 启动项目
go run main.go
有以下信息代表启动成功
Iris Version: 12.2.0-beta6Now listening on: http://localhost:8080
Application started. Press CTRL+C to shut down.
account = admin1,用户不存在
password = 111111,密码错误
account = admin 并且 password = 123456,响应成功
自定义响应状态和异常消息
自定义响应状态
自定义响应异常消息
例如:http://localhost:8080/woniu
通过上述测试验证,项目达到预期目标,小伙伴自己赶紧动手试试吧。
Go语言通过首字母的大小写来控制访问权限。无论是方法,变量,常量或是自定义的变量类型,如果首字母大写,则可以被外部包访问,反之则不可以。
而结构体中的字段名,如果首字母小写的话,则该字段无法被外部包访问和解析,比如,json解析。
如果系统用户信息结构如下:
// 系统用户信息
type SysUser struct {Account string // 用户账号Name string // 用户姓名Age int // 用户年龄
}
请求响应结果
{"code": 0,"message": "操作成功","data": {"Account": "admin","Name": "小明","Age": 18}
}
如果希望,Json 化之后的属性名是小写字母的,可以使用 struct tag。如下:
// 系统用户信息
type SysUser struct {Account string `json:"account"` // 用户账号Name string `json:"name"` // 用户姓名Age int `json:"age"` // 用户年龄
}
本文教程到此结束,有问题欢迎大家讨论。