Roc 3 роки тому
батько
коміт
369c6af192

+ 7 - 0
models/tables/session/create.go

@@ -0,0 +1,7 @@
+package session
+
+//  Create 新增记录
+func (session *Session) Create() (err error) {
+	err = getDb().Create(session).Error
+	return
+}

+ 17 - 0
models/tables/session/query.go

@@ -0,0 +1,17 @@
+package session
+
+import (
+	"gorm.io/gorm"
+	"hongze/hongze_yb/global"
+)
+
+// GetTokenByOpenId 根据用户id获取token
+func GetTokenByOpenId(openID string) (item *Session, err error) {
+	err = getDb().Where("open_id = ? ", openID).First(&item).Error
+	return
+}
+
+// 获取数据库链接
+func getDb() *gorm.DB {
+	return global.MYSQL["rddp"]
+}

+ 38 - 0
models/tables/session/session.go

@@ -0,0 +1,38 @@
+package session
+
+import "time"
+
+// Session [...]
+type Session struct {
+	SessionID       int64     `gorm:"primaryKey;column:session_id;type:bigint(12);not null" json:"-"`
+	UserID          int64     `gorm:"index:session_user;column:user_id;type:bigint(20);not null" json:"userId"`
+	OpenID          string    `gorm:"column:open_id;type:varchar(32);not null" json:"openId"` // openid
+	AccessToken     string    `gorm:"index:session_token;column:access_token;type:varchar(64);not null" json:"accessToken"`
+	ExpireTime      time.Time `gorm:"index:expire_time;column:expire_time;type:datetime;not null" json:"expireTime"`
+	CreatedTime     time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createdTime"` // 创建时间
+	LastUpdatedTime time.Time `gorm:"column:last_updated_time;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"lastUpdatedTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *Session) TableName() string {
+	return "session"
+}
+
+// SessionColumns get sql column name.获取数据库列名
+var SessionColumns = struct {
+	SessionID       string
+	UserID          string
+	OpenID          string
+	AccessToken     string
+	ExpireTime      string
+	CreatedTime     string
+	LastUpdatedTime string
+}{
+	SessionID:       "session_id",
+	UserID:          "user_id",
+	OpenID:          "open_id",
+	AccessToken:     "access_token",
+	ExpireTime:      "expire_time",
+	CreatedTime:     "created_time",
+	LastUpdatedTime: "last_updated_time",
+}

+ 20 - 0
models/tables/session/update.go

@@ -0,0 +1,20 @@
+package session
+
+import (
+	"time"
+)
+
+// Update 更新对应字段数据
+func (session *Session) Update(updateCols []string) (err error) {
+	err = getDb().Model(session).Select(updateCols).Updates(*session).Error
+	return
+}
+
+// UpdateSession 更新session
+func (session *Session) UpdateSession(userId int, expireTime time.Time) (err error) {
+	session.UserID = int64(userId)
+	session.ExpireTime = expireTime
+	var updateCols = []string{"UserID", "ExpireTime"}
+	err = session.Update(updateCols)
+	return
+}

+ 9 - 0
models/tables/user_record/create.go

@@ -0,0 +1,9 @@
+package user_record
+
+import "hongze/hongze_yb/global"
+
+//  Create 新增记录
+func (userRecord *UserRecord) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(userRecord).Error
+	return
+}

+ 27 - 0
models/tables/user_record/query.go

@@ -0,0 +1,27 @@
+package user_record
+
+import "hongze/hongze_yb/global"
+
+// GetByUserId 根据用户id和平台id获取用户关系
+func GetByUserId(userId, platform int) (item *UserRecord, err error) {
+	err = global.DEFAULT_MYSQL.Where("user_id = ? and create_platform = ?", userId, platform).First(&item).Error
+	return
+}
+
+// GetByUnionID 根据用户UnionID和平台id获取用户关系
+func GetByUnionID(unionID string, platform int) (item *UserRecord, err error) {
+	err = global.DEFAULT_MYSQL.Where("union_id = ? and create_platform = ?", unionID, platform).First(&item).Error
+	return
+}
+
+// GetByOpenID 根据用户OpenID获取用户关系
+func GetByOpenID(openID string) (item *UserRecord, err error) {
+	err = global.DEFAULT_MYSQL.Where("open_id = ? ", openID).First(&item).Error
+	return
+}
+
+// GetUserThirdRecordByUserId 获取该用户第一个的 三方信息(微信头像信息)
+func GetUserThirdRecordByUserId(userId int) (item *UserRecord, err error) {
+	err = global.DEFAULT_MYSQL.Where("user_id = ? ", userId).Order("user_record_id asc").First(&item).Error
+	return
+}

+ 41 - 0
models/tables/user_record/update.go

@@ -0,0 +1,41 @@
+package user_record
+
+import "hongze/hongze_yb/global"
+
+// Update 更新对应字段数据
+func (userRecord *UserRecord) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(userRecord).Select(updateCols).Updates(*userRecord).Error
+	return
+}
+
+// ModifyUserRecordInfo 修改用户微信信息
+func (userRecord *UserRecord) ModifyUserRecordInfo(nickName, headimgUrl, city, province, country string, sex int64) (err error) {
+	userRecord.NickName = nickName
+	userRecord.Headimgurl = headimgUrl
+	userRecord.City = city
+	userRecord.Province = province
+	userRecord.Country = country
+	userRecord.Sex = sex
+	var updateCols = []string{"NickName", "Headimgurl", "City", "Province", "Country", "Sex"}
+	err = userRecord.Update(updateCols)
+	return
+}
+
+// UnBindUserRecordByOpenid 解除绑定用户关系
+func (userRecord *UserRecord) UnBindUserRecordByOpenid() (err error) {
+	userRecord.UserID = 0
+	userRecord.BindAccount = ""
+	var updateCols = []string{"UserID", "BindAccount"}
+	err = userRecord.Update(updateCols)
+	return
+}
+
+// UnBindUserRecordByOpenid 根据openid解除绑定用户关系
+func UnBindUserRecordByOpenid(openId string) (err error) {
+
+	err = global.DEFAULT_MYSQL.Model(UserRecord{}).Select("UserID", "BindAccount").Where("open_id = ? ", openId).Updates(UserRecord{
+		UserID:      0,
+		BindAccount: "",
+	}).Error
+	return
+}

+ 65 - 0
models/tables/user_record/user_record.go

@@ -0,0 +1,65 @@
+package user_record
+
+import "time"
+
+// UserRecord 联系人表
+type UserRecord struct {
+	UserRecordID   uint64    `gorm:"primaryKey;column:user_record_id;type:bigint(20) unsigned;not null" json:"-"` // 用户id
+	OpenID         string    `gorm:"index:open_id;column:open_id;type:varchar(32);default:''" json:"openId"`      // open_id
+	UnionID        string    `gorm:"column:union_id;type:varchar(64);default:''" json:"unionId"`
+	Subscribe      int8      `gorm:"column:subscribe;type:tinyint(1);default:0" json:"subscribe"`                  // 是否关注
+	NickName       string    `gorm:"index:nick_name;column:nick_name;type:varchar(32);default:''" json:"nickName"` // 用户昵称
+	RealName       string    `gorm:"column:real_name;type:varchar(32);default:''" json:"realName"`                 // 用户实际名称
+	BindAccount    string    `gorm:"column:bind_account;type:varchar(128);default:''" json:"bindAccount"`          // 绑定时的账号
+	Sex            int64     `gorm:"column:sex;type:bigint(20);default:1" json:"sex"`                              // 普通用户性别,1为男性,2为女性
+	Province       string    `gorm:"column:province;type:varchar(30);default:''" json:"province"`                  // 普通用户个人资料填写的省份
+	City           string    `gorm:"column:city;type:varchar(30);default:''" json:"city"`                          // 普通用户个人资料填写的城市
+	Country        string    `gorm:"column:country;type:varchar(30);default:''" json:"country"`                    // 国家,如中国为CN
+	Headimgurl     string    `gorm:"column:headimgurl;type:varchar(512);default:''" json:"headimgurl"`
+	CreateTime     time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                     // 创建时间
+	CreatePlatform int8      `gorm:"index:idx_create_platform;column:create_platform;type:tinyint(4);default:1" json:"createPlatform"` // 注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序
+	SessionKey     string    `gorm:"column:session_key;type:varchar(255);default:''" json:"sessionKey"`                                // 微信小程序会话密钥
+	UserID         int       `gorm:"index:idx_user_id;column:user_id;type:int(11);default:0" json:"userId"`                            // 用户id
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *UserRecord) TableName() string {
+	return "user_record"
+}
+
+// UserRecordColumns get sql column name.获取数据库列名
+var UserRecordColumns = struct {
+	UserRecordID   string
+	OpenID         string
+	UnionID        string
+	Subscribe      string
+	NickName       string
+	RealName       string
+	BindAccount    string
+	Sex            string
+	Province       string
+	City           string
+	Country        string
+	Headimgurl     string
+	CreateTime     string
+	CreatePlatform string
+	SessionKey     string
+	UserID         string
+}{
+	UserRecordID:   "user_record_id",
+	OpenID:         "open_id",
+	UnionID:        "union_id",
+	Subscribe:      "subscribe",
+	NickName:       "nick_name",
+	RealName:       "real_name",
+	BindAccount:    "bind_account",
+	Sex:            "sex",
+	Province:       "province",
+	City:           "city",
+	Country:        "country",
+	Headimgurl:     "headimgurl",
+	CreateTime:     "create_time",
+	CreatePlatform: "create_platform",
+	SessionKey:     "session_key",
+	UserID:         "user_id",
+}

+ 9 - 0
models/tables/wx_user/create.go

@@ -0,0 +1,9 @@
+package wx_user
+
+import "hongze/hongze_yb/global"
+
+//  Create 新增记录
+func (wxUser *WxUser) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(wxUser).Error
+	return
+}

+ 24 - 0
models/tables/wx_user/update.go

@@ -0,0 +1,24 @@
+package wx_user
+
+import (
+	"hongze/hongze_yb/global"
+	"time"
+)
+
+// Update 更新对应字段数据
+func (wxUser *WxUser) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(wxUser).Select(updateCols).Updates(*wxUser).Error
+	return
+}
+
+// ModifyWxUserRegisterStatus 变更联系人是否已注册状态
+func (wxUser *WxUser) ModifyWxUserRegisterStatus(isRegister, source int8, registerTime time.Time) (err error) {
+
+	wxUser.IsRegister = isRegister
+	wxUser.Source = source
+	wxUser.RegisterTime = registerTime
+	var updateCols = []string{"IsRegister", "Source", "RegisterTime"}
+	err = wxUser.Update(updateCols)
+
+	return
+}

+ 9 - 0
models/tables/wx_user_log/create.go

@@ -0,0 +1,9 @@
+package wx_user_log
+
+import "hongze/hongze_yb/global"
+
+//  Create 新增记录
+func (wxUserLog *WxUserLog) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(wxUserLog).Error
+	return
+}

+ 44 - 0
models/tables/wx_user_log/wx_user_log.go

@@ -0,0 +1,44 @@
+package wx_user_log
+
+import "time"
+
+// WxUserLog [...]
+type WxUserLog struct {
+	ID         int       `gorm:"primaryKey;column:id;type:int(11);not null" json:"-"`
+	UserID     int       `gorm:"column:user_id;type:int(11)" json:"userId"`
+	OpenID     string    `gorm:"column:open_id;type:varchar(255)" json:"openId"`
+	UnionID    string    `gorm:"column:union_id;type:varchar(255)" json:"unionId"`
+	Mobile     string    `gorm:"column:mobile;type:varchar(50)" json:"mobile"`
+	Email      string    `gorm:"column:email;type:varchar(50)" json:"email"`
+	Handle     string    `gorm:"column:handle;type:varchar(20)" json:"handle"`
+	Remark     string    `gorm:"column:remark;type:varchar(500)" json:"remark"`
+	CreateTime time.Time `gorm:"column:create_time;type:datetime" json:"createTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *WxUserLog) TableName() string {
+	return "wx_user_log"
+}
+
+// WxUserLogColumns get sql column name.获取数据库列名
+var WxUserLogColumns = struct {
+	ID         string
+	UserID     string
+	OpenID     string
+	UnionID    string
+	Mobile     string
+	Email      string
+	Handle     string
+	Remark     string
+	CreateTime string
+}{
+	ID:         "id",
+	UserID:     "user_id",
+	OpenID:     "open_id",
+	UnionID:    "union_id",
+	Mobile:     "mobile",
+	Email:      "email",
+	Handle:     "handle",
+	Remark:     "remark",
+	CreateTime: "create_time",
+}

+ 421 - 0
services/user/user.go

@@ -0,0 +1,421 @@
+package services
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/silenceper/wechat/v2/miniprogram/auth"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/session"
+	"hongze/hongze_yb/models/tables/user_record"
+	"hongze/hongze_yb/models/tables/wx_user"
+	"hongze/hongze_yb/models/tables/wx_user_log"
+	"hongze/hongze_yb/utils"
+	"strconv"
+	"time"
+)
+
+var ERR_NO_USER_RECORD = errors.New("用户关系没有入库")
+var ERR_USER_NOT_BIND = errors.New("用户没有绑定")
+
+type UserInfo struct {
+	wx_user.WxUser
+	RecordInfo *user_record.UserRecord
+}
+
+// GetWxUserItemByOpenId 通过openid获取用户信息
+func GetWxUserItemByOpenId(openid string) (userInfo UserInfo, err error) {
+	//通过openid获取用户关联信息
+	userRecord, userRecordErr := user_record.GetByOpenID(openid)
+	if userRecordErr != nil {
+		if userRecordErr == utils.ErrNoRow {
+			err = ERR_NO_USER_RECORD
+			return
+		} else {
+			err = userRecordErr
+			return
+		}
+	}
+
+	//该openid在系统中没有关联关系
+	if userRecord == nil {
+		err = ERR_NO_USER_RECORD
+		return
+	}
+
+	//该openid没有绑定用户
+	if userRecord.UserID <= 0 {
+		err = ERR_USER_NOT_BIND
+		item := new(wx_user.WxUser)
+		//格式化返回用户数据
+		userInfo = formatWxUserAndUserRecord(item, userRecord)
+		return
+	}
+
+	//获取用户信息
+	item, wxUserErr := wx_user.GetByUserId(userRecord.UserID)
+	if wxUserErr != nil {
+		err = wxUserErr
+
+		//如果是找不到数据,那么可能是该用户被删除了,但是user_record没有删除对应的关系
+		if wxUserErr == utils.ErrNoRow {
+			//用户被删除了,但是user_record没有删除对应的关系,那么去解除绑定
+			userUnbindErr := user_record.UnBindUserRecordByOpenid(openid)
+			if userUnbindErr != nil {
+				err = userUnbindErr
+				return
+			}
+			//返回状态为 用户未绑定 逻辑代码
+			err = ERR_USER_NOT_BIND
+			item := new(wx_user.WxUser)
+			//格式化返回用户数据
+			userInfo = formatWxUserAndUserRecord(item, userRecord)
+			return
+		}
+		return
+	}
+	//格式化返回用户数据
+	userInfo = formatWxUserAndUserRecord(item, userRecord)
+	return
+}
+
+// GetWxUserItemByUserId 根据用户id和平台id获取用户信息
+func GetWxUserItemByUserId(userId, platform int) (userInfo UserInfo, err error) {
+	//获取用户信息
+	wxUser, err := wx_user.GetByUserId(userId)
+	if err != nil {
+		return
+	}
+	//格式化返回用户数据
+	userInfo = formatWxUser(wxUser, platform)
+	return
+}
+
+// GetWxUserItemByEmail 根据用户邮箱和平台id获取用户信息
+func GetWxUserItemByEmail(email string, platform int) (userInfo UserInfo, err error) {
+	//获取用户信息
+	wxUser, err := wx_user.GetByEmail(email)
+	if err != nil {
+		return
+	}
+	//格式化返回用户数据
+	userInfo = formatWxUser(wxUser, platform)
+	return
+}
+
+// GetWxUserItemByMobile 根据用户手机号和平台id获取用户信息
+func GetWxUserItemByMobile(mobile string, platform int) (userInfo UserInfo, err error) {
+	//获取用户信息
+	wxUser, err := wx_user.GetByMobile(mobile)
+	if err != nil {
+		return
+	}
+	//格式化返回用户数据
+	userInfo = formatWxUser(wxUser, platform)
+	return
+}
+
+// GetWxUserItemByUnionId 根据用户unionid和平台id获取用户信息
+func GetWxUserItemByUnionId(unionId string, platform int) (userInfo UserInfo, err error) {
+	//获取用户信息
+	userRecord, err := user_record.GetByUnionID(unionId, platform)
+	if err != nil {
+		return
+	}
+	wxUser, err := wx_user.GetByUserId(userRecord.UserID)
+	if err != nil {
+		return
+	}
+	//格式化返回用户数据
+	userInfo = formatWxUserAndUserRecord(wxUser, userRecord)
+	return
+}
+
+//通过用户 关系表记录  和  用户记录  格式化返回 用户数据
+func formatWxUserAndUserRecord(wxUser *wx_user.WxUser, userRecord *user_record.UserRecord) (userInfo UserInfo) {
+	wxUser.OpenID = userRecord.OpenID
+	wxUser.UnionID = userRecord.UnionID
+	wxUser.NickName = userRecord.NickName
+	//wxUser.RealName = userRecord.RealName
+	//wxUser.BindAccount = userRecord.BindAccount
+	wxUser.Headimgurl = userRecord.Headimgurl
+
+	wxUserJson, _ := json.Marshal(wxUser)
+	_ = json.Unmarshal(wxUserJson, &userInfo)
+	userInfo.RecordInfo = userRecord
+	return
+}
+
+//通过用户 用户记录  和  来源平台  格式化返回 用户数据
+func formatWxUser(wxUser *wx_user.WxUser, platform int) (userInfo UserInfo) {
+	//根据用户id和平台id获取用户关系
+	userRecord, userRecordErr := user_record.GetByUserId(int(wxUser.UserID), platform)
+	if userRecordErr != nil {
+		if userRecordErr != utils.ErrNoRow {
+			return
+		}
+	}
+
+	//该openid在系统中没有关联关系
+	if userRecord == nil {
+		wxUserJson, _ := json.Marshal(wxUser)
+		_ = json.Unmarshal(wxUserJson, &userInfo)
+		return
+	} else {
+		userInfo = formatWxUserAndUserRecord(wxUser, userRecord)
+	}
+	return
+}
+
+//用户绑定
+func BindWxUser(openid, mobile, email string, areaNum, registerPlatform int) (wxUser *wx_user.WxUser, err error) {
+	var source int8
+	source = 6 //绑定来源,1:微信端,2:pc网页端,3:查研观向小程序,4:每日咨询
+	if mobile == "" && email == "" {
+		err = errors.New("手机号或邮箱必填一个")
+		return
+	}
+	var bindAccount string
+	//根据手机号获取用户信息
+	if mobile != "" {
+		tmpWxUser, wxUserErr := wx_user.GetByMobile(mobile)
+		if wxUserErr != nil && wxUserErr != utils.ErrNoRow {
+			err = wxUserErr
+			return
+		}
+		wxUser = tmpWxUser
+		bindAccount = mobile
+	}
+	//根据邮箱获取用户信息
+	if wxUser == nil && email != "" {
+		tmpWxUser, wxUserErr := wx_user.GetByEmail(email)
+		if wxUserErr != nil && wxUserErr != utils.ErrNoRow {
+			err = wxUserErr
+			return
+		}
+		wxUser = tmpWxUser
+		bindAccount = email
+	}
+
+	//查询openid的第三方(微信)信息
+	userRecord, err := user_record.GetByOpenID(openid)
+	if err != nil {
+		return
+	}
+
+	var userId int
+	//如果查询出来的用户是nil,那么需要新增用户
+	if wxUser == nil {
+		key := "bind_wx_user:mobile:" + mobile + ":email:" + email
+		isHas, _ := global.Redis.Exists(context.TODO(), key).Result()
+		if isHas > 0 {
+			err = errors.New("多次提交,请关闭页面重新进入")
+			return
+		}
+		global.Redis.SetNX(context.TODO(), key, "ok", time.Second*300)
+		addwxUser := &wx_user.WxUser{
+			CompanyID:           1,
+			CreatedTime:         time.Now(),
+			FirstLogin:          1,
+			Enabled:             1,
+			RegisterPlatform:    int8(registerPlatform), //账号注册来源,注册平台,1:微信端,2:PC网页端
+			RegisterTime:        time.Now(),
+			Mobile:              mobile,
+			Email:               email,
+			IsRegister:          1,
+			Source:              source,
+			CountryCode:         strconv.Itoa(areaNum),
+			OutboundMobile:      mobile,
+			OutboundCountryCode: strconv.Itoa(areaNum),
+		}
+
+		addUserErr := addwxUser.Create()
+		//添加完成,清除缓存
+		_ = global.Redis.Del(context.TODO(), key)
+		if addUserErr != nil {
+			err = addUserErr
+			return
+		}
+		userId = int(addwxUser.UserID)
+		tmpWxUser, _ := wx_user.GetByUserId(userId)
+		wxUser = tmpWxUser
+	} else {
+		userId = int(wxUser.UserID)
+	}
+	//如果存在该手机号/邮箱,那么需要校验
+	if userRecord.UserID > 0 && userRecord.UserID != userId {
+		err = errors.New(fmt.Sprint("用户已绑定其他账户,已绑定的用户编号:", userRecord.UserID, ",不允许重复绑定"))
+		return
+	}
+	if userRecord.UserID == 0 {
+		userRecord.BindAccount = bindAccount
+		userRecord.UserID = userId
+		var updateCols = []string{"UserID", "BindAccount"}
+		tmpErr := userRecord.Update(updateCols)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+	}
+
+	//如果当前该第三方用户信息的昵称为空串的话,那么需要去查询该用户的第一个绑定信息的数据作为来源做数据修复
+	if userRecord.NickName == "" {
+		oldUserRecord, err := user_record.GetUserThirdRecordByUserId(userId)
+		if err == nil && oldUserRecord != nil {
+			//如果该用户绑定的第一条数据的头像信息不为空串,那么就去做新数据的修复
+			if oldUserRecord.NickName != "" {
+				_ = userRecord.ModifyUserRecordInfo(oldUserRecord.NickName, oldUserRecord.Headimgurl, oldUserRecord.City, oldUserRecord.Province, oldUserRecord.Country, oldUserRecord.Sex)
+			}
+		}
+	}
+
+	//如果该用户 绑定注册状态 字段处于 未注册 的情况下,那么去修改该数据
+	if wxUser.IsRegister == 0 {
+		err = wxUser.ModifyWxUserRegisterStatus(1, source, time.Now())
+		if err != nil {
+			return
+		}
+	}
+
+	//格式化用户数据
+	formatWxUserAndUserRecord(wxUser, userRecord)
+	return
+}
+
+//微信登录
+func WxLogin(wxPlatform int, code string, wxSession auth.ResCode2Session, userInfo UserInfo) (token string, userId, firstLogin, permission int, err error) {
+	openId := wxSession.OpenID
+	unionId := wxSession.UnionID
+	if unionId == "" {
+		unionId = userInfo.UnionID
+	}
+
+	//firstLogin==1,强制绑定手机号或者邮箱
+	firstLogin = 1
+
+QUERY_WX_USER:
+	wxUser, wxUserErr := GetWxUserItemByOpenId(openId)
+	if wxUserErr == ERR_NO_USER_RECORD { //没有用户openid记录
+		_, recordErr := AddUserRecord(openId, unionId, "", "", "", "", "", "", "", wxPlatform, 0, 0)
+		//如果插入失败,那么直接将错误信息返回
+		if recordErr != nil {
+			err = recordErr
+			return
+		}
+		//插入成功后,需要重新查询该用户,并进入下面的逻辑
+		goto QUERY_WX_USER
+	} else if wxUserErr == ERR_USER_NOT_BIND {
+		//没有用户信息
+		//wxUser.FirstLogin = 1
+	} else if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+
+	//如果已经登录注册绑定的情况下
+	if wxUserErr == nil {
+		//获取用户权限
+		firstLogin = int(wxUser.FirstLogin)
+		userId = int(wxUser.UserID)
+
+		//if wxUserInfo != nil {
+		//	go models.ModifyUserRecordInfo(openId, wxUserInfo.Nickname, wxUserInfo.Headimgurl, wxUserInfo.City, wxUserInfo.Province, wxUserInfo.Country, wxUserInfo.Sex, userId)
+		//}
+
+		if wxUser.Mobile == "" && wxUser.Email == "" {
+			firstLogin = 1
+		} else {
+			firstLogin = 0
+		}
+	}
+
+	//获取登录token
+	tokenItem, tokenErr := session.GetTokenByOpenId(openId)
+	if tokenErr != nil && tokenErr != utils.ErrNoRow {
+		err = errors.New("登录失败,获取token失败:" + tokenErr.Error())
+		return
+	}
+
+	if tokenItem == nil || (tokenErr != nil && tokenErr == utils.ErrNoRow) {
+		timeUnix := time.Now().Unix()
+		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+		token = utils.MD5(openId) + utils.MD5(timeUnixStr)
+		//新增session
+		{
+			//session := new(session.Session)
+			//session.OpenID = openId
+			//session.UserID = int64(userId)
+			//session.CreatedTime = time.Now()
+			//session.LastUpdatedTime = time.Now()
+			//session.ExpireTime = time.Now().AddDate(0, 3, 0)
+			//session.AccessToken = token
+
+			sessionItem := &session.Session{
+				OpenID:          openId,
+				UserID:          int64(userId),
+				CreatedTime:     time.Now(),
+				LastUpdatedTime: time.Now(),
+				ExpireTime:      time.Now().AddDate(0, 3, 0),
+				AccessToken:     token,
+			}
+			sessionErr := sessionItem.Create()
+			if err != nil {
+				err = errors.New("登录失败,新增用户session信息失败:" + sessionErr.Error())
+				return
+			}
+		}
+	} else {
+		token = tokenItem.AccessToken
+		//如果联系人编号不为空,且联系人编号与session里面的联系人编号不一致的时候,需要做session变更
+		if userId > 0 && tokenItem.UserID != int64(userId) {
+			_ = tokenItem.UpdateSession(userId, time.Now().AddDate(0, 1, 0))
+		}
+	}
+
+	//新增登录日志
+	{
+		loginLog := &wx_user_log.WxUserLog{
+			UserID:     userId,
+			OpenID:     openId,
+			UnionID:    unionId,
+			CreateTime: time.Now(),
+			Handle:     "yb_login",
+			Remark:     token,
+		}
+		go loginLog.Create()
+	}
+	return
+}
+
+// AddUserRecord 添加第三方用户(微信)记录
+func AddUserRecord(openId, unionId, nickName, realName, province, city, country, headimgurl, sessionKey string, platform, sex, subscribe int) (userRecordInfo *user_record.UserRecord, err error) {
+	find, err := user_record.GetByOpenID(openId)
+	if err != nil && err != utils.ErrNoRow {
+		return
+	}
+	if find != nil {
+		userRecordInfo = find
+		return
+	}
+	userRecordInfo = &user_record.UserRecord{
+		OpenID:         openId,  //用户open_id
+		UnionID:        unionId, //用户union_id
+		Subscribe:      int8(subscribe),
+		NickName:       nickName,       //用户昵称,最大长度:32
+		RealName:       realName,       //用户实际名称,最大长度:32
+		Sex:            int64(sex),     //普通用户性别,1为男性,2为女性
+		Province:       province,       //普通用户个人资料填写的省份,最大长度:30
+		City:           city,           //普通用户个人资料填写的城市,最大长度:30
+		Country:        country,        //国家,如中国为CN,最大长度:30
+		Headimgurl:     headimgurl,     //用户第三方(微信)头像,最大长度:512
+		CreateTime:     time.Now(),     //创建时间,关系添加时间、用户授权时间
+		CreatePlatform: int8(platform), //注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序;默认:1
+		SessionKey:     sessionKey,     //微信小程序会话密钥,最大长度:255
+	}
+	err = userRecordInfo.Create()
+	if err != nil {
+		return
+	}
+	return
+}