123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- package service
- import (
- "encoding/json"
- "errors"
- "fmt"
- "gas-cylinder-api/app/admin/model"
- "gas-cylinder-api/app/admin/service/dto"
- "gas-cylinder-api/common/global"
- "gas-cylinder-api/common/middleware/handler"
- model2 "gas-cylinder-api/common/model"
- "gas-cylinder-api/conf"
- "github.com/dgrijalva/jwt-go"
- "github.com/gin-gonic/gin"
- "gogs.baozhida.cn/zoie/OAuth-core/pkg"
- "gogs.baozhida.cn/zoie/OAuth-core/pkg/utils"
- "gogs.baozhida.cn/zoie/OAuth-core/sdk"
- "gogs.baozhida.cn/zoie/OAuth-core/service"
- "gorm.io/gorm"
- "net/http"
- "time"
- )
- type AppletCustomer struct {
- service.Service
- }
- func GetAppletCustomerId(c *gin.Context) string {
- customerId, exists := c.Get("customer_id")
- if !exists {
- return ""
- }
- return customerId.(string)
- }
- // GetPage 获取Customer列表
- func (e *AppletCustomer) WxLogin(c *dto.AppletCustomerWxLoginReq) (token, expiresAt string, err error) {
- var data model.Customer
- url := "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
- appid := conf.ExtConfig.Applet.Appid
- appSecret := conf.ExtConfig.Applet.AppSecret
- url = fmt.Sprintf(url, appid, appSecret, c.Code)
- // 发起请求
- res, _ := http.Get(url)
- // 成功后获取openId
- wxRes := dto.AppletCustomerLoginResp{}
- err = json.NewDecoder(res.Body).Decode(&wxRes)
- if err != nil || wxRes.Openid == "" {
- return token, expiresAt, errors.New("获取openid失败")
- }
- err = e.Orm.Where("principal_phone = ?", c.Phone).First(&data).Error
- id := data.Id
- if err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- // 添加客户
- for {
- var count int64
- id = utils.GetUUID()
- var i int64
- err = e.Orm.Model(&data).Where("id = ?", id).Count(&count).Error
- if err != nil {
- continue
- }
- if i == 0 {
- break
- }
- }
- err = e.Orm.Create(&model.Customer{
- ProvCustomer: model.ProvCustomer{
- Id: id,
- PrincipalPhone: c.Phone,
- },
- Openid: wxRes.Openid,
- }).Error
- } else {
- return token, expiresAt, errors.New("获取个人信息失败")
- }
- }
- if data.Openid != wxRes.Openid {
- data.Openid = wxRes.Openid
- err = e.Orm.Save(&data).Error
- if err != nil {
- return token, expiresAt, errors.New("同步个人信息失败")
- }
- }
- token, expiresAt, _ = e.GeneratorToken(id)
- return token, expiresAt, nil
- }
- func (e *AppletCustomer) Login(c *dto.AppletCustomerLoginReq) (token, expiresAt string, err error) {
- var data model.Customer
- err = e.Orm.Where("principal_phone = ? and dept_id = -1", c.Phone).First(&data).Error
- id := data.Id
- if err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- return token, expiresAt, errors.New("用户名或密码错误")
- } else {
- return token, expiresAt, err
- }
- }
- if len(c.VerifyCode) > 0 {
- code, err := sdk.Runtime.GetCacheAdapter().Get(handler.GetVerifyCodeCacheKey(c.Phone))
- if err != nil {
- e.Log.Errorf("user login error, %s", err.Error())
- err = errors.New("验证码已过期")
- return token, expiresAt, err
- }
- if code != c.VerifyCode {
- e.Log.Errorf("user login error, %s", "验证码错误")
- err = errors.New("验证码错误")
- return token, expiresAt, err
- }
- token, expiresAt, _ = e.GeneratorToken(id)
- return token, expiresAt, nil
- }
- _, err = pkg.CompareHashAndPassword(data.Password, c.Password)
- if err != nil {
- e.Log.Errorf("user login error, %s", err.Error())
- return token, expiresAt, errors.New("用户名或密码错误")
- }
- token, expiresAt, _ = e.GeneratorToken(id)
- return token, expiresAt, nil
- }
- // func (e *AppletCustomer) Refresh(oldToken string) (token, expiresAt string, err error) {
- // var data model.Customer
- //
- // err = e.Orm.Where("principal_phone = ? and dept_id = -1", c.Phone).First(&data).Error
- // id := data.Id
- // if err != nil {
- // if errors.Is(err, gorm.ErrRecordNotFound) {
- // return token, expiresAt, errors.New("用户名或密码错误")
- // } else {
- // return token, expiresAt, err
- // }
- // }
- //
- // if len(c.VerifyCode) > 0 {
- // code, err := sdk.Runtime.GetCacheAdapter().Get(handler.GetVerifyCodeCacheKey(c.Phone))
- // if err != nil {
- // e.Log.Errorf("user login error, %s", err.Error())
- // err = errors.New("验证码已过期")
- // return token, expiresAt, err
- // }
- // if code != c.VerifyCode {
- // e.Log.Errorf("user login error, %s", "验证码错误")
- // err = errors.New("验证码错误")
- // return token, expiresAt, err
- // }
- // token, expiresAt, _ = e.GeneratorToken(id)
- // return token, expiresAt, nil
- // }
- //
- // _, err = pkg.CompareHashAndPassword(data.Password, c.Password)
- // if err != nil {
- // e.Log.Errorf("user login error, %s", err.Error())
- // return token, expiresAt, errors.New("用户名或密码错误")
- // }
- //
- // token, expiresAt, _ = e.GeneratorToken(id)
- // return token, expiresAt, nil
- //
- // }
- func (e *AppletCustomer) Register(c *dto.AppletCustomerRegisterReq) (err error) {
- var data model.Customer
- code, err := sdk.Runtime.GetCacheAdapter().Get(handler.GetVerifyCodeCacheKey(c.Phone))
- if err != nil {
- e.Log.Errorf("user login error, %s", err.Error())
- err = errors.New("验证码已过期")
- return
- }
- if code != c.VerifyCode {
- e.Log.Errorf("user login error, %s", "验证码错误")
- err = errors.New("验证码错误")
- return
- }
- err = e.Orm.Where("principal_phone = ? and dept_id = -1", c.Phone).First(&data).Error
- id := data.Id
- if err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- // 添加客户
- for {
- var count int64
- id = utils.GetUUID()
- var i int64
- err = e.Orm.Model(&data).Where("id = ?", id).Count(&count).Error
- if err != nil {
- continue
- }
- if i == 0 {
- break
- }
- }
- err = e.Orm.Create(&model.Customer{
- ProvCustomer: model.ProvCustomer{
- Type: c.Type,
- Id: id,
- PrincipalPhone: c.Phone,
- },
- //Openid: wxRes.Openid,
- Password: c.Password,
- DeptBy: model2.DeptBy{
- DeptId: -1,
- },
- }).Error
- } else {
- return err
- }
- }
- if len(data.Id) > 0 {
- return errors.New("该手机号已注册")
- }
- return nil
- }
- func (e *AppletCustomer) GeneratorToken(customerId string) (string, string, error) {
- // 创建一个我们自己的声明
- var TokenExpireDuration = time.Second * 24 * 3600 * time.Duration(conf.ExtConfig.Applet.TokenExpire)
- expiresAt := time.Now().Add(TokenExpireDuration)
- c := model.CustomerClaims{
- customerId,
- jwt.StandardClaims{
- ExpiresAt: expiresAt.Unix(), // 过期时间
- Issuer: "customer", // 签发人
- },
- }
- // 使用指定的签名方法创建签名对象
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
- // 使用指定的secret签名并获得完整的编码后的字符串token
- tokenStr, err := token.SignedString(model.AppletCustomerSecret)
- return tokenStr, expiresAt.Format("2006-01-02 15:04:05"), err
- }
- // UpdatePwd 修改SysUser对象密码
- func (e *AppletCustomer) UpdatePwd(id string, oldPassword, newPassword string) error {
- var err error
- if newPassword == "" {
- return nil
- }
- c := &model.Customer{}
- err = e.Orm.Model(c).
- Select("id", "password").
- Where("id = ?", id).
- First(c).Error
- if err != nil {
- e.Log.Errorf("db error: %s", err)
- if errors.Is(err, gorm.ErrRecordNotFound) {
- return global.UpdateNotFoundOrNoPermissionErr
- }
- return errors.New("密码修改失败")
- }
- var ok bool
- ok, err = pkg.CompareHashAndPassword(c.Password, oldPassword)
- if err != nil {
- e.Log.Errorf("CompareHashAndPassword error, %s", err.Error())
- return errors.New("密码修改失败")
- }
- if !ok {
- err = errors.New("incorrect Password")
- e.Log.Warnf("user[%d] %s", id, err.Error())
- return err
- }
- c.Password = newPassword
- db := e.Orm.Model(c).Where("id = ?", id).
- Select("Password", "Salt").
- Updates(c)
- if err = db.Error; err != nil {
- if errors.Is(err, model.ErrForbidUpdateSysRole) {
- return model.ErrForbidUpdateSysRole
- }
- e.Log.Errorf("db error: %s", err)
- return errors.New("密码修改失败")
- }
- return nil
- }
|