六. IHOME (GoWeb项目 获取用户信息)

该博客介绍了如何在 Go Gin 框架中实现用户信息的获取与更新,以及中间件的使用。首先,通过 GET 请求获取用户的基本信息,包括用户名、手机号等,数据从 Redis 存储中读取。接着,展示了 PUT 方法用于更新用户名,并同步更新 Session 中的值。最后,定义了一个登录过滤中间件,用于检查用户 Session,确保只有已登录用户才能访问特定路由。
摘要由CSDN通过智能技术生成

目录

1. 获取用户基本信息

2. 更新用户名

3. 项目中使用中间件


 

1. 获取用户基本信息

main.go 中添加 r1.GET("/user", controller.GetUserInfo)

ihome/model/modelFunc.go中添加函数

func GetUserInfo(userName string) (User, error) {
	var user User
	err := GlobalConn.Where("name = ?", userName).First(&user).Error
	return user, err
}

ihome/controller/user.go 中添加GetUserInfo函数

func GetUserInfo(ctx *gin.Context) {
	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)

	s := sessions.Default(ctx)
	userName := s.Get("username")

	if userName == nil {
		resp["errno"] = utils.RECODE_SESSIONERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_SESSIONERR)
		return
	} else {
		user, err := model.GetUserInfo(userName.(string))
		if err != nil {
			resp["errno"] = utils.RECODE_DBERR
			resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
			return
		} else {
			resp["errno"] = utils.RECODE_OK
			resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)

			temp := make(map[string]interface{})
			temp["user_id"] = user.ID
			temp["name"] = user.Name
			temp["mobile"] = user.Mobile
			temp["real_name"] = user.Real_name
			temp["id_card"] = user.Id_card
			temp["avatar_url"] = user.Avatar_url

			resp["data"] = temp
		}
	}
}

测试:

  1. 重启 web/main.go

  2. 刷新 浏览器,看到:用户名:xxxx 手机号 : xxxxx 。

2. 更新用户名

main.go 中添加 r1.PUT("/user/name", controller.PutUserInfo)

ihome/model/modelFunc.go 中添加UpdateUserName函数

func UpdateUserName(newName, oldName string) error {
	return GlobalConn.Model(new(User)).Where("name = ?", oldName).Update("name", newName).Error
}

ihome/controller.go 中添加PutUserInfo.go 函数

func PutUserInfo(ctx *gin.Context) {
	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)

	s := sessions.Default(ctx)
	userName := s.Get("username")

	var nameData struct {
		Name string `json:"name"`
	}
	ctx.Bind(&nameData)
	err := model.UpdateUserName(nameData.Name, userName.(string))
	if err != nil {
		resp["errno"] = utils.RECODE_DBERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
		return
	} else {
		s.Set("username", nameData.Name)
		err := s.Save()
		if err != nil {
			resp["errno"] = utils.RECODE_SESSIONERR
			resp["errmsg"] = utils.RecodeText(utils.RECODE_SESSIONERR)
			return
		}
		resp["errno"] = utils.RECODE_OK
		resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)
		resp["data"] = nameData
	}
}

测试:

        1. 修改以后的用户名,保存在 Session中, 后退页面也能看到!

3. 项目中使用中间件

中间件:

  • 用于 两个模块之间的 功能 软件(模块);
  • 承上启下。 前后台开发: 路由 ——> 中间件 (起过滤作用) ——> 控制器
  • 特性:对 “中间件”指定位置 , 以下的路由起作用!以上的,作用不到。

中间件类型

  • gin 框架规定:中间件类型为:gin.HandlerFunc 类型。

main.go 中添加函数创建中间件

func LoginFilter() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		s := sessions.Default(ctx)
		userName := s.Get("username")
		if userName == nil {
			ctx.Abort()
		} else {
			ctx.Next()
		}
	}
}

在 所有需要进行 Session 校验操作之前, 添加、使用这个中间件。

func main() {
	model.InitRedis()
	model.InitDb()

	router := gin.Default()
	store, _ := redis.NewStore(10, "tcp", "192.168.233.131:6379", "", []byte("ihome"))
	router.Use(sessions.Sessions("mysessions", store))

	router.Static("/home", "view")

	r1 := router.Group("/api/v1.0/")
	{
		r1.GET("session", controller.GetSession)
		r1.GET("imagecode/:uuid", controller.GetImageCd)
		r1.GET("smscode/:phone", controller.GetSmsCd)
		r1.POST("users", controller.PostRet)
		r1.GET("areas", controller.GetArea)
		r1.POST("sessions", controller.PostLogin)

		r1.Use(LoginFilter())

		r1.DELETE("session", controller.DeleteSession)
		r1.GET("user", controller.GetUserInfo)
		r1.PUT("user/name", controller.PutUserInfo)
	}

	router.Run(":8080")
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值