login.go 5.4 KB

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