login.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package handler
  2. import (
  3. "cold-logistics/conf"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/alibaba/sentinel-golang/util"
  8. log "gogs.baozhida.cn/zoie/OAuth-core/logger"
  9. coreModel "gogs.baozhida.cn/zoie/OAuth-core/model"
  10. "gogs.baozhida.cn/zoie/OAuth-core/pkg"
  11. "gogs.baozhida.cn/zoie/OAuth-core/sdk"
  12. "gorm.io/gorm"
  13. "net/http"
  14. )
  15. type Login struct {
  16. Username string `form:"UserName" json:"username"` // 用户名
  17. Password string `form:"Password" json:"password"` // 密码
  18. Phone string `form:"Phone" json:"phone"` // 手机号
  19. VerifyCode string `form:"VerifyCode" json:"verifyCode"` // 验证码
  20. Type int `form:"Type" json:"type"` // 1-密码 2-短信验证码 3-微信登录
  21. Mobile bool `form:"Mobile" json:"mobile"` // 是否手机登录
  22. AuthorizationCode string `form:"authorizationCode" json:"authorizationCode"` // 微信登录code
  23. }
  24. //Code string `form:"Code" json:"code" binding:"required"`
  25. //UUID string `form:"UUID" json:"uuid" binding:"required"`
  26. type SmsLogin struct {
  27. }
  28. func (u *Login) GetUser(tx *gorm.DB) (user SysUser, role SysRole, dept SysDept, err error) {
  29. err = tx.Table("sys_user").Where("username = ? and status = 2", u.Username).First(&user).Error
  30. if err != nil {
  31. log.Errorf("get user error, %s", err.Error())
  32. return
  33. }
  34. _, err = pkg.CompareHashAndPassword(user.Password, u.Password)
  35. if err != nil {
  36. log.Errorf("user login error, %s", err.Error())
  37. return
  38. }
  39. //err = tx.Table("sys_role").Where("id = ? ", user.RoleId).First(&role).Error
  40. //if err != nil {
  41. // log.Errorf("get role error, %s", err.Error())
  42. // return
  43. //}
  44. if user.DeptId > 0 {
  45. err = tx.Table("sys_dept").Where("id = ? ", user.DeptId).First(&dept).Error
  46. if err != nil {
  47. log.Errorf("get dept error, %s", err.Error())
  48. return
  49. }
  50. }
  51. return
  52. }
  53. func (u *Login) GetUserByCode(tx *gorm.DB) (user SysUser, role SysRole, dept SysDept, err error) {
  54. err = tx.Table("sys_user").Where("phone = ? and status = 2", u.Phone).First(&user).Error
  55. if err != nil {
  56. log.Errorf("get user error, %s", err.Error())
  57. return
  58. }
  59. code, err := sdk.Runtime.GetCacheAdapter().Get(GetVerifyCodeCacheKey(u.Phone))
  60. if err != nil {
  61. log.Errorf("user login error, %s", err.Error())
  62. err = errors.New("验证码已过期")
  63. return
  64. }
  65. if code != u.VerifyCode {
  66. log.Errorf("user login error, %s", "验证码错误")
  67. err = errors.New("验证码错误")
  68. return
  69. }
  70. err = tx.Table("sys_role").Where("id = ? ", user.RoleId).First(&role).Error
  71. if err != nil {
  72. log.Errorf("get role error, %s", err.Error())
  73. return
  74. }
  75. if user.DeptId > 0 {
  76. err = tx.Table("sys_dept").Where("id = ? ", user.DeptId).First(&dept).Error
  77. if err != nil {
  78. log.Errorf("get dept error, %s", err.Error())
  79. return
  80. }
  81. }
  82. return
  83. }
  84. func GetUserByID(tx *gorm.DB, id int64) (user SysUser, role SysRole, err error) {
  85. err = tx.Table("sys_user").Where("id = ? ", id).First(&user).Error
  86. if err != nil {
  87. log.Errorf("get user error, %s", err.Error())
  88. return
  89. }
  90. err = tx.Table("sys_role").Where("id = ? ", user.RoleId).First(&role).Error
  91. if err != nil {
  92. log.Errorf("get role error, %s", err.Error())
  93. return
  94. }
  95. return
  96. }
  97. type AppletCustomerRegisterReq struct {
  98. Type int `json:"type"` // 类型 0-商户 1-私人
  99. Phone string `json:"phone"` // 手机号
  100. Password string `json:"password"` // 密码
  101. VerifyCode string `json:"verifyCode"` // 验证码
  102. }
  103. type AppletCustomerLoginResp struct {
  104. Openid string `json:"openid"` //用户唯一标识
  105. Session_key string `json:"session_key"` // 会话密钥 session_key 是对用户数据进行 加密签名 的密钥
  106. Unionid string `json:"unionid"` // 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
  107. Errcode int `json:"errcode"` //错误码: -1、0、40029、 45011、 40226 (具体说明,请阅读 接口文档)
  108. Errmsg string `json:"errmsg"` //错误信息
  109. }
  110. func (u *Login) GetUserByWX(tx *gorm.DB) (user SysUser, role SysRole, dept SysDept, err error) {
  111. url := "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
  112. appid := conf.ExtConfig.Applet.Appid
  113. appSecret := conf.ExtConfig.Applet.AppSecret
  114. url = fmt.Sprintf(url, appid, appSecret, u.AuthorizationCode)
  115. // 发起请求
  116. res, _ := http.Get(url)
  117. // 成功后获取openId
  118. wxRes := AppletCustomerLoginResp{}
  119. err = json.NewDecoder(res.Body).Decode(&wxRes)
  120. if err != nil || wxRes.Openid == "" {
  121. err = errors.New("获取openid失败")
  122. return
  123. }
  124. err = tx.Where("username = ? and user_type = 'customer' and status = '2' and dept_id = 0", u.Phone).First(&user).Error
  125. if err != nil {
  126. if errors.Is(err, gorm.ErrRecordNotFound) {
  127. // 添加客户
  128. user = SysUser{
  129. User: coreModel.User{
  130. Uuid: util.NewUuid(),
  131. Username: u.Phone,
  132. Phone: u.Phone,
  133. },
  134. UserType: "customer",
  135. Openid: wxRes.Openid,
  136. }
  137. err = tx.Create(&user).Error
  138. if err != nil {
  139. err = errors.New("添加个人信息失败")
  140. }
  141. } else {
  142. err = errors.New("获取个人信息失败")
  143. return
  144. }
  145. }
  146. if user.Openid != wxRes.Openid {
  147. user.Openid = wxRes.Openid
  148. err = tx.Save(&user).Error
  149. if err != nil {
  150. err = errors.New("同步个人信息失败")
  151. return
  152. }
  153. }
  154. return
  155. }