【go iris】MVC架构和session的使用

iris-MVC&Session

在这里插入图片描述

ris框架中的mvc包中提供了Application结构体定义。开发者可以通过注册自定义的controller来使用对应提供的API,其中包含路由组router.Party,以此用来注册layout、middleware以及相应的handlers等。

主函数

MVC 应用程序有自己的 Router ,它是一个iris/router.Party类型的标准 iris api。
Controllers 可以注册到任意的 Party,包括子域。

package main

import (
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
	"github.com/kataras/iris/v12/sessions"
)


func main() {
	app := iris.New()
	sessionID := "mySession"
	//session的创建
	sess := sessions.New(sessions.Config{
		Cookie: sessionID,
	})
	app.Use(sess.Handler())
	users := mvc.New(app.Party("/api/user"))
	users.Register(sess.Start)
	users.Handle(&controllers.UsersController{Model: user})
	// Listens and serves incoming http requests
	// on http://localhost:8080.
	app.Listen("0.0.0.0:8080")
}


控制器

注册后路由可以根据 Controllers 内函数的命名自动生成!!
命名规则【每个部分首字母大写】:方法【GET/POST/PUT/DELETE/…】+子路径+By(可选)。
通过控制器方法的输入参数访问动态路径参数【方法函数接收器支持的类型: int,int64, bool 和 string。】,不需要绑定:
访问控制器的字段 Context (不需要手动绑定)如 Ctx iris.Context

  • 当作方法参数输入,如func(ctx iris.Context, otherArguments...)
  • 或放在控制器结构体中作为成员变量。
//对应mvc.New(app.Party("/user")).Handle(new(user.Controller))
func(*Controller) Get() - GET:/user.
func(*Controller) Post() - POST:/user.
func(*Controller) GetLogin() - GET:/user/login
func(*Controller) PostLogin() - POST:/user/login
func(*Controller) GetProfileFollowers() - GET:/user/profile/followers
func(*Controller) PostProfileFollowers() - POST:/user/profile/followers
func(*Controller) GetBy(id int64) - GET:/user/{param:long}
func(*Controller) PostBy(id int64) - POST:/user/{param:long}
package controllers

import (
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
	"github.com/dgrijalva/jwt-go/request"
	"github.com/globalsign/mgo/bson"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/sessions"
)

type UsersController struct {
	Ctx     iris.Context
	Model   models.UserDB
	Session *sessions.Session
}

// RegisterReq POST /user/register 注册请求
type RegisterReq struct {
	Name     string `json:"username"`
	Email    string `json:"email"`
	Password string `json:"password"`
}

//OptionsRegister OPTIONS /user/register 用户注册
func (c *UsersController) OptionsRegister() {
	return
}

//PostRegister POST /user/register 用户注册
func (c *UsersController) PostRegister() (res models.CommonRes) {
	req := RegisterReq{}
	if err := c.Ctx.ReadJSON(&req); err != nil {
		res.State = models.StatusBadReq
	}
	if err := c.Model.Register(req.Name, req.Password, req.Email); err != nil {
		res.State = err.Error()
	} else {
		//c.Session.Set("name", req.Name)
		res.State = models.StatusSuccess
	}
	return
}

// LoginReq POST /user/login 登陆请求
type LoginReq struct {
	Name     string `json:"username"`
	Password string `json:"password"`
}

//PostLogin POST /user/login 用户登陆
func (c *UsersController) PostLogin() (res models.CommonRes) {
	req := LoginReq{}
	err := c.Ctx.ReadJSON(&req)
	if err != nil || req.Name == "" || req.Password == "" {
		res.State = models.StatusBadReq
		return
	}
	userID, err := c.Model.Login(req.Name, req.Password)
	if err != nil {
		res.State = err.Error()
	} else {
		c.Session.Set("id", userID)
		res.State = models.StatusSuccess
	}
	return
}


//PostLogout POST /user/logout 退出登陆
func (c *UsersController) PostLogout() (res models.CommonRes) {
	fmt.Println(c.Session)
	if c.Session.Get("id") == nil {
		res.State = models.StatusNotLogin
		return
	}
	c.Session.Delete("id")
	res.State = models.StatusSuccess
	return
}

//NameReq POST /user/name 更新用户名
type NameReq struct {
	Name string `json:"name"`
}


//PostName POST /user/name 更新用户名
func (c *UsersController) PostName() (res models.CommonRes) {
	if c.Session.Get("id") == nil {
		res.State = models.StatusNotLogin
		return
	}
	req := NameReq{}
	err = c.Ctx.ReadJSON(&req)
	if err != nil || req.Name == "" {
		res.State = models.StatusBadReq
		return
	}
	err = c.Model.SetUserName(c.Session.GetString("id"), req.Name)
	if err != nil {
		res.State = err.Error()
	} else {
		res.State = models.StatusSuccess
	}
	return
}

//OptionsInfoBy OPTIONS /user/info/{userID:string}
func (c *UsersController) OptionsInfoBy(id string) {
	return
}

//GetInfo GET /user/info/{userID:string}
func (c *UsersController) GetInfoBy(id string) (res models.UserInfoRes) {
	if id == "self" {
		if c.Session.Get("id") == nil {
			res.State = models.StatusNotLogin
			return
		}
		id = c.Session.GetString("id")
	} else if !bson.IsObjectIdHex(id) {
		res.State = models.StatusBadReq
		return
	}
	userinfores, err := c.Model.GetUserInfo(id)
	res = userinfores
	if err != nil {
		res.State = err.Error()
	} else {
		res.State = models.StatusSuccess
	}
	return
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值