go iris简易mvc模型

go iris简易mvc模型

 

 

 

datamodels/user.go

package datamodels

type User struct {
	UserId    int64  `json:"user_id" xorm:"not null pk autoincr BIGINT(20)"`
	Name      string `json:"name" xorm:"unique VARCHAR(255)"`
	Balance   int64  `json:"balance" xorm:"BIGINT(20)"`
	Time      int64  `json:"time" xorm:"BIGINT(20)"`
	CreatTime int64  `json:"creat_time" xorm:"BIGINT(20)"`
}

  

repositories/user_dao.go

package repositories

import (
	"test/datamodels"
	"github.com/go-xorm/xorm"
)

// Userdao 将xorm引擎封装为struct
type Userdao struct {
	engine *xorm.Engine
}

// NewUserDao 会被外部引用,首字母大写。
// 初始化struct,传入*xorm.Engine,返回封装xorm引擎的struct指针
func NewUserDao(xormEngine *xorm.Engine) *Userdao {
	// 等同于 return &Userdao{engine: xorm_engine,}
	engineUser := &Userdao{engine: xormEngine,}	// 初始化结构体
	return engineUser
}

// engine = xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
// GetAll 获取User表中所有数据
func (d *Userdao) GetAll() []datamodels.User {
	// 先初始化一个slice,cap为0,类型为struce,用来接收数据
	dataList := make([]datamodels.User, 0)
	// orm语句,执行结果回传给datalist的指针变量
	err := d.engine.Find(&dataList)
	if err != nil {
		return dataList	// 如果出错则return空切片
	}
	return dataList
}

  

services/service.go

package services

import (
	"test/datamodels"
	"test/repositories"
	_ "github.com/go-sql-driver/mysql"
	"github.com/go-xorm/xorm"
)
/**
 *	1.初始化struct
 *  2.声明interface
 *  3.将struct赋值给interface
 *  4.interface使用struct的func
 */

 /**
 *	将dao的struct包含于service的struct中,
 *	这样调用struct(service)的func就相当于调用struct(dao)的func
 *  初始化struct(service)的时候顺便初始化了struct(dao)
 *  将初始化的struct(service)赋值给interface
 *  这样interface可以调用func(service)了 - 也就是func(dao)
 *  service是表层,dao是底层
 */


// UserService 初始化接口
type UserService interface {
	GetAll() []datamodels.User
}

// userSer 将dao中
type userService struct {
	dao *repositories.Userdao // 包含dao的struct
}

// NewUserService 实例化struct,再将struct赋值给interface
func NewUserService() UserService {
	engine, err := xorm.NewEngine("mysql", "root:root@/xorm?charset=utf8")
	if err != nil {
		// 错误处理
		panic("here")
	}
	a := &userService{dao: repositories.NewUserDao(engine)}	// 顺便把dao给new了
	return a
}

func (s *userService) GetAll() []datamodels.User {
	return s.dao.GetAll()
}

  

web/controllers/index.go

package controllers

import (
	"fmt"
	"test/services"
	"github.com/kataras/iris/v12"
)

type IndexController struct {
	Ctx iris.Context
	Sb  services.UserService  // Sb此处一定要首字母大写
}

func (c *IndexController) Get() {
	c.Ctx.HTML("/ | ")
	c.Ctx.Next()
}

func (c *IndexController) GetUsers() {

	dataList := c.Sb.GetAll()

	fmt.Println(dataList)
	c.Ctx.Next()
}

  

main.go

package main

import (
	"test/services"
	"test/web/controllers"

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

func main() {
	// 1.创建实例
	app := iris.New()

	// 2.设置错误等级
	//app.Logger().SetLevel("debug")

	// 3.注册模板
	htmlEngine := iris.HTML("./web/views", ".html") // 从./web/views目录下加载所有以.html为后缀文件,并解析他们
	htmlEngine.Layout("shared/layout.html")         // 相当于组成页面的框架html,其他模板填充进该layout
	htmlEngine.Reload(true)                         // 每次重新加载模板
	app.RegisterView(htmlEngine)                    // 注册该模板

	// 4.设置静态文件目录
	app.HandleDir("/public", "./public/") // 外网访问/public文件就是访问web.exe同级目录下public文件

	// 5.设置异常页面
	app.OnAnyErrorCode(func(ctx iris.Context) { // 自定义错误,错误码在100~511自动触发
		ctx.ViewData("message", ctx.Values().GetStringDefault("message", "访问页面出错")) // 绑定数据
		ctx.ViewLayout("shared/layout.html")
		ctx.View("shared/error.html")
	})

	// 6.注册控制器
	// app.Use(bigbefore)	// 全局before
	// app.Done(bigafter)	// 全局after
	// app.UseGlobal(global)
	// users := app.Party("/user", middleHandlerUser)   // user组,访问该组下路由都会触发middleHandlerUser方法
	// users.Use(b)                                     // user组的前置函数,在middleHandlerUser之后执行
	// users.Done(a)                                // user组的后置函数
	// users.Get("", routeUser)                         // http://127.0.0.1:8080/user
	// users.Get("/test", before, routeUserTest, after) // http://127.0.0.1:8080/user/test 依次执行 before, routeUserTest, after 方法
	// users.Get("/user/test", routeUserUserTest)       // http://127.0.0.1:8080/user/user/test

	// test := app.Party("/test") // 不使用middleHandlerUser
	// test.Get("", routeTest)    // http://127.0.0.1:8080/test

	app.Use(bigbefore)                    // 全局Use
	app.Done(bigafter)                    // 全局Done
	app.UseGlobal(useGlobal)              // 全局UseGlobal
	mvc.Configure(app.Party("/"), config) // 路由分组

	// 7.启动服务
	app.Run(iris.Addr(":8080"))
}

func config(app *mvc.Application) {
	//添加基本身份验证(admin:password)中间件
	//用于基于/电影的请求。
	app.Router.Use(groupBefore) // 小组前置
	app.Router.Done(groupAfter) // 小组后置
	// 使用数据源中的一些(内存)数据创建我们的电影资源库。
	//repo := repositories.NewMovieRepository(datasource.Movies)
	// 创建我们的电影服务,我们将它绑定到电影应用程序的依赖项。
	//movieService := services.NewMovieService(repo)
	//app.Register(movieService)
	//为我们的电影控制器服务
	//请注意,您可以为多个控制器提供服务
	//你也可以使用`movies.Party(relativePath)`或`movies.Clone(app.Party(...))创建子mvc应用程序
	userService123 := services.NewUserService()	// 传入的是一个Interface类型的接口
	app.Register(userService123)
	app.Handle(new(controllers.IndexController))
}

func groupBefore(ctx iris.Context) {
	ctx.HTML("小组Use | ")
	ctx.Next()
}

func groupAfter(ctx iris.Context) {
	ctx.HTML("小组Done | ")
	ctx.Next()
}

func useGlobal(ctx iris.Context) {
	ctx.HTML("全局UseGlobal | ")
	ctx.Next()
}

func b(ctx iris.Context) {
	ctx.HTML("user组before | ")
	ctx.Next()
}

func a(ctx iris.Context) {
	ctx.HTML("user组after | ")
	ctx.Next()
}

func middleHandlerUser(ctx iris.Context) {
	ctx.HTML("user组middleHandler | ")
	ctx.Next()
}

func routeUserUserTest(ctx iris.Context) {
	ctx.WriteString("/user/user/test | ")
	ctx.Next()
}

func routeUser(ctx iris.Context) {
	ctx.WriteString("/user | ")
	ctx.Next()
}

func routeUserTest(ctx iris.Context) {
	ctx.WriteString("/user/test | ")
	ctx.Next()
}

func before(ctx iris.Context) {
	ctx.WriteString("我是/user/test的before方法 | ")
	ctx.Next()
}

func after(ctx iris.Context) {
	ctx.WriteString("我是/user/test的after方法 | ")
	ctx.Next()
}

func routeTest(ctx iris.Context) {
	ctx.WriteString("/test | ")
	ctx.Next()
}

func bigbefore(ctx iris.Context) {
	ctx.WriteString("全局Use | ")
	ctx.Next()
}

func bigafter(ctx iris.Context) {
	ctx.WriteString("全局Done | ")
	ctx.Next()
}

  

go iris简易mvc模型

上一篇:DotNet框架


下一篇:httprunner3.x详细教程四(.env文件介绍)