applet_customer.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "gas-cylinder-api/app/admin/model"
  7. "gas-cylinder-api/app/admin/service/dto"
  8. "gas-cylinder-api/common/global"
  9. "gas-cylinder-api/common/middleware/handler"
  10. model2 "gas-cylinder-api/common/model"
  11. "gas-cylinder-api/conf"
  12. "github.com/dgrijalva/jwt-go"
  13. "github.com/gin-gonic/gin"
  14. "gogs.baozhida.cn/zoie/OAuth-core/pkg"
  15. "gogs.baozhida.cn/zoie/OAuth-core/pkg/utils"
  16. "gogs.baozhida.cn/zoie/OAuth-core/sdk"
  17. "gogs.baozhida.cn/zoie/OAuth-core/service"
  18. "gorm.io/gorm"
  19. "net/http"
  20. "time"
  21. )
  22. type AppletCustomer struct {
  23. service.Service
  24. }
  25. func GetAppletCustomerId(c *gin.Context) string {
  26. customerId, exists := c.Get("customer_id")
  27. if !exists {
  28. return ""
  29. }
  30. return customerId.(string)
  31. }
  32. // GetPage 获取Customer列表
  33. func (e *AppletCustomer) WxLogin(c *dto.AppletCustomerWxLoginReq) (token, expiresAt string, err error) {
  34. var data model.Customer
  35. url := "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
  36. appid := conf.ExtConfig.Applet.Appid
  37. appSecret := conf.ExtConfig.Applet.AppSecret
  38. url = fmt.Sprintf(url, appid, appSecret, c.Code)
  39. // 发起请求
  40. res, _ := http.Get(url)
  41. // 成功后获取openId
  42. wxRes := dto.AppletCustomerLoginResp{}
  43. err = json.NewDecoder(res.Body).Decode(&wxRes)
  44. if err != nil || wxRes.Openid == "" {
  45. return token, expiresAt, errors.New("获取openid失败")
  46. }
  47. err = e.Orm.Where("principal_phone = ?", c.Phone).First(&data).Error
  48. id := data.Id
  49. if err != nil {
  50. if errors.Is(err, gorm.ErrRecordNotFound) {
  51. // 添加客户
  52. for {
  53. var count int64
  54. id = utils.GetUUID()
  55. var i int64
  56. err = e.Orm.Model(&data).Where("id = ?", id).Count(&count).Error
  57. if err != nil {
  58. continue
  59. }
  60. if i == 0 {
  61. break
  62. }
  63. }
  64. err = e.Orm.Create(&model.Customer{
  65. ProvCustomer: model.ProvCustomer{
  66. Id: id,
  67. PrincipalPhone: c.Phone,
  68. },
  69. Openid: wxRes.Openid,
  70. }).Error
  71. } else {
  72. return token, expiresAt, errors.New("获取个人信息失败")
  73. }
  74. }
  75. if data.Openid != wxRes.Openid {
  76. data.Openid = wxRes.Openid
  77. err = e.Orm.Save(&data).Error
  78. if err != nil {
  79. return token, expiresAt, errors.New("同步个人信息失败")
  80. }
  81. }
  82. token, expiresAt, _ = e.GeneratorToken(id)
  83. return token, expiresAt, nil
  84. }
  85. func (e *AppletCustomer) Login(c *dto.AppletCustomerLoginReq) (token, expiresAt string, err error) {
  86. var data model.Customer
  87. err = e.Orm.Where("principal_phone = ? and dept_id = -1", c.Phone).First(&data).Error
  88. id := data.Id
  89. if err != nil {
  90. if errors.Is(err, gorm.ErrRecordNotFound) {
  91. return token, expiresAt, errors.New("用户名或密码错误")
  92. } else {
  93. return token, expiresAt, err
  94. }
  95. }
  96. if len(c.VerifyCode) > 0 {
  97. code, err := sdk.Runtime.GetCacheAdapter().Get(handler.GetVerifyCodeCacheKey(c.Phone))
  98. if err != nil {
  99. e.Log.Errorf("user login error, %s", err.Error())
  100. err = errors.New("验证码已过期")
  101. return token, expiresAt, err
  102. }
  103. if code != c.VerifyCode {
  104. e.Log.Errorf("user login error, %s", "验证码错误")
  105. err = errors.New("验证码错误")
  106. return token, expiresAt, err
  107. }
  108. token, expiresAt, _ = e.GeneratorToken(id)
  109. return token, expiresAt, nil
  110. }
  111. _, err = pkg.CompareHashAndPassword(data.Password, c.Password)
  112. if err != nil {
  113. e.Log.Errorf("user login error, %s", err.Error())
  114. return token, expiresAt, errors.New("用户名或密码错误")
  115. }
  116. token, expiresAt, _ = e.GeneratorToken(id)
  117. return token, expiresAt, nil
  118. }
  119. // func (e *AppletCustomer) Refresh(oldToken string) (token, expiresAt string, err error) {
  120. // var data model.Customer
  121. //
  122. // err = e.Orm.Where("principal_phone = ? and dept_id = -1", c.Phone).First(&data).Error
  123. // id := data.Id
  124. // if err != nil {
  125. // if errors.Is(err, gorm.ErrRecordNotFound) {
  126. // return token, expiresAt, errors.New("用户名或密码错误")
  127. // } else {
  128. // return token, expiresAt, err
  129. // }
  130. // }
  131. //
  132. // if len(c.VerifyCode) > 0 {
  133. // code, err := sdk.Runtime.GetCacheAdapter().Get(handler.GetVerifyCodeCacheKey(c.Phone))
  134. // if err != nil {
  135. // e.Log.Errorf("user login error, %s", err.Error())
  136. // err = errors.New("验证码已过期")
  137. // return token, expiresAt, err
  138. // }
  139. // if code != c.VerifyCode {
  140. // e.Log.Errorf("user login error, %s", "验证码错误")
  141. // err = errors.New("验证码错误")
  142. // return token, expiresAt, err
  143. // }
  144. // token, expiresAt, _ = e.GeneratorToken(id)
  145. // return token, expiresAt, nil
  146. // }
  147. //
  148. // _, err = pkg.CompareHashAndPassword(data.Password, c.Password)
  149. // if err != nil {
  150. // e.Log.Errorf("user login error, %s", err.Error())
  151. // return token, expiresAt, errors.New("用户名或密码错误")
  152. // }
  153. //
  154. // token, expiresAt, _ = e.GeneratorToken(id)
  155. // return token, expiresAt, nil
  156. //
  157. // }
  158. func (e *AppletCustomer) Register(c *dto.AppletCustomerRegisterReq) (err error) {
  159. var data model.Customer
  160. code, err := sdk.Runtime.GetCacheAdapter().Get(handler.GetVerifyCodeCacheKey(c.Phone))
  161. if err != nil {
  162. e.Log.Errorf("user login error, %s", err.Error())
  163. err = errors.New("验证码已过期")
  164. return
  165. }
  166. if code != c.VerifyCode {
  167. e.Log.Errorf("user login error, %s", "验证码错误")
  168. err = errors.New("验证码错误")
  169. return
  170. }
  171. err = e.Orm.Where("principal_phone = ? and dept_id = -1", c.Phone).First(&data).Error
  172. id := data.Id
  173. if err != nil {
  174. if errors.Is(err, gorm.ErrRecordNotFound) {
  175. // 添加客户
  176. for {
  177. var count int64
  178. id = utils.GetUUID()
  179. var i int64
  180. err = e.Orm.Model(&data).Where("id = ?", id).Count(&count).Error
  181. if err != nil {
  182. continue
  183. }
  184. if i == 0 {
  185. break
  186. }
  187. }
  188. err = e.Orm.Create(&model.Customer{
  189. ProvCustomer: model.ProvCustomer{
  190. Type: c.Type,
  191. Id: id,
  192. PrincipalPhone: c.Phone,
  193. },
  194. //Openid: wxRes.Openid,
  195. Password: c.Password,
  196. DeptBy: model2.DeptBy{
  197. DeptId: -1,
  198. },
  199. }).Error
  200. } else {
  201. return err
  202. }
  203. }
  204. if len(data.Id) > 0 {
  205. return errors.New("该手机号已注册")
  206. }
  207. return nil
  208. }
  209. func (e *AppletCustomer) GeneratorToken(customerId string) (string, string, error) {
  210. // 创建一个我们自己的声明
  211. var TokenExpireDuration = time.Second * 24 * 3600 * time.Duration(conf.ExtConfig.Applet.TokenExpire)
  212. expiresAt := time.Now().Add(TokenExpireDuration)
  213. c := model.CustomerClaims{
  214. customerId,
  215. jwt.StandardClaims{
  216. ExpiresAt: expiresAt.Unix(), // 过期时间
  217. Issuer: "customer", // 签发人
  218. },
  219. }
  220. // 使用指定的签名方法创建签名对象
  221. token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
  222. // 使用指定的secret签名并获得完整的编码后的字符串token
  223. tokenStr, err := token.SignedString(model.AppletCustomerSecret)
  224. return tokenStr, expiresAt.Format("2006-01-02 15:04:05"), err
  225. }
  226. // UpdatePwd 修改SysUser对象密码
  227. func (e *AppletCustomer) UpdatePwd(id string, oldPassword, newPassword string) error {
  228. var err error
  229. if newPassword == "" {
  230. return nil
  231. }
  232. c := &model.Customer{}
  233. err = e.Orm.Model(c).
  234. Select("id", "password").
  235. Where("id = ?", id).
  236. First(c).Error
  237. if err != nil {
  238. e.Log.Errorf("db error: %s", err)
  239. if errors.Is(err, gorm.ErrRecordNotFound) {
  240. return global.UpdateNotFoundOrNoPermissionErr
  241. }
  242. return errors.New("密码修改失败")
  243. }
  244. var ok bool
  245. ok, err = pkg.CompareHashAndPassword(c.Password, oldPassword)
  246. if err != nil {
  247. e.Log.Errorf("CompareHashAndPassword error, %s", err.Error())
  248. return errors.New("密码修改失败")
  249. }
  250. if !ok {
  251. err = errors.New("incorrect Password")
  252. e.Log.Warnf("user[%d] %s", id, err.Error())
  253. return err
  254. }
  255. c.Password = newPassword
  256. db := e.Orm.Model(c).Where("id = ?", id).
  257. Select("Password", "Salt").
  258. Updates(c)
  259. if err = db.Error; err != nil {
  260. if errors.Is(err, model.ErrForbidUpdateSysRole) {
  261. return model.ErrForbidUpdateSysRole
  262. }
  263. e.Log.Errorf("db error: %s", err)
  264. return errors.New("密码修改失败")
  265. }
  266. return nil
  267. }