GoWeb 的 MVC 入门实战案例,基于 Iris 框架实现(附案例全代码)

news2025/1/13 10:19:07

1、什么是 MVC

M 即 Model 模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

V 即 View 视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。

C 即 Controller 控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

2、Iris 简介

Iris 是使用 Go 语言开发的一个 Web 开发框架,特点有 飞快 (fast)、简单 (simple)、效率 (efficient)、小巧 (micro),该框架用起来比较顺手,虽然也存在诸多的问题,但瑕不掩瑜。

Iris 对 MVC (Model View Controller) 模式有着非常好的支持,这是其它 go 语言框架所不具备。

Iris Web 框架支持以最快的方式执行,请求数据、模型、持久性数据和绑定。

想深入了解和学习的可以参考:Iris 框架中文文档

3、项目目录

首先分享一个项目目录,先了解每个文件夹干什么
在这里插入图片描述
接下来创建一个 go 项目,示例:go-iris 并按上图目录创建所需文件夹。注意:项目目录也可以按照自己习惯创建并不是唯一

最终项目结构如下图所示

在这里插入图片描述

4、编写代码

注意:conf 和 app/model 目录此项目可忽略,暂时没用上

4.1、安装软件包

在 VS Code 终端输入以下命令并执行

# 1、下载并安装 Iris,目前此项目只需要安装这一个
go get -u github.com/kataras/iris/v12@master

4.2、编写工具包代码

工欲善其事,必先利其器,我们从工具包开始

4.2.1、通用响应结构

在 utils/common 目录新建文件 response.go,编写如下代码

package common

import "strconv"

/**
 * <h1>通用响应结构体定义</h1>
 * Created by woniu
 */
type CommonResponse struct {
	Code    int         `json:"code"`    // 响应状态:0成功 其他失败
	Message string      `json:"message"` // 响应消息
	Data    interface{} `json:"data"`    // 响应数据
}

/*
* <h2>响应成功</h2>
* @param data 响应数据
**/
func ResponseSuccess(data interface{}) CommonResponse {
	return CommonResponse{
		Code:    0,
		Message: "操作成功",
		Data:    data,
	}
}

/*
* <h2>响应失败</h2>
* @param code 响应异常状态
* @param message 响应异常消息
**/
func ResponseError(code int, message string) CommonResponse {
	return CommonResponse{
		Code:    code,
		Message: message,
		Data:    nil,
	}
}

/*
* <h2>响应失败</h2>
* @param code 响应异常状态
**/
func ResponseErrorCode(code int) CommonResponse {
	return CommonResponse{
		Code:    code,
		Message: "操作失败",
		Data:    nil,
	}
}

/*
* <h2>响应失败</h2>
* @param message 响应异常消息
* 可以传入 0000_XXXXXXX 字符串,自动转换
**/
func ResponseErrorMessage(message string) CommonResponse {

	// 异常消息长度大于4
	if len(message) > 4 {
		// 截取异常消息前四位
		var codeStr = message[0:4]
		// 前四位字符串类型转 int 类型
		code, err := strconv.Atoi(codeStr)
		// 如果没有异常,自动分割,示例:0000_XXXXXXX
		if err == nil {
			return CommonResponse{
				Code:    code,
				Message: message[5:],
				Data:    nil,
			}
		}
	}

	return CommonResponse{
		Code:    -1,
		Message: message,
		Data:    nil,
	}
}

4.2.2、业务异常自定义

在 utils/constant 目录新建文件 errors.go,编写如下代码

package constant

import "errors"

/**
 * <h1>业务异常自定义</h1>
 * Created by woniu
 */

var (
	ResErrSysUserPasswordErr = errors.New("1003_密码错误")
	ResErrSysUserIsNil       = errors.New("1004_用户不存在")
)

4.2.3、用户登录功能

简单实现用户登录请求并正确响应,用户账号:admin,用户密码:123456

4.2.3.1、用户登录请求结构

在 app/dto 目录新建文件 login_dto.go,编写如下代码

package dto

// 用户登录
type LoginDto struct {
	Account      string // 用户账号
	Password     string // 用户密码
}

4.2.3.2、系统用户响应结构

在 app/vo 目录新建文件 sys_user_vo.go,编写如下代码

package vo

// 系统用户信息
type SysUser struct {
	Account string `json:"account"` // 用户账号
	Name    string `json:"name"`    // 用户姓名
	Age     int    `json:"age"`     // 用户年龄
}

4.2.3.3、系统用户业务处理

在 app/service 目录新建文件 sys_user_service.go,编写如下代码

package service

import (
	"go-iris/app/dto"
	"go-iris/app/vo"
	"go-iris/utils/constant"
)

/**
 * <h1>系统用户业务处理</h1>
 * Created by woniu
 */
var SysUser = new(sysUserService)

type sysUserService struct{}

/**
 * <h2>用户名密码登录</h2>
 */
func (s *sysUserService) PasswordLogin(requestModel dto.LoginDto) (*vo.SysUser, error) {
	// 用户账号必须是 admin
	if requestModel.Account != "admin" {
		return nil, constant.ResErrSysUserIsNil
	}

	// 用户密码必须是 123456
	if requestModel.Password != "123456" {
		return nil, constant.ResErrSysUserPasswordErr
	}

	// 用户名 + 密码 校验正确,返回用户信息
	var sysUser = vo.SysUser{
		Account: "admin",
		Name:    "小明",
		Age:     18,
	}

	return &sysUser, nil
}

4.2.3.4、系统用户业务处理

在 app/controller 目录新建文件 sys_user_controller.go,编写如下代码

package controller

import (
	"go-iris/app/dto"
	"go-iris/app/service"
	"go-iris/utils/common"

	"github.com/kataras/iris/v12"
)

/**
 * <h1>系统用户控制器</h1>
 * Created by woniu
 */
var SysUser = new(SysUserController)

type SysUserController struct{}

/**
 * <h2>用户名密码登录</h2>
 */
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))
}

4.2.4、通用响应测试

在 app/controller 目录新建文件 error_controller.go,编写如下代码

package controller

import (
	"go-iris/utils/common"

	"github.com/kataras/iris/v12"
)

/**
 * <h1>通用响应测试控制器</h1>
 * Created by woniu
 */
var Error = new(ErrorController)

type ErrorController struct{}

/**
 * <h2>响应失败</h2>
 */
func (sc *ErrorController) ResponseError(ctx iris.Context) {
	// 响应失败
	ctx.JSON(common.ResponseError(9001, "自定义响应状态和异常消息"))
}

/**
 * <h2>响应失败</h2>
 */
func (sc *ErrorController) ResponseErrorCode(ctx iris.Context) {
	// 响应失败
	ctx.JSON(common.ResponseErrorCode(9002))
}

/**
 * <h2>响应失败</h2>
 */
func (sc *ErrorController) ResponseErrorMessage(ctx iris.Context) {
	// 响应失败
	ctx.JSON(common.ResponseErrorMessage("自定义响应异常消息"))
}

4.2.5、请求路由

在 router 目录新建文件 router.go,编写如下代码

package router

import (

	// 自己业务 controller 路径
	"go-iris/app/controller"

	"github.com/kataras/iris/v12"
)

/**
 * <h2>注册路由</h2>
 */
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)
	}
}

4.2.6、自定义请求 404 响应页面

在 app/views/html 目录新建文件 404.html,编写如下代码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GO - IRIS</title>
</head>
<body>
    <h1 align="center">404</h1>
</body>
</html>

4.2.7、应用程序启动

在项目根目录新建文件 main.go,编写如下代码

package main

import (
	"go-iris/router"

	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/middleware/logger"
	"github.com/kataras/iris/v12/middleware/recover"
)

/**
 * <h1>应用程序启动</h1>
 * Created by woniu
 */
func main() {
	// 创建 Iris
	app := 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"))
}

/**
 * <h1>请求地址不存在,跳转到 404 页面</h1>
 */
func notFound(ctx iris.Context) {
	// 出现 404 的时候,就跳转到 $views_dir/html/404.html 模板
	ctx.View("html/404.html")
}

相关代码已完成编写,最终项目结构及文件如下图

在这里插入图片描述

5、启动并测试

5.1、启动项目

在 VS Code 终端输入以下命令并执行

# 启动项目
go run main.go

有以下信息代表启动成功

Iris Version: 12.2.0-beta6

Now listening on: http://localhost:8080
Application started. Press CTRL+C to shut down.

5.2、测试接口

5.2.1、用户登录

account = admin1,用户不存在

在这里插入图片描述
password = 111111,密码错误

在这里插入图片描述
account = admin 并且 password = 123456,响应成功

在这里插入图片描述

5.2.2、通用响应异常测试

自定义响应状态和异常消息

在这里插入图片描述

自定义响应状态

在这里插入图片描述

自定义响应异常消息

在这里插入图片描述

5.2.3、请求地址不存在

例如:http://localhost:8080/woniu

在这里插入图片描述

通过上述测试验证,项目达到预期目标,小伙伴自己赶紧动手试试吧。

6、每日一记

6.1、首字母大小写控制访问权限

Go语言通过首字母的大小写来控制访问权限。无论是方法,变量,常量或是自定义的变量类型,如果首字母大写,则可以被外部包访问,反之则不可以。

而结构体中的字段名,如果首字母小写的话,则该字段无法被外部包访问和解析,比如,json解析。

6.2、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"`     // 用户年龄
}

本文教程到此结束,有问题欢迎大家讨论。

实践是检验真理的唯一标准,一键送三连关注不迷路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1531_AURIX_TriCore内核架构_任务以及函数

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 继续前面的内核架构学习&#xff0c;这次看一下任务以及函数的描述。 1. 在嵌入式系统中&#xff0c;内核以及函数的设计其实是有一定的模型或者说是…

day33 文件上传中间件解析漏洞编辑器安全

前言 先判断中间件&#xff0c;是否有解析漏洞&#xff0c;字典扫描拿到上传点&#xff0c;或者会员中心&#xff0c;有可能存在文件上传的地方&#xff0c;而后测试绕过/验证&#xff0c;根据实际情况判断是白名单、黑名单还是内容其他的绕过&#xff0c;绕过/验证和中间件的…

数字信号处理FFT快速傅立叶变换MATLAB实现——实例

今天做作业的时候发现要对一个信号进行FFT变换&#xff0c;在网上找了半天也没找到个能看懂的&#xff08;因为我太菜了&#xff09;&#xff0c;后来自己研究了一下&#xff0c;感觉一知半解的 起因是这道作业题 例题-满足奈奎斯特 我画了两个图&#xff0c;一个是原信号经过…

毕业论文管理系统的设计与实现

摘要 随着互联网技术的迅猛发展&#xff0c;网络给人们带来了很多便利&#xff0c;比如人们借助于网络进行相互交流、相互通信、共享信息、文件的上传下载等。在线毕业论文管理系统就是以上运用之一&#xff0c;它已经广泛的应用于目前的各大高校,但现有的这些系统都有一定的局…

如何在VScode和Jetbrain上使用备受争议的GitHub Copilot

如何在VScode和Jetbrain上使用备受争议的GitHub Copilot VSCDOE https://docs.github.com/en/copilot/quickstart 配置好之后&#xff0c;就是这种效果&#xff0c;真实太NB了&#xff01;&#xff01;&#xff01; 一个tab就把所有的代码都填充上去了&#xff01; Jetbrain…

MES系统以全流程优化为核心,实现全闭环的生产

MES系统是一个在车间中广泛使用的软件&#xff0c;它具有承上启下的功能.该系统采用企业ERP系统&#xff0c;获取计划、资源等数据&#xff0c;并与PLM、SRM、WMS等进行整合&#xff0c;获取BOM、流程等数据。该系统可对下级的控制系统进行操作&#xff0c;并将作业命令和恢复计…

Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控

在k8s上 Prometheus&#xff08;普罗米修斯&#xff09; 监控&#xff0c;需要部署各种组件&#xff0c;比如Prometheus、Alertmanager、Grafana。同时各个组件的配置文件也是需要到处各个配置&#xff0c;Prometheus配置监控服务时&#xff0c;你还要知道各个监控服务的地址&a…

JDBC编程

JDBC编程 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QlM7GTR-1669108965995)(https://img1.baidu.com/it/u865461056,274570923&fm253&fmtauto&app138&fPNG?w794&h500)] 什么是JDBC Java数据库连接 Java Database Connect…

第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台

文章目录3. Drools入门案例3.1 业务场景说明3.2 开发实现3.3 小结3.3.1 规则引擎构成3.3.2 相关概念说明3.3.3 规则引擎执行过程3.3.4 KIE介绍3. Drools入门案例 全套代码及资料全部完整提供&#xff0c;点此处下载 本小节通过一个Drools入门案例来让大家初步了解Drools的使用…

Java 集合学习笔记:HashMap

Java 集合学习笔记&#xff1a;HashMapUML简介阅读源码属性字段1. 静态属性2.成员属性静态内部类class Node<K,V>静态工具方法hash(Object key)comparableClassFor(Object x)compareComparables(Class<?> kc, Object k, Object x)tableSizeFor(int cap)构造方法Ha…

电梯物联网网关软硬件一体化解决方案

电梯物联网监测平台&#xff0c;基于边缘计算智能监测设备全天候、全自动监测电梯的运行。通过采集电梯实时运行传感数据&#xff0c;建立运行状态关键数据标准&#xff0c;基于AI机器学习算法&#xff0c;采用大数据分析计算&#xff0c;对电梯故障、困人等事件实时报警&#…

solr自定义定制自带core添加分词器,解决镜像没有权限问题

因为solr要安装自定义的分词器 就打算在原有基础上提前放好,直接启动就有core 第一步获取默认配置 方法一 docker安装solr 这个帖子中 1、安装镜像 docker pull solr:8.11.1 2、新建目录 mkdir -p /home/apps/solr 3、复制配置文件 运行一个临时solr docker run --name solr…

14.HTML和CSS 02

文章目录一、HTML标签&#xff1a;表单标签1、概念2、form标签3、表单项标签4、案例二、CSS&#xff1a;页面美化和布局控制1、概念2、好处3、CSS的使用&#xff1a;CSS与html结合方式4、css语法5、选择器6、属性案例一、HTML标签&#xff1a;表单标签 1、概念 表单标签是用于…

integral函数Opencv源码理解-leetcode动态规划的使用场景

前言 Opencv有一个integral()函数&#xff0c;也就是积分图算法。有三种积分图类型&#xff0c;求和&#xff08;sum&#xff09;&#xff0c;求平方和(sqsum)&#xff0c;求旋转45和(titled)。根据名字可知道&#xff0c;前两个是统计输出每个坐标的左上方像素和、左上方像素平…

pexpect 自动交互输入

pexpect 为 python 内置库&#xff0c;在 linux 上执行的&#xff0c;win 执行会报错 主要用于执行命令后自动输入&#xff0c;例如要执行 sql 去修改全局变量&#xff1a; mysql -uroot -p -h127.0.0.1 -e"set gloabl max_prepared_stmt_count1000000;" 这时候会…

实时数据平台设计

1 相关概念背景 1.1 从现代数仓架构角度看实时数据平台 现代数仓由传统数仓发展而来&#xff0c;对比传统数仓&#xff0c;现代数仓既有与其相同之处&#xff0c;也有诸多发展点。首先我们看一下传统数仓&#xff08;图1&#xff09;和现代数仓&#xff08;图2&#xff09;的…

基于springboot和vue的IT内部电脑报修服务系统设计与实现-计算机毕业设计源码+LW文档

it内部设备服务系统设计与实现 摘 要 it内部设备服务系统将传统的网络服务方式与最新的互联网技术相结合&#xff0c;使用方便快捷&#xff0c;有利于设备维修部门规范管理&#xff0c;提高网络维修部门的工作效率&#xff0c;在技术、态度等多方面提高维修部门服务质量。因此…

Oracle表空间、用户详解

目录新建连接三者关系表空间创建表空间修改表空间和数据文件修改数据文件容量新增表空间的数据文件重命名数据文件修改表空间状态修改数据文件状态删除表空间查询用户创建删除查询修改新建连接 工具选择&#xff1a; 我们一般会选择一个工具来连接本地的Oracle&#xff0c;而我…

老男孩k8s笔记

1.docker常用操作&#xff0c;挂载&#xff0c;环境变量&#xff0c;容器内安装应用&#xff0c;提交镜像 2.trefik部署&#xff1a; k8s部署traefik_weixin_30916125的博客-CSDN博客 3.删除节点后重新加入 k8s node节点删除并重新加入_人生匆匆的博客-CSDN博客 4.mariDB配置…

streamlit+ndraw进行可视化训练深度学习模型

简介 如果你喜欢web可视化的方式训练深度学习模型&#xff0c;那么streamlit是一个不可错过的选择&#xff01; 优点&#xff1a; 提供丰富的web组件支持嵌入python中&#xff0c;简单易用轻松构建一个web页面&#xff0c;按钮控制训练过程 本文使用streamlit进行web可视化…