三. IHOME (GoWeb项目 用户注册)

目录

0. 前提

1. 获取并绑定数据

1.1 获取数据

1.2 实现注册服务


0. 前提

完成图片验证码与短信注册之后,继续进行用户注册的其他服务

1. 获取并绑定数据

1.1 获取数据

  • 前端传递数据种类:

    1. form表单:数据为 form data

    2. ajax(阿贾克斯): 数据为 json 格式。 体现成 —— Request Payload

  • 默认 postForm() 方法 只能获取 form 表单传递的数据。

  • 针对 Request Payload 数据形式,需要 使用 “数据绑定“ 来获取传递的数据。

    • ctx.Bind() 将 数据绑定到对象中。

浏览器 :注册流程, —— Network 中 Headers 中 获取

  • http请求方法:Post

  • Request Payload: mobile、password、sms_code 作为 key

1.2 实现注册服务

在main.go 函数增加将所填的注册信息保存到数据库服务

r1.POST("users", controller.PostRet)

修改user微服务,增加注册微服务

首先修改proto,如下所示

syntax = "proto3";

package user;

option go_package = "./proto;user";

service User {
	rpc SendSms(Request) returns (Response) {};
	rpc Register(RegReq) returns (Response) {};
}

message RegReq {
	string mobile = 1;
	string password = 2;
	string sms_code = 3;
}

message Request {
	string phone = 1;
	string imgCode = 2;
	string uuid = 3;
}

message Response {
	string errno = 1;
	string errmsg = 2;
}

终端运行

make proto

在modelFunc.go 文件中添加校验短信验证函数

func CheckSmsCode(phone, code string) error {
	conn := RedisPool.Get()
	defer conn.Close()

	smsCode, err := redis.String(conn.Do("get", phone+"_code"))
	if err != nil {
		fmt.Println("get phone_code err: ", err)
		return err
	}
	if smsCode != code {
		return errors.New("Verification code matching failed!")
	}
	return nil
}

我们需要将注册信息写入到Mysql数据库中,因此和Redis一样,建立连接池

在service/user/model/modelFunc.go中添加

var GlobalConn *gorm.DB

func InitDb() (*gorm.DB, error) {
	//sql.Open()
	db, err := gorm.Open("mysql", "root:123456@tcp/search_hourse?charset=utf8&parseTime=True&loc=Local")
	// defer db.Close()
	if err == nil {
		GlobalConn = db
		GlobalConn.SingularTable(true)
		GlobalConn.DB().SetMaxIdleConns(10)
		GlobalConn.DB().SetConnMaxLifetime(100)
		GlobalConn.AutoMigrate(new(User), new(House), new(Area), new(Facility), new(HouseImage), new(OrderHouse))

		return GlobalConn, nil
	}
	return nil, err
}

并在user为服务main.go 初始化redis连接池上边添加

model.InitDb()

此时 Mysql连接池已经建立好,可以通过GlobalConn对Mysql数据库进行操作

在modelFunc.go 文件中添加注册函数

func RegisterUsr(mobile, pwd string) error {
	var user User
	user.Name = mobile
    user.Mobile = mobile

	m5 := md5.New()
	m5.Write([]byte(pwd))
	pwd_hash := hex.EncodeToString(m5.Sum(nil))
	user.Password_hash = pwd_hash

	return GlobalConn.Create(&user).Error
}

修改 handler/user.go

func (e *User) Register(ctx context.Context, req *user.RegReq, rsp *user.Response) error {
	if model.CheckSmsCode(req.Mobile, req.SmsCode) == nil {
		err := model.RegisterUsr(req.Mobile, req.Password)
		if err != nil {
			rsp.Errno = utils.RECODE_DBERR
			rsp.Errmsg = utils.RecodeText(utils.RECODE_DBERR)
		} else {
			rsp.Errno = utils.RECODE_OK
			rsp.Errmsg = utils.RecodeText(utils.RECODE_OK)
		}
	} else {
		rsp.Errno = utils.RECODE_DATAERR
		rsp.Errmsg = utils.RecodeText(utils.RECODE_DATAERR)
	}
	return nil
}

注意保持微服务model,proto文件与所有微服务model,proto文件一致,因为我们修改了proto文件,因此要更改ihome/proto/user/所有文件,每个微服务model可能不一致,所有只有改为服务用到的可以不同步到ihome下

在controller/user.go 添加PostRet函数

func PostRet(ctx *gin.Context) {
	// mobile := ctx.PostForm("mobile")
	// pwd := ctx.PostForm("password")
	// sms_code := ctx.PostForm("sms_code")
	// fmt.Println("mobile = ", mobile, " pwd = ", pwd, " sms_code = ", sms_code)
	var regData struct {
		Mobile   string `json:"mobile"`
		PassWord string `json:"password"`
		SmsCode  string `json:"sms_code"`
	}
	ctx.Bind(&regData)

	consulService := utils.InitMicro()

	newClient := userMicro.NewUserService("user", consulService.Client())

	resp, err := newClient.Register(context.TODO(), &userMicro.RegReq{
		Mobile:   regData.Mobile,
		Password: regData.PassWord,
		SmsCode:  regData.SmsCode,
	})
	if err != nil {
		fmt.Println("newClient.Register err: ", err)
		return
	}
	ctx.JSON(http.StatusOK, resp)
	// fmt.Println("mobile = ", regData.Mobile, " pwd = ", regData.PassWord, " sms_code = ", regData.SmsCode)
}

此时,注册完成后可以在Mysql数据库看到注册信息

  1. 测试:

    • consul 启动

    • getCaptcha 服务启动 --- 12341

    • user 服务启动 --- 12342

    • web 启动 --- 8080

    • 浏览器测试,注册流程。

      • 成功:

        • 界面跳转。

        • 查询 MySQL数据库, 多一条用户信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值