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
}