Guest User

Untitled

a guest
Sep 10th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.25 KB | None | 0 0
  1. package user
  2.  
  3. import (
  4. "fmt"
  5. "regexp"
  6. "strconv"
  7. "time"
  8.  
  9. "dxmall/utils"
  10.  
  11. "github.com/jinzhu/gorm"
  12. "github.com/smtc/glog"
  13. "gopkg.in/redis.v3"
  14. )
  15.  
  16. var (
  17. allDigital = regexp.MustCompile(`^[0-9]*$`)
  18. minPasswdLen = 6
  19.  
  20. NameOrPasswdInvalid = fmt.Errorf("username or password invalid")
  21. EmptyUserPhone = fmt.Errorf("user phone is empty")
  22. EmptyPassword = fmt.Errorf("password is emtpy")
  23. PasswordTooShort = fmt.Errorf("password too short")
  24. UserPhoneHasExist = fmt.Errorf("user phone has exist")
  25. UserPhoneInvalid = fmt.Errorf("user phone invalid")
  26. )
  27.  
  28. // 定义用户
  29. //
  30. type DxUser struct {
  31. Id int64
  32. UserName string `gorm:"not null;unique;size:40" json:"username"`
  33. Passwd string `gorm:"not null;size:160" json:"passwd"`
  34. UserPhone int64 `gorm:"not null;unique;size:40" json:"phone"`
  35. RegIp string `gorm:"not null;size:40"` // 注册地址
  36. Nickname string //昵称
  37. IsDel bool
  38. CreatedAt time.Time `json:"created_at"`
  39. UpdatedAt time.Time `json:"updated_at"`
  40. }
  41.  
  42.  
  43. func GetUser(db *gorm.DB, id int64) (*DxUser, error) {
  44. var user DxUser
  45.  
  46. err := db.Where("id = ?", id).First(&user).Error
  47.  
  48. return &user, err
  49. }
  50.  
  51. //
  52. // 根据用户名查找用户
  53. func GetUserByName(db *gorm.DB, name string) (*DxUser, error) {
  54. var (
  55. err error
  56. user DxUser
  57. )
  58.  
  59. if allDigital.Match([]byte(name)) {
  60. err = db.Where("user_phone = ?", name).First(&user).Error
  61. } else {
  62. err = db.Where("user_name = ?", name).First(&user).Error
  63. }
  64.  
  65. return &user, err
  66. }
  67.  
  68. func GetOrCreateAndLogin(db *gorm.DB, phone, passwd, name, ipaddr string, areaid int) *DxUser {
  69. user, err := GetUserByName(db, phone)
  70. if err == gorm.ErrRecordNotFound {
  71. user, _, _ = CreateUser(db, phone, passwd, name, ipaddr, areaid)
  72. return user
  73. }
  74. return user
  75. }
  76.  
  77. // 用户注册, 仅要求提供最简单的信息:
  78. // phone, passwd 必须且不为空; name可以为空
  79. // phone就是手机号码, 创建记录时, 当name为空时, name= "m" + phone
  80. // ipaddr是用户的公网地址
  81. //
  82. // 1 检查手机号码是否存在
  83. // 2 检查密码是否符合规范
  84. //
  85. func CreateUser(db *gorm.DB, phone, passwd, name, ipaddr string, areaid int) (*DxUser, int, error) {
  86. if phone == "" {
  87. return nil, utils.ERROR_EmptyUserPhone, EmptyUserPhone
  88. }
  89.  
  90. if passwd == "" {
  91. return nil, utils.ERROR_EmptyPassword, EmptyPassword
  92. }
  93.  
  94. if len(passwd) < minPasswdLen {
  95. return nil, utils.ERROR_PasswordTooShort, PasswordTooShort
  96. }
  97.  
  98. user, err := GetUserByName(db, phone)
  99. if err != gorm.ErrRecordNotFound {
  100. return nil, utils.ERROR_UserPhoneHasExist, UserPhoneHasExist
  101. }
  102.  
  103. if err = utils.ValidPhoneNo(phone); err != nil {
  104. return nil, utils.ERROR_PhoneNoInvalid, err
  105. }
  106.  
  107. if name != "" {
  108. if err = utils.ValidUserName(name); err != nil {
  109. return nil, utils.ERROR_UserNameInvalid, err
  110. }
  111. } else {
  112. name = "m" + phone[0:3] + "****" + phone[len(phone)-4:len(phone)]
  113. }
  114.  
  115. iphone, err := strconv.ParseInt(phone, 10, 64)
  116. if err != nil {
  117. return nil, utils.ERROR_PhoneNoInvalid, UserPhoneInvalid
  118. }
  119.  
  120. // 填充资料
  121. user = new(DxUser)
  122.  
  123. user.UserPhone = iphone
  124. user.UserName = name
  125. user.Passwd = utils.Createpasswd(passwd)
  126. user.RegIp = ipaddr
  127. user.Regtime = time.Now()
  128.  
  129. user.AreaId = areaid
  130.  
  131. // 创建
  132. err = db.Create(user).Error
  133.  
  134. return user, utils.ERROR_CREATE_USER, err
  135. }
  136.  
  137. // 如果name全为数字, 则把name当做手机号码
  138. // authen user
  139. // 认证用户身份
  140. func AuthenUser(db *gorm.DB, name, passwd string) (*DxUser, error) {
  141. user, err := GetUserByName(db, name)
  142.  
  143. if err != nil {
  144. return nil, NameOrPasswdInvalid
  145. }
  146.  
  147. // 验证成功
  148. if utils.Checkpasswd(user.Passwd, passwd) {
  149. return user, nil
  150. }
  151.  
  152. glog.Error("AuthenUser: password invalid: username=%s password=%s\n", name, passwd)
  153.  
  154. return nil, NameOrPasswdInvalid
  155. }
  156.  
  157. //
  158. // 返回access token和refresh token
  159. // token都保存在redis中
  160. func (u *DxUser) GetTokens(rc *redis.Client, client *DxClient) (*AccessToken, string, error) {
  161. token, err := GrantAccessToken(rc, client.Name, u.Id, client.AccessSeconds, "default")
  162. if err != nil {
  163. return nil, "", err
  164. }
  165.  
  166. // 如果 refresh seconds 为 0, 直接返回!
  167. if client.RefreshSeconds == 0 {
  168. return token, "", err
  169. }
  170.  
  171. rt, err := GrantRefreshToken(rc, client.Name, u.Id, client.RefreshSeconds, "default")
  172. if err != nil {
  173. return token, "", err
  174. }
  175.  
  176. return token, rt.Token, nil
  177. }
Add Comment
Please, Sign In to add comment