浏览代码

fix:变更登录逻辑

zqbao 9 月之前
父节点
当前提交
bc7ca9122a
共有 6 个文件被更改,包括 94 次插入82 次删除
  1. 13 5
      controllers/base_auth.go
  2. 2 2
      controllers/user.go
  3. 16 26
      controllers/wechat.go
  4. 3 36
      models/user.go
  5. 35 0
      models/wx_sesssion.go
  6. 25 13
      services/user.go

+ 13 - 5
controllers/base_auth.go

@@ -11,7 +11,8 @@ import (
 
 type BaseAuthController struct {
 	web.Controller
-	User *models.User
+	User    *models.User
+	Session *models.WxSession
 }
 
 func (c *BaseAuthController) Prepare() {
@@ -26,23 +27,30 @@ func (c *BaseAuthController) Prepare() {
 				return
 			}
 			token := authorization
-			user, err := models.GetUserByToken(token)
+			session, err := models.GetWxSessionByAccessToken(token)
 			if err != nil {
 				if err.Error() == utils.ErrNoRow() {
 					c.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "Token 信息已变更:Token: " + token})
 					c.StopRun()
 					return
 				}
-				c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()})
+				c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Err:" + err.Error()})
 				c.StopRun()
 				return
 			}
-			if user == nil {
-				c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "user is empty "})
+			if session == nil {
+				c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "session is empty "})
+				c.StopRun()
+				return
+			}
+			user, err := models.GetUserByOpenId(session.OpenId)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Err:" + err.Error()})
 				c.StopRun()
 				return
 			}
 			c.User = user
+			c.Session = session
 		} else {
 			c.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"})
 			c.StopRun()

+ 2 - 2
controllers/user.go

@@ -34,7 +34,7 @@ func (this *UserAuthController) Login() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	user := this.User
+	session := this.Session
 
 	var req request.LoginReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -102,7 +102,7 @@ func (this *UserAuthController) Login() {
 			return
 		}
 	}
-	_, errMsg, err := services.BindUser(user.UnionId, user.OpenId, req.Phone, req.Email, req.AreaCode)
+	_, errMsg, err := services.BindUser(session.UnionId, session.OpenId, req.Phone, req.Email, req.AreaCode)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "登录失败,系统处理中,请稍后重试"
 		if errMsg != `` {

+ 16 - 26
controllers/wechat.go

@@ -207,41 +207,31 @@ func (this *WechatController) Login() {
 		br.ErrMsg = "用户信息获取失败,系统错误,Err:" + err.Error()
 		return
 	}
-	user, err := models.GetUserByOpenId(userInfo.OpenID)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() && user == nil {
-			tmpUser := &models.User{
-				OpenId:         userInfo.OpenID,
-				UnionId:        userInfo.UnionID,
-				LastUpdateTime: time.Now(),
-			}
-			tmpUserId, er := tmpUser.Insert()
-			if er != nil {
-				br.Msg = "登录失败"
-				br.ErrMsg = "登录失败,新增用户信息失败:" + er.Error()
-				return
-			}
-			user = tmpUser
-			user.UserId = int(tmpUserId)
-		} else {
-			br.Msg = "获取用户信息失败"
-			br.ErrMsg = "获取用户信息失败,系统错误,Err:" + err.Error()
-			return
-		}
+	session := &models.WxSession{
+		WxSessionId: utils.MD5(userInfo.OpenID),
+		OpenId:      userInfo.OpenID,
+		UnionId:     userInfo.UnionID,
+		CreateTime:  time.Now(),
+	}
+	er := session.Insert()
+	if er != nil {
+		br.Msg = "用户登录失败"
+		br.ErrMsg = "用户登录获取失败,系统错误,Err:" + er.Error()
+		return
 	}
 	var token string
 	timeUnix := time.Now().Unix()
 	timeUnixStr := strconv.FormatInt(timeUnix, 10)
-	token = utils.MD5(strconv.Itoa(user.UserId)) + utils.MD5(timeUnixStr)
-	user.AccessToken = token
-	user.LastUpdateTime = time.Now()
-	err = user.Update([]string{"access_token", "last_update_time"})
+	token = utils.MD5(session.OpenId) + utils.MD5(timeUnixStr)
+	session.AccessToken = token
+	session.LastUpdateTime = time.Now()
+	err = session.Update([]string{"access_token", "last_update_time"})
 	if err != nil {
 		br.Msg = "微信登录失败"
 		br.ErrMsg = "微信登录失败,更新用户信息失败:" + err.Error()
 		return
 	}
-	token = user.AccessToken
+	token = session.AccessToken
 	resp := new(response.WeChatLoginResp)
 	resp.Authorization = token
 

+ 3 - 36
models/user.go

@@ -10,6 +10,7 @@ type User struct {
 	UserId         int       `orm:"pk" description:"用户id"`
 	OpenId         string    `description:"openid"`
 	UnionId        string    `description:"unionid"`
+	NickName       string    `description:"用户昵称"`
 	RealName       string    `description:"姓名"`
 	Phone          string    `description:"手机号"`
 	AreaCode       string    `description:"区号"`
@@ -41,26 +42,6 @@ func (u *User) Update(cols []string) (err error) {
 	return
 }
 
-type UserItem struct {
-	UserId         int       `description:"用户id"`
-	OpenId         string    `description:"open_id"`
-	UnionId        string    `description:"union_id"`
-	NickName       string    `description:"用户昵称"`
-	RealName       string    `description:"用户实际名称"`
-	Phone          string    `description:"手机号码"`
-	Componey       string    `description:"所属公司"`
-	AreaCode       string    `description:"区号"`
-	SellerId       int       `description:"销售id"`
-	Email          string    `description:"邮箱"`
-	Headimgurl     string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
-	ValidEndTime   time.Time `description:"服务截至时间"`
-	RegisterTime   time.Time `description:"登录时间,用户首次登录小程序的时间"`
-	CreateTime     time.Time `description:"系统中新增用户的时间"`
-	ModifyTime     time.Time `description:"系统中用户信息更新的时间"`
-	IsRegistered   bool      `description:"是否注册:1:已注册,0:未注册"`
-	LastUpdateTime time.Time `description:"用户最近一次登录时间"`
-}
-
 type UserView struct {
 	Headimgurl     string `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
 	RealName       string `description:"用户实际名称"`
@@ -92,14 +73,6 @@ func GetUserByOpenId(openId string) (item *User, err error) {
 	return
 }
 
-// 根据openid获取用户关系
-func GetUserItemByOpenId(openId string) (item *UserItem, err error) {
-	sql := `SELECT * FROM user WHERE open_id=? `
-	o := orm.NewOrm()
-	err = o.Raw(sql, openId).QueryRow(&item)
-	return
-}
-
 // 变更联系人是否已注册状态
 func ModifyUserRegisterStatus(userId int, status bool, registerTime, modifyTime time.Time) (err error) {
 	o := orm.NewOrm()
@@ -125,21 +98,15 @@ func GetUserList(condition string, pars []interface{}) (items []*User, err error
 	return
 }
 
-func GetUserItemByPhone(phone string) (item *UserItem, err error) {
+func GetUserByPhone(phone string) (item *User, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM user WHERE phone=? `
 	err = o.Raw(sql, phone).QueryRow(&item)
 	return
 }
 
-func GetUserItemByEmail(email string) (item *UserItem, err error) {
+func GetUserByEmail(email string) (item *User, err error) {
 	sql := `SELECT * FROM user WHERE email=? `
 	err = orm.NewOrm().Raw(sql, email).QueryRow(&item)
 	return
 }
-
-func GetUserItemByUserId(userId int) (item *UserItem, err error) {
-	sql := `SELECT * FROM user WHERE user_id=? `
-	err = orm.NewOrm().Raw(sql, userId).QueryRow(&item)
-	return
-}

+ 35 - 0
models/wx_sesssion.go

@@ -0,0 +1,35 @@
+package models
+
+import (
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type WxSession struct {
+	WxSessionId    string    `orm:"pk" description:"id"`
+	OpenId         string    `description:"openId"`
+	UnionId        string    `description:"unionId"`
+	AccessToken    string    `description:"微信token"`
+	CreateTime     time.Time `description:"创建时间"`
+	LastUpdateTime time.Time `description:"最后更新时间"`
+}
+
+func (w *WxSession) Insert() (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(w)
+	return
+}
+
+func (w *WxSession) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(w, cols...)
+	return
+}
+
+func GetWxSessionByAccessToken(accessToken string) (item *WxSession, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM wx_session WHERE access_token = ?`
+	err = o.Raw(sql, accessToken).QueryRow(&item)
+	return
+}

+ 25 - 13
services/user.go

@@ -9,7 +9,7 @@ import (
 )
 
 // BindUser 用户绑定
-func BindUser(unionId, openId, phone, email, areaCode string) (userItem *models.UserItem, errMsg string, err error) {
+func BindUser(unionId, openId, phone, email, areaCode string) (userItem *models.User, errMsg string, err error) {
 	if phone == "" && email == "" {
 		err = errors.New("手机号或邮箱必填一个")
 		return
@@ -19,7 +19,7 @@ func BindUser(unionId, openId, phone, email, areaCode string) (userItem *models.
 		err = errors.New("openid不能为空")
 		return
 	}
-	userItem, err = models.GetUserItemByOpenId(openId)
+	userItem, err = models.GetUserByOpenId(openId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return
 	}
@@ -58,24 +58,36 @@ func BindUser(unionId, openId, phone, email, areaCode string) (userItem *models.
 		}
 	} else {
 		//根据手机号获取用户信息
+		var phoneUser, emailUser *models.User
 		if phone != "" {
-			tmpWxUser, wxUserErr := models.GetUserItemByPhone(phone)
-			if wxUserErr != nil && wxUserErr.Error() != utils.ErrNoRow() {
-				err = wxUserErr
+			tmpUser, userErr := models.GetUserByPhone(phone)
+			if userErr != nil && userErr.Error() != utils.ErrNoRow() {
+				err = userErr
 				return
 			}
-			userItem = tmpWxUser
+			phoneUser = tmpUser
 		}
 		//根据邮箱获取用户信息
-		if userItem == nil && email != "" {
-			tmpWxUser, wxUserErr := models.GetUserItemByEmail(email)
-			if wxUserErr != nil && wxUserErr.Error() != utils.ErrNoRow() {
-				err = wxUserErr
+		if email != "" {
+			tmpUser, userErr := models.GetUserByEmail(email)
+			if userErr != nil && userErr.Error() != utils.ErrNoRow() {
+				err = userErr
 				return
 			}
-			userItem = tmpWxUser
+			emailUser = tmpUser
+		}
+		// 理论上来说不会同时出现手机号和邮箱同时存在的情况
+		if phoneUser.UserId != emailUser.UserId {
+			errMsg = "该手机号和邮箱已绑定其他微信号"
+			err = errors.New("该手机号和邮箱已绑定其他微信号")
+			return
+		}
+		if phoneUser != nil {
+			userItem = phoneUser
+		}
+		if emailUser != nil {
+			userItem = emailUser
 		}
-
 		var userId int
 		//如果查询出来的用户是nil,那么需要新增用户
 		if userItem == nil {
@@ -102,7 +114,7 @@ func BindUser(unionId, openId, phone, email, areaCode string) (userItem *models.
 			}
 			user.UserId = int(tmpUserId)
 			userId = int(tmpUserId)
-			userItem, err = models.GetUserItemByUserId(userId)
+			userItem, err = models.GetUserById(userId)
 		} else {
 			userId = userItem.UserId
 		}